@edupia-tutor/spec-driven-docs 0.14.1 → 0.14.2
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/bin/index.js +12 -1
- package/commands/debug.md +5 -5
- package/commands/define-product.md +38 -36
- package/commands/define-product.tmpl +33 -31
- package/commands/dev-gen-test.md +5 -5
- package/commands/dev-run-test.md +5 -5
- package/commands/dev-smoke-test.md +5 -5
- package/commands/fix-bug.md +5 -5
- package/commands/generate-bdd.md +5 -5
- package/commands/generate-code.md +5 -5
- package/commands/generate-design-spec.md +7 -7
- package/commands/generate-design-spec.tmpl +2 -2
- package/commands/generate-prd.md +19 -16
- package/commands/generate-prd.tmpl +10 -7
- package/commands/generate-spec-manifest.md +7 -7
- package/commands/generate-spec-manifest.tmpl +2 -2
- package/commands/generate-tech-docs.md +5 -5
- package/commands/learn.md +5 -5
- package/commands/map-testids.md +5 -5
- package/commands/propose-scenario.md +5 -5
- package/commands/qc-analyze.md +6 -6
- package/commands/qc-analyze.tmpl +1 -1
- package/commands/qc-design-test.md +5 -5
- package/commands/qc-plan.md +5 -5
- package/commands/qc-report.md +5 -5
- package/commands/qc-review.md +5 -5
- package/commands/qc-run-test.md +5 -5
- package/commands/refine-prd.md +8 -8
- package/commands/refine-prd.tmpl +3 -3
- package/commands/report-bug.md +5 -5
- package/commands/review-code.md +5 -5
- package/commands/review-context.md +9 -9
- package/commands/review-context.tmpl +4 -4
- package/commands/review-tech-docs.md +5 -5
- package/commands/setup-ai-first.md +5 -5
- package/commands/setup-ai-first.tmpl +3 -3
- package/commands/sync.md +1 -1
- package/commands/sync.tmpl +1 -1
- package/commands/validate-traces.md +7 -7
- package/commands/validate-traces.tmpl +2 -2
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +5 -5
- package/core/commands/define-product.md +38 -36
- package/core/commands/dev-gen-test.md +5 -5
- package/core/commands/dev-run-test.md +5 -5
- package/core/commands/dev-smoke-test.md +5 -5
- package/core/commands/fix-bug.md +5 -5
- package/core/commands/generate-bdd.md +5 -5
- package/core/commands/generate-code.md +5 -5
- package/core/commands/generate-design-spec.md +7 -7
- package/core/commands/generate-prd.md +19 -16
- package/core/commands/generate-spec-manifest.md +7 -7
- package/core/commands/generate-tech-docs.md +5 -5
- package/core/commands/learn.md +5 -5
- package/core/commands/map-testids.md +5 -5
- package/core/commands/propose-scenario.md +5 -5
- package/core/commands/qc-analyze.md +6 -6
- package/core/commands/qc-design-test.md +5 -5
- package/core/commands/qc-plan.md +5 -5
- package/core/commands/qc-report.md +5 -5
- package/core/commands/qc-review.md +5 -5
- package/core/commands/qc-run-test.md +5 -5
- package/core/commands/refine-prd.md +8 -8
- package/core/commands/report-bug.md +5 -5
- package/core/commands/review-code.md +5 -5
- package/core/commands/review-context.md +9 -9
- package/core/commands/review-tech-docs.md +5 -5
- package/core/commands/setup-ai-first.md +5 -5
- package/core/commands/sync.md +1 -1
- package/core/commands/validate-traces.md +7 -7
- package/core/skills/code/SKILL.md +5 -5
- package/core/skills/debug/SKILL.md +3 -3
- package/core/skills/design-spec/SKILL.md +6 -6
- package/core/skills/prd/SKILL.md +8 -8
- package/core/skills/setup-ai-first/SKILL.md +1 -1
- package/core/skills/spec/SKILL.md +4 -4
- package/core/skills/test/SKILL.md +8 -8
- package/core/steps/context-loader.md +3 -3
- package/core/steps/gate.md +2 -2
- package/core/templates/prd.template.md +4 -4
- package/core/templates/project-context.yaml +2 -2
- package/docs/01-getting-started/core-concepts.md +1 -1
- package/docs/01-getting-started/quickstart.md +7 -7
- package/docs/02-guides/developer/bdd-and-trace.md +1 -1
- package/docs/02-guides/developer/scenarios.md +5 -5
- package/docs/02-guides/product-owner/handoff-checklist.md +1 -1
- package/docs/02-guides/product-owner/scenarios.md +23 -23
- package/docs/02-guides/tester/bug-reporting.md +2 -2
- package/docs/02-guides/tester/reading-specs.md +2 -2
- package/docs/02-guides/tester/scenarios.md +1 -1
- package/docs/02-guides/tester/spec-manifest.md +3 -3
- package/docs/02-guides/tester/workflow.md +1 -1
- package/docs/03-concepts/architecture.md +3 -3
- package/docs/03-concepts/pipeline.md +3 -3
- package/docs/04-operations/sync-and-update.md +5 -5
- package/docs/05-reference/command-cheatsheet.md +2 -2
- package/docs/05-reference/commands.md +8 -8
- package/package.json +1 -1
- package/scripts/migrate-specs.js +5 -3
- package/scripts/rename-prd-files.js +174 -0
- package/skills/code/SKILL.md +5 -5
- package/skills/debug/SKILL.md +3 -3
- package/skills/design-spec/SKILL.md +6 -6
- package/skills/design-spec/SKILL.tmpl +1 -1
- package/skills/prd/SKILL.md +8 -8
- package/skills/prd/SKILL.tmpl +2 -2
- package/skills/setup-ai-first/SKILL.md +1 -1
- package/skills/setup-ai-first/SKILL.tmpl +1 -1
- package/skills/spec/SKILL.md +4 -4
- package/skills/spec/SKILL.tmpl +2 -2
- package/skills/test/SKILL.md +8 -8
- package/steps/context-loader.md +3 -3
- package/steps/gate.md +2 -2
- package/templates/prd.template.md +4 -4
- package/templates/project-context.yaml +2 -2
package/bin/index.js
CHANGED
|
@@ -11,6 +11,7 @@ const VERSION = pkg.version;
|
|
|
11
11
|
|
|
12
12
|
const args = process.argv.slice(2);
|
|
13
13
|
const isMigrateSpecs = args.includes('--migrate-specs');
|
|
14
|
+
const isRenamePrd = args.includes('--rename-prd-files');
|
|
14
15
|
const isInit = args.includes('--init');
|
|
15
16
|
const isProject = args.includes('--project');
|
|
16
17
|
const installHooks = args.includes('--hooks');
|
|
@@ -73,8 +74,12 @@ if (showHelp) {
|
|
|
73
74
|
console.log('Maintenance:');
|
|
74
75
|
console.log(' --migrate-specs Migrate an existing project from the legacy artifact-type-first');
|
|
75
76
|
console.log(' spec layout (specs/prd, specs/bdd, ...) to the feature-package');
|
|
76
|
-
console.log(' layout (specs/{domain}/{prd-slug}/{prd.md,bdd
|
|
77
|
+
console.log(' layout (specs/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md,bdd/,...}).');
|
|
77
78
|
console.log(' DRY-RUN by default; add --apply to execute. Uses git mv when possible.');
|
|
79
|
+
console.log(' --rename-prd-files Rename feature-package PRD files from the old fixed name prd.md to the');
|
|
80
|
+
console.log(' {TICKET-ID}-{prd-slug}.md convention (e.g. SEG01-segment-scoring-service.md).');
|
|
81
|
+
console.log(' For projects already on the feature-package layout. DRY-RUN by default;');
|
|
82
|
+
console.log(' add --apply to execute. Uses git mv when possible.');
|
|
78
83
|
console.log('');
|
|
79
84
|
console.log('Options:');
|
|
80
85
|
console.log(' --module <name> Copy stack module to .agent/modules/<name>/');
|
|
@@ -108,6 +113,12 @@ if (isMigrateSpecs) {
|
|
|
108
113
|
return; // migrate-specs.js calls process.exit itself
|
|
109
114
|
}
|
|
110
115
|
|
|
116
|
+
// ── --rename-prd-files: rename feature-package prd.md → {TICKET-ID}-{slug}.md ──
|
|
117
|
+
if (isRenamePrd) {
|
|
118
|
+
require(path.join(__dirname, '..', 'scripts', 'rename-prd-files.js'));
|
|
119
|
+
return; // rename-prd-files.js calls process.exit itself
|
|
120
|
+
}
|
|
121
|
+
|
|
111
122
|
// ── Step 1: Build .tmpl → .md ─────────────────────────────────────────────
|
|
112
123
|
const buildScript = path.join(__dirname, 'build.js');
|
|
113
124
|
if (fs.existsSync(buildScript)) {
|
package/commands/debug.md
CHANGED
|
@@ -57,13 +57,13 @@ Hiển thị và chờ phản hồi:
|
|
|
57
57
|
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.
|
|
58
58
|
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/`):
|
|
59
59
|
- **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 đó.
|
|
60
|
-
- **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/
|
|
60
|
+
- **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.)*
|
|
61
61
|
- **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
|
|
62
62
|
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
63
63
|
|
|
64
64
|
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.
|
|
65
65
|
3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
|
|
66
|
-
- Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs
|
|
66
|
+
- 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).
|
|
67
67
|
- 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)"
|
|
68
68
|
- Chờ người dùng chọn rồi mới tiếp tục.
|
|
69
69
|
|
|
@@ -131,7 +131,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
131
131
|
- `domains` → danh sách các business domain đang hoạt động
|
|
132
132
|
|
|
133
133
|
**Paths (nếu có):**
|
|
134
|
-
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
|
|
134
|
+
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
|
|
135
135
|
- `paths.refinement_dir` → thư mục output cho findings/review
|
|
136
136
|
- `paths.qc_dir` → gốc artifact QC automation (hiện ở top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
|
|
137
137
|
- `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
|
|
@@ -157,7 +157,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
157
157
|
Lưu ý: Trong bố cục feature-package, `specs_dir` là gốc thống nhất. Mọi loại spec artifact (PRD, BDD, tech-docs, design-spec) đều nằm dưới `{specs_dir}/{domain}/{prd-slug}/`. `prd-slug` là tên folder feature-package, không phải một biến config riêng.
|
|
158
158
|
|
|
159
159
|
**Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, vì artifact BDD/tech-docs/design-spec lồng sâu hơn một hoặc hai cấp bên trong package. Ví dụ:
|
|
160
|
-
- `specs/payment/create-invoice/
|
|
160
|
+
- `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
|
|
161
161
|
- `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
|
|
162
162
|
- `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
|
|
163
163
|
- `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
|
|
@@ -178,7 +178,7 @@ Nếu có section `services`:
|
|
|
178
178
|
**1. Phát hiện active domain** (theo thứ tự ưu tiên):
|
|
179
179
|
- Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
|
|
180
180
|
- Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng ở mọi độ sâu target — xem quy tắc trích xuất `prd_slug` ở Bước 1.
|
|
181
|
-
*(vd: `specs/user/create-account/
|
|
181
|
+
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
182
182
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
183
183
|
|
|
184
184
|
**2. Route tới service** — nếu active domain khớp với một key trong `services`:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# /define-product —
|
|
1
|
+
# /define-product — Khám phá tính năng (Q&A 8 Phase)
|
|
2
2
|
|
|
3
3
|
## Gate
|
|
4
4
|
# Gate — Quy trình vào chuẩn cho mọi lệnh
|
|
@@ -54,13 +54,13 @@ Hiển thị và chờ phản hồi:
|
|
|
54
54
|
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.
|
|
55
55
|
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/`):
|
|
56
56
|
- **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 đó.
|
|
57
|
-
- **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/
|
|
57
|
+
- **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.)*
|
|
58
58
|
- **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
|
|
59
59
|
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
60
60
|
|
|
61
61
|
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.
|
|
62
62
|
3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
|
|
63
|
-
- Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs
|
|
63
|
+
- 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).
|
|
64
64
|
- 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)"
|
|
65
65
|
- Chờ người dùng chọn rồi mới tiếp tục.
|
|
66
66
|
|
|
@@ -128,7 +128,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
128
128
|
- `domains` → danh sách các business domain đang hoạt động
|
|
129
129
|
|
|
130
130
|
**Paths (nếu có):**
|
|
131
|
-
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
|
|
131
|
+
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
|
|
132
132
|
- `paths.refinement_dir` → thư mục output cho findings/review
|
|
133
133
|
- `paths.qc_dir` → gốc artifact QC automation (hiện ở top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
|
|
134
134
|
- `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
|
|
@@ -154,7 +154,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
154
154
|
Lưu ý: Trong bố cục feature-package, `specs_dir` là gốc thống nhất. Mọi loại spec artifact (PRD, BDD, tech-docs, design-spec) đều nằm dưới `{specs_dir}/{domain}/{prd-slug}/`. `prd-slug` là tên folder feature-package, không phải một biến config riêng.
|
|
155
155
|
|
|
156
156
|
**Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, vì artifact BDD/tech-docs/design-spec lồng sâu hơn một hoặc hai cấp bên trong package. Ví dụ:
|
|
157
|
-
- `specs/payment/create-invoice/
|
|
157
|
+
- `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
|
|
158
158
|
- `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
|
|
159
159
|
- `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
|
|
160
160
|
- `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
|
|
@@ -175,7 +175,7 @@ Nếu có section `services`:
|
|
|
175
175
|
**1. Phát hiện active domain** (theo thứ tự ưu tiên):
|
|
176
176
|
- Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
|
|
177
177
|
- Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng ở mọi độ sâu target — xem quy tắc trích xuất `prd_slug` ở Bước 1.
|
|
178
|
-
*(vd: `specs/user/create-account/
|
|
178
|
+
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
179
179
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
180
180
|
|
|
181
181
|
**2. Route tới service** — nếu active domain khớp với một key trong `services`:
|
|
@@ -414,12 +414,12 @@ AI quét dự án và ghi:
|
|
|
414
414
|
- **Chuẩn hoá thuật ngữ** — map mọi thuật ngữ trong input PO về thuật ngữ chuẩn từ business-dictionary.md.
|
|
415
415
|
|
|
416
416
|
```
|
|
417
|
-
|
|
|
418
|
-
|
|
419
|
-
| {
|
|
417
|
+
| Thuật ngữ trong input PO | Thuật ngữ chuẩn (business-dictionary) |
|
|
418
|
+
|--------------------------|---------------------------------------|
|
|
419
|
+
| {thuật ngữ gốc} | {thuật ngữ chuẩn} |
|
|
420
420
|
```
|
|
421
421
|
|
|
422
|
-
Lưu bản đồ thuật ngữ này vào file product-definition output dưới section
|
|
422
|
+
Lưu bản đồ thuật ngữ này vào file product-definition output dưới section `### Chuẩn hoá thuật ngữ` (trong Phase 0) — `/generate-prd` sẽ tham chiếu nó trong bước **Quy tắc thuật ngữ** để đảm bảo nhất quán.
|
|
423
423
|
|
|
424
424
|
---
|
|
425
425
|
|
|
@@ -433,12 +433,10 @@ Hỏi **lần lượt từng câu một**, đợi PO trả lời rồi mới h
|
|
|
433
433
|
4. **Actors**: Những ai sẽ dùng feature này? Liệt kê từng vai trò, và đánh dấu ai là người dùng chính (Primary), ai phụ (Secondary).
|
|
434
434
|
5. **In Scope**: Feature này làm gì? (mỗi dòng một chức năng — chỉ những gì thuộc ticket này)
|
|
435
435
|
6. **Out of Scope**: Cái gì KHÔNG làm trong ticket này? Ghi rõ kèm lý do hoặc để dành pha/ticket sau — để tránh phình phạm vi.
|
|
436
|
-
7. **User Story**: Xác nhận theo format:
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
Để (So that) {giá trị nghiệp vụ}
|
|
441
|
-
```
|
|
436
|
+
7. **User Story**: Xác nhận theo format (mỗi ý một bullet):
|
|
437
|
+
- **Là một (As a)** {vai trò}
|
|
438
|
+
- **Tôi muốn (I want to)** {mục tiêu}
|
|
439
|
+
- **Để (So that)** {giá trị nghiệp vụ}
|
|
442
440
|
8. **Phụ thuộc liên service**: Để chạy được, feature có cần **dữ liệu hay năng lực** gì từ feature/team khác không? Mô tả ở mức nghiệp vụ (cần gì, từ ai, vì sao) — chưa cần nói API hay kỹ thuật. Nếu không có → trả lời "Không có".
|
|
443
441
|
|
|
444
442
|
Sau câu 8 → **tóm tắt lại toàn bộ** cho PO → chờ xác nhận → ghi `✅ PO xác nhận: Có` → sang Phase 2.
|
|
@@ -451,7 +449,7 @@ Hỏi:
|
|
|
451
449
|
1. **Entry Point**: Người dùng bắt đầu tương tác với feature này ở đâu?
|
|
452
450
|
2. **Flow Steps**: Mô tả từng bước (dùng bảng):
|
|
453
451
|
```
|
|
454
|
-
|
|
|
452
|
+
| Bước | Hành động | Trạng thái/Kết quả nghiệp vụ | Ghi chú |
|
|
455
453
|
```
|
|
456
454
|
3. **Exit Point**: Kết quả cuối khi flow hoàn thành là gì?
|
|
457
455
|
4. **Edge Cases**: Các kịch bản thất bại nghiệp vụ ngoài happy path? (input thiếu, điều kiện không thoả, thao tác đồng thời, phụ thuộc không sẵn sàng → kết quả nghiệp vụ kỳ vọng)
|
|
@@ -462,21 +460,21 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
|
462
460
|
|
|
463
461
|
## Phase 3 — Clarification Log *(CHECKPOINT 3)*
|
|
464
462
|
|
|
465
|
-
Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn
|
|
463
|
+
Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn Mục chưa giải quyết.
|
|
466
464
|
|
|
467
465
|
```
|
|
468
|
-
###
|
|
469
|
-
| # |
|
|
466
|
+
### Vòng {N}
|
|
467
|
+
| # | Nhóm | Câu hỏi | PO trả lời |
|
|
470
468
|
|---|----------------|------------|------------|
|
|
471
|
-
| 1 | Context/Flow/Logic | {
|
|
469
|
+
| 1 | Context/Flow/Logic | {câu hỏi} | {trả lời} |
|
|
472
470
|
```
|
|
473
471
|
|
|
474
|
-
**BLOCK**: Nếu còn
|
|
472
|
+
**BLOCK**: Nếu còn Mục chưa giải quyết → KHÔNG được sang Phase 4.
|
|
475
473
|
|
|
476
|
-
###
|
|
477
|
-
- {
|
|
474
|
+
### Mục chưa giải quyết
|
|
475
|
+
- {mục — hoặc "None"}
|
|
478
476
|
|
|
479
|
-
Khi mọi
|
|
477
|
+
Khi mọi Mục chưa giải quyết đã xử lý → ghi `✅ CHECKPOINT 3: Không còn mục tồn đọng` → sang Phase 4.
|
|
480
478
|
|
|
481
479
|
---
|
|
482
480
|
|
|
@@ -485,9 +483,9 @@ Khi mọi Unresolved Items đã giải quyết → ghi `✅ CHECKPOINT 3: No Unr
|
|
|
485
483
|
Suy ra từ Phase 1-3. Mỗi BR = một quy tắc (hệ thống PHẢI / KHÔNG được làm gì — WHAT):
|
|
486
484
|
|
|
487
485
|
```
|
|
488
|
-
| Rule ID |
|
|
486
|
+
| Rule ID | Hành động/Trigger | Quy tắc | Điều kiện |
|
|
489
487
|
|---------|---------------------|-------------------------------|---------------------|
|
|
490
|
-
| BR-1 | {
|
|
488
|
+
| BR-1 | {hành động từ flow} | System MUST/MUST NOT... | {điều kiện áp dụng} |
|
|
491
489
|
```
|
|
492
490
|
|
|
493
491
|
Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
@@ -513,9 +511,9 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
|
513
511
|
Suy ra từ BR + User Story. Mỗi AC phải testable (pass/fail rõ ràng):
|
|
514
512
|
|
|
515
513
|
```
|
|
516
|
-
| AC ID |
|
|
517
|
-
|
|
518
|
-
| AC-1 | {
|
|
514
|
+
| AC ID | Mô tả | Hành vi kỳ vọng | Bắt nguồn từ |
|
|
515
|
+
|-------|-------------------------|----------------------------|--------------|
|
|
516
|
+
| AC-1 | {mô tả tiêu chí} | {hành vi hệ thống cần làm} | BR-{N} |
|
|
519
517
|
```
|
|
520
518
|
|
|
521
519
|
Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
@@ -527,13 +525,13 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
|
527
525
|
Tự sinh ma trận độ phủ:
|
|
528
526
|
|
|
529
527
|
```
|
|
530
|
-
| Flow
|
|
531
|
-
|
|
532
|
-
| {
|
|
528
|
+
| Hành động Flow | Có Rule? | Có Logic? | Có AC? | Status |
|
|
529
|
+
|----------------|----------|-----------|--------|--------|
|
|
530
|
+
| {Hành động 1} | ✅/❌ | ✅/❌ | ✅/❌ | OK/GAP |
|
|
533
531
|
```
|
|
534
532
|
|
|
535
|
-
- **
|
|
536
|
-
- **
|
|
533
|
+
- **Xung đột phát hiện**: liệt kê các rule xung đột, hoặc "None".
|
|
534
|
+
- **Mục còn thiếu**: liệt kê gap, hoặc "None".
|
|
537
535
|
|
|
538
536
|
Nếu phát hiện GAP → cảnh báo PO và giải quyết trước khi đánh dấu completed.
|
|
539
537
|
|
|
@@ -544,7 +542,11 @@ Nếu phát hiện GAP → cảnh báo PO và giải quyết trước khi đánh
|
|
|
544
542
|
Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/product-definition.template.md`.
|
|
545
543
|
|
|
546
544
|
Điền tất cả section bằng dữ liệu thu thập qua các phase.
|
|
547
|
-
|
|
545
|
+
|
|
546
|
+
**Cập nhật Metadata theo tiến độ (cho phép resume):**
|
|
547
|
+
- Sau mỗi CHECKPOINT phase được chốt (`✅ PO xác nhận: Có`, hoặc với Phase 3 là `✅ CHECKPOINT 3: Không còn mục tồn đọng`) → cập nhật `Completed Phase` = số phase vừa xong và giữ `Status: in-progress`.
|
|
548
|
+
- Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
|
|
549
|
+
- Nếu discovery bị ngắt giữa chừng, file vẫn được ghi với `Completed Phase` phản ánh phase cao nhất đã xác nhận — buổi sau resume tiếp từ phase kế tiếp.
|
|
548
550
|
|
|
549
551
|
# Report Footer — Định dạng output chuẩn cho mọi lệnh
|
|
550
552
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# /define-product —
|
|
1
|
+
# /define-product — Khám phá tính năng (Q&A 8 Phase)
|
|
2
2
|
|
|
3
3
|
## Gate
|
|
4
4
|
{{include:steps/gate.md}}
|
|
@@ -20,12 +20,12 @@ AI quét dự án và ghi:
|
|
|
20
20
|
- **Chuẩn hoá thuật ngữ** — map mọi thuật ngữ trong input PO về thuật ngữ chuẩn từ business-dictionary.md.
|
|
21
21
|
|
|
22
22
|
```
|
|
23
|
-
|
|
|
24
|
-
|
|
25
|
-
| {
|
|
23
|
+
| Thuật ngữ trong input PO | Thuật ngữ chuẩn (business-dictionary) |
|
|
24
|
+
|--------------------------|---------------------------------------|
|
|
25
|
+
| {thuật ngữ gốc} | {thuật ngữ chuẩn} |
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
Lưu bản đồ thuật ngữ này vào file product-definition output dưới section
|
|
28
|
+
Lưu bản đồ thuật ngữ này vào file product-definition output dưới section `### Chuẩn hoá thuật ngữ` (trong Phase 0) — `/generate-prd` sẽ tham chiếu nó trong bước **Quy tắc thuật ngữ** để đảm bảo nhất quán.
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
@@ -39,12 +39,10 @@ Hỏi **lần lượt từng câu một**, đợi PO trả lời rồi mới h
|
|
|
39
39
|
4. **Actors**: Những ai sẽ dùng feature này? Liệt kê từng vai trò, và đánh dấu ai là người dùng chính (Primary), ai phụ (Secondary).
|
|
40
40
|
5. **In Scope**: Feature này làm gì? (mỗi dòng một chức năng — chỉ những gì thuộc ticket này)
|
|
41
41
|
6. **Out of Scope**: Cái gì KHÔNG làm trong ticket này? Ghi rõ kèm lý do hoặc để dành pha/ticket sau — để tránh phình phạm vi.
|
|
42
|
-
7. **User Story**: Xác nhận theo format:
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
Để (So that) {giá trị nghiệp vụ}
|
|
47
|
-
```
|
|
42
|
+
7. **User Story**: Xác nhận theo format (mỗi ý một bullet):
|
|
43
|
+
- **Là một (As a)** {vai trò}
|
|
44
|
+
- **Tôi muốn (I want to)** {mục tiêu}
|
|
45
|
+
- **Để (So that)** {giá trị nghiệp vụ}
|
|
48
46
|
8. **Phụ thuộc liên service**: Để chạy được, feature có cần **dữ liệu hay năng lực** gì từ feature/team khác không? Mô tả ở mức nghiệp vụ (cần gì, từ ai, vì sao) — chưa cần nói API hay kỹ thuật. Nếu không có → trả lời "Không có".
|
|
49
47
|
|
|
50
48
|
Sau câu 8 → **tóm tắt lại toàn bộ** cho PO → chờ xác nhận → ghi `✅ PO xác nhận: Có` → sang Phase 2.
|
|
@@ -57,7 +55,7 @@ Hỏi:
|
|
|
57
55
|
1. **Entry Point**: Người dùng bắt đầu tương tác với feature này ở đâu?
|
|
58
56
|
2. **Flow Steps**: Mô tả từng bước (dùng bảng):
|
|
59
57
|
```
|
|
60
|
-
|
|
|
58
|
+
| Bước | Hành động | Trạng thái/Kết quả nghiệp vụ | Ghi chú |
|
|
61
59
|
```
|
|
62
60
|
3. **Exit Point**: Kết quả cuối khi flow hoàn thành là gì?
|
|
63
61
|
4. **Edge Cases**: Các kịch bản thất bại nghiệp vụ ngoài happy path? (input thiếu, điều kiện không thoả, thao tác đồng thời, phụ thuộc không sẵn sàng → kết quả nghiệp vụ kỳ vọng)
|
|
@@ -68,21 +66,21 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
|
68
66
|
|
|
69
67
|
## Phase 3 — Clarification Log *(CHECKPOINT 3)*
|
|
70
68
|
|
|
71
|
-
Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn
|
|
69
|
+
Dựa trên Phase 1-2, AI xác định gap và hỏi các câu follow-up. Tiếp tục các vòng cho tới khi không còn Mục chưa giải quyết.
|
|
72
70
|
|
|
73
71
|
```
|
|
74
|
-
###
|
|
75
|
-
| # |
|
|
72
|
+
### Vòng {N}
|
|
73
|
+
| # | Nhóm | Câu hỏi | PO trả lời |
|
|
76
74
|
|---|----------------|------------|------------|
|
|
77
|
-
| 1 | Context/Flow/Logic | {
|
|
75
|
+
| 1 | Context/Flow/Logic | {câu hỏi} | {trả lời} |
|
|
78
76
|
```
|
|
79
77
|
|
|
80
|
-
**BLOCK**: Nếu còn
|
|
78
|
+
**BLOCK**: Nếu còn Mục chưa giải quyết → KHÔNG được sang Phase 4.
|
|
81
79
|
|
|
82
|
-
###
|
|
83
|
-
- {
|
|
80
|
+
### Mục chưa giải quyết
|
|
81
|
+
- {mục — hoặc "None"}
|
|
84
82
|
|
|
85
|
-
Khi mọi
|
|
83
|
+
Khi mọi Mục chưa giải quyết đã xử lý → ghi `✅ CHECKPOINT 3: Không còn mục tồn đọng` → sang Phase 4.
|
|
86
84
|
|
|
87
85
|
---
|
|
88
86
|
|
|
@@ -91,9 +89,9 @@ Khi mọi Unresolved Items đã giải quyết → ghi `✅ CHECKPOINT 3: No Unr
|
|
|
91
89
|
Suy ra từ Phase 1-3. Mỗi BR = một quy tắc (hệ thống PHẢI / KHÔNG được làm gì — WHAT):
|
|
92
90
|
|
|
93
91
|
```
|
|
94
|
-
| Rule ID |
|
|
92
|
+
| Rule ID | Hành động/Trigger | Quy tắc | Điều kiện |
|
|
95
93
|
|---------|---------------------|-------------------------------|---------------------|
|
|
96
|
-
| BR-1 | {
|
|
94
|
+
| BR-1 | {hành động từ flow} | System MUST/MUST NOT... | {điều kiện áp dụng} |
|
|
97
95
|
```
|
|
98
96
|
|
|
99
97
|
Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
@@ -119,9 +117,9 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
|
119
117
|
Suy ra từ BR + User Story. Mỗi AC phải testable (pass/fail rõ ràng):
|
|
120
118
|
|
|
121
119
|
```
|
|
122
|
-
| AC ID |
|
|
123
|
-
|
|
124
|
-
| AC-1 | {
|
|
120
|
+
| AC ID | Mô tả | Hành vi kỳ vọng | Bắt nguồn từ |
|
|
121
|
+
|-------|-------------------------|----------------------------|--------------|
|
|
122
|
+
| AC-1 | {mô tả tiêu chí} | {hành vi hệ thống cần làm} | BR-{N} |
|
|
125
123
|
```
|
|
126
124
|
|
|
127
125
|
Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
@@ -133,13 +131,13 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
|
133
131
|
Tự sinh ma trận độ phủ:
|
|
134
132
|
|
|
135
133
|
```
|
|
136
|
-
| Flow
|
|
137
|
-
|
|
138
|
-
| {
|
|
134
|
+
| Hành động Flow | Có Rule? | Có Logic? | Có AC? | Status |
|
|
135
|
+
|----------------|----------|-----------|--------|--------|
|
|
136
|
+
| {Hành động 1} | ✅/❌ | ✅/❌ | ✅/❌ | OK/GAP |
|
|
139
137
|
```
|
|
140
138
|
|
|
141
|
-
- **
|
|
142
|
-
- **
|
|
139
|
+
- **Xung đột phát hiện**: liệt kê các rule xung đột, hoặc "None".
|
|
140
|
+
- **Mục còn thiếu**: liệt kê gap, hoặc "None".
|
|
143
141
|
|
|
144
142
|
Nếu phát hiện GAP → cảnh báo PO và giải quyết trước khi đánh dấu completed.
|
|
145
143
|
|
|
@@ -150,7 +148,11 @@ Nếu phát hiện GAP → cảnh báo PO và giải quyết trước khi đánh
|
|
|
150
148
|
Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/product-definition.template.md`.
|
|
151
149
|
|
|
152
150
|
Điền tất cả section bằng dữ liệu thu thập qua các phase.
|
|
153
|
-
|
|
151
|
+
|
|
152
|
+
**Cập nhật Metadata theo tiến độ (cho phép resume):**
|
|
153
|
+
- Sau mỗi CHECKPOINT phase được chốt (`✅ PO xác nhận: Có`, hoặc với Phase 3 là `✅ CHECKPOINT 3: Không còn mục tồn đọng`) → cập nhật `Completed Phase` = số phase vừa xong và giữ `Status: in-progress`.
|
|
154
|
+
- Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
|
|
155
|
+
- Nếu discovery bị ngắt giữa chừng, file vẫn được ghi với `Completed Phase` phản ánh phase cao nhất đã xác nhận — buổi sau resume tiếp từ phase kế tiếp.
|
|
154
156
|
|
|
155
157
|
{{include:steps/report-footer.md}}
|
|
156
158
|
|
package/commands/dev-gen-test.md
CHANGED
|
@@ -60,13 +60,13 @@ Hiển thị và chờ phản hồi:
|
|
|
60
60
|
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.
|
|
61
61
|
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/`):
|
|
62
62
|
- **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 đó.
|
|
63
|
-
- **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/
|
|
63
|
+
- **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.)*
|
|
64
64
|
- **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
|
|
65
65
|
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
66
66
|
|
|
67
67
|
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.
|
|
68
68
|
3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
|
|
69
|
-
- Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs
|
|
69
|
+
- 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).
|
|
70
70
|
- 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)"
|
|
71
71
|
- Chờ người dùng chọn rồi mới tiếp tục.
|
|
72
72
|
|
|
@@ -134,7 +134,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
134
134
|
- `domains` → danh sách các business domain đang hoạt động
|
|
135
135
|
|
|
136
136
|
**Paths (nếu có):**
|
|
137
|
-
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
|
|
137
|
+
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
|
|
138
138
|
- `paths.refinement_dir` → thư mục output cho findings/review
|
|
139
139
|
- `paths.qc_dir` → gốc artifact QC automation (hiện ở top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
|
|
140
140
|
- `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
|
|
@@ -160,7 +160,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
160
160
|
Lưu ý: Trong bố cục feature-package, `specs_dir` là gốc thống nhất. Mọi loại spec artifact (PRD, BDD, tech-docs, design-spec) đều nằm dưới `{specs_dir}/{domain}/{prd-slug}/`. `prd-slug` là tên folder feature-package, không phải một biến config riêng.
|
|
161
161
|
|
|
162
162
|
**Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, vì artifact BDD/tech-docs/design-spec lồng sâu hơn một hoặc hai cấp bên trong package. Ví dụ:
|
|
163
|
-
- `specs/payment/create-invoice/
|
|
163
|
+
- `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
|
|
164
164
|
- `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
|
|
165
165
|
- `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
|
|
166
166
|
- `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
|
|
@@ -181,7 +181,7 @@ Nếu có section `services`:
|
|
|
181
181
|
**1. Phát hiện active domain** (theo thứ tự ưu tiên):
|
|
182
182
|
- Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
|
|
183
183
|
- Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng ở mọi độ sâu target — xem quy tắc trích xuất `prd_slug` ở Bước 1.
|
|
184
|
-
*(vd: `specs/user/create-account/
|
|
184
|
+
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
185
185
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
186
186
|
|
|
187
187
|
**2. Route tới service** — nếu active domain khớp với một key trong `services`:
|
package/commands/dev-run-test.md
CHANGED
|
@@ -60,13 +60,13 @@ Hiển thị và chờ phản hồi:
|
|
|
60
60
|
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.
|
|
61
61
|
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/`):
|
|
62
62
|
- **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 đó.
|
|
63
|
-
- **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/
|
|
63
|
+
- **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.)*
|
|
64
64
|
- **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
|
|
65
65
|
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
66
66
|
|
|
67
67
|
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.
|
|
68
68
|
3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
|
|
69
|
-
- Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs
|
|
69
|
+
- 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).
|
|
70
70
|
- 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)"
|
|
71
71
|
- Chờ người dùng chọn rồi mới tiếp tục.
|
|
72
72
|
|
|
@@ -134,7 +134,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
134
134
|
- `domains` → danh sách các business domain đang hoạt động
|
|
135
135
|
|
|
136
136
|
**Paths (nếu có):**
|
|
137
|
-
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
|
|
137
|
+
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
|
|
138
138
|
- `paths.refinement_dir` → thư mục output cho findings/review
|
|
139
139
|
- `paths.qc_dir` → gốc artifact QC automation (hiện ở top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
|
|
140
140
|
- `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
|
|
@@ -160,7 +160,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
160
160
|
Lưu ý: Trong bố cục feature-package, `specs_dir` là gốc thống nhất. Mọi loại spec artifact (PRD, BDD, tech-docs, design-spec) đều nằm dưới `{specs_dir}/{domain}/{prd-slug}/`. `prd-slug` là tên folder feature-package, không phải một biến config riêng.
|
|
161
161
|
|
|
162
162
|
**Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, vì artifact BDD/tech-docs/design-spec lồng sâu hơn một hoặc hai cấp bên trong package. Ví dụ:
|
|
163
|
-
- `specs/payment/create-invoice/
|
|
163
|
+
- `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
|
|
164
164
|
- `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
|
|
165
165
|
- `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
|
|
166
166
|
- `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
|
|
@@ -181,7 +181,7 @@ Nếu có section `services`:
|
|
|
181
181
|
**1. Phát hiện active domain** (theo thứ tự ưu tiên):
|
|
182
182
|
- Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
|
|
183
183
|
- Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng ở mọi độ sâu target — xem quy tắc trích xuất `prd_slug` ở Bước 1.
|
|
184
|
-
*(vd: `specs/user/create-account/
|
|
184
|
+
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
185
185
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
186
186
|
|
|
187
187
|
**2. Route tới service** — nếu active domain khớp với một key trong `services`:
|
|
@@ -56,13 +56,13 @@ Hiển thị và chờ phản hồi:
|
|
|
56
56
|
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.
|
|
57
57
|
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/`):
|
|
58
58
|
- **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 đó.
|
|
59
|
-
- **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/
|
|
59
|
+
- **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.)*
|
|
60
60
|
- **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
|
|
61
61
|
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
62
62
|
|
|
63
63
|
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.
|
|
64
64
|
3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
|
|
65
|
-
- Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs
|
|
65
|
+
- 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).
|
|
66
66
|
- 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)"
|
|
67
67
|
- Chờ người dùng chọn rồi mới tiếp tục.
|
|
68
68
|
|
|
@@ -130,7 +130,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
130
130
|
- `domains` → danh sách các business domain đang hoạt động
|
|
131
131
|
|
|
132
132
|
**Paths (nếu có):**
|
|
133
|
-
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
|
|
133
|
+
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
|
|
134
134
|
- `paths.refinement_dir` → thư mục output cho findings/review
|
|
135
135
|
- `paths.qc_dir` → gốc artifact QC automation (hiện ở top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
|
|
136
136
|
- `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
|
|
@@ -156,7 +156,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
156
156
|
Lưu ý: Trong bố cục feature-package, `specs_dir` là gốc thống nhất. Mọi loại spec artifact (PRD, BDD, tech-docs, design-spec) đều nằm dưới `{specs_dir}/{domain}/{prd-slug}/`. `prd-slug` là tên folder feature-package, không phải một biến config riêng.
|
|
157
157
|
|
|
158
158
|
**Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, vì artifact BDD/tech-docs/design-spec lồng sâu hơn một hoặc hai cấp bên trong package. Ví dụ:
|
|
159
|
-
- `specs/payment/create-invoice/
|
|
159
|
+
- `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
|
|
160
160
|
- `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
|
|
161
161
|
- `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
|
|
162
162
|
- `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
|
|
@@ -177,7 +177,7 @@ Nếu có section `services`:
|
|
|
177
177
|
**1. Phát hiện active domain** (theo thứ tự ưu tiên):
|
|
178
178
|
- Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
|
|
179
179
|
- Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng ở mọi độ sâu target — xem quy tắc trích xuất `prd_slug` ở Bước 1.
|
|
180
|
-
*(vd: `specs/user/create-account/
|
|
180
|
+
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
181
181
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
182
182
|
|
|
183
183
|
**2. Route tới service** — nếu active domain khớp với một key trong `services`:
|
package/commands/fix-bug.md
CHANGED
|
@@ -54,13 +54,13 @@ Hiển thị và chờ phản hồi:
|
|
|
54
54
|
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.
|
|
55
55
|
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/`):
|
|
56
56
|
- **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 đó.
|
|
57
|
-
- **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/
|
|
57
|
+
- **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.)*
|
|
58
58
|
- **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
|
|
59
59
|
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
60
60
|
|
|
61
61
|
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.
|
|
62
62
|
3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
|
|
63
|
-
- Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs
|
|
63
|
+
- 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).
|
|
64
64
|
- 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)"
|
|
65
65
|
- Chờ người dùng chọn rồi mới tiếp tục.
|
|
66
66
|
|
|
@@ -128,7 +128,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
128
128
|
- `domains` → danh sách các business domain đang hoạt động
|
|
129
129
|
|
|
130
130
|
**Paths (nếu có):**
|
|
131
|
-
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{prd.md | bdd/ | tech-docs/ | design-spec/}`
|
|
131
|
+
- `paths.specs_dir` → gốc của spec artifact — PRD, BDD, tech-docs, design-spec. Cấu trúc: `{specs_dir}/{domain}/{prd-slug}/{ {TICKET-ID}-{prd-slug}.md | bdd/ | tech-docs/ | design-spec/}` (file PRD đặt tên `{TICKET-ID}-{prd-slug}.md`, là file `.md` duy nhất ở gốc feature folder)
|
|
132
132
|
- `paths.refinement_dir` → thư mục output cho findings/review
|
|
133
133
|
- `paths.qc_dir` → gốc artifact QC automation (hiện ở top-level, mỗi UC một thư mục con: `{qc_dir}/{UC-ID}/`)
|
|
134
134
|
- `paths.qc_skills_dir` → nơi các lệnh qc-* nạp QC skill (mặc định bundled `.agent/skills/qc`; override sang repo/submodule riêng của team QC để bản nâng cấp framework không ghi đè)
|
|
@@ -154,7 +154,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
154
154
|
Lưu ý: Trong bố cục feature-package, `specs_dir` là gốc thống nhất. Mọi loại spec artifact (PRD, BDD, tech-docs, design-spec) đều nằm dưới `{specs_dir}/{domain}/{prd-slug}/`. `prd-slug` là tên folder feature-package, không phải một biến config riêng.
|
|
155
155
|
|
|
156
156
|
**Cách trích xuất `prd_slug` (đúng cho MỌI target file, bất kể độ sâu lồng nhau):** với một path target dạng `{specs_dir}/{domain}/{prd-slug}/...`, lấy **segment path đầu tiên sau `{specs_dir}/{domain}/`** — tức vị trí `{prd-slug}`. KHÔNG dùng folder cha trực tiếp của file, vì artifact BDD/tech-docs/design-spec lồng sâu hơn một hoặc hai cấp bên trong package. Ví dụ:
|
|
157
|
-
- `specs/payment/create-invoice/
|
|
157
|
+
- `specs/payment/create-invoice/PAY01-create-invoice.md` → `prd_slug = create-invoice`
|
|
158
158
|
- `specs/payment/create-invoice/bdd/system/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `system`)*
|
|
159
159
|
- `specs/payment/create-invoice/bdd/web/PAY-UC1.feature` → `prd_slug = create-invoice` *(KHÔNG phải `web`)*
|
|
160
160
|
- `specs/payment/create-invoice/tech-docs/PAY-UC1-tech-design.md` → `prd_slug = create-invoice` *(KHÔNG phải `tech-docs`)*
|
|
@@ -175,7 +175,7 @@ Nếu có section `services`:
|
|
|
175
175
|
**1. Phát hiện active domain** (theo thứ tự ưu tiên):
|
|
176
176
|
- Đọc `@trace.domain` từ frontmatter của target file (nếu Gate đã nạp một target file)
|
|
177
177
|
- Trích xuất từ path target file: `domain` = segment đầu tiên sau base path `specs_dir`; `prd_slug` = segment kế tiếp (folder feature-package). Điều này đúng ở mọi độ sâu target — xem quy tắc trích xuất `prd_slug` ở Bước 1.
|
|
178
|
-
*(vd: `specs/user/create-account/
|
|
178
|
+
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
179
179
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
180
180
|
|
|
181
181
|
**2. Route tới service** — nếu active domain khớp với một key trong `services`:
|