@edupia-tutor/spec-driven-docs 0.14.0 → 0.14.1
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 +435 -435
- package/commands/debug.tmpl +111 -111
- package/commands/define-product.md +330 -327
- package/commands/define-product.tmpl +50 -47
- package/commands/dev-gen-test.md +364 -364
- package/commands/dev-gen-test.tmpl +63 -63
- package/commands/dev-run-test.md +375 -375
- package/commands/dev-run-test.tmpl +74 -74
- package/commands/dev-smoke-test.md +340 -340
- package/commands/dev-smoke-test.tmpl +60 -60
- package/commands/fix-bug.md +402 -402
- package/commands/fix-bug.tmpl +78 -78
- package/commands/generate-bdd.md +512 -512
- package/commands/generate-bdd.tmpl +211 -211
- package/commands/generate-code.md +480 -482
- package/commands/generate-code.tmpl +179 -181
- package/commands/generate-design-spec.md +495 -495
- package/commands/generate-design-spec.tmpl +219 -219
- package/commands/generate-prd.md +445 -396
- package/commands/generate-prd.tmpl +45 -198
- package/commands/generate-spec-manifest.md +337 -337
- package/commands/generate-spec-manifest.tmpl +57 -57
- package/commands/generate-tech-docs.md +364 -364
- package/commands/generate-tech-docs.tmpl +84 -84
- package/commands/learn.md +346 -346
- package/commands/learn.tmpl +22 -22
- package/commands/map-testids.md +321 -321
- package/commands/map-testids.tmpl +41 -41
- package/commands/propose-scenario.md +334 -334
- package/commands/propose-scenario.tmpl +54 -54
- package/commands/qc-analyze.md +322 -323
- package/commands/qc-analyze.tmpl +42 -43
- package/commands/qc-design-test.md +303 -303
- package/commands/qc-design-test.tmpl +23 -23
- package/commands/qc-plan.md +296 -296
- package/commands/qc-plan.tmpl +16 -16
- package/commands/qc-report.md +301 -301
- package/commands/qc-report.tmpl +21 -21
- package/commands/qc-review.md +297 -297
- package/commands/qc-review.tmpl +17 -17
- package/commands/qc-run-test.md +336 -336
- package/commands/qc-run-test.tmpl +35 -35
- package/commands/refine-prd.md +426 -428
- package/commands/refine-prd.tmpl +61 -61
- package/commands/report-bug.md +350 -350
- package/commands/report-bug.tmpl +70 -70
- package/commands/review-code.md +363 -363
- package/commands/review-code.tmpl +39 -39
- package/commands/review-context.md +577 -579
- package/commands/review-context.tmpl +212 -212
- package/commands/review-tech-docs.md +426 -426
- package/commands/review-tech-docs.tmpl +146 -146
- package/commands/setup-ai-first.md +237 -237
- package/commands/setup-ai-first.tmpl +131 -131
- package/commands/sync.md +145 -145
- package/commands/sync.tmpl +93 -93
- package/commands/update-framework.md +88 -88
- package/commands/update-framework.tmpl +36 -36
- package/commands/validate-traces.md +379 -379
- package/commands/validate-traces.tmpl +99 -99
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +435 -435
- package/core/commands/define-product.md +330 -327
- package/core/commands/dev-gen-test.md +364 -364
- package/core/commands/dev-run-test.md +375 -375
- package/core/commands/dev-smoke-test.md +340 -340
- package/core/commands/fix-bug.md +402 -402
- package/core/commands/generate-bdd.md +512 -512
- package/core/commands/generate-code.md +480 -482
- package/core/commands/generate-design-spec.md +495 -495
- package/core/commands/generate-prd.md +445 -396
- package/core/commands/generate-spec-manifest.md +337 -337
- package/core/commands/generate-tech-docs.md +364 -364
- package/core/commands/learn.md +346 -346
- package/core/commands/map-testids.md +321 -321
- package/core/commands/propose-scenario.md +334 -334
- package/core/commands/qc-analyze.md +322 -323
- package/core/commands/qc-design-test.md +303 -303
- package/core/commands/qc-plan.md +296 -296
- package/core/commands/qc-report.md +301 -301
- package/core/commands/qc-review.md +297 -297
- package/core/commands/qc-run-test.md +336 -336
- package/core/commands/refine-prd.md +426 -428
- package/core/commands/report-bug.md +350 -350
- package/core/commands/review-code.md +363 -363
- package/core/commands/review-context.md +577 -579
- package/core/commands/review-tech-docs.md +426 -426
- package/core/commands/setup-ai-first.md +237 -237
- package/core/commands/sync.md +145 -145
- package/core/commands/update-framework.md +88 -88
- package/core/commands/validate-traces.md +379 -379
- package/core/skills/code/SKILL.md +388 -388
- package/core/skills/debug/SKILL.md +390 -390
- package/core/skills/design-spec/SKILL.md +316 -316
- package/core/skills/discovery/SKILL.md +7 -547
- package/core/skills/prd/SKILL.md +298 -394
- package/core/skills/setup-ai-first/SKILL.md +79 -79
- package/core/skills/spec/SKILL.md +176 -176
- package/core/skills/test/SKILL.md +602 -602
- package/core/steps/capture-lesson.md +44 -44
- package/core/steps/context-loader.md +174 -174
- package/core/steps/gate.md +54 -54
- package/core/steps/report-footer.md +52 -52
- package/core/steps/review-fanout.md +85 -87
- package/core/steps/spawn-agent.md +45 -45
- package/core/steps/trace-mirror.md +21 -21
- package/core/templates/architecture.template.md +37 -37
- package/core/templates/design-spec.template.md +77 -77
- package/core/templates/platform-guide.template.md +47 -47
- package/core/templates/prd.template.md +106 -231
- package/core/templates/product-definition.template.md +101 -88
- package/docs/04-operations/publishing.md +20 -3
- package/package.json +1 -1
- package/skills/code/SKILL.md +388 -388
- package/skills/code/SKILL.tmpl +56 -56
- package/skills/debug/SKILL.md +390 -390
- package/skills/debug/SKILL.tmpl +60 -60
- package/skills/design-spec/SKILL.md +316 -316
- package/skills/design-spec/SKILL.tmpl +36 -36
- package/skills/discovery/SKILL.md +7 -547
- package/skills/discovery/SKILL.tmpl +7 -140
- package/skills/prd/SKILL.md +298 -394
- package/skills/prd/SKILL.tmpl +40 -151
- package/skills/setup-ai-first/SKILL.md +79 -79
- package/skills/setup-ai-first/SKILL.tmpl +27 -27
- package/skills/spec/SKILL.md +176 -176
- package/skills/spec/SKILL.tmpl +18 -18
- package/skills/test/SKILL.md +602 -602
- package/skills/test/SKILL.tmpl +44 -44
- package/steps/capture-lesson.md +44 -44
- package/steps/context-loader.md +174 -174
- package/steps/gate.md +54 -54
- package/steps/report-footer.md +52 -52
- package/steps/review-fanout.md +85 -87
- package/steps/spawn-agent.md +45 -45
- package/steps/trace-mirror.md +21 -21
- package/templates/architecture.template.md +37 -37
- package/templates/design-spec.template.md +77 -77
- package/templates/platform-guide.template.md +47 -47
- package/templates/prd.template.md +106 -231
- package/templates/product-definition.template.md +101 -88
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# /generate-code —
|
|
1
|
+
# /generate-code — Sinh Implementation Code
|
|
2
2
|
|
|
3
3
|
## Gate
|
|
4
4
|
{{include:steps/gate.md}}
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
*Lưu ý: Với lệnh này, target ở Bước 1 là một file `.feature` hoặc UC-ID. Nếu `$ARGUMENTS` là UC-ID, tìm file feature khớp bằng cách glob `{paths.specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` (wildcard `*` cho prd-slug chưa biết, `**` đệ quy để phủ các thư mục con platform `web/`·`app/`·`system/`); lấy `domain` + `prd_slug` từ path khớp. Cũng kiểm tra `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv` tìm drift (new vs drifted vs synced).*
|
|
7
7
|
|
|
8
8
|
## Context
|
|
9
9
|
{{include:steps/context-loader.md}}
|
|
@@ -12,303 +12,301 @@
|
|
|
12
12
|
|
|
13
13
|
## Scope Lock
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Lệnh này giới hạn nghiêm ngặt trong **một file feature** được truyền qua `$ARGUMENTS`:
|
|
16
16
|
|
|
17
|
-
-
|
|
18
|
-
- UC: `{UC-ID}` (
|
|
17
|
+
- File feature: `{path chính xác từ $ARGUMENTS}`
|
|
18
|
+
- UC: `{UC-ID}` (đọc từ `@trace.id` trong header file đó)
|
|
19
19
|
|
|
20
|
-
**
|
|
20
|
+
**KHÔNG đọc hay implement scenario từ bất kỳ file `.feature` nào khác** trong cùng folder domain, kể cả khi chúng dùng chung entity, khái niệm domain, hay tên service.
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
|
-
## Context Load (
|
|
24
|
+
## Context Load (bổ sung)
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
1.
|
|
28
|
-
2. Tech-doc
|
|
26
|
+
Đọc:
|
|
27
|
+
1. Chỉ file `.feature` đã giới hạn scope
|
|
28
|
+
2. Tech-doc tại `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design.md` (nếu tồn tại)
|
|
29
29
|
3. CLAUDE.md §architecture + §coding_standards
|
|
30
|
-
4. **(FE/App
|
|
30
|
+
4. **(chỉ FE/App)** Design Spec tại `{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-*{slug}.md` (nếu tồn tại) — nguồn của màn hình, component inventory, và link Figma frame từng-màn.
|
|
31
31
|
|
|
32
32
|
---
|
|
33
33
|
|
|
34
34
|
## Phase Detection
|
|
35
35
|
|
|
36
|
-
Parse `$ARGUMENTS`
|
|
36
|
+
Parse `$ARGUMENTS` tìm flag `--phase`:
|
|
37
37
|
|
|
38
|
-
| Flag |
|
|
38
|
+
| Flag | Ý nghĩa |
|
|
39
39
|
|---|---|
|
|
40
|
-
| `--phase=ui` | FE Phase 1 —
|
|
41
|
-
| `--phase=integration` | FE Phase 2 —
|
|
42
|
-
| *(
|
|
43
|
-
|
|
44
|
-
**
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
**
|
|
50
|
-
|
|
51
|
-
- **BE contract** `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design.md` —
|
|
52
|
-
- **System BDD** `{paths.specs_dir}/{domain}/{prd-slug}/bdd/system/{TICKET-ID}*.feature` —
|
|
40
|
+
| `--phase=ui` | FE Phase 1 — sinh UI + layer mock API từ System BDD contract |
|
|
41
|
+
| `--phase=integration` | FE Phase 2 — thay mock adapter bằng lời gọi API thật từ tech docs |
|
|
42
|
+
| *(không có)* | Default — full implementation (BE hoặc full-stack không tách mock) |
|
|
43
|
+
|
|
44
|
+
**Nếu `--phase` được set — xác nhận platform:**
|
|
45
|
+
Đọc `@trace.platform` từ header file feature.
|
|
46
|
+
- Nếu `system` → cảnh báo: "Flag `--phase` không áp dụng cho system BDD (hướng BE). Tiếp tục với chế độ default." Coi như không có flag.
|
|
47
|
+
- Nếu `web` hoặc `app` → tiếp tục logic phase bên dưới.
|
|
48
|
+
|
|
49
|
+
**Nếu `--phase=ui`:**
|
|
50
|
+
Phân giải **nguồn shape của mock** (hybrid — ưu tiên contract thật, fallback về System BDD):
|
|
51
|
+
- **BE contract** `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design.md` — nếu tồn tại, **shape** port/DTO của mock adapter (field request/response, type, error code) lấy từ đây → `mock_source = contract`. Chính xác nhất; không phải rework shape lúc integration.
|
|
52
|
+
- **System BDD** `{paths.specs_dir}/{domain}/{prd-slug}/bdd/system/{TICKET-ID}*.feature` — luôn nạp mệnh đề `Then` để lấy **behavior + giá trị fixture**. Nếu không có BE contract, shape cũng được infer từ đây → `mock_source = system-bdd`, và WARN:
|
|
53
53
|
```
|
|
54
|
-
⚠ BE contract
|
|
55
|
-
System BDD
|
|
56
|
-
|
|
57
|
-
(
|
|
54
|
+
⚠ Không tìm thấy BE contract — shape mock được infer chỉ từ System BDD.
|
|
55
|
+
System BDD mô tả behavior, không phải full request/response shape — mock
|
|
56
|
+
có thể khác API thật; dự kiến điều chỉnh ở --phase=integration.
|
|
57
|
+
(Khuyến nghị: để BE publish {prd-slug}/tech-docs/{UC-ID}-tech-design.md trước để có mock chính xác.)
|
|
58
58
|
```
|
|
59
|
-
-
|
|
59
|
+
- Nếu System BDD cũng thiếu → cảnh báo "Không tìm thấy System BDD — layer mock sẽ dùng fixture placeholder." Tiếp tục.
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
Lưu `mock_source` (`contract` | `system-bdd`) cho các tag mock bên dưới.
|
|
62
62
|
|
|
63
|
-
**
|
|
64
|
-
Spec
|
|
65
|
-
fidelity than a plain web link.
|
|
63
|
+
**Rồi chạy Figma Dev Mode MCP Check bên dưới** trước khi sinh UI — link frame của Design
|
|
64
|
+
Spec là visual contract, và MCP local đọc chúng với độ trung thực cao hơn nhiều so với link web trần.
|
|
66
65
|
|
|
67
66
|
---
|
|
68
67
|
|
|
69
|
-
## Figma Dev Mode MCP Check *(FE/App
|
|
68
|
+
## Figma Dev Mode MCP Check *(chỉ sinh UI FE/App)*
|
|
70
69
|
|
|
71
|
-
*
|
|
72
|
-
|
|
70
|
+
*Chỉ chạy khi `platform` là `web`/`app` VÀ đang sinh UI (`--phase=ui`, hoặc chế độ default
|
|
71
|
+
cho feature FE/App). Bỏ qua hoàn toàn với BE / platform `system`.*
|
|
73
72
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
PO viết Design Spec từ **link web Figma** (read-only, giới hạn). Để codegen,
|
|
74
|
+
**Figma Dev Mode MCP server local** (tích hợp trong **app desktop** Figma) cho nhiều hơn
|
|
75
|
+
nhiều: layout chính xác, **variable/token** design, mapping component **Code Connect**,
|
|
76
|
+
selection context, và code snippet — những thứ một URL web đơn không trả về được.
|
|
78
77
|
|
|
79
|
-
**Step 1 —
|
|
80
|
-
(
|
|
78
|
+
**Step 1 — Phát hiện MCP local.** Kiểm tra xem Figma Dev Mode MCP server có kết nối không
|
|
79
|
+
(một Figma tool kiểu `get_design_context` / `get_code` sẵn có qua MCP).
|
|
81
80
|
|
|
82
|
-
**Step 2 —
|
|
81
|
+
**Step 2 — Nếu CHƯA kết nối → gợi ý dev bật nó, rồi chờ:**
|
|
83
82
|
|
|
84
83
|
```
|
|
85
|
-
🎨 Figma Dev Mode MCP
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
1.
|
|
89
|
-
2.
|
|
90
|
-
3.
|
|
91
|
-
Figma
|
|
92
|
-
(
|
|
93
|
-
4.
|
|
94
|
-
5.
|
|
95
|
-
|
|
96
|
-
|
|
84
|
+
🎨 Không phát hiện Figma Dev Mode MCP.
|
|
85
|
+
Để có code FE chính xác (token, component, Code Connect thật), dùng server LOCAL:
|
|
86
|
+
|
|
87
|
+
1. Mở app Figma DESKTOP (không phải browser)
|
|
88
|
+
2. Mở file/frame của feature này
|
|
89
|
+
3. Bật Dev Mode MCP server:
|
|
90
|
+
Menu Figma → Preferences → "Enable Dev Mode MCP Server"
|
|
91
|
+
(cần Dev hoặc Full seat; server chạy ở http://127.0.0.1:3845)
|
|
92
|
+
4. Đảm bảo MCP server này đã được thêm vào config MCP của Claude Code
|
|
93
|
+
5. Chọn frame của màn bạn đang implement, rồi tiếp tục
|
|
94
|
+
|
|
95
|
+
Gõ C để tiếp tục khi đã bật, hoặc S để skip (fallback về link web + text spec).
|
|
97
96
|
```
|
|
98
97
|
|
|
99
|
-
- `C` →
|
|
100
|
-
- `S` →
|
|
101
|
-
|
|
98
|
+
- `C` → phát hiện lại; nếu giờ đã kết nối → tiếp tục dùng MCP local.
|
|
99
|
+
- `S` → tiếp tục ở **fallback mode**: chỉ dùng link frame web + text spec của Design Spec;
|
|
100
|
+
thêm note ⚠️ trong report cuối rằng UI được sinh mà không có độ trung thực Figma local.
|
|
102
101
|
|
|
103
|
-
**Step 3 —
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
real token names, not hardcoded values.
|
|
102
|
+
**Step 3 — Khi MCP local ĐÃ kết nối:** với mỗi màn đang implement, pull frame được chọn
|
|
103
|
+
qua Figma MCP và ground UI trên layout, variable, và mapping Code Connect trả về. Ưu tiên
|
|
104
|
+
component được map Code-Connect hơn là bịa markup; dùng tên token thật, không phải giá trị hardcode.
|
|
107
105
|
|
|
108
|
-
**
|
|
109
|
-
|
|
110
|
-
- **FE tech-design** (
|
|
111
|
-
- **BE API contract** (endpoint/shape
|
|
106
|
+
**Nếu `--phase=integration`:**
|
|
107
|
+
Phân giải design điều khiển adapter (hai tầng):
|
|
108
|
+
- **FE tech-design** (ưu tiên — mapping port→endpoint→DTO): `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design-{platform}.md` §4, sinh bởi `/generate-tech-docs` (path FE).
|
|
109
|
+
- **BE API contract** (nguồn endpoint/shape): `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design.md`.
|
|
112
110
|
|
|
113
|
-
|
|
114
|
-
|
|
111
|
+
Đọc `@trace.status` của cái nào điều khiển adapter (doc FE nếu có, else BE contract).
|
|
112
|
+
Nếu `draft` hoặc `in-review` → cảnh báo:
|
|
115
113
|
```
|
|
116
|
-
⚠ Tech design
|
|
117
|
-
Contract / adapter
|
|
118
|
-
|
|
114
|
+
⚠ Tech design cho {UC-ID} ({platform}) đang {status}.
|
|
115
|
+
Contract / mapping adapter còn có thể đổi.
|
|
116
|
+
Tiếp tục — đảm bảo BE endpoint đã deploy hoặc confirm mapping thủ công.
|
|
119
117
|
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
118
|
+
Nếu FE tech-design **thiếu** → cảnh báo: "Không tìm thấy FE tech-design — fallback về BE contract trực tiếp (mapping adapter được infer). Khuyến nghị: chạy `/generate-tech-docs {web|app .feature}` trước."
|
|
119
|
+
Định vị mock adapter có sẵn từ lần chạy `--phase=ui` (tìm `{UC-ID}MockApiAdapter` trong `{paths.src_dir}/{domain}/`).
|
|
120
|
+
Nếu không tìm thấy → cảnh báo: "Không tìm thấy mock adapter — sinh real API adapter từ đầu dùng contract tech-doc."
|
|
123
121
|
|
|
124
122
|
---
|
|
125
123
|
|
|
126
124
|
## Read Trace State
|
|
127
125
|
|
|
128
|
-
|
|
126
|
+
Đọc `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv` nếu tồn tại. Với mỗi scenario row, ghi nhận `status` hiện tại:
|
|
129
127
|
|
|
130
|
-
| Status |
|
|
128
|
+
| Status | Ý nghĩa | Hành động trong lần chạy này |
|
|
131
129
|
|--------|---------|-------------------|
|
|
132
|
-
| `UNTRACKED` | `implemented_by == —` | Generate — scenario
|
|
133
|
-
| `DRIFT` | `spec_ver != gen_ver` | Regenerate — scenario
|
|
134
|
-
| `OK` |
|
|
135
|
-
| `GAP` |
|
|
130
|
+
| `UNTRACKED` | `implemented_by == —` | Generate — scenario chưa có code |
|
|
131
|
+
| `DRIFT` | `spec_ver != gen_ver` | Regenerate — scenario đã cập nhật từ lần codegen trước |
|
|
132
|
+
| `OK` | đã implement + test | Skip trừ khi gen lại tường minh |
|
|
133
|
+
| `GAP` | đã implement, chưa test | Skip codegen — đã code rồi; chạy `/dev-gen-test` thay vì |
|
|
136
134
|
|
|
137
|
-
|
|
138
|
-
|
|
135
|
+
Dùng các status này để điền số **Scenarios** trong plan CHECKPOINT (`{X} new, {Y} drifted, {Z} synced-skip`).
|
|
136
|
+
Nếu `.tsv` không tồn tại → coi mọi scenario là `UNTRACKED`.
|
|
139
137
|
|
|
140
138
|
---
|
|
141
139
|
|
|
142
140
|
## File Scan
|
|
143
141
|
|
|
144
|
-
|
|
142
|
+
Trước khi sinh, xác định file nào cần cho các scenario của UC này. Kiểm tra mỗi file đã tồn tại trên disk chưa.
|
|
145
143
|
|
|
146
|
-
|
|
144
|
+
Phân loại mỗi file:
|
|
147
145
|
|
|
148
|
-
| Status |
|
|
146
|
+
| Status | Ý nghĩa | Hành động |
|
|
149
147
|
|--------|---------|--------|
|
|
150
|
-
| `CREATE` | File
|
|
151
|
-
| `EXTEND` | File
|
|
152
|
-
| `SKIP` | File
|
|
148
|
+
| `CREATE` | File chưa tồn tại | Sinh file mới đầy đủ |
|
|
149
|
+
| `EXTEND` | File tồn tại, cần method mới | Chỉ thêm method mới — KHÔNG viết lại code có sẵn |
|
|
150
|
+
| `SKIP` | File tồn tại và đã phủ tất cả scenario của UC | Để nguyên |
|
|
153
151
|
|
|
154
|
-
> **EXTEND
|
|
152
|
+
> **Quy tắc EXTEND:** Đọc file có sẵn đầy đủ. Định vị đúng class/interface. Chỉ thêm các method mà scenario `{UC-ID}` cần. Giữ nguyên mọi method, field, annotation hiện có y như cũ. Gắn `@trace.implements={UC-ID}-SC{N}` lên mỗi method mới.
|
|
155
153
|
|
|
156
154
|
---
|
|
157
155
|
|
|
158
156
|
## CHECKPOINT — Code Generation Plan
|
|
159
157
|
|
|
160
|
-
|
|
158
|
+
Trước khi sinh code, hiện:
|
|
161
159
|
|
|
162
160
|
```
|
|
163
161
|
Code Generation Plan — {UC-ID}
|
|
164
162
|
──────────────────────────────────────────────────────
|
|
165
163
|
Feature : {name}
|
|
166
|
-
Ticket : {TICKET_ID
|
|
164
|
+
Ticket : {TICKET_ID nếu biết}
|
|
167
165
|
Domain : {domain}
|
|
168
|
-
UC : {UC-ID}
|
|
166
|
+
UC : chỉ {UC-ID} ← các file feature khác trong folder này KHÔNG được đọc
|
|
169
167
|
Tech : {language} / {framework}
|
|
170
|
-
Phase : {UI — mock layer | Integration — real API | Default — full} ←
|
|
168
|
+
Phase : {UI — mock layer | Integration — real API | Default — full} ← bỏ nếu không có flag --phase
|
|
171
169
|
Scenarios: {N} total ({X} new, {Y} drifted, {Z} synced-skip)
|
|
172
|
-
Layer : {
|
|
170
|
+
Layer : {từ CLAUDE.md §2}
|
|
173
171
|
|
|
174
172
|
Files:
|
|
175
|
-
CREATE {N}
|
|
173
|
+
CREATE {N} file mới
|
|
176
174
|
+ {path/FileName.ext}
|
|
177
|
-
EXTEND {M}
|
|
178
|
-
~ {path/FileName.ext} —
|
|
179
|
-
SKIP {K}
|
|
175
|
+
EXTEND {M} file có sẵn (chỉ thêm method)
|
|
176
|
+
~ {path/FileName.ext} — thêm: {methodA}, {methodB}
|
|
177
|
+
SKIP {K} file (không cần đổi)
|
|
180
178
|
= {path/FileName.ext}
|
|
181
179
|
──────────────────────────────────────────────────────
|
|
182
180
|
Proceed? (Y/N)
|
|
183
181
|
```
|
|
184
182
|
|
|
185
|
-
|
|
183
|
+
Chờ "Y" rõ ràng trước khi sinh.
|
|
186
184
|
|
|
187
185
|
## Branch
|
|
188
186
|
```bash
|
|
189
187
|
git checkout -b feature/{TICKET_ID}-{slug}
|
|
190
188
|
```
|
|
191
189
|
|
|
192
|
-
## Generate (layer
|
|
190
|
+
## Generate (thứ tự layer từ CLAUDE.md §2)
|
|
193
191
|
|
|
194
|
-
|
|
195
|
-
DTOs → Entity/Model → Repository → Service interface → Service impl → Facade (
|
|
192
|
+
Thứ tự mặc định (override từ CLAUDE.md nếu khác):
|
|
193
|
+
DTOs → Entity/Model → Repository → Service interface → Service impl → Facade (nếu áp dụng) → Controller
|
|
196
194
|
|
|
197
|
-
**
|
|
195
|
+
**Với file `CREATE`:** sinh file đầy đủ.
|
|
198
196
|
|
|
199
|
-
**
|
|
197
|
+
**Với file `EXTEND`:** mở file có sẵn → chỉ thêm method mới cho `{UC-ID}` → không đụng gì khác.
|
|
200
198
|
|
|
201
|
-
**
|
|
199
|
+
**Tag traceability trên controller/handler (theo cú pháp comment của ngôn ngữ bạn):**
|
|
202
200
|
```
|
|
203
201
|
@trace.implements={UC-ID}-SC{N}
|
|
204
|
-
@trace.prd_version={
|
|
205
|
-
@trace.bdd_version={
|
|
206
|
-
@trace.tech_doc_revision={
|
|
202
|
+
@trace.prd_version={đọc @trace.prd_version từ header file .feature}
|
|
203
|
+
@trace.bdd_version={đọc @trace.bdd_version từ header file .feature}
|
|
204
|
+
@trace.tech_doc_revision={đọc @trace.revision từ header tech-doc, hoặc bỏ nếu không có tech-doc}
|
|
207
205
|
@trace.source={paths.specs_dir}/{domain}/{prd-slug}/bdd/{UC-ID}-{slug}.feature
|
|
208
206
|
```
|
|
209
207
|
|
|
210
|
-
`@trace.prd_version`
|
|
211
|
-
`@trace.bdd_version`
|
|
212
|
-
`@trace.tech_doc_revision`
|
|
213
|
-
`/validate-traces`
|
|
208
|
+
`@trace.prd_version` ghi code này được viết theo version PRD nào.
|
|
209
|
+
`@trace.bdd_version` ghi code này được sinh từ version BDD nào.
|
|
210
|
+
`@trace.tech_doc_revision` ghi code này theo revision tech-design nào.
|
|
211
|
+
`/validate-traces` sẽ gắn cờ drift nếu bất kỳ artifact upstream nào được cập nhật lên version mới hơn.
|
|
214
212
|
|
|
215
|
-
> **
|
|
213
|
+
> **Quy tắc entry-point:** `@trace.implements` phải xuất hiện ở **layer entry-point** như định nghĩa trong `CLAUDE.md §2`. Với REST API → Controller. Với module event-driven → event handler / consumer class. Với context-engineering → hàm orchestration prompt. Không bao giờ chỉ đặt ở layer trong.
|
|
216
214
|
|
|
217
|
-
### Test Selectors — emit
|
|
215
|
+
### Test Selectors — emit element ID ổn định *(chỉ UI FE/App)*
|
|
218
216
|
|
|
219
|
-
|
|
217
|
+
*Áp dụng khi `platform` là `web`/`app` và đang sinh UI (`--phase=ui`, hoặc chế độ default FE/App). Bỏ qua với BE.*
|
|
220
218
|
|
|
221
|
-
|
|
219
|
+
Mỗi element **có action** (button, input, link, select, toggle, form-submit) PHẢI mang một **test-id ổn định** để QC định vị trực tiếp (không scan runtime):
|
|
222
220
|
|
|
223
|
-
1. **
|
|
224
|
-
2. **Emit
|
|
221
|
+
1. **Nguồn id.** Nếu FE tech-design `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design-{platform}.md` tồn tại, lấy id **nguyên văn** từ bảng §2b Test Selectors của nó (contract). Nếu chưa tồn tại (vd `--phase=ui` trước FE tech-design), **sinh id theo quy ước** `{uc-lower}-{screen}-{element}-{type}` (vd `ft001-login-submit-btn`) để QC vẫn có handle ổn định — chúng sẽ được đối chiếu với §2b của tech-design lúc integration.
|
|
222
|
+
2. **Emit qua attribute platform** (từ `@trace.testid_attr`, hoặc theo module):
|
|
225
223
|
- web (`react`/`nextjs`/`vue`/`angular`) → `data-testid="..."`
|
|
226
224
|
- React Native → `testID="..."`
|
|
227
|
-
- Flutter → `Key('...')` (+ `Semantics(identifier: '...')`
|
|
225
|
+
- Flutter → `Key('...')` (+ `Semantics(identifier: '...')` khi action cần)
|
|
228
226
|
- native iOS → `accessibilityIdentifier = "..."`
|
|
229
|
-
3.
|
|
230
|
-
4. **
|
|
227
|
+
3. Chỉ element có action; đừng spam id lên text tĩnh. Giữ id giống hệt map của tech-design để QC Page Object khớp ngay lần đầu.
|
|
228
|
+
4. **Component catalog tái dùng?** Truyền id qua **forwarding prop** của nó (xem section catalog `## Test-ID Forwarding` — vd `<Button testId="ft001-login-submit-btn">`), không phải attribute thô. Nếu component không forward test-id, hoặc bạn đang backfill màn **existing/brownfield** (không phải sinh mới ở đây), đó là việc của `/map-testids {UC-ID}` — chạy nó thay vì sửa component dùng chung inline.
|
|
231
229
|
|
|
232
|
-
## Mock API Layer (`--phase=ui`
|
|
230
|
+
## Mock API Layer (chỉ `--phase=ui`)
|
|
233
231
|
|
|
234
|
-
*
|
|
232
|
+
*Bỏ qua hoàn toàn section này nếu `--phase` không phải `ui`.*
|
|
235
233
|
|
|
236
|
-
|
|
234
|
+
Dựng mock từ `mock_source` đã phân giải ở Phase Detection — **shape** từ BE contract khi có, **giá trị fixture + behavior** luôn từ mệnh đề `Then` của System BDD:
|
|
237
235
|
|
|
238
|
-
1.
|
|
239
|
-
- `mock_source = contract` → field
|
|
240
|
-
- `mock_source = system-bdd` → shape **
|
|
241
|
-
2. **
|
|
242
|
-
3. **
|
|
243
|
-
- Implements interface `{UC-ID}ApiPort` (
|
|
244
|
-
-
|
|
245
|
-
-
|
|
246
|
-
-
|
|
236
|
+
1. **Định nghĩa shape port** `{UC-ID}ApiPort` (DTO request/response + error code):
|
|
237
|
+
- `mock_source = contract` → tên field / type / error code lấy **nguyên văn từ BE contract** §2 (API Endpoints) / §3 (Data Model) — shape thật.
|
|
238
|
+
- `mock_source = system-bdd` → shape **infer** từ mệnh đề `Then` của System BDD (tạm — xem cảnh báo ở trên).
|
|
239
|
+
2. **Trích dữ liệu fixture** theo từng scenario từ mệnh đề `Then` của System BDD — response success + error (BDD là source of truth cho *giá trị / behavior*, bất kể nguồn shape).
|
|
240
|
+
3. **Sinh mock adapter** tại `{paths.src_dir}/{domain}/{UC-ID}MockApiAdapter.{ext}`:
|
|
241
|
+
- Implements interface `{UC-ID}ApiPort` (cùng interface mà real adapter sẽ implement)
|
|
242
|
+
- Mỗi method trả về fixture data khớp mệnh đề `Then` của BDD, theo shape của port
|
|
243
|
+
- Gồm cả trạng thái success và error (map sang các error scenario trong BDD)
|
|
244
|
+
- Tag traceability:
|
|
247
245
|
```
|
|
248
246
|
@trace.mock_for={UC-ID}
|
|
249
247
|
@trace.mock_source={contract | system-bdd}
|
|
250
248
|
@trace.system_bdd={paths.specs_dir}/{domain}/{prd-slug}/bdd/system/{UC-ID}*.feature
|
|
251
|
-
{@trace.be_contract={UC-ID}-tech-design.md #
|
|
249
|
+
{@trace.be_contract={UC-ID}-tech-design.md # chỉ khi mock_source=contract}
|
|
252
250
|
```
|
|
253
|
-
4. **Wire
|
|
251
|
+
4. **Wire vào layer service/hook** qua environment flag hoặc DI:
|
|
254
252
|
```
|
|
255
253
|
const adapter = IS_MOCK ? new {UC-ID}MockApiAdapter() : new {UC-ID}ApiAdapter()
|
|
256
254
|
```
|
|
257
|
-
- `IS_MOCK`
|
|
255
|
+
- `IS_MOCK` mặc định `true` ở môi trường development/test cho tới khi real adapter được sinh.
|
|
258
256
|
|
|
259
|
-
> Tester
|
|
260
|
-
> Shape
|
|
257
|
+
> Tester dùng mock adapter để test mọi FE scenario mà không cần đợi BE **deploy**.
|
|
258
|
+
> Shape lấy từ BE contract khi có (chính xác, không rework integration); else từ System BDD (tạm — điều chỉnh ở `--phase=integration`). Giá trị fixture luôn từ System BDD — BDD là source of truth cho behavior.
|
|
261
259
|
|
|
262
260
|
---
|
|
263
261
|
|
|
264
|
-
## Integration Phase (`--phase=integration`
|
|
262
|
+
## Integration Phase (chỉ `--phase=integration`)
|
|
265
263
|
|
|
266
|
-
*
|
|
264
|
+
*Bỏ qua hoàn toàn section này nếu `--phase` không phải `integration`.*
|
|
267
265
|
|
|
268
|
-
1.
|
|
269
|
-
2.
|
|
270
|
-
3. **
|
|
271
|
-
- Implements
|
|
272
|
-
-
|
|
273
|
-
-
|
|
274
|
-
-
|
|
266
|
+
1. **Đọc integration design.** Ưu tiên FE tech-design §4 (mapping port→endpoint→DTO→error) tại `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design-{platform}.md`, dùng BE API contract `{UC-ID}-tech-design.md` làm nguồn endpoint / request-response / error-code. Nếu không có FE tech-design, trích endpoint + shape + error code trực tiếp từ BE contract.
|
|
267
|
+
2. **Đọc mock adapter có sẵn** interface (`{UC-ID}ApiPort`) từ output `--phase=ui`.
|
|
268
|
+
3. **Sinh real API adapter** tại `{paths.src_dir}/{domain}/{UC-ID}ApiAdapter.{ext}`:
|
|
269
|
+
- Implements cùng interface `{UC-ID}ApiPort` như mock adapter
|
|
270
|
+
- Gọi HTTP thật tới endpoint từ contract tech-doc
|
|
271
|
+
- Map field response sang cùng shape mà mock adapter trả về
|
|
272
|
+
- Tag traceability:
|
|
275
273
|
```
|
|
276
274
|
@trace.implements={UC-ID}-SC{N}
|
|
277
|
-
@trace.tech_doc_revision={
|
|
275
|
+
@trace.tech_doc_revision={đọc từ header tech-doc}
|
|
278
276
|
```
|
|
279
|
-
4. **
|
|
280
|
-
5. **
|
|
277
|
+
4. **Lật wire-up**: chuyển DI binding / env flag để service/hook dùng `{UC-ID}ApiAdapter` (thật) thay vì mock.
|
|
278
|
+
5. **KHÔNG xoá mock adapter** — giữ lại cho unit test.
|
|
281
279
|
|
|
282
280
|
---
|
|
283
281
|
|
|
284
|
-
## Self-Review (3
|
|
285
|
-
- [ ]
|
|
286
|
-
- [ ] @trace.implements
|
|
287
|
-
- [ ]
|
|
288
|
-
- [ ] Error handling
|
|
289
|
-
- [ ]
|
|
282
|
+
## Self-Review (3 vòng)
|
|
283
|
+
- [ ] Mỗi scenario có endpoint tương ứng
|
|
284
|
+
- [ ] @trace.implements trên mọi endpoint
|
|
285
|
+
- [ ] Tôn trọng quy tắc layer kiến trúc (CLAUDE.md §2)
|
|
286
|
+
- [ ] Error handling khớp CLAUDE.md §5
|
|
287
|
+
- [ ] Không magic number, không debug logging
|
|
290
288
|
|
|
291
289
|
## Build Verify
|
|
292
290
|
```bash
|
|
293
|
-
{conventions.build_command} #
|
|
291
|
+
{conventions.build_command} # từ project-context.yaml, tối đa 3 retry
|
|
294
292
|
```
|
|
295
293
|
|
|
296
294
|
## Write Trace State
|
|
297
295
|
|
|
298
|
-
|
|
296
|
+
Cập nhật `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv` — với mỗi scenario đã implement, tìm row có sẵn theo `sc_id` và chỉ cập nhật các cột sau. *(Umbrella + `spec_source`: `trace_dir` phân giải về `{spec_source}/.trace` — lệnh này chạy từ `service_root` nhưng ghi trace row vào **spec repo** (liên-repo); commit/push spec submodule cho lần cập nhật trace, cùng với push code 2 tầng.)*
|
|
299
297
|
|
|
300
|
-
|
|
|
298
|
+
| Cột | Giá trị |
|
|
301
299
|
|--------|-------|
|
|
302
|
-
| `gen_ver` | copy `spec_ver`
|
|
300
|
+
| `gen_ver` | copy `spec_ver` từ row `.tsv` hiện tại (= version scenario tại thời điểm codegen) |
|
|
303
301
|
| `implemented_by` | `{ControllerClass}.{methodName}` |
|
|
304
|
-
| `bdd_version` | `@trace.bdd_version`
|
|
305
|
-
| `tech_doc_revision` | `@trace.revision`
|
|
306
|
-
| `fe_tech_doc_revision` | `@trace.revision`
|
|
307
|
-
| `fe_phase` | `ui`
|
|
308
|
-
| `last_updated` |
|
|
302
|
+
| `bdd_version` | `@trace.bdd_version` từ header `.feature` |
|
|
303
|
+
| `tech_doc_revision` | `@trace.revision` từ **BE** contract `{UC-ID}-tech-design.md`, hoặc `—` nếu không có |
|
|
304
|
+
| `fe_tech_doc_revision` | `@trace.revision` từ **FE** tech-design `{UC-ID}-tech-design-{platform}.md` khi sinh FE với `--phase=integration` (doc có §4 điều khiển adapter này); `—` cho BE, hoặc cho FE `--phase=ui` / không có FE tech-design |
|
|
305
|
+
| `fe_phase` | `ui` nếu `--phase=ui` \| `integrated` nếu `--phase=integration` \| `—` nếu không có flag phase |
|
|
306
|
+
| `last_updated` | hôm nay `YYYY-MM-DD` |
|
|
309
307
|
|
|
310
|
-
|
|
311
|
-
`status`
|
|
308
|
+
Giữ nguyên mọi cột khác (`sc_title`, `spec_ver`, `prd_version`, `prd_status`, `uc_status`, `test_count`, `test_classes`, `dev_selftest`, `dev_selftest_at`, `qc_status`, `qc_run_at`, `qc_owner`, `qc_blocked_by`).
|
|
309
|
+
`status` được tính bởi `/validate-traces` — không set ở đây.
|
|
312
310
|
|
|
313
311
|
## Refresh Panel Mirror
|
|
314
312
|
{{include:steps/trace-mirror.md}}
|
|
@@ -324,26 +322,26 @@ git commit -m "{commit_format}: {description}"
|
|
|
324
322
|
{{include:steps/report-footer.md}}
|
|
325
323
|
|
|
326
324
|
```
|
|
327
|
-
/generate-code
|
|
325
|
+
/generate-code Hoàn tất — {UC-ID}
|
|
328
326
|
Files: created={N}, extended={M}, skipped={K} | Build: SUCCESS
|
|
329
327
|
Branch: feature/{TICKET_ID}-{slug}
|
|
330
328
|
Phase : {UI (mock layer) | Integration (real API) | Default (full)}
|
|
331
329
|
fe_phase : {ui | integrated | —}
|
|
332
|
-
Figma : {
|
|
330
|
+
Figma : {Dev Mode MCP local (grounded) | ⚠️ chỉ link web + text spec (không có MCP local) | n/a cho BE} ← chỉ UI FE/App
|
|
333
331
|
|
|
334
332
|
Next:
|
|
335
|
-
--phase=ui
|
|
336
|
-
→
|
|
337
|
-
→
|
|
338
|
-
→
|
|
333
|
+
--phase=ui xong:
|
|
334
|
+
→ Báo tester: FE test được qua mock adapter
|
|
335
|
+
→ Thu sign-off BE → /review-tech-docs {tech-design-file}
|
|
336
|
+
→ Khi BE sẵn sàng → /generate-code {feature-file} --phase=integration
|
|
339
337
|
|
|
340
|
-
--phase=integration
|
|
341
|
-
→ /review-code {UC-ID} ← code review
|
|
342
|
-
→ /dev-gen-test {UC-ID} ← integration test
|
|
338
|
+
--phase=integration xong:
|
|
339
|
+
→ /review-code {UC-ID} ← cần code review
|
|
340
|
+
→ /dev-gen-test {UC-ID} ← bộ integration test
|
|
343
341
|
|
|
344
|
-
Default (
|
|
345
|
-
→ /review-code {UC-ID} ← code review
|
|
342
|
+
Default (không có flag phase):
|
|
343
|
+
→ /review-code {UC-ID} ← cần code review trước khi test
|
|
346
344
|
→ /dev-gen-test {UC-ID}
|
|
347
345
|
|
|
348
|
-
📊 Living Docs:
|
|
346
|
+
📊 Living Docs: chạy /validate-traces (hoặc /sync) để push trace này lên dashboard spec-module.
|
|
349
347
|
```
|