@edupia-tutor/spec-driven-docs 0.14.7 → 0.14.8
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/generate-bdd.md +59 -4
- package/commands/generate-bdd.tmpl +59 -4
- package/commands/generate-code.md +18 -1
- package/commands/generate-code.tmpl +18 -1
- package/commands/generate-design-spec.md +35 -5
- package/commands/generate-design-spec.tmpl +35 -5
- package/commands/generate-prd.md +7 -4
- package/commands/generate-tech-docs.md +1 -0
- package/commands/generate-tech-docs.tmpl +1 -0
- package/commands/propose-scenario.md +6 -2
- package/commands/propose-scenario.tmpl +6 -2
- package/commands/qc-analyze.md +14 -0
- package/commands/qc-analyze.tmpl +14 -0
- package/commands/refine-prd.md +15 -4
- package/commands/refine-prd.tmpl +15 -4
- package/commands/review-context.md +15 -11
- package/commands/review-context.tmpl +15 -11
- package/commands/validate-traces.md +1 -0
- package/commands/validate-traces.tmpl +1 -0
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/generate-bdd.md +59 -4
- package/core/commands/generate-code.md +18 -1
- package/core/commands/generate-design-spec.md +35 -5
- package/core/commands/generate-prd.md +7 -4
- package/core/commands/generate-tech-docs.md +1 -0
- package/core/commands/propose-scenario.md +6 -2
- package/core/commands/qc-analyze.md +14 -0
- package/core/commands/refine-prd.md +15 -4
- package/core/commands/review-context.md +15 -11
- package/core/commands/validate-traces.md +1 -0
- package/core/skills/code/SKILL.md +7 -759
- package/core/skills/debug/SKILL.md +9 -859
- package/core/skills/design-spec/SKILL.md +3 -582
- package/core/skills/prd/SKILL.md +5 -464
- package/core/skills/setup-ai-first/SKILL.md +3 -208
- package/core/skills/spec/SKILL.md +7 -450
- package/core/skills/test/SKILL.md +10 -1290
- package/core/steps/spawn-agent.md +12 -7
- package/core/templates/prd.template.md +7 -4
- package/docs/01-getting-started/core-concepts.md +2 -2
- package/docs/01-getting-started/quickstart.md +4 -3
- package/docs/02-guides/bdd-input-checklist.md +68 -0
- package/docs/02-guides/developer/README.md +3 -0
- package/docs/02-guides/developer/bdd-and-trace.md +1 -0
- package/docs/02-guides/developer/commands.md +3 -3
- package/docs/02-guides/developer/pr-checklist.md +1 -0
- package/docs/02-guides/developer/workflow.md +2 -2
- package/docs/02-guides/prd-input-checklist.md +94 -0
- package/docs/02-guides/product-owner/README.md +3 -1
- package/docs/02-guides/product-owner/commands.md +1 -1
- package/docs/02-guides/tech-docs-input-checklist.md +82 -0
- package/docs/02-guides/tester/README.md +1 -1
- package/docs/02-guides/tester/bug-reporting.md +1 -1
- package/docs/02-guides/tester/qc-automation.md +1 -1
- package/docs/03-concepts/README.md +1 -0
- package/docs/03-concepts/mechanisms-explained.md +34 -0
- package/docs/03-concepts/pipeline.md +12 -9
- package/docs/03-concepts/traceability.md +4 -1
- package/docs/04-operations/bug-flow.md +2 -0
- package/docs/05-reference/command-cheatsheet.md +8 -8
- package/docs/05-reference/commands.md +12 -10
- package/docs/05-reference/trace-schema.md +2 -1
- package/package.json +1 -1
- package/skills/code/SKILL.md +7 -759
- package/skills/code/SKILL.tmpl +7 -164
- package/skills/debug/SKILL.md +9 -859
- package/skills/debug/SKILL.tmpl +9 -252
- package/skills/design-spec/SKILL.md +3 -582
- package/skills/design-spec/SKILL.tmpl +3 -87
- package/skills/prd/SKILL.md +5 -464
- package/skills/prd/SKILL.tmpl +5 -63
- package/skills/setup-ai-first/SKILL.md +3 -208
- package/skills/setup-ai-first/SKILL.tmpl +3 -108
- package/skills/spec/SKILL.md +7 -450
- package/skills/spec/SKILL.tmpl +7 -162
- package/skills/test/SKILL.md +10 -1290
- package/skills/test/SKILL.tmpl +10 -288
- package/steps/spawn-agent.md +12 -7
- package/templates/prd.template.md +7 -4
package/core/skills/prd/SKILL.md
CHANGED
|
@@ -4,475 +4,16 @@ description: Sinh PRD từ một product definition, hoặc phân tích một PR
|
|
|
4
4
|
|
|
5
5
|
# PRD Skills — Generate & Refine
|
|
6
6
|
|
|
7
|
-
Skill này xử lý
|
|
8
|
-
|
|
9
|
-
---
|
|
7
|
+
Skill này xử lý `/generate-prd` và `/refine-prd`. Để **không lệch logic/schema**, skill KHÔNG nhân bản — mỗi lệnh thực thi **y hệt** command tương ứng.
|
|
10
8
|
|
|
11
9
|
## /generate-prd — Sinh Product Requirements Document
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
<!-- Directory: {paths.product_definitions_dir}/**/*.md -->
|
|
16
|
-
# Gate — Quy trình vào chuẩn cho mọi lệnh
|
|
17
|
-
|
|
18
|
-
Mọi lệnh PHẢI chạy gate này trước khi thực thi phần logic riêng của nó.
|
|
19
|
-
|
|
20
|
-
## Bước 0 — Kiểm tra chế độ Sub-Agent
|
|
21
|
-
|
|
22
|
-
Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ một orchestrator hay không:
|
|
23
|
-
|
|
24
|
-
1. Thử parse `$ARGUMENTS` dưới dạng JSON.
|
|
25
|
-
2. Nếu parse thành công **và** chứa `"_agent_mode": true`:
|
|
26
|
-
- **Bỏ qua hoàn toàn Bước 1, 2 và 3 của Gate này.**
|
|
27
|
-
- Đặt target file = `payload.target_file`
|
|
28
|
-
- Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
|
|
29
|
-
- Đặt phạm vi UC = `payload.uc_id` (chỉ xử lý UC này)
|
|
30
|
-
- Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
|
|
31
|
-
- Đặt dimension = `payload.dimension` nếu có (lệnh review per-UC: chỉ review đúng lăng kính này)
|
|
32
|
-
- Đi thẳng tới phần logic riêng của lệnh.
|
|
33
|
-
3. Nếu `$ARGUMENTS` không phải JSON hoặc không có `_agent_mode` → tiếp tục sang Bước 1 (chế độ thường).
|
|
34
|
-
|
|
35
|
-
## Bước 0-B — Kiểm tra Model
|
|
36
|
-
|
|
37
|
-
*Bỏ qua bước này nếu `_agent_mode: true` (sub-agent — orchestrator đã kiểm tra rồi).*
|
|
38
|
-
|
|
39
|
-
Các lệnh sinh nội dung và review phức tạp đòi hỏi khả năng suy luận mạnh.
|
|
40
|
-
Dùng model nhỏ hơn sẽ rủi ro: bỏ sót edge case, phân tích spec thiếu sót, vi phạm kiến trúc.
|
|
41
|
-
|
|
42
|
-
Hiển thị và chờ phản hồi:
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
⚙️ MODEL CHECK
|
|
46
|
-
──────────────────────────────────────────────────────────────────
|
|
47
|
-
Recommended : claude-opus-4 (hoặc model Opus mới nhất)
|
|
48
|
-
Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
|
|
49
|
-
suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
|
|
50
|
-
|
|
51
|
-
Cách đổi trong Claude Code:
|
|
52
|
-
• Settings → Model → chọn "claude-opus"
|
|
53
|
-
• hoặc: /model → chọn claude-opus
|
|
54
|
-
|
|
55
|
-
Đang chạy claude-opus?
|
|
56
|
-
Y — đúng, đang dùng claude-opus → tiếp tục
|
|
57
|
-
S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
|
|
58
|
-
──────────────────────────────────────────────────────────────────
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
- "Y" → tiếp tục sang Bước 1.
|
|
62
|
-
- "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
|
|
63
|
-
- "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang claude-opus rồi chạy lại lệnh này."
|
|
64
|
-
|
|
65
|
-
## Bước 1 — Xác định Target File
|
|
66
|
-
|
|
67
|
-
1. Nếu `$ARGUMENTS` được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
68
|
-
2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
|
|
69
|
-
- **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
|
|
70
|
-
- **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
|
|
71
|
-
- **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
|
|
72
|
-
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
73
|
-
|
|
74
|
-
Khi một file khớp: đặt nó làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path mà lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
|
|
75
|
-
3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
|
|
76
|
-
- Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` — file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
|
|
77
|
-
- Hiển thị danh sách cho người dùng và hỏi: "Bạn muốn làm việc với file nào? (Nhập số thứ tự hoặc tên file)"
|
|
78
|
-
- Chờ người dùng chọn rồi mới tiếp tục.
|
|
79
|
-
|
|
80
|
-
## Bước 2 — Chạy Context Loader
|
|
81
|
-
|
|
82
|
-
Nạp toàn bộ context của dự án bằng cách làm theo quy trình trong `steps/context-loader.md`.
|
|
83
|
-
Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phiên làm việc của lệnh.
|
|
84
|
-
|
|
85
|
-
## Bước 3 — CHECKPOINT
|
|
86
|
-
|
|
87
|
-
Sau khi hoàn thành Bước 1 và 2, hiển thị bản tóm tắt và chờ xác nhận:
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
CHECKPOINT
|
|
91
|
-
-----------
|
|
92
|
-
Target : {resolved file path}
|
|
93
|
-
Project : {project.name từ project-context.yaml}
|
|
94
|
-
Tech stack : {language} / {framework}
|
|
95
|
-
Module : {module nếu có, else "not configured"}
|
|
96
|
-
Domains : {danh sách domain, ngăn cách bởi dấu phẩy}
|
|
97
|
-
|
|
98
|
-
Tiếp tục? (Y/N)
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Chờ người dùng trả lời rõ ràng "Y" hoặc "N" rồi mới tiếp tục.
|
|
102
|
-
- "Y" → tiếp tục sang các bước riêng của lệnh bên dưới.
|
|
103
|
-
- "N" → dừng lại và hỏi người dùng muốn thay đổi gì.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
### Quy tắc nội dung — chống jargon kỹ thuật *(áp dụng cho mọi PRD sinh ra)*
|
|
107
|
-
|
|
108
|
-
**1. PRD platform-agnostic — chỉ mô tả WHAT (nghiệp vụ), KHÔNG mô tả HOW (kỹ thuật).**
|
|
109
|
-
Viết AC / Business Rule / Business Logic theo *kết quả nghiệp vụ*, KHÔNG nhét chi tiết triển khai (API, JWT/token, endpoint, HTTP status, tên class/bảng/cột DB, query, spinner, animation…). Những thứ đó thuộc **Tech Docs** (kỹ thuật) hoặc **Design Spec** (giao diện).
|
|
110
|
-
|
|
111
|
-
| ✅ Viết trong PRD (nghiệp vụ) | ❌ KHÔNG viết trong PRD |
|
|
112
|
-
|---|---|
|
|
113
|
-
| "Đăng nhập thành công → truy cập được tính năng" | "API trả về JWT token" ← Tech Docs |
|
|
114
|
-
| "Sai mật khẩu 5 lần → khoá tài khoản 30 phút" | "Click button → hiện toast" ← Design Spec |
|
|
115
|
-
| "Phiên hết hạn → yêu cầu xác thực lại" | "Hiển thị spinner khi loading" ← Design Spec |
|
|
116
|
-
|
|
117
|
-
- Nếu PO đưa chi tiết UI (màu, layout, animation) → **nhắc**: *"Chi tiết UI này thuộc Design Spec, không thuộc PRD. Ghi nhận để tạo Design Spec sau."*
|
|
118
|
-
- Enum/thuật ngữ kỹ thuật ĐÃ chuẩn hoá trong domain-knowledge (vd `userType`, `TYPE_1`) thì giữ nguyên gốc — đây là từ vựng nghiệp vụ, KHÔNG phải jargon triển khai.
|
|
119
|
-
|
|
120
|
-
**2. Terminology — bám từ điển dự án.**
|
|
121
|
-
- Thay mọi **banned term** bằng canonical term (xem `business-dictionary.md` § Banned Terms); ghi chú việc thay ở mục **Giả định AI**.
|
|
122
|
-
- Status/Enum → lấy đúng giá trị trong `core-entities.md` (Enum Registry).
|
|
123
|
-
- **Thuật ngữ MỚI**: nếu input PO có từ chưa có trong `business-dictionary.md` và lặp ≥2 lần → **DỪNG, hỏi PO** (nghĩa là gì / canonical term / có thêm vào từ điển không) trước khi tiếp tục.
|
|
124
|
-
|
|
125
|
-
**3. Cross-reference bắt buộc.** Mọi chỗ nhắc TICKET-ID khác → inline link `[TICKET-ID](./file.md)` nếu file PRD tồn tại; không để plain text.
|
|
126
|
-
|
|
127
|
-
### Generate
|
|
128
|
-
|
|
129
|
-
Sinh PRD theo đúng cấu trúc chuẩn dưới đây (template canonical: `templates/prd.template.md`). Quy ước bắt buộc:
|
|
130
|
-
|
|
131
|
-
- **Ngôn ngữ:** heading + nội dung viết tiếng Việt (giữ thuật ngữ kỹ thuật/Enum nguyên gốc).
|
|
132
|
-
- **Tiêu đề file:** `# {TICKET}-{N} {Feature Name}` — KHÔNG thêm tiền tố "PRD —".
|
|
133
|
-
- **Tên file ghi ra:** `specs/{domain}/{prd-slug}/{TICKET}-{prd-slug}.md` (vd `SEG01-segment-scoring-service.md` — KHÔNG đặt tên `prd.md`; bố cục feature-package — mọi artifact của feature nằm chung folder này, PRD là file `.md` duy nhất ở gốc folder).
|
|
134
|
-
- **Business Rule:** đặt BÊN TRONG từng Use Case (không gom thành mục phẳng), bảng 3 cột `ID | Business Rule | Business Logic`; ID theo dạng `{TICKET}-{N}-UC{n}-BR{m}` (đánh số BR liên tục xuyên suốt các UC, không reset mỗi UC).
|
|
135
|
-
- **Acceptance Criteria:** danh sách phẳng `**AC{n}:**`, văn xuôi — KHÔNG ép Given/When/Then.
|
|
136
|
-
- **Liên kết:** trỏ tới PRD/tài liệu liên quan bằng link tương đối; trỏ `core-entities` / `business-dictionary` ở mục Tài liệu tham khảo.
|
|
137
|
-
- **Giả định AI:** nếu phát hiện độ vênh/giả định chưa được PO chốt → liệt kê thành `Q1…Qn` để PO xác nhận; nếu mọi thứ đã rõ từ product-definition → ghi "Không có — toàn bộ nội dung đã được PO xác nhận".
|
|
138
|
-
|
|
139
|
-
Template (cấu trúc đầu ra — single-source từ `templates/prd.template.md`):
|
|
140
|
-
|
|
141
|
-
````markdown
|
|
142
|
-
# {TICKET}-{N} {Feature Name}
|
|
143
|
-
|
|
144
|
-
<!--
|
|
145
|
-
Template này được sử dụng bởi workflow /generate-prd.
|
|
146
|
-
AI Agent sẽ điền các section dựa trên input từ PO.
|
|
147
|
-
Các placeholder {…} cần được thay thế bằng nội dung thực tế.
|
|
148
|
-
|
|
149
|
-
FORMAT CHUẨN: Business Rule = bảng 3 cột
|
|
150
|
-
ID | Business Rule | Business Logic (KHÔNG tách Business Logic ra khối riêng).
|
|
151
|
-
|
|
152
|
-
TERMINOLOGY:
|
|
153
|
-
- Tuân thủ 100% từ điển project: specs/domain-knowledge/business-dictionary.md
|
|
154
|
-
(KHÔNG dùng từ điển của project khác). Thay banned term bằng canonical term;
|
|
155
|
-
nếu phát hiện banned term trong input PO → thay + ghi chú trong "Giả định AI".
|
|
156
|
-
- Status/Enum values → tham chiếu core-entities.md (Enum Registry).
|
|
157
|
-
|
|
158
|
-
CROSS-REFERENCE (BẮT BUỘC): Bất kỳ chỗ nào nhắc đến một tính năng/ticket khác
|
|
159
|
-
(pre-condition, business rule, giả định, AC, hay bất kỳ section nào) → PHẢI gắn inline link:
|
|
160
|
-
[TICKET-ID khác](../{prd-slug-khác}/{TICKET-ID-khác}-{prd-slug-khác}.md)
|
|
161
|
-
Không để TICKET-ID dạng plain text nếu tồn tại file PRD tương ứng. (Mỗi PRD nằm trong feature-package riêng nên link trỏ sang folder anh em `../{prd-slug-khác}/`.)
|
|
162
|
-
Ngoài ra, ghi rõ quan hệ phụ thuộc trong "Tài liệu tham khảo" ở Appendix.
|
|
163
|
-
|
|
164
|
-
NEW TERM DETECTION: Nếu input PO xuất hiện thuật ngữ CHƯA CÓ trong business-dictionary.md
|
|
165
|
-
và lặp lại ≥ 2 lần → DỪNG lại, hỏi PO confirm trước khi tiếp tục:
|
|
166
|
-
+ Thuật ngữ đó nghĩa gì trong ngữ cảnh hệ thống?
|
|
167
|
-
+ English term chuẩn nên dùng là gì?
|
|
168
|
-
+ Có cần bổ sung vào business-dictionary.md không?
|
|
169
|
-
Sau khi PO confirm → cập nhật business-dictionary.md (nếu PO đồng ý) rồi mới tiếp tục.
|
|
170
|
-
|
|
171
|
-
NUMBERING:
|
|
172
|
-
- UC ID: {TICKET}-{N}-UC{n} (n bắt đầu từ 1, tăng theo từng use case)
|
|
173
|
-
- BR ID: {TICKET}-{N}-UC{n}-BR{m} (m tăng LIÊN TỤC xuyên suốt PRD, KHÔNG reset mỗi UC)
|
|
174
|
-
-->
|
|
175
|
-
|
|
176
|
-
---
|
|
177
|
-
|
|
178
|
-
## Metadata
|
|
179
|
-
|
|
180
|
-
| Field | Value |
|
|
181
|
-
|---------------|------------------------------------------|
|
|
182
|
-
| **PRD ID** | {TICKET}-{N} |
|
|
183
|
-
| **Version** | 1.0 |
|
|
184
|
-
| **Status** | draft |
|
|
185
|
-
| **Author** | AI-assisted |
|
|
186
|
-
| **PO** | {tên PO} |
|
|
187
|
-
| **Domain** | {domain} |
|
|
188
|
-
| **Created** | {date} |
|
|
189
|
-
| **Updated** | {date} |
|
|
190
|
-
| **Ticket** | {TICKET}-{N}{ — nếu PO có link tracker thật, thêm bên cạnh: `{TICKET}-{N} ([Jira]({tracker_url}))`} |
|
|
191
|
-
| **API Source** | *(để trống nếu greenfield — chỉ điền `existing` khi PRD bọc một API đã chạy production)* |
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
# Feature
|
|
196
|
-
|
|
197
|
-
**{Feature Name}**
|
|
198
|
-
|
|
199
|
-
{Đoạn mô tả tổng quan: feature làm gì, cho ai, giải quyết vấn đề gì — lấy từ product-definition.}
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
# 1. Tổng quan
|
|
204
|
-
|
|
205
|
-
## a. User Story
|
|
206
|
-
|
|
207
|
-
- **Là một (As a)** {persona}
|
|
208
|
-
- **Tôi muốn (I want to)** {action}
|
|
209
|
-
- **Để (So that)** {benefit}
|
|
210
|
-
|
|
211
|
-
## b. Phạm vi
|
|
212
|
-
|
|
213
|
-
**In Scope**
|
|
214
|
-
- {hạng mục trong phạm vi 1}
|
|
215
|
-
- {hạng mục trong phạm vi 2}
|
|
216
|
-
|
|
217
|
-
**Out of Scope** *(chỉ thêm khi có ranh giới cần nói rõ)*
|
|
218
|
-
- {hạng mục ngoài phạm vi + lý do / chủ sở hữu}
|
|
219
|
-
|
|
220
|
-
## c. Phụ thuộc liên service *(mức nghiệp vụ — KHÔNG mô tả API/event/kỹ thuật)*
|
|
221
|
-
|
|
222
|
-
> Kế thừa từ Product Definition Phase 1 ("Phụ thuộc liên service"). Nếu contract do đối tác phát triển song song (xem `API Source`), ghi phụ thuộc partner vào đây.
|
|
223
|
-
|
|
224
|
-
- {Cần {dữ liệu/năng lực} từ {feature/team/partner} — vì {lý do nghiệp vụ}} — hoặc "Không có"
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
# 2. Acceptance Criteria
|
|
229
|
-
|
|
230
|
-
> Mỗi AC kế thừa liên kết "Bắt nguồn từ BR" của Product Definition (Phase 6), remap sang BR ID của PRD. Vì BR ID đã chứa số UC nên ref BR truy ngược được tới đúng UC.
|
|
231
|
-
|
|
232
|
-
**AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
|
|
233
|
-
|
|
234
|
-
**AC2:** {…} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
|
|
235
|
-
|
|
236
|
-
---
|
|
237
|
-
|
|
238
|
-
# 3. Use Case
|
|
239
|
-
|
|
240
|
-
#### {TICKET}-{N}-UC1: {Tên use case}
|
|
241
|
-
|
|
242
|
-
**Actor:** {actor}
|
|
11
|
+
→ **Đọc và tuân theo `commands/generate-prd.md`** với cùng `$ARGUMENTS`.
|
|
243
12
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
**Pre-condition:**
|
|
247
|
-
- {điều kiện trước 1}
|
|
248
|
-
|
|
249
|
-
**Post-condition:**
|
|
250
|
-
- {kết quả sau 1}
|
|
251
|
-
|
|
252
|
-
**AC liên quan:** AC{x}, AC{y} *(các AC mà UC này thoả — phải đúng bằng tập AC có ref BR trỏ về UC này ở §2)*
|
|
253
|
-
|
|
254
|
-
**Business Rule**
|
|
255
|
-
|
|
256
|
-
| ID | Business Rule | Business Logic |
|
|
257
|
-
|----|---------------|----------------|
|
|
258
|
-
| {TICKET}-{N}-UC1-BR1 | {luật ngắn gọn} | - {logic chi tiết, xuống dòng bằng `<br/>`}<br/>- {…} |
|
|
259
|
-
| {TICKET}-{N}-UC1-BR2 | {…} | - {…} |
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
#### {TICKET}-{N}-UC2: {Tên use case}
|
|
264
|
-
|
|
265
|
-
{lặp cấu trúc UC như trên; BR đánh số tiếp tục BR3, BR4…}
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
# 4. UI/UX Guidelines
|
|
270
|
-
|
|
271
|
-
## a. User Flow
|
|
272
|
-
|
|
273
|
-
```mermaid
|
|
274
|
-
flowchart TD
|
|
275
|
-
START(["{điểm bắt đầu}"]) --> A{"{điểm quyết định}"}
|
|
276
|
-
A -->|{nhánh}| B["{bước}"]
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
## b. Wireframe
|
|
280
|
-
|
|
281
|
-
### Screen 1: {Tên màn}
|
|
282
|
-
|
|
283
|
-
| Thành phần | Chi tiết |
|
|
284
|
-
|------------|----------|
|
|
285
|
-
| **Screen** | {tên/ngữ cảnh màn} |
|
|
286
|
-
| **Components** | - {thành phần 1}<br/>- {thành phần 2} |
|
|
287
|
-
| **Actions** | - {hành động 1 → kết quả}<br/>- {hành động 2 → kết quả} |
|
|
288
|
-
|
|
289
|
-
---
|
|
290
|
-
|
|
291
|
-
### Screen 2: {Tên màn}
|
|
292
|
-
|
|
293
|
-
{lặp bảng như trên cho từng màn}
|
|
294
|
-
|
|
295
|
-
---
|
|
296
|
-
|
|
297
|
-
# Appendix
|
|
298
|
-
|
|
299
|
-
## Input gốc từ PO
|
|
300
|
-
|
|
301
|
-
> {Trích nguyên văn input/ghi chú gốc của PO + đường dẫn product-definition nguồn.}
|
|
302
|
-
|
|
303
|
-
## Tài liệu tham khảo
|
|
304
|
-
|
|
305
|
-
- [{TICKET liên quan}](../{prd-slug-khác}/{TICKET-ID-khác}-{prd-slug-khác}.md) — {quan hệ: pre-condition / overlapping / related…}
|
|
306
|
-
- Từ điển nghiệp vụ: `{path}/business-dictionary.md`
|
|
307
|
-
- Domain knowledge: `{path}/{domain}.md`
|
|
308
|
-
|
|
309
|
-
## Existing API Contract *(CHỈ brownfield — điền khi API Source = existing; greenfield BỎ QUA cả section này)*
|
|
310
|
-
|
|
311
|
-
<!--
|
|
312
|
-
Chỉ dùng khi PRD bọc một API đã tồn tại trên hệ thống. PO ghi lại contract để:
|
|
313
|
-
- /generate-bdd (system) dùng trực tiếp làm input — không cần tổng hợp từ FE/App BDD;
|
|
314
|
-
- /generate-tech-docs chạy mode reverse-document (mô tả lại as-is, không design mới);
|
|
315
|
-
- /review-tech-docs bỏ qua cổng T7 cross-team sign-off (contract đã cố định).
|
|
316
|
-
Nếu greenfield (thiết kế mới) → xoá toàn bộ section này.
|
|
317
|
-
-->
|
|
318
|
-
|
|
319
|
-
| Method | Path | Auth | Request | Response |
|
|
320
|
-
|--------|------|------|---------|----------|
|
|
321
|
-
| {GET/POST/PUT/DELETE} | {/api/v1/path} | {Bearer / none} | `{ field: type }` | `{ field: type }` |
|
|
322
|
-
|
|
323
|
-
**Error responses:**
|
|
324
|
-
|
|
325
|
-
| HTTP Status | Error Code | Khi nào xảy ra |
|
|
326
|
-
|-------------|------------|----------------|
|
|
327
|
-
| {4xx/5xx} | {ERR_CODE} | {condition} |
|
|
328
|
-
|
|
329
|
-
## Giả định AI
|
|
330
|
-
|
|
331
|
-
> {Giả định / độ vênh AI phát hiện khi đối chiếu product-definition với domain-knowledge — cần PO review. AI KHÔNG tự hoà giải.}
|
|
332
|
-
|
|
333
|
-
- **Q1 — [AI DRAFT] {tiêu đề}:** {mô tả độ vênh + nguồn}. **Cần PO chốt {điều gì}.**
|
|
334
|
-
|
|
335
|
-
_(Nếu không có độ vênh: ghi "Không có — toàn bộ nội dung đã được PO xác nhận qua Product Definition.")_
|
|
336
|
-
|
|
337
|
-
---
|
|
338
|
-
|
|
339
|
-
# Change Log
|
|
340
|
-
|
|
341
|
-
### v1.0 — {mô tả} ({date})
|
|
342
|
-
|
|
343
|
-
| Mục | Thay đổi |
|
|
344
|
-
|-----|----------|
|
|
345
|
-
| — | Bản đầu — sinh từ product-definition. |
|
|
346
|
-
|
|
347
|
-
---
|
|
348
|
-
|
|
349
|
-
<!--
|
|
350
|
-
NEXT STEPS:
|
|
351
|
-
Khi PRD được approve (status: approved), chạy:
|
|
352
|
-
/generate-bdd "specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md"
|
|
353
|
-
để sinh BDD feature specs từ PRD này.
|
|
354
|
-
-->
|
|
355
|
-
|
|
356
|
-
````
|
|
357
|
-
|
|
358
|
-
### Output
|
|
359
|
-
|
|
360
|
-
```
|
|
361
|
-
✅ Đã tạo PRD: specs/{domain}/{prd-slug}/{TICKET}-{prd-slug}.md
|
|
362
|
-
Status: draft
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
# Report Footer — Định dạng output chuẩn cho mọi lệnh
|
|
366
|
-
|
|
367
|
-
Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
|
|
368
|
-
|
|
369
|
-
## Status Badge
|
|
370
|
-
|
|
371
|
-
Chọn một theo kết quả:
|
|
372
|
-
- `✅ Complete` — mọi bước thành công, không có vấn đề
|
|
373
|
-
- `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
|
|
374
|
-
- `⚠️ Warnings` — hoàn thành nhưng có vấn đề không chặn, nên review lại
|
|
375
|
-
|
|
376
|
-
## Output Artifacts
|
|
377
|
-
|
|
378
|
-
Liệt kê mọi file được tạo hoặc sửa bởi lệnh này:
|
|
379
|
-
```
|
|
380
|
-
Output Artifacts:
|
|
381
|
-
{created|updated} {file-path} ({mô tả ngắn})
|
|
382
|
-
{created|updated} {file-path} ({mô tả ngắn})
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
|
|
386
|
-
|
|
387
|
-
## Pipeline Position
|
|
388
|
-
|
|
389
|
-
In một sơ đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
|
|
390
|
-
để người dùng luôn thấy lệnh này nằm ở đâu trong luồng end-to-end:
|
|
391
|
-
|
|
392
|
-
```
|
|
393
|
-
Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **phase của nó** trong sơ đồ trên:
|
|
397
|
-
|
|
398
|
-
| Phase | Commands |
|
|
399
|
-
|-------|----------|
|
|
400
|
-
| Discovery | `/define-product` |
|
|
401
|
-
| PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
402
|
-
| Design Spec | `/generate-design-spec` |
|
|
403
|
-
| BDD | `/generate-bdd` · `/review-context` (BDD) |
|
|
404
|
-
| Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
|
|
405
|
-
| Code | `/generate-code` · `/review-code` |
|
|
406
|
-
| Dev Self-Check | `/dev-gen-test` · `/dev-run-test` · `/dev-smoke-test` |
|
|
407
|
-
| QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
|
|
408
|
-
| Trace Audit | `/validate-traces` |
|
|
409
|
-
|
|
410
|
-
Với **lệnh review**, thêm vòng review 3 bước và đánh dấu bước hiện tại, vd:
|
|
411
|
-
`Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
|
|
412
|
-
|
|
413
|
-
**Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
|
|
414
|
-
`/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính —
|
|
415
|
-
**bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào sơ đồ).
|
|
416
|
-
|
|
417
|
-
## Gợi ý lệnh tiếp theo
|
|
418
|
-
|
|
419
|
-
Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
420
|
-
|
|
421
|
-
| Lệnh hiện tại | Gợi ý lệnh tiếp theo |
|
|
422
|
-
|-------------------------|-----------------------------------------------|
|
|
423
|
-
| /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
|
|
424
|
-
| /define-product | `/generate-prd {product-definition-file}` |
|
|
425
|
-
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
426
|
-
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
427
|
-
| /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
|
|
428
|
-
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
429
|
-
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
430
|
-
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
|
431
|
-
| /qc-analyze | `/qc-plan {UC-ID}` (xử lý các gap blocker 🔴 trước) |
|
|
432
|
-
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
433
|
-
| /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
|
|
434
|
-
| /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
|
|
435
|
-
| /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
|
|
436
|
-
| /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
|
|
437
|
-
| /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
|
|
438
|
-
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
439
|
-
| /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
|
|
440
|
-
| /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
|
|
441
|
-
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
442
|
-
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
443
|
-
| /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
|
|
444
|
-
| /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
|
|
445
|
-
| /dev-smoke-test | Tạo PR và link tới ticket |
|
|
446
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK → tạo PR |
|
|
447
|
-
| /fix-bug | Tạo PR và link tới ticket |
|
|
448
|
-
| /debug | `/fix-bug {ticket-id}` nếu cần sửa |
|
|
449
|
-
| /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
|
|
450
|
-
| /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
|
|
451
|
-
| /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
|
|
452
|
-
| /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
|
|
453
|
-
| /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
|
|
454
|
-
|
|
455
|
-
Định dạng footer như sau:
|
|
456
|
-
```
|
|
457
|
-
---
|
|
458
|
-
Status : {badge}
|
|
459
|
-
{khối Output Artifacts}
|
|
460
|
-
Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
461
|
-
(lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
|
|
462
|
-
Next : {lệnh gợi ý kèm ví dụ tham số}
|
|
463
|
-
```
|
|
464
|
-
*(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
---
|
|
13
|
+
Command lo: guard discovery completed · phân giải API Source (existing/greenfield/partner) · Terminology Map · map §1c "Phụ thuộc liên service" + §4b Wireframe · slug kế thừa · template canonical (`templates/prd.template.md`) · Change Log rolling-window.
|
|
468
14
|
|
|
469
15
|
## /refine-prd — Phân tích PRD qua 4 lăng kính review
|
|
470
16
|
|
|
471
|
-
Lệnh này thực thi **y hệt** `commands/refine-prd.md` — không nhân bản logic ở đây để tránh lệch schema findings.
|
|
472
|
-
|
|
473
|
-
`commands/refine-prd.md` bao gồm:
|
|
474
|
-
- Phân tích PRD bằng 4 lăng kính **fan-out đa sub-agent** (QA / DEV / SA / PO) + vòng completeness-critic (1 lần chạy ra đủ finding).
|
|
475
|
-
- Ghi findings YAML với **schema đầy đủ** (`uc_id`, `quote`, `auto_fixable`) — bắt buộc cho source-jump và nút "Apply to PRD" của Review Board.
|
|
476
|
-
- **Resume Mode** (`--resume`): áp dụng findings đã accept → bump version → ghi changelog → reset `draft`.
|
|
477
|
-
|
|
478
17
|
→ **Đọc và tuân theo `commands/refine-prd.md`** với cùng `$ARGUMENTS`.
|
|
18
|
+
|
|
19
|
+
Command lo: 4 lăng kính fan-out đa sub-agent + completeness-critic (findings đầy đủ 1 lần chạy) · schema findings đầy đủ (`uc_id`, `quote`, `auto_fixable`) cho Review Board · Resume Mode (apply → bump version → reset draft → changelog).
|