@educa-corp/sdd-framework 0.4.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/build.js +113 -19
- package/bin/gate-trace.js +464 -0
- package/bin/index.js +418 -146
- package/bin/lint-trace.js +602 -0
- package/bin/self-check.js +499 -6
- package/bin/trace-schema.json +1449 -692
- package/commands/debug.md +123 -510
- package/commands/debug.tmpl +3 -0
- package/commands/define-product.md +86 -509
- package/commands/dev-gen-test.md +120 -516
- package/commands/dev-run-test.md +120 -516
- package/commands/dev-smoke-test.md +86 -509
- package/commands/extend-prd.md +486 -0
- package/commands/extend-prd.tmpl +273 -0
- package/commands/fix-bug.md +152 -515
- package/commands/generate-architecture.md +94 -514
- package/commands/generate-architecture.tmpl +3 -0
- package/commands/generate-bdd.md +138 -519
- package/commands/generate-bdd.tmpl +18 -3
- package/commands/generate-code.md +156 -523
- package/commands/generate-code.tmpl +36 -7
- package/commands/generate-design-spec.md +86 -509
- package/commands/generate-prd.md +114 -509
- package/commands/generate-prd.tmpl +28 -0
- package/commands/generate-spec-manifest.md +86 -509
- package/commands/generate-tech-docs.md +86 -509
- package/commands/learn.md +172 -495
- package/commands/learn.tmpl +70 -3
- package/commands/map-testids.md +86 -509
- package/commands/propose-scenario.md +136 -508
- package/commands/propose-scenario.tmpl +52 -1
- package/commands/qc-analyze.md +86 -509
- package/commands/qc-design-test.md +87 -509
- package/commands/qc-design-test.tmpl +1 -0
- package/commands/qc-plan.md +86 -509
- package/commands/qc-report.md +86 -509
- package/commands/qc-review.md +86 -509
- package/commands/qc-run-test.md +133 -517
- package/commands/qc-run-test.tmpl +13 -1
- package/commands/refine-prd.md +99 -519
- package/commands/refine-prd.tmpl +3 -0
- package/commands/report-bug.md +86 -509
- package/commands/review-code.md +127 -513
- package/commands/review-code.tmpl +7 -3
- package/commands/review-context.md +96 -515
- package/commands/review-context.tmpl +6 -2
- package/commands/review-tech-docs.md +90 -510
- package/commands/review-tech-docs.tmpl +3 -0
- package/commands/setup-ai-first.md +166 -137
- package/commands/setup-ai-first.tmpl +72 -0
- package/commands/sync.md +86 -118
- package/commands/sync.tmpl +84 -16
- package/commands/update-framework.md +16 -102
- package/commands/update-framework.tmpl +14 -0
- package/commands/validate-traces.md +458 -531
- package/commands/validate-traces.tmpl +381 -31
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/README.md +20 -0
- package/core/commands/debug.md +123 -510
- package/core/commands/define-product.md +86 -509
- package/core/commands/dev-gen-test.md +120 -516
- package/core/commands/dev-run-test.md +120 -516
- package/core/commands/dev-smoke-test.md +86 -509
- package/core/commands/extend-prd.md +486 -0
- package/core/commands/fix-bug.md +152 -515
- package/core/commands/generate-architecture.md +94 -514
- package/core/commands/generate-bdd.md +138 -519
- package/core/commands/generate-code.md +156 -523
- package/core/commands/generate-design-spec.md +86 -509
- package/core/commands/generate-prd.md +114 -509
- package/core/commands/generate-spec-manifest.md +86 -509
- package/core/commands/generate-tech-docs.md +86 -509
- package/core/commands/learn.md +172 -495
- package/core/commands/map-testids.md +86 -509
- package/core/commands/propose-scenario.md +136 -508
- package/core/commands/qc-analyze.md +86 -509
- package/core/commands/qc-design-test.md +87 -509
- package/core/commands/qc-plan.md +86 -509
- package/core/commands/qc-report.md +86 -509
- package/core/commands/qc-review.md +86 -509
- package/core/commands/qc-run-test.md +133 -517
- package/core/commands/refine-prd.md +99 -519
- package/core/commands/report-bug.md +86 -509
- package/core/commands/review-code.md +127 -513
- package/core/commands/review-context.md +96 -515
- package/core/commands/review-tech-docs.md +90 -510
- package/core/commands/setup-ai-first.md +166 -137
- package/core/commands/sync.md +86 -118
- package/core/commands/update-framework.md +16 -102
- package/core/commands/validate-traces.md +458 -531
- package/core/hooks/data-guard.js +174 -83
- package/core/hooks/settings.json +2 -1
- package/core/rules/workflow.md +48 -4
- package/core/steps/capture-lesson.md +34 -1
- package/core/steps/context-loader.md +24 -3
- package/core/steps/gate.md +92 -35
- package/core/steps/report-footer.md +26 -2
- package/core/steps/trace-mirror.md +34 -7
- package/core/templates/README.md +24 -1
- package/core/templates/ci/trace-gate.yml +146 -0
- package/core/templates/feature.template +1 -1
- package/core/templates/hooks/pre-push +61 -0
- package/docs/01-getting-started/installation.md +18 -1
- package/docs/01-getting-started/what-is-sdd.md +4 -2
- package/docs/02-concepts/architecture.md +48 -5
- package/docs/02-concepts/pipeline-steps/02-specification.md +39 -3
- package/docs/02-concepts/pipeline-steps/04-bdd.md +24 -2
- package/docs/02-concepts/pipeline-steps/05-tech-docs.md +18 -1
- package/docs/02-concepts/pipeline-steps/06-code.md +35 -4
- package/docs/02-concepts/pipeline-steps/09-validate-traces.md +137 -12
- package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +59 -3
- package/docs/02-concepts/roles-and-hitl.md +1 -1
- package/docs/02-concepts/traceability.md +183 -117
- package/docs/03-guides/architect.md +63 -0
- package/docs/03-guides/developer.md +20 -4
- package/docs/03-guides/product-owner.md +72 -68
- package/docs/03-guides/tester-qa.md +81 -70
- package/docs/04-reference/commands.md +134 -105
- package/docs/04-reference/configuration.md +146 -94
- package/docs/04-reference/model-selection.md +32 -19
- package/docs/04-reference/trace-schema.md +26 -9
- package/docs/explain/02-generate-prd.md +80 -78
- package/docs/explain/02b-extend-prd.md +125 -0
- package/docs/explain/03-refine-prd.md +86 -86
- package/docs/explain/04-review-context.md +18 -1
- package/docs/explain/06-generate-bdd.md +23 -0
- package/docs/explain/08-review-tech-docs.md +20 -5
- package/docs/explain/10-review-code.md +36 -2
- package/docs/explain/19-qc-run-test.md +87 -67
- package/docs/explain/21-validate-traces.md +75 -68
- package/docs/explain/23-fix-bug.md +19 -3
- package/docs/explain/26-propose-scenario.md +70 -63
- package/docs/explain/27-learn.md +5 -3
- package/docs/explain/README.md +135 -134
- package/hooks/data-guard.js +174 -83
- package/hooks/settings.json +2 -1
- package/package.json +53 -50
- package/rules/workflow.md +48 -4
- package/steps/capture-lesson.md +34 -1
- package/steps/context-loader.md +24 -3
- package/steps/gate.md +92 -35
- package/steps/report-footer.md +26 -2
- package/steps/trace-mirror.md +34 -7
- package/templates/README.md +24 -1
- package/templates/ci/trace-gate.yml +146 -0
- package/templates/feature.template +1 -1
- package/templates/hooks/pre-push +61 -0
- package/scripts/init.sh +0 -49
- package/scripts/upgrade.sh +0 -94
package/commands/sync.md
CHANGED
|
@@ -259,17 +259,81 @@ Với mỗi entry trong danh sách đó:
|
|
|
259
259
|
|
|
260
260
|
---
|
|
261
261
|
|
|
262
|
-
## Step 4 — Check
|
|
262
|
+
## Step 4 — Check luật git cho sổ trace
|
|
263
263
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
264
|
+
*Step 4a/4b kiểm **có được commit hay không** (hai chiều ngược nhau — nhầm chiều là mất dữ liệu).
|
|
265
|
+
Step 4c kiểm **merge thế nào khi hai người cùng ghi**. Cả hai đều là đường mất sổ, và 4c không
|
|
266
|
+
cần ai làm sai gì cả — chỉ cần hai người làm việc cùng lúc.*
|
|
267
267
|
|
|
268
|
-
|
|
268
|
+
*Đọc bảng trước:*
|
|
269
|
+
|
|
270
|
+
| Đường dẫn | Vai trò | Kỳ vọng |
|
|
271
|
+
|---|---|---|
|
|
272
|
+
| `{paths.trace_dir}` (`.trace/` hoặc `{spec_source}/.trace/`) | **AUTHORITATIVE** — TSV + `trace-history.jsonl`, không regenerate được | **PHẢI commit** — gitignore nó là **lỗi nghiêm trọng** |
|
|
273
|
+
| `.trace-mirror/` | bản sao tiện cho panel VS Code | phải gitignore |
|
|
274
|
+
| `.living-docs/` | report sinh ra | phải gitignore |
|
|
275
|
+
|
|
276
|
+
**4a. Cảnh báo mềm — mirror chưa gitignore.**
|
|
277
|
+
Kiểm `.trace-mirror/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`), và `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set). Thiếu cái nào:
|
|
278
|
+
```
|
|
279
|
+
⚠️ Mirror chưa gitignore — chúng được sinh ra, đừng bao giờ commit:
|
|
280
|
+
echo ".trace-mirror/" >> .gitignore
|
|
281
|
+
echo ".living-docs/" >> {spec_source}/.gitignore # specs module (nếu có spec_source)
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**4b. 🔴 Báo động — sổ gốc ĐANG bị bỏ qua.**
|
|
285
|
+
Phân giải `{paths.trace_dir}`; nếu nó nằm trong một git repo, chạy `git -C {repo} check-ignore -q {trace_dir}`. **Trúng** (exit 0) → in ngay, mức chặn:
|
|
286
|
+
```
|
|
287
|
+
🔴 NGUY HIỂM — sổ gốc trace ĐANG bị git bỏ qua: {paths.trace_dir}
|
|
288
|
+
Toàn bộ trạng thái theo dõi (spec_ver · gen_ver · implemented_by · test_count ·
|
|
289
|
+
dev_selftest · qc_status) VÀ trace-history.jsonl KHÔNG được lưu vào git.
|
|
290
|
+
Người khác clone repo về sẽ không thấy gì, và lịch sử thì KHÔNG dựng lại được.
|
|
291
|
+
|
|
292
|
+
Sửa:
|
|
293
|
+
1. Gỡ dòng khớp `.trace` khỏi .gitignore của {repo}
|
|
294
|
+
2. git -C {repo} add -f {trace_dir} && git -C {repo} commit -m "restore trace state"
|
|
295
|
+
Nguyên nhân thường gặp: bản trước v0.4.3 gọi panel mirror là `.trace` (trùng tên sổ gốc),
|
|
296
|
+
nên gợi ý "gitignore .trace/" của chính lệnh này có thể đã nhắm trúng sổ gốc.
|
|
269
297
|
```
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
298
|
+
> **Vì sao cần báo động này:** trước v0.4.3, mirror và sổ gốc **cùng tên `.trace`**. Khi dev mở thẳng spec repo làm workspace thì hai path bằng nhau — và Step 4 (bản cũ) gợi ý gitignore theo **tên**, không theo vai trò. Làm theo là mất sổ gốc, **im lặng**: máy vẫn chạy, dashboard vẫn có số; chỉ người thứ hai clone về mới phát hiện. Bản v0.4.3 đổi tên mirror thành `.trace-mirror` để cái bẫy biến mất, nhưng **dự án đã dính từ trước thì vẫn dính** — 4b là để tìm ra chúng.
|
|
299
|
+
|
|
300
|
+
**4c. Luật merge cho sổ trace.**
|
|
301
|
+
|
|
302
|
+
Sổ trace **phải commit** (4b) và **được nhiều người ghi trên nhiều nhánh song song**. Git cần biết
|
|
303
|
+
merge nó thế nào — mặc định thì không biết, và mặc định là đường mất row.
|
|
304
|
+
|
|
305
|
+
Kiểm `{paths.trace_dir}/.gitattributes` có tồn tại và có đủ hai dòng dưới. **Thiếu → tạo/bổ sung
|
|
306
|
+
ngay** (đây là hành động ghi duy nhất của Step 4; nó chỉ thêm file luật, không đụng dữ liệu):
|
|
307
|
+
|
|
308
|
+
```gitattributes
|
|
309
|
+
# Sổ trace — dữ liệu KHÔNG regenerate được. Hai luật, hai lý do khác nhau:
|
|
310
|
+
#
|
|
311
|
+
# merge=union — giữ row của CẢ HAI nhánh thay vì bắt người chọn một bên. Trùng sc_id sau
|
|
312
|
+
# union là ca ĐÚNG VÀ ĐƯỢC MONG ĐỢI: `--lint-trace` T4 bắt nó, rồi /validate-traces
|
|
313
|
+
# reconcile về một row. Mất row thì KHÔNG có gì bắt được. Đánh đổi có chủ ý — đừng "dọn".
|
|
314
|
+
# (union là driver built-in của git: không ai cần chạy git config gì thêm.)
|
|
315
|
+
#
|
|
316
|
+
# text eol=lf — BẮT BUỘC đi kèm union, không phải cho đẹp. Thiếu nó: một máy ghi CRLF →
|
|
317
|
+
# git thấy MỌI dòng đã đổi → union giữ cả hai bản → NHÂN ĐÔI CẢ FILE, gồm cả dòng header.
|
|
318
|
+
# Team mixed Windows/macOS gặp ca này mà không ai làm gì sai.
|
|
319
|
+
*.tsv text eol=lf merge=union
|
|
320
|
+
*.jsonl text eol=lf merge=union
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
> **Vì sao đặt `.gitattributes` BÊN TRONG `{paths.trace_dir}` thay vì gốc repo:** `trace_dir` là
|
|
324
|
+
> đường dẫn **cấu hình được** (`.trace/`, `../.trace`, `{spec_source}/.trace/`), nên một luật ở gốc
|
|
325
|
+
> repo phải nhắc lại đúng đường dẫn đó và sẽ lệch ngay khi ai đổi config. Đặt trong thư mục thì
|
|
326
|
+
> pattern là `*.tsv` thuần — không phụ thuộc `trace_dir` tên gì, nằm ở đâu, và **đi theo sổ** khi
|
|
327
|
+
> spec repo được mount vào một umbrella khác. Git đọc `.gitattributes` ở mọi cấp thư mục.
|
|
328
|
+
|
|
329
|
+
> **KHÔNG thêm `*.json`.** `trace-report.json` có thể nằm cùng thư mục và union trên JSON tạo ra
|
|
330
|
+
> **JSON không hợp lệ** — panel VS Code parse lỗi. Nó là file **sinh lại được**: conflict ở đó thì
|
|
331
|
+
> chạy lại `/validate-traces`, đừng merge tay.
|
|
332
|
+
|
|
333
|
+
In vào report:
|
|
334
|
+
```
|
|
335
|
+
✅ {paths.trace_dir}/.gitattributes (merge=union + eol=lf)
|
|
336
|
+
(hoặc: ✅ vừa tạo — sổ trace giờ merge được khi hai người cùng ghi)
|
|
273
337
|
```
|
|
274
338
|
|
|
275
339
|
---
|
|
@@ -280,12 +344,12 @@ Nếu thiếu cái nào:
|
|
|
280
344
|
|
|
281
345
|
**Phân giải Living Docs home (cùng quy tắc như `/validate-traces`):**
|
|
282
346
|
- `living_docs_dir` = `{spec_source}/.living-docs` nếu `setup.spec_source` được set, else `.living-docs` ở umbrella root. *(Specs module được mount trong mọi service workspace, nên panel phân giải nó kể cả khi dev mở một service submodule đơn.)*
|
|
283
|
-
- `panel_mirror` = `./.trace` ở gốc workspace hiện tại.
|
|
347
|
+
- `panel_mirror` = `./.trace-mirror` ở gốc workspace hiện tại. *(Cố ý KHÁC tên `.trace` — xem Step 4.)*
|
|
284
348
|
|
|
285
349
|
1. Với mỗi service trong danh sách **đã làm phẳng** ở Step 3 (gồm cả các submodule nằm dưới `by_prd_slug` — bỏ sót chúng là mất trace của các repo chia theo feature): nếu `{service.path}/.trace/` có file `.tsv` → copy chúng vào `{living_docs_dir}/{service-name}/` (tạo dir nếu cần).
|
|
286
350
|
2. Ghi merged `{living_docs_dir}/trace-report.json`:
|
|
287
351
|
- Tổng hợp TSV `.trace/` của mỗi service, thêm field `"service"` **và `"platform"`** (suy từ tên file `{UC-ID}-{platform}.tsv`) cho mỗi row, tính lại summary totals. **Không dedupe theo `sc_id` giữa các platform** — `web·SC1` và `system·SC1` là 2 row khác nhau; nhờ field `platform` dashboard hiển thị tách bạch coverage từng platform.
|
|
288
|
-
3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir
|
|
352
|
+
3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir`, hoặc nếu `{paths.trace_dir}` đã nằm trong workspace hiện tại (panel đọc thẳng ở đó). **KHÔNG** copy `trace-history.jsonl` — nó là dữ liệu tích luỹ, không phải thứ sinh lại được.
|
|
289
353
|
|
|
290
354
|
In kết quả sync:
|
|
291
355
|
```
|
|
@@ -312,108 +376,8 @@ Nếu `spec-manifest.yaml` tồn tại HOẶC `setup.spec_source` được cấu
|
|
|
312
376
|
|
|
313
377
|
## Output
|
|
314
378
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
|
|
318
|
-
|
|
319
|
-
## Status Badge
|
|
320
|
-
|
|
321
|
-
Chọn một theo kết quả:
|
|
322
|
-
- `✅ Complete` — mọi bước thành công, không có vấn đề
|
|
323
|
-
- `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
|
|
324
|
-
- `⚠️ Warnings` — hoàn thành nhưng có vấn đề không chặn, nên review lại
|
|
325
|
-
|
|
326
|
-
## Output Artifacts
|
|
327
|
-
|
|
328
|
-
Liệt kê mọi file được tạo hoặc sửa bởi lệnh này:
|
|
329
|
-
```
|
|
330
|
-
Output Artifacts:
|
|
331
|
-
{created|updated} {file-path} ({mô tả ngắn})
|
|
332
|
-
{created|updated} {file-path} ({mô tả ngắn})
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
|
|
336
|
-
|
|
337
|
-
## Pipeline Position
|
|
338
|
-
|
|
339
|
-
In một sơ đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
|
|
340
|
-
để người dùng luôn thấy lệnh này nằm ở đâu trong luồng end-to-end:
|
|
341
|
-
|
|
342
|
-
```
|
|
343
|
-
Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **phase của nó** trong sơ đồ trên:
|
|
347
|
-
|
|
348
|
-
| Phase | Commands |
|
|
349
|
-
|-------|----------|
|
|
350
|
-
| Discovery | `/define-product` |
|
|
351
|
-
| PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
352
|
-
| Design Spec | `/generate-design-spec` |
|
|
353
|
-
| BDD | `/generate-bdd` · `/review-context` (BDD) |
|
|
354
|
-
| Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
|
|
355
|
-
| Code | `/generate-code` · `/review-code` |
|
|
356
|
-
| Dev Self-Check | `/dev-gen-test` · `/dev-run-test` · `/dev-smoke-test` |
|
|
357
|
-
| QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
|
|
358
|
-
| Trace Audit | `/validate-traces` |
|
|
359
|
-
|
|
360
|
-
Với **lệnh review**, thêm vòng review 3 bước và đánh dấu bước hiện tại, vd:
|
|
361
|
-
`Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
|
|
362
|
-
|
|
363
|
-
**Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
|
|
364
|
-
`/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính —
|
|
365
|
-
**bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào sơ đồ).
|
|
366
|
-
|
|
367
|
-
## Gợi ý lệnh tiếp theo
|
|
368
|
-
|
|
369
|
-
Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
370
|
-
|
|
371
|
-
| Lệnh hiện tại | Gợi ý lệnh tiếp theo |
|
|
372
|
-
|-------------------------|-----------------------------------------------|
|
|
373
|
-
| /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
|
|
374
|
-
| /define-product | `/generate-prd {product-definition-file}` |
|
|
375
|
-
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
376
|
-
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
377
|
-
| /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
|
|
378
|
-
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
379
|
-
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
380
|
-
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
|
381
|
-
| /qc-analyze | `/qc-plan {UC-ID}` (xử lý các gap blocker 🔴 trước) |
|
|
382
|
-
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
383
|
-
| /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
|
|
384
|
-
| /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
|
|
385
|
-
| /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
|
|
386
|
-
| /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
|
|
387
|
-
| /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
|
|
388
|
-
| /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
|
|
389
|
-
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
390
|
-
| /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
|
|
391
|
-
| /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
|
|
392
|
-
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
393
|
-
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
394
|
-
| /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
|
|
395
|
-
| /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
|
|
396
|
-
| /dev-smoke-test | Tạo PR và link tới ticket |
|
|
397
|
-
| /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
|
|
398
|
-
| /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
|
|
399
|
-
| /debug | `/fix-bug {ticket-id}` nếu cần sửa |
|
|
400
|
-
| /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
|
|
401
|
-
| /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
|
|
402
|
-
| /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
|
|
403
|
-
| /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
|
|
404
|
-
| /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
|
|
405
|
-
|
|
406
|
-
Định dạng footer như sau:
|
|
407
|
-
```
|
|
408
|
-
---
|
|
409
|
-
Status : {badge}
|
|
410
|
-
{khối Output Artifacts}
|
|
411
|
-
Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
412
|
-
(lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
|
|
413
|
-
Next : {lệnh gợi ý kèm ví dụ tham số}
|
|
414
|
-
```
|
|
415
|
-
*(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
|
|
416
|
-
|
|
379
|
+
**Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
|
|
380
|
+
Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
417
381
|
|
|
418
382
|
```
|
|
419
383
|
/sync — {Setup | Update}
|
|
@@ -444,19 +408,23 @@ Service Configs
|
|
|
444
408
|
⚠️ payment-service — .agent/project-context.yaml missing
|
|
445
409
|
→ create it so /dev-run-test works correctly
|
|
446
410
|
|
|
447
|
-
|
|
448
|
-
✅ .trace/
|
|
449
|
-
|
|
411
|
+
Luật git cho sổ trace
|
|
412
|
+
✅ .trace-mirror/ + .living-docs/ gitignored (mirror — sinh lại được)
|
|
413
|
+
✅ {paths.trace_dir}/ KHÔNG bị gitignore (sổ gốc — phải commit)
|
|
414
|
+
✅ {paths.trace_dir}/.gitattributes (merge=union + eol=lf — hai người ghi song song)
|
|
415
|
+
(hoặc: ⚠️ Thêm .trace-mirror/ vào .gitignore)
|
|
416
|
+
(hoặc: 🔴 NGUY HIỂM — sổ gốc {paths.trace_dir} đang bị gitignore, xem Step 4b)
|
|
417
|
+
(hoặc: ✅ vừa tạo .gitattributes — trước đó merge song song sẽ conflict và mất row)
|
|
450
418
|
|
|
451
419
|
Living Docs
|
|
452
|
-
✅
|
|
453
|
-
(
|
|
420
|
+
✅ {panel_mirror}/ synced — {N} TSVs across {S} services
|
|
421
|
+
(chạy /validate-traces để có report coverage đầy đủ)
|
|
454
422
|
|
|
455
423
|
Spec Manifest
|
|
456
424
|
✅ spec-manifest.yaml — {N} features indexed
|
|
457
425
|
|
|
458
426
|
---
|
|
459
427
|
Status : ✅ Complete | ⚠️ Warnings
|
|
460
|
-
Output Artifacts: updated .trace/ (
|
|
428
|
+
Output Artifacts: updated .trace-mirror/ (panel mirror), spec-manifest.yaml
|
|
461
429
|
Next : /validate-traces (full coverage check) | /generate-code {UC-ID} (start coding)
|
|
462
430
|
```
|
package/commands/sync.tmpl
CHANGED
|
@@ -259,17 +259,81 @@ Với mỗi entry trong danh sách đó:
|
|
|
259
259
|
|
|
260
260
|
---
|
|
261
261
|
|
|
262
|
-
## Step 4 — Check
|
|
262
|
+
## Step 4 — Check luật git cho sổ trace
|
|
263
263
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
264
|
+
*Step 4a/4b kiểm **có được commit hay không** (hai chiều ngược nhau — nhầm chiều là mất dữ liệu).
|
|
265
|
+
Step 4c kiểm **merge thế nào khi hai người cùng ghi**. Cả hai đều là đường mất sổ, và 4c không
|
|
266
|
+
cần ai làm sai gì cả — chỉ cần hai người làm việc cùng lúc.*
|
|
267
267
|
|
|
268
|
-
|
|
268
|
+
*Đọc bảng trước:*
|
|
269
|
+
|
|
270
|
+
| Đường dẫn | Vai trò | Kỳ vọng |
|
|
271
|
+
|---|---|---|
|
|
272
|
+
| `{paths.trace_dir}` (`.trace/` hoặc `{spec_source}/.trace/`) | **AUTHORITATIVE** — TSV + `trace-history.jsonl`, không regenerate được | **PHẢI commit** — gitignore nó là **lỗi nghiêm trọng** |
|
|
273
|
+
| `.trace-mirror/` | bản sao tiện cho panel VS Code | phải gitignore |
|
|
274
|
+
| `.living-docs/` | report sinh ra | phải gitignore |
|
|
275
|
+
|
|
276
|
+
**4a. Cảnh báo mềm — mirror chưa gitignore.**
|
|
277
|
+
Kiểm `.trace-mirror/` trong `.gitignore` của repo hiện tại (hoặc `.git/info/exclude`), và `.living-docs/` trong `.gitignore` của **specs module** (khi `setup.spec_source` được set). Thiếu cái nào:
|
|
278
|
+
```
|
|
279
|
+
⚠️ Mirror chưa gitignore — chúng được sinh ra, đừng bao giờ commit:
|
|
280
|
+
echo ".trace-mirror/" >> .gitignore
|
|
281
|
+
echo ".living-docs/" >> {spec_source}/.gitignore # specs module (nếu có spec_source)
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**4b. 🔴 Báo động — sổ gốc ĐANG bị bỏ qua.**
|
|
285
|
+
Phân giải `{paths.trace_dir}`; nếu nó nằm trong một git repo, chạy `git -C {repo} check-ignore -q {trace_dir}`. **Trúng** (exit 0) → in ngay, mức chặn:
|
|
286
|
+
```
|
|
287
|
+
🔴 NGUY HIỂM — sổ gốc trace ĐANG bị git bỏ qua: {paths.trace_dir}
|
|
288
|
+
Toàn bộ trạng thái theo dõi (spec_ver · gen_ver · implemented_by · test_count ·
|
|
289
|
+
dev_selftest · qc_status) VÀ trace-history.jsonl KHÔNG được lưu vào git.
|
|
290
|
+
Người khác clone repo về sẽ không thấy gì, và lịch sử thì KHÔNG dựng lại được.
|
|
291
|
+
|
|
292
|
+
Sửa:
|
|
293
|
+
1. Gỡ dòng khớp `.trace` khỏi .gitignore của {repo}
|
|
294
|
+
2. git -C {repo} add -f {trace_dir} && git -C {repo} commit -m "restore trace state"
|
|
295
|
+
Nguyên nhân thường gặp: bản trước v0.4.3 gọi panel mirror là `.trace` (trùng tên sổ gốc),
|
|
296
|
+
nên gợi ý "gitignore .trace/" của chính lệnh này có thể đã nhắm trúng sổ gốc.
|
|
297
|
+
```
|
|
298
|
+
> **Vì sao cần báo động này:** trước v0.4.3, mirror và sổ gốc **cùng tên `.trace`**. Khi dev mở thẳng spec repo làm workspace thì hai path bằng nhau — và Step 4 (bản cũ) gợi ý gitignore theo **tên**, không theo vai trò. Làm theo là mất sổ gốc, **im lặng**: máy vẫn chạy, dashboard vẫn có số; chỉ người thứ hai clone về mới phát hiện. Bản v0.4.3 đổi tên mirror thành `.trace-mirror` để cái bẫy biến mất, nhưng **dự án đã dính từ trước thì vẫn dính** — 4b là để tìm ra chúng.
|
|
299
|
+
|
|
300
|
+
**4c. Luật merge cho sổ trace.**
|
|
301
|
+
|
|
302
|
+
Sổ trace **phải commit** (4b) và **được nhiều người ghi trên nhiều nhánh song song**. Git cần biết
|
|
303
|
+
merge nó thế nào — mặc định thì không biết, và mặc định là đường mất row.
|
|
304
|
+
|
|
305
|
+
Kiểm `{paths.trace_dir}/.gitattributes` có tồn tại và có đủ hai dòng dưới. **Thiếu → tạo/bổ sung
|
|
306
|
+
ngay** (đây là hành động ghi duy nhất của Step 4; nó chỉ thêm file luật, không đụng dữ liệu):
|
|
307
|
+
|
|
308
|
+
```gitattributes
|
|
309
|
+
# Sổ trace — dữ liệu KHÔNG regenerate được. Hai luật, hai lý do khác nhau:
|
|
310
|
+
#
|
|
311
|
+
# merge=union — giữ row của CẢ HAI nhánh thay vì bắt người chọn một bên. Trùng sc_id sau
|
|
312
|
+
# union là ca ĐÚNG VÀ ĐƯỢC MONG ĐỢI: `--lint-trace` T4 bắt nó, rồi /validate-traces
|
|
313
|
+
# reconcile về một row. Mất row thì KHÔNG có gì bắt được. Đánh đổi có chủ ý — đừng "dọn".
|
|
314
|
+
# (union là driver built-in của git: không ai cần chạy git config gì thêm.)
|
|
315
|
+
#
|
|
316
|
+
# text eol=lf — BẮT BUỘC đi kèm union, không phải cho đẹp. Thiếu nó: một máy ghi CRLF →
|
|
317
|
+
# git thấy MỌI dòng đã đổi → union giữ cả hai bản → NHÂN ĐÔI CẢ FILE, gồm cả dòng header.
|
|
318
|
+
# Team mixed Windows/macOS gặp ca này mà không ai làm gì sai.
|
|
319
|
+
*.tsv text eol=lf merge=union
|
|
320
|
+
*.jsonl text eol=lf merge=union
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
> **Vì sao đặt `.gitattributes` BÊN TRONG `{paths.trace_dir}` thay vì gốc repo:** `trace_dir` là
|
|
324
|
+
> đường dẫn **cấu hình được** (`.trace/`, `../.trace`, `{spec_source}/.trace/`), nên một luật ở gốc
|
|
325
|
+
> repo phải nhắc lại đúng đường dẫn đó và sẽ lệch ngay khi ai đổi config. Đặt trong thư mục thì
|
|
326
|
+
> pattern là `*.tsv` thuần — không phụ thuộc `trace_dir` tên gì, nằm ở đâu, và **đi theo sổ** khi
|
|
327
|
+
> spec repo được mount vào một umbrella khác. Git đọc `.gitattributes` ở mọi cấp thư mục.
|
|
328
|
+
|
|
329
|
+
> **KHÔNG thêm `*.json`.** `trace-report.json` có thể nằm cùng thư mục và union trên JSON tạo ra
|
|
330
|
+
> **JSON không hợp lệ** — panel VS Code parse lỗi. Nó là file **sinh lại được**: conflict ở đó thì
|
|
331
|
+
> chạy lại `/validate-traces`, đừng merge tay.
|
|
332
|
+
|
|
333
|
+
In vào report:
|
|
269
334
|
```
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
echo ".living-docs/" >> {spec_source}/.gitignore # specs module (if spec_source set)
|
|
335
|
+
✅ {paths.trace_dir}/.gitattributes (merge=union + eol=lf)
|
|
336
|
+
(hoặc: ✅ vừa tạo — sổ trace giờ merge được khi hai người cùng ghi)
|
|
273
337
|
```
|
|
274
338
|
|
|
275
339
|
---
|
|
@@ -280,12 +344,12 @@ Nếu thiếu cái nào:
|
|
|
280
344
|
|
|
281
345
|
**Phân giải Living Docs home (cùng quy tắc như `/validate-traces`):**
|
|
282
346
|
- `living_docs_dir` = `{spec_source}/.living-docs` nếu `setup.spec_source` được set, else `.living-docs` ở umbrella root. *(Specs module được mount trong mọi service workspace, nên panel phân giải nó kể cả khi dev mở một service submodule đơn.)*
|
|
283
|
-
- `panel_mirror` = `./.trace` ở gốc workspace hiện tại.
|
|
347
|
+
- `panel_mirror` = `./.trace-mirror` ở gốc workspace hiện tại. *(Cố ý KHÁC tên `.trace` — xem Step 4.)*
|
|
284
348
|
|
|
285
349
|
1. Với mỗi service trong danh sách **đã làm phẳng** ở Step 3 (gồm cả các submodule nằm dưới `by_prd_slug` — bỏ sót chúng là mất trace của các repo chia theo feature): nếu `{service.path}/.trace/` có file `.tsv` → copy chúng vào `{living_docs_dir}/{service-name}/` (tạo dir nếu cần).
|
|
286
350
|
2. Ghi merged `{living_docs_dir}/trace-report.json`:
|
|
287
351
|
- Tổng hợp TSV `.trace/` của mỗi service, thêm field `"service"` **và `"platform"`** (suy từ tên file `{UC-ID}-{platform}.tsv`) cho mỗi row, tính lại summary totals. **Không dedupe theo `sc_id` giữa các platform** — `web·SC1` và `system·SC1` là 2 row khác nhau; nhờ field `platform` dashboard hiển thị tách bạch coverage từng platform.
|
|
288
|
-
3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir
|
|
352
|
+
3. **Mirror tới panel location:** copy `{living_docs_dir}/trace-report.json` (+ TSV namespaced) → `{panel_mirror}/` để panel trong repo đang mở không rỗng. Skip nếu `panel_mirror` đã bằng `living_docs_dir`, hoặc nếu `{paths.trace_dir}` đã nằm trong workspace hiện tại (panel đọc thẳng ở đó). **KHÔNG** copy `trace-history.jsonl` — nó là dữ liệu tích luỹ, không phải thứ sinh lại được.
|
|
289
353
|
|
|
290
354
|
In kết quả sync:
|
|
291
355
|
```
|
|
@@ -343,19 +407,23 @@ Service Configs
|
|
|
343
407
|
⚠️ payment-service — .agent/project-context.yaml missing
|
|
344
408
|
→ create it so /dev-run-test works correctly
|
|
345
409
|
|
|
346
|
-
|
|
347
|
-
✅ .trace/
|
|
348
|
-
|
|
410
|
+
Luật git cho sổ trace
|
|
411
|
+
✅ .trace-mirror/ + .living-docs/ gitignored (mirror — sinh lại được)
|
|
412
|
+
✅ {paths.trace_dir}/ KHÔNG bị gitignore (sổ gốc — phải commit)
|
|
413
|
+
✅ {paths.trace_dir}/.gitattributes (merge=union + eol=lf — hai người ghi song song)
|
|
414
|
+
(hoặc: ⚠️ Thêm .trace-mirror/ vào .gitignore)
|
|
415
|
+
(hoặc: 🔴 NGUY HIỂM — sổ gốc {paths.trace_dir} đang bị gitignore, xem Step 4b)
|
|
416
|
+
(hoặc: ✅ vừa tạo .gitattributes — trước đó merge song song sẽ conflict và mất row)
|
|
349
417
|
|
|
350
418
|
Living Docs
|
|
351
|
-
✅
|
|
352
|
-
(
|
|
419
|
+
✅ {panel_mirror}/ synced — {N} TSVs across {S} services
|
|
420
|
+
(chạy /validate-traces để có report coverage đầy đủ)
|
|
353
421
|
|
|
354
422
|
Spec Manifest
|
|
355
423
|
✅ spec-manifest.yaml — {N} features indexed
|
|
356
424
|
|
|
357
425
|
---
|
|
358
426
|
Status : ✅ Complete | ⚠️ Warnings
|
|
359
|
-
Output Artifacts: updated .trace/ (
|
|
427
|
+
Output Artifacts: updated .trace-mirror/ (panel mirror), spec-manifest.yaml
|
|
360
428
|
Next : /validate-traces (full coverage check) | /generate-code {UC-ID} (start coding)
|
|
361
429
|
```
|
|
@@ -119,6 +119,20 @@ Tóm tắt cho người dùng:
|
|
|
119
119
|
- **Updated commands** — file có nội dung thay đổi
|
|
120
120
|
- **Removed commands** — file bị xoá trong version mới
|
|
121
121
|
|
|
122
|
+
> **Từ v0.5.1, "Removed" là trạng thái CÓ THẬT.** Trước đó `installCore` chỉ copy, không có
|
|
123
|
+
> nhánh xoá nào — nên lệnh bị bỏ ở version mới nằm lại trong `.agent/commands/` và
|
|
124
|
+
> `.claude/commands/` **vĩnh viễn**: vẫn hiện trong menu `/`, vẫn chạy được, vẫn mang logic
|
|
125
|
+
> của version cũ, kể cả khi framework đã bỏ nó *vì nó sai*. Step này từng hứa báo cáo một
|
|
126
|
+
> trạng thái mà installer không thể tạo ra (GAPS-v3 G44).
|
|
127
|
+
> Giờ installer tự in ra ngay sau bước cài — đọc các dòng đó, chúng chính xác hơn `git diff`:
|
|
128
|
+
> ```
|
|
129
|
+
> 🗑️ {n} file framework đã bị BỎ ở version này — đã gỡ khỏi .agent/
|
|
130
|
+
> 🗑️ {n} shortcut của lệnh đã bị bỏ — đã gỡ khỏi .claude/commands/
|
|
131
|
+
> ⚠️ {n} file framework đã bị bỏ NHƯNG bạn đã sửa — GIỮ LẠI
|
|
132
|
+
> ```
|
|
133
|
+
> **Chỉ file còn nguyên bản mới bị gỡ.** File bạn đã sửa luôn được giữ + backup — thà để lại
|
|
134
|
+
> một file lạc còn hơn xoá thứ ai đó đã bỏ công viết.
|
|
135
|
+
|
|
122
136
|
Nếu có command mới xuất hiện (vd một slash command mới), nêu rõ để user biết nó giờ đã có.
|
|
123
137
|
|
|
124
138
|
**Kiểm file bị ghi đè.** `--init` copy `core/` → `.agent/` **vô điều kiện** — mọi thứ project đã sửa trong `.agent/` (trừ `project-context.yaml`) bị ghi đè. Từ v0.4.2 lệnh cài tự cứu chúng. Kiểm:
|
|
@@ -162,108 +176,8 @@ Sau migrate, nhắc chạy `/validate-traces` để reconcile sổ trace với b
|
|
|
162
176
|
|
|
163
177
|
## Output
|
|
164
178
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
|
|
168
|
-
|
|
169
|
-
## Status Badge
|
|
170
|
-
|
|
171
|
-
Chọn một theo kết quả:
|
|
172
|
-
- `✅ Complete` — mọi bước thành công, không có vấn đề
|
|
173
|
-
- `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
|
|
174
|
-
- `⚠️ Warnings` — hoàn thành nhưng có vấn đề không chặn, nên review lại
|
|
175
|
-
|
|
176
|
-
## Output Artifacts
|
|
177
|
-
|
|
178
|
-
Liệt kê mọi file được tạo hoặc sửa bởi lệnh này:
|
|
179
|
-
```
|
|
180
|
-
Output Artifacts:
|
|
181
|
-
{created|updated} {file-path} ({mô tả ngắn})
|
|
182
|
-
{created|updated} {file-path} ({mô tả ngắn})
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
|
|
186
|
-
|
|
187
|
-
## Pipeline Position
|
|
188
|
-
|
|
189
|
-
In một sơ đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
|
|
190
|
-
để người dùng luôn thấy lệnh này nằm ở đâu trong luồng end-to-end:
|
|
191
|
-
|
|
192
|
-
```
|
|
193
|
-
Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **phase của nó** trong sơ đồ trên:
|
|
197
|
-
|
|
198
|
-
| Phase | Commands |
|
|
199
|
-
|-------|----------|
|
|
200
|
-
| Discovery | `/define-product` |
|
|
201
|
-
| PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
202
|
-
| Design Spec | `/generate-design-spec` |
|
|
203
|
-
| BDD | `/generate-bdd` · `/review-context` (BDD) |
|
|
204
|
-
| Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
|
|
205
|
-
| Code | `/generate-code` · `/review-code` |
|
|
206
|
-
| Dev Self-Check | `/dev-gen-test` · `/dev-run-test` · `/dev-smoke-test` |
|
|
207
|
-
| QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
|
|
208
|
-
| Trace Audit | `/validate-traces` |
|
|
209
|
-
|
|
210
|
-
Với **lệnh review**, thêm vòng review 3 bước và đánh dấu bước hiện tại, vd:
|
|
211
|
-
`Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
|
|
212
|
-
|
|
213
|
-
**Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
|
|
214
|
-
`/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính —
|
|
215
|
-
**bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào sơ đồ).
|
|
216
|
-
|
|
217
|
-
## Gợi ý lệnh tiếp theo
|
|
218
|
-
|
|
219
|
-
Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
220
|
-
|
|
221
|
-
| Lệnh hiện tại | Gợi ý lệnh tiếp theo |
|
|
222
|
-
|-------------------------|-----------------------------------------------|
|
|
223
|
-
| /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
|
|
224
|
-
| /define-product | `/generate-prd {product-definition-file}` |
|
|
225
|
-
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
226
|
-
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
227
|
-
| /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
|
|
228
|
-
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
229
|
-
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
230
|
-
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
|
231
|
-
| /qc-analyze | `/qc-plan {UC-ID}` (xử lý các gap blocker 🔴 trước) |
|
|
232
|
-
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
233
|
-
| /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
|
|
234
|
-
| /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
|
|
235
|
-
| /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
|
|
236
|
-
| /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
|
|
237
|
-
| /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
|
|
238
|
-
| /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
|
|
239
|
-
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
240
|
-
| /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
|
|
241
|
-
| /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
|
|
242
|
-
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
243
|
-
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
244
|
-
| /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
|
|
245
|
-
| /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
|
|
246
|
-
| /dev-smoke-test | Tạo PR và link tới ticket |
|
|
247
|
-
| /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
|
|
248
|
-
| /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
|
|
249
|
-
| /debug | `/fix-bug {ticket-id}` nếu cần sửa |
|
|
250
|
-
| /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
|
|
251
|
-
| /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
|
|
252
|
-
| /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
|
|
253
|
-
| /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
|
|
254
|
-
| /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
|
|
255
|
-
|
|
256
|
-
Định dạng footer như sau:
|
|
257
|
-
```
|
|
258
|
-
---
|
|
259
|
-
Status : {badge}
|
|
260
|
-
{khối Output Artifacts}
|
|
261
|
-
Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
262
|
-
(lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
|
|
263
|
-
Next : {lệnh gợi ý kèm ví dụ tham số}
|
|
264
|
-
```
|
|
265
|
-
*(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
|
|
266
|
-
|
|
179
|
+
**Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
|
|
180
|
+
Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
267
181
|
|
|
268
182
|
```
|
|
269
183
|
/update-framework — v{current} → v{latest}
|
|
@@ -119,6 +119,20 @@ Tóm tắt cho người dùng:
|
|
|
119
119
|
- **Updated commands** — file có nội dung thay đổi
|
|
120
120
|
- **Removed commands** — file bị xoá trong version mới
|
|
121
121
|
|
|
122
|
+
> **Từ v0.5.1, "Removed" là trạng thái CÓ THẬT.** Trước đó `installCore` chỉ copy, không có
|
|
123
|
+
> nhánh xoá nào — nên lệnh bị bỏ ở version mới nằm lại trong `.agent/commands/` và
|
|
124
|
+
> `.claude/commands/` **vĩnh viễn**: vẫn hiện trong menu `/`, vẫn chạy được, vẫn mang logic
|
|
125
|
+
> của version cũ, kể cả khi framework đã bỏ nó *vì nó sai*. Step này từng hứa báo cáo một
|
|
126
|
+
> trạng thái mà installer không thể tạo ra (GAPS-v3 G44).
|
|
127
|
+
> Giờ installer tự in ra ngay sau bước cài — đọc các dòng đó, chúng chính xác hơn `git diff`:
|
|
128
|
+
> ```
|
|
129
|
+
> 🗑️ {n} file framework đã bị BỎ ở version này — đã gỡ khỏi .agent/
|
|
130
|
+
> 🗑️ {n} shortcut của lệnh đã bị bỏ — đã gỡ khỏi .claude/commands/
|
|
131
|
+
> ⚠️ {n} file framework đã bị bỏ NHƯNG bạn đã sửa — GIỮ LẠI
|
|
132
|
+
> ```
|
|
133
|
+
> **Chỉ file còn nguyên bản mới bị gỡ.** File bạn đã sửa luôn được giữ + backup — thà để lại
|
|
134
|
+
> một file lạc còn hơn xoá thứ ai đó đã bỏ công viết.
|
|
135
|
+
|
|
122
136
|
Nếu có command mới xuất hiện (vd một slash command mới), nêu rõ để user biết nó giờ đã có.
|
|
123
137
|
|
|
124
138
|
**Kiểm file bị ghi đè.** `--init` copy `core/` → `.agent/` **vô điều kiện** — mọi thứ project đã sửa trong `.agent/` (trừ `project-context.yaml`) bị ghi đè. Từ v0.4.2 lệnh cài tự cứu chúng. Kiểm:
|