@educa-corp/sdd-framework 0.2.6 → 0.2.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/debug.md +4 -1
- package/commands/define-product.md +38 -1
- package/commands/define-product.tmpl +34 -0
- package/commands/dev-gen-test.md +4 -1
- package/commands/dev-run-test.md +4 -1
- package/commands/dev-smoke-test.md +4 -1
- package/commands/fix-bug.md +4 -1
- package/commands/generate-architecture.md +4 -1
- package/commands/generate-bdd.md +4 -1
- package/commands/generate-code.md +80 -26
- package/commands/generate-code.tmpl +76 -25
- package/commands/generate-design-spec.md +4 -1
- package/commands/generate-prd.md +4 -1
- package/commands/generate-spec-manifest.md +4 -1
- package/commands/generate-tech-docs.md +4 -1
- package/commands/learn.md +4 -1
- package/commands/map-testids.md +4 -1
- package/commands/propose-scenario.md +4 -1
- package/commands/qc-analyze.md +4 -1
- package/commands/qc-design-test.md +4 -1
- package/commands/qc-plan.md +4 -1
- package/commands/qc-report.md +4 -1
- package/commands/qc-review.md +4 -1
- package/commands/qc-run-test.md +4 -1
- package/commands/refine-prd.md +4 -1
- package/commands/report-bug.md +4 -1
- package/commands/review-code.md +4 -1
- package/commands/review-context.md +4 -1
- package/commands/review-tech-docs.md +4 -1
- package/commands/setup-ai-first.md +2 -1
- package/commands/validate-traces.md +4 -1
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +4 -1
- package/core/commands/define-product.md +38 -1
- package/core/commands/dev-gen-test.md +4 -1
- package/core/commands/dev-run-test.md +4 -1
- package/core/commands/dev-smoke-test.md +4 -1
- package/core/commands/fix-bug.md +4 -1
- package/core/commands/generate-architecture.md +4 -1
- package/core/commands/generate-bdd.md +4 -1
- package/core/commands/generate-code.md +80 -26
- package/core/commands/generate-design-spec.md +4 -1
- package/core/commands/generate-prd.md +4 -1
- package/core/commands/generate-spec-manifest.md +4 -1
- package/core/commands/generate-tech-docs.md +4 -1
- package/core/commands/learn.md +4 -1
- package/core/commands/map-testids.md +4 -1
- package/core/commands/propose-scenario.md +4 -1
- package/core/commands/qc-analyze.md +4 -1
- package/core/commands/qc-design-test.md +4 -1
- package/core/commands/qc-plan.md +4 -1
- package/core/commands/qc-report.md +4 -1
- package/core/commands/qc-review.md +4 -1
- package/core/commands/qc-run-test.md +4 -1
- package/core/commands/refine-prd.md +4 -1
- package/core/commands/report-bug.md +4 -1
- package/core/commands/review-code.md +4 -1
- package/core/commands/review-context.md +4 -1
- package/core/commands/review-tech-docs.md +4 -1
- package/core/commands/setup-ai-first.md +2 -1
- package/core/commands/validate-traces.md +4 -1
- package/core/modules/phaser-game/architecture-snippets/phaser-scene-patterns.md +646 -0
- package/core/modules/phaser-game/module.yaml +15 -0
- package/core/modules/phaser-game/stack-profile.yaml +90 -0
- package/core/steps/context-loader.md +2 -0
- package/core/steps/gate.md +2 -1
- package/core/templates/project-context.yaml +6 -0
- package/docs/02-concepts/pipeline-steps/06-code.md +7 -4
- package/docs/03-guides/developer.md +6 -3
- package/docs/explain/09-generate-code.md +41 -3
- package/modules/phaser-game/architecture-snippets/phaser-scene-patterns.md +646 -0
- package/modules/phaser-game/module.yaml +15 -0
- package/modules/phaser-game/stack-profile.yaml +90 -0
- package/package.json +1 -1
- package/steps/context-loader.md +2 -0
- package/steps/gate.md +2 -1
- package/templates/project-context.yaml +6 -0
package/commands/debug.md
CHANGED
|
@@ -55,7 +55,8 @@ Hiển thị và chờ phản hồi:
|
|
|
55
55
|
|
|
56
56
|
## Bước 1 — Xác định Target File
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
59
|
+
1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
59
60
|
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/`):
|
|
60
61
|
- **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 đó.
|
|
61
62
|
- **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.)*
|
|
@@ -141,6 +142,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
141
142
|
- `paths.business_dictionary` → path tới business-dictionary.md
|
|
142
143
|
- `paths.core_entities` → path tới core-entities.md
|
|
143
144
|
- `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
|
|
145
|
+
- `paths.src_dir` → gốc mã nguồn (nơi generate-code đặt & quét code; nguồn chính cho FE + phạm vi reuse-scan của DS5)
|
|
144
146
|
- `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (mỗi UC × platform một sổ)
|
|
145
147
|
|
|
146
148
|
Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
@@ -153,6 +155,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
153
155
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
154
156
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
155
157
|
- `tech_docs_dir` = `specs`
|
|
158
|
+
- `src_dir` = `src`
|
|
156
159
|
- `trace_dir` = `.trace`
|
|
157
160
|
|
|
158
161
|
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.
|
|
@@ -52,7 +52,8 @@ Hiển thị và chờ phản hồi:
|
|
|
52
52
|
|
|
53
53
|
## Bước 1 — Xác định Target File
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
56
|
+
1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
56
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/`):
|
|
57
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 đó.
|
|
58
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.)*
|
|
@@ -138,6 +139,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
138
139
|
- `paths.business_dictionary` → path tới business-dictionary.md
|
|
139
140
|
- `paths.core_entities` → path tới core-entities.md
|
|
140
141
|
- `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
|
|
142
|
+
- `paths.src_dir` → gốc mã nguồn (nơi generate-code đặt & quét code; nguồn chính cho FE + phạm vi reuse-scan của DS5)
|
|
141
143
|
- `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (mỗi UC × platform một sổ)
|
|
142
144
|
|
|
143
145
|
Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
@@ -150,6 +152,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
150
152
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
151
153
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
152
154
|
- `tech_docs_dir` = `specs`
|
|
155
|
+
- `src_dir` = `src`
|
|
153
156
|
- `trace_dir` = `.trace`
|
|
154
157
|
|
|
155
158
|
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.
|
|
@@ -481,6 +484,27 @@ Các từ như `cờ / flag`, `biến / trường / field`, `giá trị / value`
|
|
|
481
484
|
**Checklist (dùng ở Quality Checklist của lệnh):** 0 thuật ngữ kỹ thuật/UI (re-render, UI, timeout, spinner, API/endpoint/token…) trong prose nghiệp vụ — đã diễn đạt lại (Nhóm 1) / chuyển Design Spec (Nhóm 2) / bỏ về Tech Docs (Nhóm 3); 0 ẩn dụ dữ liệu cho trạng thái đã có tên nghiệp vụ (cờ/giá trị/đọc-ghi khi là artifact — Nhóm 4) và 0 backtick bọc giá trị nghiệp vụ.
|
|
482
485
|
|
|
483
486
|
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## Discovery Contract *(đọc trước — quyết định cách xử lý input của PO)*
|
|
490
|
+
|
|
491
|
+
Lệnh này là **khai vấn (discovery)**, KHÔNG phải thu thập dữ liệu. Giá trị nằm ở **quá trình hỏi** — nó ép PO nói ra những gì chưa viết (edge case, out-of-scope, phụ thuộc, rule mâu thuẫn). Vì vậy:
|
|
492
|
+
|
|
493
|
+
> **Input của PO là NGUYÊN LIỆU THÔ, KHÔNG phải câu trả lời thay thế phỏng vấn.**
|
|
494
|
+
> Dù PO dán tài liệu dày cỡ nào — **vẫn đi hết Phase 1→7, mọi CHECKPOINT vẫn phải nổ.** TUYỆT ĐỐI KHÔNG coi input là "đã trả lời" rồi nhảy phase. Đây là điểm khác biệt cốt lõi so với các lệnh thu thập dữ kiện (generate-code/architecture "vét nguồn rồi mới hỏi") — ở discovery, **không có luật skip-if-answered.**
|
|
495
|
+
|
|
496
|
+
**Cơ chế Confirm-vs-Ask** *(áp cho mọi câu hỏi ở Phase 1–6)*:
|
|
497
|
+
- **Item input ĐÃ phủ** → KHÔNG skip. Trình bản nháp đã trích, đánh dấu `🤖 trích từ input` và hỏi PO **xác nhận / sửa / bổ sung**:
|
|
498
|
+
```
|
|
499
|
+
🤖 Trích từ input: "{nội dung AI hiểu được}"
|
|
500
|
+
→ Đúng chưa? Cần sửa/bổ sung gì không?
|
|
501
|
+
```
|
|
502
|
+
Chỉ khi PO chốt mới nâng dấu thành `✅ PO xác nhận` và đi tiếp.
|
|
503
|
+
- **Item input CHƯA phủ** → hỏi mới bình thường.
|
|
504
|
+
- **Nghịch lý độ dày:** input càng dày → GAP tiềm ẩn càng nhiều (đó là thứ PO *chưa nghĩ tới*), nên phần soi hở ở **Phase 3 càng phải sâu**, KHÔNG được rút ngắn. Input dày tạo *ảo giác đủ* — đừng mắc bẫy.
|
|
505
|
+
|
|
506
|
+
**Phân biệt dấu (bắt buộc, để chống blitz):** trong file output, mỗi dữ kiện mang một trong hai dấu — `✅ PO xác nhận` (PO đã chốt trực tiếp) hoặc `🤖 AI trích — chờ PO chốt`. Một phase CHỈ được đóng khi mọi item của nó mang dấu `✅`. Không tự nâng `🤖`→`✅` thay PO.
|
|
507
|
+
|
|
484
508
|
---
|
|
485
509
|
|
|
486
510
|
## Phase 0 — Knowledge Sync *(AI tự điền — bối cảnh hệ thống, KHÔNG phải yêu cầu nghiệp vụ; không cần input PO)*
|
|
@@ -511,6 +535,8 @@ Lưu bản đồ thuật ngữ này vào file product-definition output dưới
|
|
|
511
535
|
|
|
512
536
|
Hỏi **lần lượt từng câu một**, đợi PO trả lời rồi mới hỏi câu kế. Giữ giọng nghiệp vụ, thân thiện; nếu PO lúng túng, đưa một ví dụ ngắn để gợi ý. Tránh hỏi về giải pháp kỹ thuật ở phase này.
|
|
513
537
|
|
|
538
|
+
> **Áp Confirm-vs-Ask (Discovery Contract):** với câu mà input PO đã phủ, ĐỪNG bỏ qua — trình bản nháp `🤖 trích từ input` rồi hỏi PO xác nhận/sửa/bổ sung; câu chưa phủ thì hỏi mới. Mọi câu 1–8 đều phải có một cú chạm xác nhận của PO trước khi tóm tắt.
|
|
539
|
+
|
|
514
540
|
1. **Context**: Bối cảnh / lý do vì sao cần feature này?
|
|
515
541
|
2. **Problem**: Vấn đề cụ thể cần giải quyết?
|
|
516
542
|
3. **Goal**: Khi feature chạy ổn, kết quả nghiệp vụ bạn muốn thấy là gì? Mô tả *thành quả*, chưa cần cách làm.
|
|
@@ -529,6 +555,8 @@ Sau câu 8 → **tóm tắt lại toàn bộ** cho PO → chờ xác nhận →
|
|
|
529
555
|
|
|
530
556
|
## Phase 2 — User Flow Definition *(CHECKPOINT 2)*
|
|
531
557
|
|
|
558
|
+
> **Áp Confirm-vs-Ask (Discovery Contract):** input phủ bước nào → trình bản nháp `🤖 trích từ input` để PO xác nhận/sửa; bước nào input im lặng (đặc biệt Edge Cases) → hỏi mới, KHÔNG tự bịa cho đủ bảng.
|
|
559
|
+
|
|
532
560
|
Hỏi:
|
|
533
561
|
1. **Entry Point**: Người dùng bắt đầu tương tác với feature này ở đâu?
|
|
534
562
|
2. **Flow Steps**: Mô tả từng bước (dùng bảng):
|
|
@@ -550,6 +578,14 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
|
550
578
|
|
|
551
579
|
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.
|
|
552
580
|
|
|
581
|
+
> **BẮT BUỘC chạy ≥1 vòng — KHÔNG được bỏ qua kể cả khi input rất dày.** Đây là nơi bắt GAP mà PO *chưa nghĩ tới*, nên độ dày input KHÔNG làm giảm nhu cầu hỏi — mà **làm tăng**. AI phải chủ động thách thức các **vùng input im lặng**, tối thiểu soi 4 nhóm:
|
|
582
|
+
> 1. **Edge case / luồng lỗi** chưa được nêu (input thiếu, điều kiện không thoả, thao tác đồng thời).
|
|
583
|
+
> 2. **Out-of-scope mơ hồ** — ranh giới ticket chưa rõ, dễ phình phạm vi.
|
|
584
|
+
> 3. **Phụ thuộc liên service** input ngầm giả định nhưng chưa xác nhận (dữ liệu/năng lực từ team khác).
|
|
585
|
+
> 4. **Rule mâu thuẫn / chồng chéo** giữa các phát biểu trong input.
|
|
586
|
+
>
|
|
587
|
+
> Với mỗi item `🤖 AI trích — chờ PO chốt` còn sót từ Phase 1–2 → gom vào đây để PO chốt dứt điểm. **Không được nâng dấu `🤖`→`✅` thay PO.**
|
|
588
|
+
|
|
553
589
|
```
|
|
554
590
|
### Vòng {N}
|
|
555
591
|
| # | Nhóm | Câu hỏi | PO trả lời |
|
|
@@ -642,6 +678,7 @@ Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/prod
|
|
|
642
678
|
|
|
643
679
|
**Cập nhật Metadata theo tiến độ (cho phép resume):**
|
|
644
680
|
- 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`.
|
|
681
|
+
- **Chống blitz:** một phase CHỈ được tính là chốt khi mọi item của nó mang dấu `✅ PO xác nhận` — nếu còn bất kỳ item `🤖 AI trích — chờ PO chốt` nào, phase đó CHƯA xong, KHÔNG được tăng `Completed Phase`.
|
|
645
682
|
- Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
|
|
646
683
|
- 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.
|
|
647
684
|
|
|
@@ -15,6 +15,27 @@
|
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
+
## Discovery Contract *(đọc trước — quyết định cách xử lý input của PO)*
|
|
19
|
+
|
|
20
|
+
Lệnh này là **khai vấn (discovery)**, KHÔNG phải thu thập dữ liệu. Giá trị nằm ở **quá trình hỏi** — nó ép PO nói ra những gì chưa viết (edge case, out-of-scope, phụ thuộc, rule mâu thuẫn). Vì vậy:
|
|
21
|
+
|
|
22
|
+
> **Input của PO là NGUYÊN LIỆU THÔ, KHÔNG phải câu trả lời thay thế phỏng vấn.**
|
|
23
|
+
> Dù PO dán tài liệu dày cỡ nào — **vẫn đi hết Phase 1→7, mọi CHECKPOINT vẫn phải nổ.** TUYỆT ĐỐI KHÔNG coi input là "đã trả lời" rồi nhảy phase. Đây là điểm khác biệt cốt lõi so với các lệnh thu thập dữ kiện (generate-code/architecture "vét nguồn rồi mới hỏi") — ở discovery, **không có luật skip-if-answered.**
|
|
24
|
+
|
|
25
|
+
**Cơ chế Confirm-vs-Ask** *(áp cho mọi câu hỏi ở Phase 1–6)*:
|
|
26
|
+
- **Item input ĐÃ phủ** → KHÔNG skip. Trình bản nháp đã trích, đánh dấu `🤖 trích từ input` và hỏi PO **xác nhận / sửa / bổ sung**:
|
|
27
|
+
```
|
|
28
|
+
🤖 Trích từ input: "{nội dung AI hiểu được}"
|
|
29
|
+
→ Đúng chưa? Cần sửa/bổ sung gì không?
|
|
30
|
+
```
|
|
31
|
+
Chỉ khi PO chốt mới nâng dấu thành `✅ PO xác nhận` và đi tiếp.
|
|
32
|
+
- **Item input CHƯA phủ** → hỏi mới bình thường.
|
|
33
|
+
- **Nghịch lý độ dày:** input càng dày → GAP tiềm ẩn càng nhiều (đó là thứ PO *chưa nghĩ tới*), nên phần soi hở ở **Phase 3 càng phải sâu**, KHÔNG được rút ngắn. Input dày tạo *ảo giác đủ* — đừng mắc bẫy.
|
|
34
|
+
|
|
35
|
+
**Phân biệt dấu (bắt buộc, để chống blitz):** trong file output, mỗi dữ kiện mang một trong hai dấu — `✅ PO xác nhận` (PO đã chốt trực tiếp) hoặc `🤖 AI trích — chờ PO chốt`. Một phase CHỈ được đóng khi mọi item của nó mang dấu `✅`. Không tự nâng `🤖`→`✅` thay PO.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
18
39
|
## Phase 0 — Knowledge Sync *(AI tự điền — bối cảnh hệ thống, KHÔNG phải yêu cầu nghiệp vụ; không cần input PO)*
|
|
19
40
|
|
|
20
41
|
AI quét dự án và ghi:
|
|
@@ -43,6 +64,8 @@ Lưu bản đồ thuật ngữ này vào file product-definition output dưới
|
|
|
43
64
|
|
|
44
65
|
Hỏi **lần lượt từng câu một**, đợi PO trả lời rồi mới hỏi câu kế. Giữ giọng nghiệp vụ, thân thiện; nếu PO lúng túng, đưa một ví dụ ngắn để gợi ý. Tránh hỏi về giải pháp kỹ thuật ở phase này.
|
|
45
66
|
|
|
67
|
+
> **Áp Confirm-vs-Ask (Discovery Contract):** với câu mà input PO đã phủ, ĐỪNG bỏ qua — trình bản nháp `🤖 trích từ input` rồi hỏi PO xác nhận/sửa/bổ sung; câu chưa phủ thì hỏi mới. Mọi câu 1–8 đều phải có một cú chạm xác nhận của PO trước khi tóm tắt.
|
|
68
|
+
|
|
46
69
|
1. **Context**: Bối cảnh / lý do vì sao cần feature này?
|
|
47
70
|
2. **Problem**: Vấn đề cụ thể cần giải quyết?
|
|
48
71
|
3. **Goal**: Khi feature chạy ổn, kết quả nghiệp vụ bạn muốn thấy là gì? Mô tả *thành quả*, chưa cần cách làm.
|
|
@@ -61,6 +84,8 @@ Sau câu 8 → **tóm tắt lại toàn bộ** cho PO → chờ xác nhận →
|
|
|
61
84
|
|
|
62
85
|
## Phase 2 — User Flow Definition *(CHECKPOINT 2)*
|
|
63
86
|
|
|
87
|
+
> **Áp Confirm-vs-Ask (Discovery Contract):** input phủ bước nào → trình bản nháp `🤖 trích từ input` để PO xác nhận/sửa; bước nào input im lặng (đặc biệt Edge Cases) → hỏi mới, KHÔNG tự bịa cho đủ bảng.
|
|
88
|
+
|
|
64
89
|
Hỏi:
|
|
65
90
|
1. **Entry Point**: Người dùng bắt đầu tương tác với feature này ở đâu?
|
|
66
91
|
2. **Flow Steps**: Mô tả từng bước (dùng bảng):
|
|
@@ -82,6 +107,14 @@ Xác nhận → ghi `✅ PO xác nhận: Có` → tiếp tục.
|
|
|
82
107
|
|
|
83
108
|
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.
|
|
84
109
|
|
|
110
|
+
> **BẮT BUỘC chạy ≥1 vòng — KHÔNG được bỏ qua kể cả khi input rất dày.** Đây là nơi bắt GAP mà PO *chưa nghĩ tới*, nên độ dày input KHÔNG làm giảm nhu cầu hỏi — mà **làm tăng**. AI phải chủ động thách thức các **vùng input im lặng**, tối thiểu soi 4 nhóm:
|
|
111
|
+
> 1. **Edge case / luồng lỗi** chưa được nêu (input thiếu, điều kiện không thoả, thao tác đồng thời).
|
|
112
|
+
> 2. **Out-of-scope mơ hồ** — ranh giới ticket chưa rõ, dễ phình phạm vi.
|
|
113
|
+
> 3. **Phụ thuộc liên service** input ngầm giả định nhưng chưa xác nhận (dữ liệu/năng lực từ team khác).
|
|
114
|
+
> 4. **Rule mâu thuẫn / chồng chéo** giữa các phát biểu trong input.
|
|
115
|
+
>
|
|
116
|
+
> Với mỗi item `🤖 AI trích — chờ PO chốt` còn sót từ Phase 1–2 → gom vào đây để PO chốt dứt điểm. **Không được nâng dấu `🤖`→`✅` thay PO.**
|
|
117
|
+
|
|
85
118
|
```
|
|
86
119
|
### Vòng {N}
|
|
87
120
|
| # | Nhóm | Câu hỏi | PO trả lời |
|
|
@@ -174,6 +207,7 @@ Ghi `{paths.product_definitions_dir}/{TICKET-ID}-{slug}.md` theo `templates/prod
|
|
|
174
207
|
|
|
175
208
|
**Cập nhật Metadata theo tiến độ (cho phép resume):**
|
|
176
209
|
- 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`.
|
|
210
|
+
- **Chống blitz:** một phase CHỈ được tính là chốt khi mọi item của nó mang dấu `✅ PO xác nhận` — nếu còn bất kỳ item `🤖 AI trích — chờ PO chốt` nào, phase đó CHƯA xong, KHÔNG được tăng `Completed Phase`.
|
|
177
211
|
- Khi Phase 7 pass mà không còn GAP → đặt `Completed Phase: 7` và `Status: completed`.
|
|
178
212
|
- 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.
|
|
179
213
|
|
package/commands/dev-gen-test.md
CHANGED
|
@@ -58,7 +58,8 @@ Hiển thị và chờ phản hồi:
|
|
|
58
58
|
|
|
59
59
|
## Bước 1 — Xác định Target File
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
62
|
+
1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
62
63
|
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/`):
|
|
63
64
|
- **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 đó.
|
|
64
65
|
- **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.)*
|
|
@@ -144,6 +145,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
144
145
|
- `paths.business_dictionary` → path tới business-dictionary.md
|
|
145
146
|
- `paths.core_entities` → path tới core-entities.md
|
|
146
147
|
- `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
|
|
148
|
+
- `paths.src_dir` → gốc mã nguồn (nơi generate-code đặt & quét code; nguồn chính cho FE + phạm vi reuse-scan của DS5)
|
|
147
149
|
- `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (mỗi UC × platform một sổ)
|
|
148
150
|
|
|
149
151
|
Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
@@ -156,6 +158,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
156
158
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
157
159
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
158
160
|
- `tech_docs_dir` = `specs`
|
|
161
|
+
- `src_dir` = `src`
|
|
159
162
|
- `trace_dir` = `.trace`
|
|
160
163
|
|
|
161
164
|
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.
|
package/commands/dev-run-test.md
CHANGED
|
@@ -58,7 +58,8 @@ Hiển thị và chờ phản hồi:
|
|
|
58
58
|
|
|
59
59
|
## Bước 1 — Xác định Target File
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
62
|
+
1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
62
63
|
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/`):
|
|
63
64
|
- **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 đó.
|
|
64
65
|
- **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.)*
|
|
@@ -144,6 +145,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
144
145
|
- `paths.business_dictionary` → path tới business-dictionary.md
|
|
145
146
|
- `paths.core_entities` → path tới core-entities.md
|
|
146
147
|
- `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
|
|
148
|
+
- `paths.src_dir` → gốc mã nguồn (nơi generate-code đặt & quét code; nguồn chính cho FE + phạm vi reuse-scan của DS5)
|
|
147
149
|
- `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (mỗi UC × platform một sổ)
|
|
148
150
|
|
|
149
151
|
Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
@@ -156,6 +158,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
156
158
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
157
159
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
158
160
|
- `tech_docs_dir` = `specs`
|
|
161
|
+
- `src_dir` = `src`
|
|
159
162
|
- `trace_dir` = `.trace`
|
|
160
163
|
|
|
161
164
|
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.
|
|
@@ -54,7 +54,8 @@ Hiển thị và chờ phản hồi:
|
|
|
54
54
|
|
|
55
55
|
## Bước 1 — Xác định Target File
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
58
|
+
1. Nếu `$ARGUMENTS` (đã tách cờ) đượ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
59
|
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
60
|
- **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
61
|
- **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.)*
|
|
@@ -140,6 +141,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
140
141
|
- `paths.business_dictionary` → path tới business-dictionary.md
|
|
141
142
|
- `paths.core_entities` → path tới core-entities.md
|
|
142
143
|
- `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
|
|
144
|
+
- `paths.src_dir` → gốc mã nguồn (nơi generate-code đặt & quét code; nguồn chính cho FE + phạm vi reuse-scan của DS5)
|
|
143
145
|
- `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (mỗi UC × platform một sổ)
|
|
144
146
|
|
|
145
147
|
Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
@@ -152,6 +154,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
152
154
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
153
155
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
154
156
|
- `tech_docs_dir` = `specs`
|
|
157
|
+
- `src_dir` = `src`
|
|
155
158
|
- `trace_dir` = `.trace`
|
|
156
159
|
|
|
157
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.
|
package/commands/fix-bug.md
CHANGED
|
@@ -52,7 +52,8 @@ Hiển thị và chờ phản hồi:
|
|
|
52
52
|
|
|
53
53
|
## Bước 1 — Xác định Target File
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
56
|
+
1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
56
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/`):
|
|
57
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 đó.
|
|
58
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.)*
|
|
@@ -138,6 +139,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
138
139
|
- `paths.business_dictionary` → path tới business-dictionary.md
|
|
139
140
|
- `paths.core_entities` → path tới core-entities.md
|
|
140
141
|
- `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
|
|
142
|
+
- `paths.src_dir` → gốc mã nguồn (nơi generate-code đặt & quét code; nguồn chính cho FE + phạm vi reuse-scan của DS5)
|
|
141
143
|
- `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (mỗi UC × platform một sổ)
|
|
142
144
|
|
|
143
145
|
Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
@@ -150,6 +152,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
150
152
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
151
153
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
152
154
|
- `tech_docs_dir` = `specs`
|
|
155
|
+
- `src_dir` = `src`
|
|
153
156
|
- `trace_dir` = `.trace`
|
|
154
157
|
|
|
155
158
|
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.
|
|
@@ -65,7 +65,8 @@ Hiển thị và chờ phản hồi:
|
|
|
65
65
|
|
|
66
66
|
## Bước 1 — Xác định Target File
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
69
|
+
1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
69
70
|
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/`):
|
|
70
71
|
- **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 đó.
|
|
71
72
|
- **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.)*
|
|
@@ -156,6 +157,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
156
157
|
- `paths.business_dictionary` → path tới business-dictionary.md
|
|
157
158
|
- `paths.core_entities` → path tới core-entities.md
|
|
158
159
|
- `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
|
|
160
|
+
- `paths.src_dir` → gốc mã nguồn (nơi generate-code đặt & quét code; nguồn chính cho FE + phạm vi reuse-scan của DS5)
|
|
159
161
|
- `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (mỗi UC × platform một sổ)
|
|
160
162
|
|
|
161
163
|
Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
@@ -168,6 +170,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
168
170
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
169
171
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
170
172
|
- `tech_docs_dir` = `specs`
|
|
173
|
+
- `src_dir` = `src`
|
|
171
174
|
- `trace_dir` = `.trace`
|
|
172
175
|
|
|
173
176
|
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.
|
package/commands/generate-bdd.md
CHANGED
|
@@ -52,7 +52,8 @@ Hiển thị và chờ phản hồi:
|
|
|
52
52
|
|
|
53
53
|
## Bước 1 — Xác định Target File
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
56
|
+
1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
56
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/`):
|
|
57
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 đó.
|
|
58
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.)*
|
|
@@ -136,6 +137,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
136
137
|
- `paths.business_dictionary` → path tới business-dictionary.md
|
|
137
138
|
- `paths.core_entities` → path tới core-entities.md
|
|
138
139
|
- `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
|
|
140
|
+
- `paths.src_dir` → gốc mã nguồn (nơi generate-code đặt & quét code; nguồn chính cho FE + phạm vi reuse-scan của DS5)
|
|
139
141
|
- `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (mỗi UC × platform một sổ)
|
|
140
142
|
|
|
141
143
|
Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
@@ -148,6 +150,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
148
150
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
149
151
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
150
152
|
- `tech_docs_dir` = `specs`
|
|
153
|
+
- `src_dir` = `src`
|
|
151
154
|
- `trace_dir` = `.trace`
|
|
152
155
|
|
|
153
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.
|