Quality gate bắt buộc: chạy unit test + SonarQube scan, fix issues cho đến khi pass. Dùng trước khi commit/push/PR, hoặc user nói "run tests", "quality gate", "check quality", "check trước khi commit", "sonar scan". Gộp unit test gate + SonarQube check thành 1 skill.
Checkpoint bắt buộc trước mọi action finalizing code. Triết lý: broken code không được rời local machine. Bắt lỗi sớm ở đây tiết kiệm thời gian hơn là debug trên CI/production.
/check-quality
Lấy từ resources.md:
SonarQube server: http://localhost:9000
Kiểm tra changes trong backend:
git diff --name-only -- backend/ && git diff --name-only --cached -- backend/
Nếu có changes → chạy test:
cd backend && npx jest --coverage
Điều kiện pass (cả 2 phải đạt):
Nếu fail:
Nếu coverage < 70%:
Không chuyển sang Step 2 cho đến khi Step 1 pass hoàn toàn.
npm run sonar
Chờ scan xong + ~5 giây cho server xử lý results.
Query API với SONARQUBE_TOKEN và SONARQUBE_KEY từ resources.md:
Get quality gate status:
curl -s -u "{SONARQUBE_TOKEN}:" \
"http://localhost:9000/api/qualitygates/project_status?projectKey={SONARQUBE_KEY}"
Get measures:
curl -s -u "{SONARQUBE_TOKEN}:" \
"http://localhost:9000/api/measures/component?component={SONARQUBE_KEY}&metricKeys=bugs,vulnerabilities,code_smells,coverage,duplicated_lines_density,security_hotspots,alert_status"
Get open issues (sorted by severity):
curl -s -u "{SONARQUBE_TOKEN}:" \
"http://localhost:9000/api/issues/search?componentKeys={SONARQUBE_KEY}&statuses=OPEN,CONFIRMED,REOPENED&ps=500&s=SEVERITY&asc=false"
Điều kiện pass:
Fix theo thứ tự severity:
Mỗi issue từ API chứa: component (file path), line, message, type.
Sau khi fix → quay lại Step 1 (re-run test) → Step 2 (re-scan) → Step 3 (re-check). Lặp tối đa 3 vòng.
Đọc coverage matrix từ docs/features/{FEATURE_FLAG}/test-cases/coverage-matrix.md:
Kiểm tra xem có user story nào chưa có test case (Status = Missing):
Tính coverage ratio:
coverage = (stories có ít nhất 1 test) / (tổng stories) × 100%Cập nhật docs/registry.yaml:
tests_pass, coverageQuality Gate: PASSED ✓
- Tests: XX passed, 0 failed
- Coverage: XX.X%
- SonarQube: 0 Blocker, 0 Critical, X Major, X Minor
- Story Coverage: X/Y stories có test (XX%)
- Missing tests: [US-xxx, US-yyy] (nếu có)
- Fixed in this session: [danh sách]
Không bao giờ tự ý bypass gate. User phải explicitly approve.
backend/ (NestJS backend)http://localhost:9000