@anhth2/spec-driven-dev-plugin 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/debug.md +43 -8
- package/commands/define-product.md +43 -8
- package/commands/dev-gen-test.md +44 -9
- package/commands/dev-gen-test.tmpl +1 -1
- package/commands/dev-run-test.md +48 -10
- package/commands/dev-run-test.tmpl +5 -2
- package/commands/dev-smoke-test.md +43 -8
- package/commands/fix-bug.md +79 -14
- package/commands/fix-bug.tmpl +36 -6
- package/commands/generate-bdd.md +49 -10
- package/commands/generate-bdd.tmpl +6 -2
- package/commands/generate-code.md +44 -9
- package/commands/generate-code.tmpl +1 -1
- package/commands/generate-design-spec.md +43 -8
- package/commands/generate-prd.md +43 -8
- package/commands/generate-spec-manifest.md +43 -8
- package/commands/generate-tech-docs.md +43 -8
- package/commands/learn.md +43 -8
- package/commands/propose-scenario.md +74 -19
- package/commands/propose-scenario.tmpl +31 -11
- package/commands/qc-analyze.md +534 -0
- package/commands/qc-analyze.tmpl +86 -0
- package/commands/qc-design-test.md +515 -0
- package/commands/qc-design-test.tmpl +67 -0
- package/commands/qc-plan.md +497 -0
- package/commands/qc-plan.tmpl +49 -0
- package/commands/qc-report.md +508 -0
- package/commands/qc-report.tmpl +60 -0
- package/commands/qc-review.md +501 -0
- package/commands/qc-review.tmpl +53 -0
- package/commands/qc-run-test.md +549 -0
- package/commands/qc-run-test.tmpl +83 -0
- package/commands/refine-prd.md +43 -8
- package/commands/report-bug.md +59 -10
- package/commands/report-bug.tmpl +16 -2
- package/commands/review-code.md +43 -8
- package/commands/review-context.md +43 -8
- package/commands/review-tech-docs.md +43 -8
- package/commands/setup-ai-first.md +7 -0
- package/commands/sync.md +19 -9
- package/commands/sync.tmpl +12 -9
- package/commands/update-framework.md +7 -0
- package/commands/validate-traces.md +67 -12
- package/commands/validate-traces.tmpl +24 -4
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +43 -8
- package/core/commands/define-product.md +43 -8
- package/core/commands/dev-gen-test.md +44 -9
- package/core/commands/dev-run-test.md +48 -10
- package/core/commands/dev-smoke-test.md +43 -8
- package/core/commands/fix-bug.md +79 -14
- package/core/commands/generate-bdd.md +49 -10
- package/core/commands/generate-code.md +44 -9
- package/core/commands/generate-design-spec.md +43 -8
- package/core/commands/generate-prd.md +43 -8
- package/core/commands/generate-spec-manifest.md +43 -8
- package/core/commands/generate-tech-docs.md +43 -8
- package/core/commands/learn.md +43 -8
- package/core/commands/propose-scenario.md +74 -19
- package/core/commands/qc-analyze.md +534 -0
- package/core/commands/qc-design-test.md +515 -0
- package/core/commands/qc-plan.md +497 -0
- package/core/commands/qc-report.md +508 -0
- package/core/commands/qc-review.md +501 -0
- package/core/commands/qc-run-test.md +549 -0
- package/core/commands/refine-prd.md +43 -8
- package/core/commands/report-bug.md +59 -10
- package/core/commands/review-code.md +43 -8
- package/core/commands/review-context.md +43 -8
- package/core/commands/review-tech-docs.md +43 -8
- package/core/commands/setup-ai-first.md +7 -0
- package/core/commands/sync.md +19 -9
- package/core/commands/update-framework.md +7 -0
- package/core/commands/validate-traces.md +67 -12
- package/core/modules/qc-playwright/stack-profile.yaml +65 -0
- package/core/skills/code/SKILL.md +50 -8
- package/core/skills/debug/SKILL.md +57 -8
- package/core/skills/design-spec/SKILL.md +43 -8
- package/core/skills/discovery/SKILL.md +43 -8
- package/core/skills/prd/SKILL.md +14 -0
- package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/core/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
- package/core/skills/qc/qa-analyst/business-rules.md +59 -0
- package/core/skills/qc/qa-analyst/data-flow.md +64 -0
- package/core/skills/qc/qa-analyst/spec-breakdown.md +61 -0
- package/core/skills/qc/qa-designer/e2e/journey.md +41 -0
- package/core/skills/qc/qa-designer/exploratory/charter.md +68 -0
- package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
- package/core/skills/qc/qa-designer/functional/api.md +45 -0
- package/core/skills/qc/qa-designer/functional/gui-feature.md +46 -0
- package/core/skills/qc/qa-designer/functional/gui-screen.md +52 -0
- package/core/skills/qc/qa-designer/integration/api.md +42 -0
- package/core/skills/qc/qa-designer/integration/db.md +39 -0
- package/core/skills/qc/qa-designer/integration/gui.md +40 -0
- package/core/skills/qc/qa-designer/integration/kafka.md +40 -0
- package/core/skills/qc/qa-designer/non-functional.md +40 -0
- package/core/skills/qc/qa-planner/test-plan.md +120 -0
- package/core/skills/qc/qa-reviewer/script/e2e.md +87 -0
- package/core/skills/qc/qa-reviewer/script/exploratory.md +45 -0
- package/core/skills/qc/qa-reviewer/script/functional.md +101 -0
- package/core/skills/qc/qa-reviewer/script/integration.md +91 -0
- package/core/skills/qc/qa-reviewer/script/non-functional.md +126 -0
- package/core/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
- package/core/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
- package/core/skills/qc/qa-reviewer/test-case/functional.md +76 -0
- package/core/skills/qc/qa-reviewer/test-case/integration.md +69 -0
- package/core/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
- package/core/skills/qc/qa-runner/e2e.md +49 -0
- package/core/skills/qc/qa-runner/exploratory/session.md +36 -0
- package/core/skills/qc/qa-runner/functional/api.md +35 -0
- package/core/skills/qc/qa-runner/functional/gui-feature.md +51 -0
- package/core/skills/qc/qa-runner/functional/gui-screen.md +55 -0
- package/core/skills/qc/qa-runner/integration.md +47 -0
- package/core/skills/qc/qa-runner/non-functional.md +49 -0
- package/core/skills/qc/qa-runner/report/report.md +37 -0
- package/core/skills/setup-ai-first/SKILL.md +7 -0
- package/core/skills/spec/SKILL.md +14 -0
- package/core/skills/test/SKILL.md +93 -16
- package/core/steps/context-loader.md +36 -8
- package/core/steps/report-footer.md +7 -0
- package/core/templates/project-context.yaml +27 -1
- package/docs/01-getting-started/README.md +19 -0
- package/docs/01-getting-started/core-concepts.md +102 -0
- package/docs/01-getting-started/installation.md +156 -0
- package/docs/01-getting-started/quickstart.md +85 -0
- package/docs/02-guides/README.md +27 -0
- package/docs/02-guides/developer/README.md +46 -0
- package/docs/02-guides/developer/bdd-and-trace.md +123 -0
- package/docs/02-guides/developer/commands.md +76 -0
- package/docs/02-guides/developer/pr-checklist.md +15 -0
- package/docs/02-guides/developer/scenarios.md +448 -0
- package/docs/02-guides/developer/workflow.md +61 -0
- package/docs/02-guides/product-owner/README.md +77 -0
- package/docs/02-guides/product-owner/commands.md +30 -0
- package/docs/02-guides/product-owner/handoff-checklist.md +42 -0
- package/docs/02-guides/product-owner/prd-writing-rules.md +45 -0
- package/docs/02-guides/product-owner/scenarios.md +357 -0
- package/docs/02-guides/qc-automation.md +157 -0
- package/docs/02-guides/tester/README.md +74 -0
- package/docs/02-guides/tester/bug-reporting.md +117 -0
- package/docs/02-guides/tester/reading-specs.md +79 -0
- package/docs/02-guides/tester/scenarios.md +186 -0
- package/docs/02-guides/tester/spec-manifest.md +124 -0
- package/docs/02-guides/tester/test-checklist.md +31 -0
- package/docs/02-guides/tester/workflow.md +80 -0
- package/docs/03-concepts/README.md +19 -0
- package/docs/03-concepts/architecture.md +245 -0
- package/docs/03-concepts/pipeline.md +262 -0
- package/docs/03-concepts/traceability.md +149 -0
- package/docs/04-operations/README.md +33 -0
- package/docs/04-operations/bug-flow.md +362 -0
- package/docs/04-operations/publishing.md +137 -0
- package/docs/04-operations/sync-and-update.md +365 -0
- package/docs/05-reference/README.md +29 -0
- package/docs/05-reference/commands.md +229 -0
- package/docs/05-reference/modules.md +110 -0
- package/docs/05-reference/trace-schema.md +152 -0
- package/docs/README.md +51 -0
- package/modules/qc-playwright/stack-profile.yaml +65 -0
- package/package.json +2 -2
- package/skills/code/SKILL.md +50 -8
- package/skills/debug/SKILL.md +57 -8
- package/skills/design-spec/SKILL.md +43 -8
- package/skills/discovery/SKILL.md +43 -8
- package/skills/prd/SKILL.md +14 -0
- package/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
- package/skills/qc/qa-analyst/business-rules.md +59 -0
- package/skills/qc/qa-analyst/data-flow.md +64 -0
- package/skills/qc/qa-analyst/spec-breakdown.md +61 -0
- package/skills/qc/qa-designer/e2e/journey.md +41 -0
- package/skills/qc/qa-designer/exploratory/charter.md +68 -0
- package/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
- package/skills/qc/qa-designer/functional/api.md +45 -0
- package/skills/qc/qa-designer/functional/gui-feature.md +46 -0
- package/skills/qc/qa-designer/functional/gui-screen.md +52 -0
- package/skills/qc/qa-designer/integration/api.md +42 -0
- package/skills/qc/qa-designer/integration/db.md +39 -0
- package/skills/qc/qa-designer/integration/gui.md +40 -0
- package/skills/qc/qa-designer/integration/kafka.md +40 -0
- package/skills/qc/qa-designer/non-functional.md +40 -0
- package/skills/qc/qa-planner/test-plan.md +120 -0
- package/skills/qc/qa-reviewer/script/e2e.md +87 -0
- package/skills/qc/qa-reviewer/script/exploratory.md +45 -0
- package/skills/qc/qa-reviewer/script/functional.md +101 -0
- package/skills/qc/qa-reviewer/script/integration.md +91 -0
- package/skills/qc/qa-reviewer/script/non-functional.md +126 -0
- package/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
- package/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
- package/skills/qc/qa-reviewer/test-case/functional.md +76 -0
- package/skills/qc/qa-reviewer/test-case/integration.md +69 -0
- package/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
- package/skills/qc/qa-runner/e2e.md +49 -0
- package/skills/qc/qa-runner/exploratory/session.md +36 -0
- package/skills/qc/qa-runner/functional/api.md +35 -0
- package/skills/qc/qa-runner/functional/gui-feature.md +51 -0
- package/skills/qc/qa-runner/functional/gui-screen.md +55 -0
- package/skills/qc/qa-runner/integration.md +47 -0
- package/skills/qc/qa-runner/non-functional.md +49 -0
- package/skills/qc/qa-runner/report/report.md +37 -0
- package/skills/setup-ai-first/SKILL.md +7 -0
- package/skills/spec/SKILL.md +14 -0
- package/skills/test/SKILL.md +93 -16
- package/steps/context-loader.md +36 -8
- package/steps/report-footer.md +7 -0
- package/templates/project-context.yaml +27 -1
- package/ARCHITECTURE.md +0 -258
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Gen Script — Functional GUI Feature (đa màn hình)
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa**: convert `.Test.md` feature span ≥2 màn → Python pytest + Playwright. Chỉ cần load file này.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- Convert TC feature đa màn (output qa-designer gui-feature) sang script; TC đã Reviewed
|
|
13
|
+
|
|
14
|
+
## Khi KHÔNG trigger
|
|
15
|
+
- Gọn 1 màn → `functional/gui-screen.md` · API → `functional/api.md` · đầu-cuối + đồng bộ → `e2e.md`
|
|
16
|
+
|
|
17
|
+
## Quy ước script (bám CLAUDE.md)
|
|
18
|
+
- Tiền đề: `.Test.md` đã Reviewed. KHÔNG `time.sleep()` → `expect()`/auto-wait; KHÔNG hardcode → `Env.*`/`CONFIG`.
|
|
19
|
+
- **Một Page Object / màn**; điều hướng giữa màn là action trả về PO màn kế (`return NextPage(self.page)`).
|
|
20
|
+
- PO 3 lớp (kế thừa slim `BasePage`, **KHÔNG Allure**) + bọc bước `with step("…")` (`from utils.steps import step`); assertion `expect()`; mọi interaction qua PO; selector constants `UPPER_SNAKE`.
|
|
21
|
+
- Marker + fixture pytest-playwright từ root `tests/conftest.py` (`page`/`logged_in_page`/`logged_in_page_gv`/`login_page`/`dashboard`); test độc lập + cleanup; naming `Test*{...}` / `test_TC<NNN>_<snake>`.
|
|
22
|
+
|
|
23
|
+
## Phase 1 — Clarify
|
|
24
|
+
Đọc `.Test.md` · liệt kê các màn/PO cần · state truyền giữa màn · fixture dựng tiền điều kiện (data qua nhiều bước).
|
|
25
|
+
**Probe DOM thật trước khi viết selector** (SPA React/Next không `data-testid`): dump class/`aria-label`/role → BEM `feature__el`, carousel dot thường `role="tab"` + class `--active` (không `aria-selected`).
|
|
26
|
+
|
|
27
|
+
## Phase 2 — Generate
|
|
28
|
+
**PHỦ HẾT 100%**: 1 test cho **MỌI** TC trong file (`grep -cE "^#{2,4} *TC_"` = số test phải sinh), KHÔNG chọn tập đại diện, KHÔNG để TC nào Draft; TC bất khả thi → `pytest.skip`/`xfail` + lý do.
|
|
29
|
+
Bọc mỗi chặng bằng `with step("…")`; dùng chuỗi PO theo điều hướng.
|
|
30
|
+
Phủ TC điều hướng forward/back/giữ-reset state. Data từ `test_data/`. Marker mới (`bva ep e2e`…) đăng ký `pytest.ini`.
|
|
31
|
+
|
|
32
|
+
## Phase 3 — Verify
|
|
33
|
+
`py_compile` + `pytest --collect-only -q` (**số collect = tổng TC**; thiếu → sinh nốt) · chạy · cập nhật Status TC (verify KHÔNG còn Draft) · in mapping.
|
|
34
|
+
**Gom nhóm role/account** tự áp qua `utils/test_ordering.py` (root conftest); fixture auth mới → `register_auth_fixtures([...])`. ⚠️ Run dài bị **WSL suspend** có thể gây flaky login/timeout → re-run TC đó + merge report.
|
|
35
|
+
**Phân loại FAIL: script-bug (sửa selector/logic, chạy lại) vs product-gap** (feature chưa wire/defect → giữ FAIL + ghi bằng chứng vào khối "Kết quả thực thi" đầu `.Test.md`, không fake-pass).
|
|
36
|
+
|
|
37
|
+
## Output
|
|
38
|
+
Script + nhiều Page Object (mỗi màn) trong `pages/<project>/...`. Bàn giao `qa-reviewer` (script).
|
|
39
|
+
|
|
40
|
+
## Phase 4 — Report (bắt buộc sau khi chạy test)
|
|
41
|
+
Report = **Playwright Trace viewer + pytest-html** (KHÔNG Allure, KHÔNG dashboard tự viết).
|
|
42
|
+
|
|
43
|
+
1. Chạy test kèm pytest-html (trace đã bật sẵn ở conftest → mỗi test có `test-results/<nodeid>/trace.zip`):
|
|
44
|
+
```bash
|
|
45
|
+
pytest tests/<project>/.../test_<feature>.py --html=reports/<feature>/report.html --self-contained-html
|
|
46
|
+
```
|
|
47
|
+
2. Gửi cho người dùng:
|
|
48
|
+
- HTML report: `reports/<feature>/report.html` (self-contained, mở trực tiếp).
|
|
49
|
+
- Trace từng test (debug step-by-step): `python3 -m playwright show-trace test-results/<nodeid>/trace.zip`.
|
|
50
|
+
- Tóm tắt: **TOTAL / PASS / FAIL / SKIP** + duration.
|
|
51
|
+
3. TC Fail → mở trace tương ứng để xem timeline/DOM snapshot/network, phân loại script-bug vs product-gap; ghi mô tả lỗi tiếng Việt dễ hiểu vào Status/khối kết quả của `.Test.md`.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Gen Script — Functional GUI Screen (1 màn hình)
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa**: convert `.Test.md` (1 màn) → Python pytest + Playwright. Chỉ cần load file này.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "generate script cho [Screen]" / convert TC sang Python; đã có `.Test.md` (output qa-designer gui-screen), TC đã Reviewed
|
|
13
|
+
|
|
14
|
+
## Khi KHÔNG trigger
|
|
15
|
+
- Chưa có TC `.md` → chạy qa-designer trước · TC chưa review → qa-reviewer trước
|
|
16
|
+
- Feature cross-screen → `functional/gui-feature.md` · API → `functional/api.md`
|
|
17
|
+
|
|
18
|
+
## Quy ước script (bám CLAUDE.md)
|
|
19
|
+
- Tiền đề: có `.Test.md` đã Reviewed. KHÔNG `time.sleep()` → `expect()`/auto-wait; KHÔNG hardcode → `Env.*`/`CONFIG`.
|
|
20
|
+
- Page Object 3 lớp (kế thừa slim `BasePage`, **KHÔNG Allure**): locators `_x()` → actions `verb_noun()`+`with step("…")`+`return self` → assertions `assert_x()`+`expect()`; mọi interaction **qua PO** (không `page.click()` trực tiếp); selector constants `UPPER_SNAKE` đầu class.
|
|
21
|
+
- Bọc bước bằng `with step("…")` (`from utils.steps import step`) — **KHÔNG Allure** · marker category+domain (đăng ký `pytest.ini`) · fixture pytest-playwright từ root `tests/conftest.py` (`page`/`logged_in_page`/`logged_in_page_gv`/`login_page`/`dashboard`) · test độc lập + cleanup.
|
|
22
|
+
- Naming: class `TestFeature{UI,Functional,Negative}`, method `test_TC<NNN>_<snake>`; docstring = TC title; comment TC_ID + link `.md`.
|
|
23
|
+
|
|
24
|
+
## Phase 1 — Clarify
|
|
25
|
+
Đọc `.Test.md` (confirm Reviewed) · platform (web Playwright/mobile) · Page Object đã có chưa → tạo nếu cần · fixture setup data?
|
|
26
|
+
**Probe DOM thật trước khi viết selector** (SPA không `data-testid`): dump class/`aria-label`/role bằng script Playwright tạm → ghi selector đúng (BEM `feature__el`; element interactive có thể `role="tab/menuitem"` + class `--active`).
|
|
27
|
+
|
|
28
|
+
## Phase 2 — Generate
|
|
29
|
+
**PHỦ HẾT 100%**: sinh 1 `test_TC<NNN>_<scenario>` cho **MỌI** TC trong file — KHÔNG chọn tập đại diện, KHÔNG bỏ TC nào. Đếm tổng TC đầu file (`grep -cE "^#{2,4} *TC_"`) = số test phải sinh.
|
|
30
|
+
TC không thể tự động hóa (precondition bất khả thi, cần data cố định, feature chưa wire) → vẫn viết 1 test với `pytest.skip("lý do")` / `pytest.mark.xfail` — KHÔNG để Draft.
|
|
31
|
+
Map nhóm GUI→`TestFeatureUI`, Functional→`TestFeatureFunctional`, Negative→`TestFeatureNegative`. Assertion qua `assert_*()` của PO; test data từ `test_data/`, không hardcode. Marker mới (`bva ep`…) đăng ký `pytest.ini`.
|
|
32
|
+
|
|
33
|
+
## Phase 3 — Verify
|
|
34
|
+
`py_compile` + `pytest --collect-only -q` (**số collect = tổng TC trong file**, nếu thiếu → quay lại Phase 2 sinh nốt) · chạy test · cập nhật **Status** TC (Pass/Fail/Skip) · in mapping TC_ID→function→file.
|
|
35
|
+
**Gom nhóm role/account**: thứ tự chạy đã tự gom cùng (role, account) liền nhau qua `utils/test_ordering.py` (hook ở root conftest) — fixture auth mới thì `register_auth_fixtures([...])`.
|
|
36
|
+
⚠️ Run dài có thể bị **WSL suspend** (máy ngủ) làm vài TC lỗi login/timeout = flaky (không phải gap SP) → re-run đúng các TC đó + merge vào report (xem `report/report.md`).
|
|
37
|
+
**Verify KHÔNG còn Draft**: `grep -c "Status: Draft" <file>.Test.md` = 0 trước khi bàn giao.
|
|
38
|
+
**Mỗi FAIL phân loại script-bug vs product-gap** (probe trực tiếp): sai selector/expectation → sửa script & chạy lại; feature không phản hồi sau timeout → giữ FAIL + ghi bằng chứng (không fake-pass).
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
Script `tests/<project>/.../test_<screen>.py` + Page Object `pages/<project>/.../<Screen>Page.py` (nếu mới).
|
|
42
|
+
Bàn giao `qa-reviewer` (script).
|
|
43
|
+
|
|
44
|
+
## Phase 4 — Report (bắt buộc sau khi chạy test)
|
|
45
|
+
Report = **Playwright Trace viewer + pytest-html** (KHÔNG Allure, KHÔNG dashboard tự viết).
|
|
46
|
+
|
|
47
|
+
1. Chạy test kèm pytest-html (trace đã bật sẵn ở conftest → mỗi test có `test-results/<nodeid>/trace.zip`):
|
|
48
|
+
```bash
|
|
49
|
+
pytest tests/<project>/.../test_<screen>.py --html=reports/<feature>/report.html --self-contained-html
|
|
50
|
+
```
|
|
51
|
+
2. Gửi cho người dùng:
|
|
52
|
+
- HTML report: `reports/<feature>/report.html` (self-contained, mở trực tiếp).
|
|
53
|
+
- Trace từng test (debug step-by-step): `python3 -m playwright show-trace test-results/<nodeid>/trace.zip`.
|
|
54
|
+
- Tóm tắt: **TOTAL / PASS / FAIL / SKIP** + duration.
|
|
55
|
+
3. TC Fail → mở trace tương ứng để xem timeline/DOM snapshot/network, phân loại script-bug vs product-gap; ghi mô tả lỗi tiếng Việt dễ hiểu vào Status/khối kết quả của `.Test.md`.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Gen Script — Integration
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa**: convert `.Test.md` tích hợp (API↔DB↔service↔queue↔UI) → Python pytest. Chỉ cần load file này.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- Convert TC integration (output qa-designer integration/*) sang script; TC đã Reviewed
|
|
13
|
+
|
|
14
|
+
## Khi KHÔNG trigger
|
|
15
|
+
- Chỉ 1 endpoint/UI đơn → `functional/*` · hành trình đầu-cuối → `e2e.md`
|
|
16
|
+
|
|
17
|
+
## Quy ước script (bám CLAUDE.md)
|
|
18
|
+
- Tiền đề: `.Test.md` đã Reviewed. KHÔNG hardcode endpoint/DSN/topic → `Env.*`/`CONFIG`.
|
|
19
|
+
- Mỗi hệ thống có client/helper riêng (API client, DB session, Kafka producer/consumer) gói trong fixture.
|
|
20
|
+
- Verify đúng chặng: response (assert), DB (query qua fixture), event (consume + assert payload).
|
|
21
|
+
- **Cleanup bắt buộc** sau khi tạo data; test độc lập; concurrency dùng thread/async khi cần.
|
|
22
|
+
- Bọc mỗi chặng `with step("…")` (`from utils.steps import step`, **KHÔNG Allure**); assertion `expect()`; marker `@pytest.mark.integration` + domain; naming `TestFeatureIntegration` / `test_TC<NNN>_<snake>`.
|
|
23
|
+
|
|
24
|
+
## Phase 1 — Clarify
|
|
25
|
+
Đọc `.Test.md` · chuỗi tích hợp & chặng cần verify · client/fixture (API/DB/Kafka) đã có chưa · setup/teardown data.
|
|
26
|
+
|
|
27
|
+
## Phase 2 — Generate
|
|
28
|
+
Mỗi TC → 1 test theo data flow: gọi action → verify từng chặng (response/DB/event). Nhóm happy/contract-negative/failure-retry/concurrency/đồng bộ.
|
|
29
|
+
|
|
30
|
+
## Phase 3 — Verify
|
|
31
|
+
`py_compile` + `pytest --collect-only -q` · chạy (cần môi trường staging/CRM/Kafka) · cập nhật Status TC.
|
|
32
|
+
|
|
33
|
+
## Output
|
|
34
|
+
Script `tests/<project>/integration/test_<feature>.py` + client/fixture (DB/Kafka/API) nếu mới. Bàn giao `qa-reviewer`.
|
|
35
|
+
|
|
36
|
+
## Phase 4 — Report (bắt buộc sau khi chạy test)
|
|
37
|
+
Report = **Playwright Trace viewer + pytest-html** (KHÔNG Allure, KHÔNG dashboard tự viết).
|
|
38
|
+
|
|
39
|
+
1. Chạy test kèm pytest-html (trace đã bật sẵn ở conftest → mỗi test có `test-results/<nodeid>/trace.zip`):
|
|
40
|
+
```bash
|
|
41
|
+
pytest tests/<project>/integration/test_<feature>.py --html=reports/<feature>/report.html --self-contained-html
|
|
42
|
+
```
|
|
43
|
+
2. Gửi cho người dùng:
|
|
44
|
+
- HTML report: `reports/<feature>/report.html` (self-contained, mở trực tiếp).
|
|
45
|
+
- Trace từng test (debug step-by-step): `python3 -m playwright show-trace test-results/<nodeid>/trace.zip`.
|
|
46
|
+
- Tóm tắt: **TOTAL / PASS / FAIL / SKIP** + duration.
|
|
47
|
+
3. TC Fail → mở trace tương ứng để xem timeline/DOM snapshot/network, phân loại script-bug vs product-gap; ghi mô tả lỗi tiếng Việt dễ hiểu vào Status/khối kết quả của `.Test.md`.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Gen Script — Non-Functional
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa**: convert TC non-functional (performance/security/accessibility/compatibility) → script/đo. Chỉ cần load file này.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- Convert TC non-functional (output qa-designer non-functional) sang script/kịch bản đo; TC đã Reviewed
|
|
13
|
+
|
|
14
|
+
## Khi KHÔNG trigger
|
|
15
|
+
- Kiểm thử chức năng → `functional/*` · tích hợp → `integration.md`
|
|
16
|
+
|
|
17
|
+
## Quy ước script (bám CLAUDE.md)
|
|
18
|
+
- Tiền đề: `.Test.md` đã Reviewed, có **ngưỡng đo cụ thể**. KHÔNG hardcode → `Env.*`/`CONFIG`.
|
|
19
|
+
- Mỗi loại dùng công cụ phù hợp, gói trong fixture/helper:
|
|
20
|
+
- **Performance:** đo response time / throughput (pytest + timer, hoặc tích hợp k6/locust); assert ngưỡng.
|
|
21
|
+
- **Security:** test authZ (role không quyền → 403), input injection, PII không lộ, session/timeout, rate limit.
|
|
22
|
+
- **Accessibility:** axe-core/lighthouse qua Playwright; assert vi phạm = 0 ở mức WCAG mục tiêu.
|
|
23
|
+
- **Compatibility:** parametrize trình duyệt/thiết bị.
|
|
24
|
+
- Assert theo **ngưỡng pass** trong TC bằng `expect()`/`assert`; bọc bước `with step("…")` (`from utils.steps import step`, **KHÔNG Allure**); marker `@pytest.mark.{performance,security,accessibility}`.
|
|
25
|
+
|
|
26
|
+
## Phase 1 — Clarify
|
|
27
|
+
Đọc `.Test.md` · loại + ngưỡng + công cụ · môi trường/tải mẫu · data đặc biệt.
|
|
28
|
+
|
|
29
|
+
## Phase 2 — Generate
|
|
30
|
+
Mỗi TC → 1 test đo + assert ngưỡng; đánh dấu test cần môi trường/tải riêng (`@pytest.mark.slow`).
|
|
31
|
+
|
|
32
|
+
## Phase 3 — Verify
|
|
33
|
+
`py_compile` + collect · chạy (môi trường phù hợp) · cập nhật Status TC + số đo thực tế.
|
|
34
|
+
|
|
35
|
+
## Output
|
|
36
|
+
Script `tests/<project>/non_functional/test_<feature>.py` + helper đo/scan. Bàn giao `qa-reviewer`.
|
|
37
|
+
|
|
38
|
+
## Phase 4 — Report (bắt buộc sau khi chạy test)
|
|
39
|
+
Report = **Playwright Trace viewer + pytest-html** (KHÔNG Allure, KHÔNG dashboard tự viết).
|
|
40
|
+
|
|
41
|
+
1. Chạy test kèm pytest-html (trace đã bật sẵn ở conftest → mỗi test có `test-results/<nodeid>/trace.zip`):
|
|
42
|
+
```bash
|
|
43
|
+
pytest tests/<project>/non_functional/test_<feature>.py --html=reports/<feature>/report.html --self-contained-html
|
|
44
|
+
```
|
|
45
|
+
2. Gửi cho người dùng:
|
|
46
|
+
- HTML report: `reports/<feature>/report.html` (self-contained, mở trực tiếp) + số đo thực tế.
|
|
47
|
+
- Trace từng test (debug step-by-step): `python3 -m playwright show-trace test-results/<nodeid>/trace.zip`.
|
|
48
|
+
- Tóm tắt: **TOTAL / PASS / FAIL / SKIP** + duration.
|
|
49
|
+
3. TC Fail → mở trace tương ứng để xem timeline/DOM snapshot/network, phân loại script-bug vs product-gap; ghi mô tả lỗi tiếng Việt dễ hiểu + số đo vào Status/khối kết quả của `.Test.md`.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.1
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Report — Playwright Trace + pytest-html (stack chuẩn)
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa**: sinh report sau khi chạy test. Stack chuẩn dự án dùng **Playwright
|
|
10
|
+
Trace viewer** + **pytest-html** (KHÔNG Allure, KHÔNG dashboard tự viết). Chỉ cần load file này.
|
|
11
|
+
|
|
12
|
+
## Khi nào trigger
|
|
13
|
+
- Sau khi chạy test cần xuất report / xem lại bằng chứng (trace, screenshot).
|
|
14
|
+
|
|
15
|
+
## Cơ chế (đã dựng sẵn ở tests/conftest.py)
|
|
16
|
+
- **Trace viewer**: fixture `context` (root conftest) gọi `context.tracing.start(screenshots=True, snapshots=True, sources=True)`; teardown lưu `test-results/<nodeid>/trace.zip`.
|
|
17
|
+
- Xem: `python3 -m playwright show-trace test-results/<...>/trace.zip` → timeline + DOM snapshot + network + console (UI giống Playwright report bản JS).
|
|
18
|
+
- **pytest-html**: 1 file HTML self-contained. Hook `pytest_runtest_makereport` (root conftest) đính screenshot full-page khi FAIL/SKIP.
|
|
19
|
+
- Mặc định `reports/report.html` (pytest.ini). Theo feature: `--html=reports/<feature>/report.html --self-contained-html`.
|
|
20
|
+
|
|
21
|
+
## Quy trình
|
|
22
|
+
1. Chạy test với report theo feature:
|
|
23
|
+
```
|
|
24
|
+
python3 -m pytest tests/<project>/<file>.py \
|
|
25
|
+
--html=reports/<feature>/report.html --self-contained-html
|
|
26
|
+
```
|
|
27
|
+
(Trace tự bật trong conftest → test-results/<nodeid>/trace.zip cho mọi test.)
|
|
28
|
+
2. Báo path:
|
|
29
|
+
- HTML: `reports/<feature>/report.html` (on WSL, the Windows-accessible path is `\\wsl.localhost\<distro>\<repo-path>\reports\<feature>\report.html`).
|
|
30
|
+
- Trace TC fail: `test-results/<nodeid>/trace.zip` + lệnh `playwright show-trace`.
|
|
31
|
+
- Tóm tắt TOTAL / PASS / FAIL / SKIP + duration.
|
|
32
|
+
|
|
33
|
+
## Nguyên tắc
|
|
34
|
+
- KHÔNG dùng Allure, KHÔNG sinh dashboard HTML tự viết (đã bỏ utils/html_report.py & cộng sự).
|
|
35
|
+
- Evidence trung thực: trace + screenshot phản ánh đúng lần run; FAIL/gap giữ nguyên.
|
|
36
|
+
- `reports/` và `test-results/` đã gitignore (artifact nặng) — không commit.
|
|
37
|
+
- Interpreter `python3`; browser = the system/installed Chromium configured via `browser_type_launch_args` in the root conftest (see the qc-playwright module) — do not hard-code a binary path.
|
|
@@ -140,6 +140,13 @@ Suggest the logical next command based on workflow phase:
|
|
|
140
140
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
141
141
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
142
142
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
143
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
144
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
145
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
146
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
147
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
148
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
149
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
143
150
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
144
151
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
145
152
|
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
@@ -211,6 +211,13 @@ Suggest the logical next command based on workflow phase:
|
|
|
211
211
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
212
212
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
213
213
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
214
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
215
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
216
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
217
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
218
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
219
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
220
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
214
221
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
215
222
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
216
223
|
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
@@ -348,6 +355,13 @@ Suggest the logical next command based on workflow phase:
|
|
|
348
355
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
349
356
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
350
357
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
358
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
359
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
360
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
361
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
362
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
363
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
364
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
351
365
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
352
366
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
353
367
|
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
@@ -254,6 +254,13 @@ Suggest the logical next command based on workflow phase:
|
|
|
254
254
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
255
255
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
256
256
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
257
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
258
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
259
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
260
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
261
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
262
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
263
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
257
264
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
258
265
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
259
266
|
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
@@ -324,6 +331,8 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
324
331
|
- `paths.specs_dir` → BDD specs root
|
|
325
332
|
- `paths.prd_dir` → PRD documents root
|
|
326
333
|
- `paths.refinement_dir` → findings/review output dir
|
|
334
|
+
- `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
|
|
335
|
+
- `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
|
|
327
336
|
- `paths.product_definitions_dir` → product definitions root
|
|
328
337
|
- `paths.domain_knowledge_dir` → domain knowledge root
|
|
329
338
|
- `paths.business_dictionary` → path to business-dictionary.md
|
|
@@ -336,6 +345,8 @@ If `paths` section is absent, use these defaults:
|
|
|
336
345
|
- `specs_dir` = `specs/bdd`
|
|
337
346
|
- `prd_dir` = `specs/prd`
|
|
338
347
|
- `refinement_dir` = `.agent/review`
|
|
348
|
+
- `qc_dir` = `docs`
|
|
349
|
+
- `qc_skills_dir` = `.agent/skills/qc`
|
|
339
350
|
- `product_definitions_dir` = `specs/product-definition`
|
|
340
351
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
341
352
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
@@ -380,6 +391,7 @@ If `services` section is present:
|
|
|
380
391
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
381
392
|
- Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
|
|
382
393
|
- Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
|
|
394
|
+
- Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
|
|
383
395
|
|
|
384
396
|
> **Why under `spec_source`:** PRD, design-spec, domain knowledge, the **API contract (tech-docs)**, and tester feedback are all **cross-team artifacts** — they must live in the **shared spec repo** so every umbrella (FE/App/BE) reads the same source via `/sync`. Tech-docs specifically: BE authors the tech-design (API contract), commits + pushes it into the spec submodule (2-layer commit), and FE/App pull it on their next `/sync` to wire the real API in `/generate-code --phase=integration`. In single-service mode (no `spec_source`), these default under the repo root — still shared, same repo.
|
|
385
397
|
|
|
@@ -420,19 +432,41 @@ If the file does not exist → skip silently.
|
|
|
420
432
|
|
|
421
433
|
---
|
|
422
434
|
|
|
423
|
-
## Step 3 — [CRITICAL] Load CLAUDE.md
|
|
435
|
+
## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
|
|
424
436
|
|
|
425
437
|
*This is the highest-priority context — it defines HOW to write code and documents for this project.*
|
|
426
438
|
|
|
427
|
-
|
|
439
|
+
CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
|
|
440
|
+
architecture/coding standards compose correctly. The agent always sits at the umbrella
|
|
441
|
+
root, but the implementation code lives in a service submodule with its OWN stack,
|
|
442
|
+
architecture, and conventions — so the service's CLAUDE.md must win for code generation.
|
|
443
|
+
|
|
444
|
+
**Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
|
|
445
|
+
Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
|
|
446
|
+
whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
|
|
447
|
+
single-service mode) the project's only architecture + coding standards.
|
|
448
|
+
|
|
449
|
+
**Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
|
|
450
|
+
*Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
|
|
451
|
+
Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
|
|
452
|
+
the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
|
|
453
|
+
Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
|
|
454
|
+
coding standards, and error handling. Layer-1 values that the service does not redefine
|
|
455
|
+
(e.g. git conventions, banned patterns shared org-wide) remain in effect.
|
|
456
|
+
|
|
457
|
+
From the **merged** result, extract and store:
|
|
428
458
|
|
|
429
459
|
- **§1 Project Overview** → project name, language, framework, build/test commands, domains
|
|
430
|
-
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
|
|
431
|
-
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
|
|
432
|
-
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
|
|
433
|
-
- **§7 Git Conventions** → branch naming pattern, commit message format
|
|
460
|
+
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
|
|
461
|
+
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
|
|
462
|
+
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
|
|
463
|
+
- **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
|
|
434
464
|
|
|
435
|
-
|
|
465
|
+
**Resolution rules:**
|
|
466
|
+
- If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
|
|
467
|
+
- If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
|
|
468
|
+
- If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
|
|
469
|
+
- If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
|
|
436
470
|
|
|
437
471
|
---
|
|
438
472
|
|
|
@@ -532,7 +566,8 @@ Output exactly this block:
|
|
|
532
566
|
[CTX LOADED]
|
|
533
567
|
Stack : {language} / {framework} / {database}
|
|
534
568
|
Platform : {active_module} ({platform_type})
|
|
535
|
-
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
569
|
+
Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
570
|
+
CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
|
|
536
571
|
Ticket : {ticket_prefix}-
|
|
537
572
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
538
573
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
@@ -655,6 +690,13 @@ Suggest the logical next command based on workflow phase:
|
|
|
655
690
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
656
691
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
657
692
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
693
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
694
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
695
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
696
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
697
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
698
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
699
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
658
700
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
659
701
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
660
702
|
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
@@ -728,6 +770,8 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
728
770
|
- `paths.specs_dir` → BDD specs root
|
|
729
771
|
- `paths.prd_dir` → PRD documents root
|
|
730
772
|
- `paths.refinement_dir` → findings/review output dir
|
|
773
|
+
- `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
|
|
774
|
+
- `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
|
|
731
775
|
- `paths.product_definitions_dir` → product definitions root
|
|
732
776
|
- `paths.domain_knowledge_dir` → domain knowledge root
|
|
733
777
|
- `paths.business_dictionary` → path to business-dictionary.md
|
|
@@ -740,6 +784,8 @@ If `paths` section is absent, use these defaults:
|
|
|
740
784
|
- `specs_dir` = `specs/bdd`
|
|
741
785
|
- `prd_dir` = `specs/prd`
|
|
742
786
|
- `refinement_dir` = `.agent/review`
|
|
787
|
+
- `qc_dir` = `docs`
|
|
788
|
+
- `qc_skills_dir` = `.agent/skills/qc`
|
|
743
789
|
- `product_definitions_dir` = `specs/product-definition`
|
|
744
790
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
745
791
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
@@ -784,6 +830,7 @@ If `services` section is present:
|
|
|
784
830
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
785
831
|
- Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
|
|
786
832
|
- Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
|
|
833
|
+
- Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
|
|
787
834
|
|
|
788
835
|
> **Why under `spec_source`:** PRD, design-spec, domain knowledge, the **API contract (tech-docs)**, and tester feedback are all **cross-team artifacts** — they must live in the **shared spec repo** so every umbrella (FE/App/BE) reads the same source via `/sync`. Tech-docs specifically: BE authors the tech-design (API contract), commits + pushes it into the spec submodule (2-layer commit), and FE/App pull it on their next `/sync` to wire the real API in `/generate-code --phase=integration`. In single-service mode (no `spec_source`), these default under the repo root — still shared, same repo.
|
|
789
836
|
|
|
@@ -824,19 +871,41 @@ If the file does not exist → skip silently.
|
|
|
824
871
|
|
|
825
872
|
---
|
|
826
873
|
|
|
827
|
-
## Step 3 — [CRITICAL] Load CLAUDE.md
|
|
874
|
+
## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
|
|
828
875
|
|
|
829
876
|
*This is the highest-priority context — it defines HOW to write code and documents for this project.*
|
|
830
877
|
|
|
831
|
-
|
|
878
|
+
CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
|
|
879
|
+
architecture/coding standards compose correctly. The agent always sits at the umbrella
|
|
880
|
+
root, but the implementation code lives in a service submodule with its OWN stack,
|
|
881
|
+
architecture, and conventions — so the service's CLAUDE.md must win for code generation.
|
|
882
|
+
|
|
883
|
+
**Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
|
|
884
|
+
Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
|
|
885
|
+
whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
|
|
886
|
+
single-service mode) the project's only architecture + coding standards.
|
|
887
|
+
|
|
888
|
+
**Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
|
|
889
|
+
*Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
|
|
890
|
+
Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
|
|
891
|
+
the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
|
|
892
|
+
Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
|
|
893
|
+
coding standards, and error handling. Layer-1 values that the service does not redefine
|
|
894
|
+
(e.g. git conventions, banned patterns shared org-wide) remain in effect.
|
|
895
|
+
|
|
896
|
+
From the **merged** result, extract and store:
|
|
832
897
|
|
|
833
898
|
- **§1 Project Overview** → project name, language, framework, build/test commands, domains
|
|
834
|
-
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
|
|
835
|
-
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
|
|
836
|
-
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
|
|
837
|
-
- **§7 Git Conventions** → branch naming pattern, commit message format
|
|
899
|
+
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
|
|
900
|
+
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
|
|
901
|
+
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
|
|
902
|
+
- **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
|
|
838
903
|
|
|
839
|
-
|
|
904
|
+
**Resolution rules:**
|
|
905
|
+
- If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
|
|
906
|
+
- If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
|
|
907
|
+
- If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
|
|
908
|
+
- If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
|
|
840
909
|
|
|
841
910
|
---
|
|
842
911
|
|
|
@@ -936,7 +1005,8 @@ Output exactly this block:
|
|
|
936
1005
|
[CTX LOADED]
|
|
937
1006
|
Stack : {language} / {framework} / {database}
|
|
938
1007
|
Platform : {active_module} ({platform_type})
|
|
939
|
-
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
1008
|
+
Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
1009
|
+
CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
|
|
940
1010
|
Ticket : {ticket_prefix}-
|
|
941
1011
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
942
1012
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
@@ -1074,6 +1144,13 @@ Suggest the logical next command based on workflow phase:
|
|
|
1074
1144
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
1075
1145
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
1076
1146
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
1147
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
1148
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
1149
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
1150
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
1151
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
1152
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
1153
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
1077
1154
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
1078
1155
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
1079
1156
|
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
@@ -36,6 +36,8 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
36
36
|
- `paths.specs_dir` → BDD specs root
|
|
37
37
|
- `paths.prd_dir` → PRD documents root
|
|
38
38
|
- `paths.refinement_dir` → findings/review output dir
|
|
39
|
+
- `paths.qc_dir` → QC automation artifacts root (visible top-level, one subfolder per UC: `{qc_dir}/{UC-ID}/`)
|
|
40
|
+
- `paths.qc_skills_dir` → where qc-* commands load QC skills from (default bundled `.agent/skills/qc`; override to the QC team's own repo/submodule so framework upgrade won't overwrite them)
|
|
39
41
|
- `paths.product_definitions_dir` → product definitions root
|
|
40
42
|
- `paths.domain_knowledge_dir` → domain knowledge root
|
|
41
43
|
- `paths.business_dictionary` → path to business-dictionary.md
|
|
@@ -48,6 +50,8 @@ If `paths` section is absent, use these defaults:
|
|
|
48
50
|
- `specs_dir` = `specs/bdd`
|
|
49
51
|
- `prd_dir` = `specs/prd`
|
|
50
52
|
- `refinement_dir` = `.agent/review`
|
|
53
|
+
- `qc_dir` = `docs`
|
|
54
|
+
- `qc_skills_dir` = `.agent/skills/qc`
|
|
51
55
|
- `product_definitions_dir` = `specs/product-definition`
|
|
52
56
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
53
57
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
@@ -92,6 +96,7 @@ If `services` section is present:
|
|
|
92
96
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
93
97
|
- Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
|
|
94
98
|
- Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
|
|
99
|
+
- Override `paths.prd_change_requests_dir` → `{spec_source}/feedback/prd-change-requests`
|
|
95
100
|
|
|
96
101
|
> **Why under `spec_source`:** PRD, design-spec, domain knowledge, the **API contract (tech-docs)**, and tester feedback are all **cross-team artifacts** — they must live in the **shared spec repo** so every umbrella (FE/App/BE) reads the same source via `/sync`. Tech-docs specifically: BE authors the tech-design (API contract), commits + pushes it into the spec submodule (2-layer commit), and FE/App pull it on their next `/sync` to wire the real API in `/generate-code --phase=integration`. In single-service mode (no `spec_source`), these default under the repo root — still shared, same repo.
|
|
97
102
|
|
|
@@ -132,19 +137,41 @@ If the file does not exist → skip silently.
|
|
|
132
137
|
|
|
133
138
|
---
|
|
134
139
|
|
|
135
|
-
## Step 3 — [CRITICAL] Load CLAUDE.md
|
|
140
|
+
## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
|
|
136
141
|
|
|
137
142
|
*This is the highest-priority context — it defines HOW to write code and documents for this project.*
|
|
138
143
|
|
|
139
|
-
|
|
144
|
+
CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
|
|
145
|
+
architecture/coding standards compose correctly. The agent always sits at the umbrella
|
|
146
|
+
root, but the implementation code lives in a service submodule with its OWN stack,
|
|
147
|
+
architecture, and conventions — so the service's CLAUDE.md must win for code generation.
|
|
148
|
+
|
|
149
|
+
**Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
|
|
150
|
+
Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
|
|
151
|
+
whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
|
|
152
|
+
single-service mode) the project's only architecture + coding standards.
|
|
153
|
+
|
|
154
|
+
**Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
|
|
155
|
+
*Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
|
|
156
|
+
Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
|
|
157
|
+
the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
|
|
158
|
+
Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
|
|
159
|
+
coding standards, and error handling. Layer-1 values that the service does not redefine
|
|
160
|
+
(e.g. git conventions, banned patterns shared org-wide) remain in effect.
|
|
161
|
+
|
|
162
|
+
From the **merged** result, extract and store:
|
|
140
163
|
|
|
141
164
|
- **§1 Project Overview** → project name, language, framework, build/test commands, domains
|
|
142
|
-
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
|
|
143
|
-
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
|
|
144
|
-
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
|
|
145
|
-
- **§7 Git Conventions** → branch naming pattern, commit message format
|
|
165
|
+
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
|
|
166
|
+
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
|
|
167
|
+
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
|
|
168
|
+
- **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
|
|
146
169
|
|
|
147
|
-
|
|
170
|
+
**Resolution rules:**
|
|
171
|
+
- If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
|
|
172
|
+
- If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
|
|
173
|
+
- If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
|
|
174
|
+
- If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
|
|
148
175
|
|
|
149
176
|
---
|
|
150
177
|
|
|
@@ -244,7 +271,8 @@ Output exactly this block:
|
|
|
244
271
|
[CTX LOADED]
|
|
245
272
|
Stack : {language} / {framework} / {database}
|
|
246
273
|
Platform : {active_module} ({platform_type})
|
|
247
|
-
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
274
|
+
Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
275
|
+
CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
|
|
248
276
|
Ticket : {ticket_prefix}-
|
|
249
277
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
250
278
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
@@ -34,6 +34,13 @@ Suggest the logical next command based on workflow phase:
|
|
|
34
34
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
35
35
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
36
36
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
37
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
38
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
39
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
40
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
41
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
42
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
43
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
37
44
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
38
45
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
39
46
|
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|