spec-lite 1.4.2 → 1.4.5
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/README.md +21 -21
- package/package.json +1 -1
- package/skills/ado-config/SKILL.md +1 -1
- package/skills/ado-create/SKILL.md +7 -7
- package/skills/ado-update/SKILL.md +1 -1
- package/skills/archive/SKILL.md +19 -19
- package/skills/build/SKILL.md +5 -5
- package/skills/plan/SKILL.md +6 -6
- package/skills/review-everything/SKILL.md +9 -9
- package/skills/review-integration/SKILL.md +7 -7
- package/skills/scaffold/SKILL.md +9 -9
- package/skills/spec-brownfield-component/SKILL.md +11 -11
- package/skills/spec-brownfield-feature/SKILL.md +13 -13
- package/skills/spec-brownfield-init/SKILL.md +16 -14
- package/skills/spec-frd/SKILL.md +74 -18
- package/skills/spec-frd-update/SKILL.md +9 -9
- package/skills/spec-new/SKILL.md +13 -12
- package/skills/spec-prd/SKILL.md +41 -11
- package/skills/spec-remove/SKILL.md +27 -27
- package/skills/spec-sad/SKILL.md +47 -10
- package/skills/spec-tech/SKILL.md +16 -16
- package/skills/spec-test/SKILL.md +15 -15
- package/skills/spec-tsd/SKILL.md +10 -10
- package/skills-overview.md +32 -28
- package/templates/main/domain-template.md +11 -5
- package/templates/main/feature/frd-template.md +1 -1
- package/templates/main/prd-template.md +1 -1
- package/templates/main/sad-template.md +8 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-remove
|
|
3
|
-
description: Remove một feature toàn diện — tạo removal integration với Code Inventory, Reverse Dependency Audit, reverse-TDD test strategy, và Finalize Plan (move feature artifacts sang specs/removed/ + đóng ADO tickets) như task cuối trong todo.md. Nhận F-XXX làm argument.
|
|
3
|
+
description: Remove một feature toàn diện — tạo removal integration với Code Inventory, Reverse Dependency Audit, reverse-TDD test strategy, và Finalize Plan (move feature artifacts sang .specs/removed/ + đóng ADO tickets) như task cuối trong todo.md. Nhận F-XXX làm argument.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# spec-remove
|
|
@@ -12,7 +12,7 @@ Tạo removal integration cho 1 feature đã tồn tại. Output là `spec.md` v
|
|
|
12
12
|
- **Code Inventory** — code, route, DB, feature flag, config liên quan
|
|
13
13
|
- **Reverse Dependency Audit** — ai còn reference, an toàn xoá hay không
|
|
14
14
|
- **Test Strategy** — reverse-TDD (regression test "thing is gone")
|
|
15
|
-
- **Finalize Plan** — move feature artifacts sang
|
|
15
|
+
- **Finalize Plan** — move feature artifacts sang `.specs/removed/` + đóng ADO tickets, được DEV chạy như task cuối trong `todo.md`
|
|
16
16
|
- **Changes blocks** — `[REMOVE]` markers cho mọi artifact bị touched
|
|
17
17
|
|
|
18
18
|
Skill **không** sinh `tech.md` / `plan.md` / `todo.md`. Sau khi `spec.md` được approve, chạy `/spec-tech` → `/plan` → `/build` như flow thường. `spec.md` đủ giàu để 3 skill đó hoạt động không cần modification.
|
|
@@ -33,8 +33,8 @@ Skill **không** sinh `tech.md` / `plan.md` / `todo.md`. Sau khi `spec.md` đư
|
|
|
33
33
|
|
|
34
34
|
## Prerequisites
|
|
35
35
|
|
|
36
|
-
-
|
|
37
|
-
-
|
|
36
|
+
- `.specs/main/feature/{F-XXX}-*/frd.md` tồn tại
|
|
37
|
+
- `.specs/main/prd.md` có row của feature trong Feature Index
|
|
38
38
|
- (Optional) `.claude/ado.yaml` cấu hình nếu muốn đóng ADO tickets ở finalize step
|
|
39
39
|
|
|
40
40
|
---
|
|
@@ -49,7 +49,7 @@ Argument BẮT BUỘC là Feature ID dạng `F-XXX` (3 chữ số). Nếu argume
|
|
|
49
49
|
spec-remove cần Feature ID. Ví dụ: /spec-remove F-001
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
Tìm thư mục
|
|
52
|
+
Tìm thư mục `.specs/main/feature/F-XXX-*/`:
|
|
53
53
|
- 0 matches → báo lỗi feature không tồn tại, dừng.
|
|
54
54
|
- ≥ 2 matches → báo lỗi data inconsistency (nhiều thư mục cùng prefix), dừng.
|
|
55
55
|
- 1 match → tiếp.
|
|
@@ -71,20 +71,20 @@ F-XXX đã có status `removed`. Bạn muốn:
|
|
|
71
71
|
Đọc các file sau:
|
|
72
72
|
|
|
73
73
|
**Bắt buộc:**
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
74
|
+
- `.specs/main/feature/{F-XXX}-*/frd.md` — full content
|
|
75
|
+
- `.specs/main/feature/{F-XXX}-*/fdd.md` — nếu tồn tại
|
|
76
|
+
- `.specs/main/prd.md` — Feature Index (capture ADO ticket ID cho F-XXX), Component Index, NFR
|
|
77
|
+
- `.specs/main/domain.md` — Glossary + Shared Entities (xác định entity nào owned bởi component thuộc F-XXX)
|
|
78
78
|
|
|
79
79
|
**Components used by F-XXX:**
|
|
80
80
|
|
|
81
81
|
Trích từ `frd.md` section `Components Used` + `fdd.md` section `Components Touched`. Với mỗi C-YYY:
|
|
82
|
-
-
|
|
83
|
-
-
|
|
82
|
+
- `.specs/main/component/{C-YYY}-*/crd.md`
|
|
83
|
+
- `.specs/main/component/{C-YYY}-*/cdd.md` — nếu tồn tại
|
|
84
84
|
|
|
85
85
|
**Reverse dependency scan:**
|
|
86
86
|
|
|
87
|
-
Với mỗi C-YYY mà F-XXX sử dụng, grep
|
|
87
|
+
Với mỗi C-YYY mà F-XXX sử dụng, grep `.specs/main/feature/F-*/frd.md` (trừ F-XXX) tìm references tới C-YYY. Mọi feature khác có reference → load `frd.md` của feature đó để hiểu nó dùng C-YYY làm gì.
|
|
88
88
|
|
|
89
89
|
Output context summary cho user:
|
|
90
90
|
|
|
@@ -243,9 +243,9 @@ Sau khi migration deploy xong, chạy lại /spec-remove F-XXX.
|
|
|
243
243
|
|
|
244
244
|
Xác định slug và NNN giống `/spec-new`:
|
|
245
245
|
- Slug: `remove-{f-xxx-slug}` (ví dụ `remove-f001-authentication`)
|
|
246
|
-
- NNN: max của thư mục hiện có trong
|
|
246
|
+
- NNN: max của thư mục hiện có trong `.specs/integrations/` + 1, format 3 chữ số.
|
|
247
247
|
|
|
248
|
-
Output path:
|
|
248
|
+
Output path: `.specs/integrations/{NNN}-remove-{f-xxx-slug}/spec.md`
|
|
249
249
|
|
|
250
250
|
Cấu trúc spec.md:
|
|
251
251
|
|
|
@@ -319,20 +319,20 @@ Regression tests **được giữ lại** trong codebase như guardrail — futu
|
|
|
319
319
|
|
|
320
320
|
1. **Move feature artifacts:**
|
|
321
321
|
```bash
|
|
322
|
-
mkdir -p specs/removed
|
|
323
|
-
mv specs/main/feature/{F-XXX}-{slug}/ specs/removed/{F-XXX}-{slug}/
|
|
322
|
+
mkdir -p .specs/removed
|
|
323
|
+
mv .specs/main/feature/{F-XXX}-{slug}/ .specs/removed/{F-XXX}-{slug}/
|
|
324
324
|
```
|
|
325
325
|
|
|
326
|
-
2. **Append Change History** vào
|
|
326
|
+
2. **Append Change History** vào `.specs/removed/{F-XXX}-{slug}/frd.md` (nếu file còn tồn tại sau move):
|
|
327
327
|
```markdown
|
|
328
328
|
### {YYYY-MM-DD} — [{NNN}-remove-{slug}](../../integrations/{NNN}-remove-{slug}/spec.md) — removed
|
|
329
|
-
- **Feature decommissioned**: moved from specs/main/feature/ to specs/removed/
|
|
329
|
+
- **Feature decommissioned**: moved from .specs/main/feature/ to .specs/removed/
|
|
330
330
|
- Reason: {lý do từ Problem Statement}
|
|
331
331
|
```
|
|
332
332
|
|
|
333
333
|
3. **Update prd.md Feature Index:**
|
|
334
334
|
- Row F-XXX: status → `Removed`
|
|
335
|
-
- Add note column hoặc inline: `(see specs/removed/{F-XXX}-{slug}/)`
|
|
335
|
+
- Add note column hoặc inline: `(see .specs/removed/{F-XXX}-{slug}/)`
|
|
336
336
|
|
|
337
337
|
4. **Close ADO tickets** (nếu prd.md có ADO ticket ID cho F-XXX):
|
|
338
338
|
- Feature ticket → state `Removed`
|
|
@@ -342,8 +342,8 @@ Regression tests **được giữ lại** trong codebase như guardrail — futu
|
|
|
342
342
|
- Nếu ADO state name khác (vd "Closed") → xem `.claude/ado.yaml` hoặc fetch từ `wit_get_work_item_type`
|
|
343
343
|
|
|
344
344
|
5. **Verify finalize:**
|
|
345
|
-
- `ls specs/main/feature/ | grep {F-XXX}` → không còn match
|
|
346
|
-
- `ls specs/removed/{F-XXX}-{slug}/` → tồn tại
|
|
345
|
+
- `ls .specs/main/feature/ | grep {F-XXX}` → không còn match
|
|
346
|
+
- `ls .specs/removed/{F-XXX}-{slug}/` → tồn tại
|
|
347
347
|
- prd.md grep `F-XXX` → status `Removed`
|
|
348
348
|
- ADO ticket fetch → state khớp
|
|
349
349
|
|
|
@@ -356,7 +356,7 @@ Regression tests **được giữ lại** trong codebase như guardrail — futu
|
|
|
356
356
|
|
|
357
357
|
#### Features (Feature Index)
|
|
358
358
|
- Row [MODIFY status]: `F-XXX` {current status} → `Removed`
|
|
359
|
-
- {nếu có note column} Row [MODIFY note]: `F-XXX` add note "see specs/removed/"
|
|
359
|
+
- {nếu có note column} Row [MODIFY note]: `F-XXX` add note "see .specs/removed/"
|
|
360
360
|
|
|
361
361
|
#### Components (Component Index) — chỉ component exclusive với F-XXX
|
|
362
362
|
- Row [MODIFY status]: `C-YYY` {current status} → `Removed`
|
|
@@ -367,7 +367,7 @@ Regression tests **được giữ lại** trong codebase như guardrail — futu
|
|
|
367
367
|
**Format reference:** [frd-template.md](../../templates/main/feature/frd-template.md)
|
|
368
368
|
|
|
369
369
|
<!--
|
|
370
|
-
Đánh dấu mọi item bằng [REMOVE]. File sẽ bị move sang specs/removed/ ở Finalize step
|
|
370
|
+
Đánh dấu mọi item bằng [REMOVE]. File sẽ bị move sang .specs/removed/ ở Finalize step
|
|
371
371
|
nhưng cascade content vẫn ghi vào file gốc trước (để Change History entry được apply).
|
|
372
372
|
-->
|
|
373
373
|
|
|
@@ -462,7 +462,7 @@ Draft trên đã đúng chưa?
|
|
|
462
462
|
|
|
463
463
|
Sau khi confirm, agent sẽ auto-apply Changes blocks lên main artifacts.
|
|
464
464
|
File feature artifacts (frd/fdd) KHÔNG bị move ngay — chỉ apply [REMOVE] markers
|
|
465
|
-
+ Change History entry. Move sang specs/removed/ là task cuối trong todo.md,
|
|
465
|
+
+ Change History entry. Move sang .specs/removed/ là task cuối trong todo.md,
|
|
466
466
|
do /build chạy sau khi mọi deletion task khác xong.
|
|
467
467
|
```
|
|
468
468
|
|
|
@@ -500,7 +500,7 @@ Giống `/spec-new` Bước 7, nhưng với removal-specific extensions.
|
|
|
500
500
|
**[8.5] Thông báo kết quả:**
|
|
501
501
|
|
|
502
502
|
```
|
|
503
|
-
✓ specs/integrations/{NNN}-remove-{f-xxx-slug}/spec.md đã được tạo (status: approved, removal: true)
|
|
503
|
+
✓ .specs/integrations/{NNN}-remove-{f-xxx-slug}/spec.md đã được tạo (status: approved, removal: true)
|
|
504
504
|
|
|
505
505
|
Auto-cascade applied:
|
|
506
506
|
✓ prd.md — F-XXX status → Removed; {N} components status → Removed
|
|
@@ -509,7 +509,7 @@ Auto-cascade applied:
|
|
|
509
509
|
✓ feature/F-XXX-*/frd.md — all items [REMOVE], status → removed
|
|
510
510
|
✓ feature/F-XXX-*/fdd.md — all items [REMOVE], status → removed
|
|
511
511
|
|
|
512
|
-
⚠ File feature/F-XXX-*/ vẫn ở specs/main/feature/. Sẽ được move sang specs/removed/ ở task cuối todo.md.
|
|
512
|
+
⚠ File feature/F-XXX-*/ vẫn ở .specs/main/feature/. Sẽ được move sang .specs/removed/ ở task cuối todo.md.
|
|
513
513
|
⚠ ADO tickets giữ nguyên state. Sẽ được close ở task cuối todo.md (cần .claude/ado.yaml).
|
|
514
514
|
|
|
515
515
|
Bước tiếp theo:
|
|
@@ -583,6 +583,6 @@ Sau khi user confirm (Bước 8):
|
|
|
583
583
|
- [ ] Auto-cascade chạy đúng thứ tự prd → domain → sad → crd → cdd → frd → fdd
|
|
584
584
|
- [ ] Mọi artifact bị touched có Change History entry
|
|
585
585
|
- [ ] prd.md row F-XXX status = Removed (đổi ngay sau approve)
|
|
586
|
-
- [ ] File feature/F-XXX-*/ VẪN ở specs/main/feature/ (chưa move — chỉ move ở Finalize task)
|
|
586
|
+
- [ ] File feature/F-XXX-*/ VẪN ở .specs/main/feature/ (chưa move — chỉ move ở Finalize task)
|
|
587
587
|
- [ ] ADO tickets KHÔNG bị transition (chưa close — chỉ close ở Finalize task)
|
|
588
588
|
- [ ] Notification cuối ghi rõ 2 ⚠ về việc folder + ADO chưa được động vào
|
package/skills/spec-sad/SKILL.md
CHANGED
|
@@ -7,10 +7,12 @@ description: Điền hoặc cập nhật sad.md — System Architecture Document
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Tạo nội dung cho
|
|
10
|
+
Tạo nội dung cho `.specs/main/sad.md` thông qua interview có cấu trúc. SAD là bản đồ kỹ thuật của hệ thống — nó định nghĩa các quyết định kiến trúc, tech stack, và đặc biệt là **Architectural Guardrails**: các nguyên tắc bất biến mà mọi agent phải tuân theo khi sinh `tech.md`.
|
|
11
11
|
|
|
12
12
|
SAD không chứa: feature-level design, business rules, entity details — những thứ đó thuộc về `domain.md` và `fdd.md`.
|
|
13
13
|
|
|
14
|
+
**Một side-effect cascade lên `domain.md`:** carve component là việc *thiết kế hệ thống* (HOW), nên `/spec-sad` là nơi gán **`Owner`** cho các shared entity mà pha *mô tả hệ thống* (WHAT — qua `/spec-prd`/`/spec-frd`/`/spec-new`) đã định nghĩa nhưng để `Owner: TBD`. SAD không chứa entity content; nó chỉ điền cột ownership còn trống. Xem two-phase cascade ở `conventions.md` §5.5.
|
|
15
|
+
|
|
14
16
|
**Guardrails là phần quan trọng nhất của SAD.** Thiếu guardrails = agent tự quyết định tech pattern mà không có constraint.
|
|
15
17
|
|
|
16
18
|
## When to Use
|
|
@@ -30,21 +32,21 @@ SAD không chứa: feature-level design, business rules, entity details — nh
|
|
|
30
32
|
|
|
31
33
|
### Bước 1: Kiểm tra preconditions
|
|
32
34
|
|
|
33
|
-
**Đọc
|
|
35
|
+
**Đọc `.specs/main/prd.md`:**
|
|
34
36
|
|
|
35
37
|
- **Chưa tồn tại hoặc là template** → dừng ngay:
|
|
36
38
|
> `prd.md` chưa có nội dung. Hãy chạy `/spec-prd` trước.
|
|
37
39
|
|
|
38
40
|
- **Đã có nội dung** → đọc để lấy: NFRs (performance, security, availability targets), business constraints, scope.
|
|
39
41
|
|
|
40
|
-
**Đọc
|
|
42
|
+
**Đọc `.specs/main/domain.md`:**
|
|
41
43
|
|
|
42
44
|
- **Chưa tồn tại** → dừng ngay:
|
|
43
45
|
> `domain.md` chưa được scaffold. Hãy chạy `/spec-prd` trước (skill này scaffold cả `prd.md` và `domain.md` skeleton).
|
|
44
46
|
|
|
45
|
-
- **Đã tồn tại** → đọc để hiểu: glossary và shared entities (nếu có). Lưu ý `domain.md` có thể chỉ mới là skeleton vì nội dung chi tiết mọc dần qua cascade từ integrations — không cần dừng nếu file mỏng.
|
|
47
|
+
- **Đã tồn tại** → đọc để hiểu: glossary và shared entities (nếu có). Lưu ý `domain.md` có thể chỉ mới là skeleton vì nội dung chi tiết mọc dần qua cascade từ integrations — không cần dừng nếu file mỏng. **Ghi nhận các shared entity có `Owner: TBD`** (do pha mô tả seed) → đây là danh sách cần gán owner ở Bước 2 (Phần 1.6).
|
|
46
48
|
|
|
47
|
-
**Đọc
|
|
49
|
+
**Đọc `.specs/main/sad.md`:**
|
|
48
50
|
|
|
49
51
|
- **Chưa tồn tại** → tiến hành Bước 2 (full interview).
|
|
50
52
|
|
|
@@ -61,6 +63,7 @@ SAD không chứa: feature-level design, business rules, entity details — nh
|
|
|
61
63
|
| 5 | Inter-Service Communication | ✓ đã có / ✗ trống/thiếu |
|
|
62
64
|
| 6 | Infrastructure Overview | ✓ đã có / ✗ trống/thiếu |
|
|
63
65
|
| 7 | Architectural Guardrails | ✓ đã có / ✗ trống/thiếu |
|
|
66
|
+
| 8 | ADR Log | ✓ đã có / ✗ trống/thiếu |
|
|
64
67
|
|
|
65
68
|
Một section được coi là **trống/thiếu** nếu: không tồn tại trong file, hoặc chỉ chứa placeholder template (dấu `{}`), hoặc không có dòng nội dung thực. Ngoài các sections trên, **ghi nhận các sections thừa** — những `##` heading có trong file nhưng không có trong template.
|
|
66
69
|
|
|
@@ -73,9 +76,10 @@ SAD không chứa: feature-level design, business rules, entity details — nh
|
|
|
73
76
|
[3] Tech Stack ✓ đã có
|
|
74
77
|
[4] Cross-Cutting Concerns ✗ chưa có — cần bổ sung
|
|
75
78
|
[5] Inter-Service Communication ✓ đã có
|
|
76
|
-
[6]
|
|
77
|
-
[7]
|
|
78
|
-
[8]
|
|
79
|
+
[6] Infrastructure Overview ✓ đã có
|
|
80
|
+
[7] Architectural Guardrails ✓ đã có
|
|
81
|
+
[8] ADR Log ✗ chưa có — cần bổ sung
|
|
82
|
+
[9] Deployment Diagram ⚠ không có trong template
|
|
79
83
|
[A] Interview tất cả sections
|
|
80
84
|
|
|
81
85
|
Chọn số hoặc A:
|
|
@@ -117,6 +121,20 @@ Nếu user muốn đề xuất → đề xuất 2-3 option với trade-offs rõ
|
|
|
117
121
|
|
|
118
122
|
Nếu `prd.md > Components` còn rỗng (brownfield init chưa scan code, hoặc greenfield chưa biết component) → để placeholder và note rằng bảng này sẽ được điền khi Component Index có nội dung (qua `/spec-brownfield-component` hoặc cascade từ integration).
|
|
119
123
|
|
|
124
|
+
**Phần 1.6 — Gán Owner cho shared entity (cascade lên domain):**
|
|
125
|
+
|
|
126
|
+
Sau khi component boundaries đã rõ (từ Components table), với mỗi shared entity có `Owner: TBD` (ghi nhận ở Bước 1):
|
|
127
|
+
> Entity **{Entity}** (định nghĩa ở domain) nên được component nào sở hữu canonical definition?
|
|
128
|
+
> - {C-XXX} — {tên}
|
|
129
|
+
> - {C-YYY} — {tên}
|
|
130
|
+
> Và những component nào reference nó (Used by)?
|
|
131
|
+
|
|
132
|
+
- Gán `Owner: C-XXX` (component giữ canonical definition) + `Used by: C-XXX, C-YYY`.
|
|
133
|
+
- Nếu hoá ra entity chỉ một component dùng → vẫn ghi `Owner`, `Used by` chỉ component đó; cân nhắc note rằng nó có thể chuyển về `crd.md` nội bộ (không bắt buộc xử lý ở đây).
|
|
134
|
+
- Component Index còn rỗng → để nguyên `Owner: TBD`, gán sau khi component được carve.
|
|
135
|
+
|
|
136
|
+
Đây là nửa **thiết kế hệ thống (HOW)** của domain cascade — bổ sung ownership cho định nghĩa entity mà pha mô tả đã tạo. Ghi xuống ở Bước 5.
|
|
137
|
+
|
|
120
138
|
**Phần 2 — Tech Stack:**
|
|
121
139
|
> Tech stack cho từng layer: Frontend, Backend, Database, Infrastructure?
|
|
122
140
|
> Với mỗi lựa chọn: lý do chọn là gì? (performance, team familiarity, ecosystem...)
|
|
@@ -146,6 +164,12 @@ Nếu user chưa quyết định layer nào → đề xuất options dựa trên
|
|
|
146
164
|
- Nếu có external API → `GUARD-XXX: Mọi external API call phải có retry + timeout`
|
|
147
165
|
- Nếu layered architecture → `GUARD-XXX: Không để business logic trong API/controller layer`
|
|
148
166
|
|
|
167
|
+
**Phần 7 — ADR Log:**
|
|
168
|
+
> Trong quá trình thảo luận vừa rồi, những quyết định nào là *quan trọng và có đánh đổi*? (chọn architectural style, tech chính, sync vs async...)
|
|
169
|
+
> Với mỗi cái, tôi sẽ ghi một ADR entry: quyết định + bối cảnh/lý do + hệ quả.
|
|
170
|
+
|
|
171
|
+
Tự đề xuất ADR-001+ từ chính các lựa chọn user đã chốt ở Phần 1–6 (style, tech stack, communication) — không bắt user nhập lại từ đầu. Status mặc định `accepted`. Nếu chưa có quyết định nào đáng ghi → để placeholder.
|
|
172
|
+
|
|
149
173
|
---
|
|
150
174
|
|
|
151
175
|
### Bước 3: Write — sinh draft
|
|
@@ -167,7 +191,7 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
|
|
|
167
191
|
|
|
168
192
|
### Bước 5: Save
|
|
169
193
|
|
|
170
|
-
Ghi nội dung đã được confirm vào
|
|
194
|
+
Ghi nội dung đã được confirm vào `.specs/main/sad.md`.
|
|
171
195
|
|
|
172
196
|
**Change History:** Append entry vào section `## Change History` cuối `sad.md` (theo `conventions.md` §5.5):
|
|
173
197
|
|
|
@@ -179,9 +203,21 @@ Ghi nội dung đã được confirm vào `specs/main/sad.md`.
|
|
|
179
203
|
|
|
180
204
|
Nếu chạy lần thứ N (sad.md đã có) → operation = `update`, body liệt kê section đã đổi với mô tả ngắn.
|
|
181
205
|
|
|
206
|
+
**Cascade Owner lên `domain.md` (nếu Phần 1.6 gán owner cho entity TBD):** apply `[MODIFY Owner]` + `[MODIFY Used by]` vào các entity tương ứng trong `domain.md > Shared Entities`, rồi append **một** Change History entry vào `domain.md`, operation = `manual`:
|
|
207
|
+
|
|
208
|
+
```markdown
|
|
209
|
+
### {YYYY-MM-DD} — manual — update
|
|
210
|
+
|
|
211
|
+
- **Shared Entities**:
|
|
212
|
+
- [MODIFY Owner] {Entity} — TBD → {C-XXX} (gán ownership qua /spec-sad)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Atomic với việc ghi sad.md. Không tạo entity mới ở đây (đó là pha mô tả); chỉ điền `Owner`/`Used by` còn `TBD`.
|
|
216
|
+
|
|
182
217
|
Thông báo kết quả:
|
|
183
218
|
```
|
|
184
|
-
✓ specs/main/sad.md đã được cập nhật (status: draft)
|
|
219
|
+
✓ .specs/main/sad.md đã được cập nhật (status: draft)
|
|
220
|
+
{nếu có} ✓ domain.md — gán Owner cho {N} shared entity (TBD → C-XXX)
|
|
185
221
|
|
|
186
222
|
Bước tiếp theo:
|
|
187
223
|
- /spec-new {feature-name} → định nghĩa requirements của từng feature
|
|
@@ -216,4 +252,5 @@ Trước khi kết thúc, kiểm tra:
|
|
|
216
252
|
- [ ] Mỗi tech stack item có lý do chọn rõ ràng
|
|
217
253
|
- [ ] Tất cả 4 cross-cutting concerns đã được điền (auth, error, logging, caching)
|
|
218
254
|
- [ ] Guardrails có ít nhất 3 item, mỗi item cụ thể và actionable
|
|
255
|
+
- [ ] Shared entity có `Owner: TBD` đã được gán `Owner: C-XXX` + `Used by` (nếu Component Index đã có nội dung); cascade `[MODIFY Owner]` lên domain.md + Change History entry operation `manual`
|
|
219
256
|
- [ ] User đã confirm — đặc biệt phần Guardrails — trước khi ghi file
|
|
@@ -7,7 +7,7 @@ description: Tạo tech.md cho một integration dựa trên spec.md đã đư
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Tạo `tech.md` cho một integration trong
|
|
10
|
+
Tạo `tech.md` cho một integration trong `.specs/integrations/{slug}/`.
|
|
11
11
|
|
|
12
12
|
`tech.md` là technical design — định nghĩa **how to build**: solution approach, data model changes, interfaces. Phải có `spec.md` đã approve trước khi chạy skill này.
|
|
13
13
|
|
|
@@ -30,14 +30,14 @@ Tạo `tech.md` cho một integration trong `specs/integrations/{slug}/`.
|
|
|
30
30
|
|
|
31
31
|
**Nếu có ARGUMENT:**
|
|
32
32
|
- Parse argument: có thể là số thứ tự (`2`, `002`) hoặc slug (`002-implement-todo`)
|
|
33
|
-
- Quét
|
|
33
|
+
- Quét `.specs/integrations/*/spec.md`, tìm integration khớp với argument
|
|
34
34
|
- Nếu không tìm thấy → báo lỗi:
|
|
35
35
|
> Không tìm thấy integration khớp với "{argument}". Kiểm tra lại tên hoặc số thứ tự.
|
|
36
36
|
- Nếu tìm thấy → dùng integration đó, bắt đầu luôn
|
|
37
37
|
|
|
38
38
|
**Nếu không có ARGUMENT:**
|
|
39
39
|
|
|
40
|
-
Quét
|
|
40
|
+
Quét `.specs/integrations/`. Liệt kê **tất cả** integrations có `spec.md`, đánh dấu những cái đã có `tech.md`:
|
|
41
41
|
|
|
42
42
|
```
|
|
43
43
|
Integrations:
|
|
@@ -58,7 +58,7 @@ Nếu integration đã có `tech.md` → hỏi trước khi tiếp tục:
|
|
|
58
58
|
|
|
59
59
|
### Bước 1b: Gate check — spec.md phải approved
|
|
60
60
|
|
|
61
|
-
Đọc frontmatter của
|
|
61
|
+
Đọc frontmatter của `.specs/integrations/{slug}/spec.md`.
|
|
62
62
|
|
|
63
63
|
Nếu `status` **không phải** `approved`:
|
|
64
64
|
|
|
@@ -76,12 +76,12 @@ Nếu `status: approved` → tiếp tục sang Bước 2.
|
|
|
76
76
|
|
|
77
77
|
Load các file sau:
|
|
78
78
|
|
|
79
|
-
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
79
|
+
- `.specs/integrations/{slug}/spec.md` — đọc toàn bộ + frontmatter (`features`, `components`)
|
|
80
|
+
- `.specs/main/sad.md` — đọc Tech Stack và Architectural Guardrails
|
|
81
|
+
- `.specs/main/domain.md` — đọc Glossary và Shared Entities
|
|
82
|
+
- `.specs/main/component/{C-XXX}-{slug}/cdd.md` — cho mỗi component trong frontmatter `components` (nếu cdd.md tồn tại)
|
|
83
|
+
- `.specs/main/feature/{F-XXX}-{slug}/frd.md` — cho mỗi feature trong frontmatter `features` (đọc `Verification Rules` để sinh `Verification Implementation` trong fdd.md)
|
|
84
|
+
- `.specs/main/feature/{F-XXX}-{slug}/fdd.md` — cho mỗi feature trong frontmatter `features` (nếu fdd.md tồn tại)
|
|
85
85
|
|
|
86
86
|
Tóm tắt context và surface assumptions:
|
|
87
87
|
|
|
@@ -168,11 +168,11 @@ Liệt kê **tất cả** components bị touched trong frontmatter và đánh g
|
|
|
168
168
|
|
|
169
169
|
Với từng component có đề xuất:
|
|
170
170
|
|
|
171
|
-
**Tạo mới**
|
|
171
|
+
**Tạo mới** `.specs/main/component/{C-XXX}-{component-slug}/cdd.md`
|
|
172
172
|
- Dùng khi component này được giới thiệu lần đầu trong integration (cascade từ spec.md đã đề xuất tạo crd, giờ tech.md đề xuất tạo cdd)
|
|
173
173
|
- Nội dung: Module Structure, Internal Data Flow, Storage & Persistence, Internal Interfaces, Technical Decisions
|
|
174
174
|
|
|
175
|
-
**Cập nhật**
|
|
175
|
+
**Cập nhật** `.specs/main/component/{C-XXX}-{component-slug}/cdd.md`
|
|
176
176
|
- Khi cdd.md đã tồn tại và integration thay đổi internal design
|
|
177
177
|
|
|
178
178
|
### feature/{F-XXX}-{feature-name}/fdd.md
|
|
@@ -184,12 +184,12 @@ Liệt kê **tất cả** features liên quan trong frontmatter và đánh giá:
|
|
|
184
184
|
| F-001 — Checkout | tồn tại | **Cập nhật** — thêm sequence khi payment fail |
|
|
185
185
|
| F-002 — Refund | chưa có | **Tạo mới** |
|
|
186
186
|
|
|
187
|
-
**Tạo mới**
|
|
187
|
+
**Tạo mới** `.specs/main/feature/{F-XXX}-{feature-slug}/fdd.md`
|
|
188
188
|
- Khi feature gắn với integration nhưng chưa có fdd.md
|
|
189
189
|
- Nội dung: Inter-component data flow, Orchestration, Cross-component invariants, **Verification Implementation** — từ tech.md (chỉ phần inter-component, không lặp internal design của component)
|
|
190
190
|
- **Verification Implementation**: với mỗi rule trong `frd.md > Verification Rules` của feature này, sinh row trong bảng `Rule ID | Rule (short) | Layer | Owning component | Error propagation`. Reference rule bằng `VR-F{NNN}-{seq}` ID (lấy nguyên từ FRD, không tạo ID mới). Rule (short) copy ngắn gọn từ FRD để row tự đọc được. Layer = client/gateway/service (có thể combine). Owning component reference C-XXX. KHÔNG đưa regex/validator code/error message wording vào — đó thuộc `cdd.md` của owning component (cascade riêng) hoặc UI copy artifact. Bỏ qua nếu FRD không có Verification Rules.
|
|
191
191
|
|
|
192
|
-
**Cập nhật**
|
|
192
|
+
**Cập nhật** `.specs/main/feature/{F-XXX}-{feature-slug}/fdd.md`
|
|
193
193
|
- Khi fdd.md đã tồn tại, ghi rõ thay đổi flow nào
|
|
194
194
|
- Nếu integration thêm/đổi rule trong FRD → cập nhật bảng Verification Implementation tương ứng
|
|
195
195
|
|
|
@@ -216,7 +216,7 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
|
|
|
216
216
|
|
|
217
217
|
### Bước 6: Save + Auto-cascade
|
|
218
218
|
|
|
219
|
-
**[6.1] Ghi
|
|
219
|
+
**[6.1] Ghi `.specs/integrations/{slug}/tech.md`** với status `approved` (không phải `draft` — human đã confirm ở Bước 5 chính là approval). Frontmatter `features` và `components` mirror từ `spec.md`.
|
|
220
220
|
|
|
221
221
|
**[6.2] Auto-apply mỗi Changes block** vào main artifact tương ứng. Thứ tự apply (để tránh forward reference): `sad.md` → `domain.md` → `component/*/cdd.md` → `feature/*/fdd.md`.
|
|
222
222
|
|
|
@@ -265,7 +265,7 @@ Cho mỗi artifact:
|
|
|
265
265
|
**[6.4] Thông báo kết quả:**
|
|
266
266
|
|
|
267
267
|
```
|
|
268
|
-
✓ specs/integrations/{slug}/tech.md đã được tạo (status: approved)
|
|
268
|
+
✓ .specs/integrations/{slug}/tech.md đã được tạo (status: approved)
|
|
269
269
|
|
|
270
270
|
Auto-cascade applied:
|
|
271
271
|
✓ sad.md — {summary | no-op}
|
|
@@ -7,13 +7,13 @@ description: Tạo test.md cho một integration bằng cách mechanical derive
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Tạo `test.md` cho một integration trong
|
|
10
|
+
Tạo `test.md` cho một integration trong `.specs/integrations/{slug}/`.
|
|
11
11
|
|
|
12
12
|
`test.md` là verification design ở integration level — định nghĩa **how to verify** rằng integration đáp ứng `spec.md`. Nội dung gồm Test Strategy (per integration) + Changes blocks cascade lên feature `tsd.md` (Test Spec Document).
|
|
13
13
|
|
|
14
14
|
**Hai artifact tách bạch:**
|
|
15
|
-
-
|
|
16
|
-
-
|
|
15
|
+
- `.specs/integrations/{slug}/test.md` — integration-level, ephemeral, PR record bất biến sau approve (single-word naming như `spec.md` / `tech.md` / `plan.md`).
|
|
16
|
+
- `.specs/main/feature/{F-XXX}-{slug}/tsd.md` — feature-level, persistent canonical artifact (3-letter naming như `frd.md` / `fdd.md`). TC content cuối cùng nằm ở đây.
|
|
17
17
|
|
|
18
18
|
**Role:** QC. Song song với `/spec-tech` (DEV role). Cả hai chỉ phụ thuộc `spec.md` approved — không có thứ tự bắt buộc giữa chúng.
|
|
19
19
|
|
|
@@ -38,14 +38,14 @@ Tạo `test.md` cho một integration trong `specs/integrations/{slug}/`.
|
|
|
38
38
|
|
|
39
39
|
**Nếu có ARGUMENT:**
|
|
40
40
|
- Parse argument: có thể là số thứ tự (`2`, `002`) hoặc slug (`002-implement-todo`)
|
|
41
|
-
- Quét
|
|
41
|
+
- Quét `.specs/integrations/*/spec.md`, tìm integration khớp với argument
|
|
42
42
|
- Nếu không tìm thấy → báo lỗi:
|
|
43
43
|
> Không tìm thấy integration khớp với "{argument}". Kiểm tra lại tên hoặc số thứ tự.
|
|
44
44
|
- Nếu tìm thấy → dùng integration đó, bắt đầu luôn
|
|
45
45
|
|
|
46
46
|
**Nếu không có ARGUMENT:**
|
|
47
47
|
|
|
48
|
-
Quét
|
|
48
|
+
Quét `.specs/integrations/`. Liệt kê **tất cả** integrations có `spec.md`, đánh dấu những cái đã có `test.md`:
|
|
49
49
|
|
|
50
50
|
```
|
|
51
51
|
Integrations:
|
|
@@ -66,7 +66,7 @@ Nếu integration đã có `test.md` → hỏi trước khi tiếp tục:
|
|
|
66
66
|
|
|
67
67
|
### Bước 1b: Gate check
|
|
68
68
|
|
|
69
|
-
Đọc frontmatter của
|
|
69
|
+
Đọc frontmatter của `.specs/integrations/{slug}/spec.md`.
|
|
70
70
|
|
|
71
71
|
**Check 1 — spec.md phải approved:**
|
|
72
72
|
|
|
@@ -77,7 +77,7 @@ Nếu `status` **không phải** `approved`:
|
|
|
77
77
|
> `/spec-test` cần spec.md approved vì cascade frd.md (nguồn của TC) chỉ apply sau khi approve.
|
|
78
78
|
>
|
|
79
79
|
> Để tiếp tục:
|
|
80
|
-
> 1. Review
|
|
80
|
+
> 1. Review `.specs/integrations/{slug}/spec.md`
|
|
81
81
|
> 2. Approve (đổi `status: draft` → `status: approved`)
|
|
82
82
|
>
|
|
83
83
|
> Sau đó chạy lại `/spec-test`.
|
|
@@ -107,10 +107,10 @@ Nếu cả 2 check pass → tiếp tục Bước 2.
|
|
|
107
107
|
|
|
108
108
|
Load các file sau:
|
|
109
109
|
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
-
|
|
110
|
+
- `.specs/integrations/{slug}/spec.md` — đọc toàn bộ + frontmatter (`features`)
|
|
111
|
+
- `.specs/main/feature/{F-XXX}-{slug}/frd.md` — cho mỗi feature trong frontmatter `features` (source của TC — bắt buộc tồn tại vì cascade từ spec.md đã apply)
|
|
112
|
+
- `.specs/main/feature/{F-XXX}-{slug}/tsd.md` — cho mỗi feature trong frontmatter `features` (nếu tồn tại — cần để diff và assign next ID)
|
|
113
|
+
- `.specs/integrations/{slug}/tech.md` — đọc nếu tồn tại (optional, dùng để hint environment / data set / NFR perf threshold)
|
|
114
114
|
|
|
115
115
|
Tóm tắt context:
|
|
116
116
|
|
|
@@ -127,7 +127,7 @@ TÔI HIỂU:
|
|
|
127
127
|
```
|
|
128
128
|
|
|
129
129
|
Nếu frd.md của feature nào không tồn tại → báo lỗi và dừng (lỗi cascade từ spec.md trước đó):
|
|
130
|
-
> ⛔
|
|
130
|
+
> ⛔ `.specs/main/feature/{F-XXX}-{slug}/frd.md` không tồn tại nhưng feature có trong `features:` của spec.md. Cascade từ spec.md có thể đã fail. Kiểm tra lại.
|
|
131
131
|
|
|
132
132
|
---
|
|
133
133
|
|
|
@@ -284,14 +284,14 @@ Chỉ tiến hành Bước 6 sau khi QC confirm.
|
|
|
284
284
|
|
|
285
285
|
### Bước 6: Save + Auto-cascade
|
|
286
286
|
|
|
287
|
-
**[6.1] Ghi
|
|
287
|
+
**[6.1] Ghi `.specs/integrations/{slug}/test.md`** với status `approved` (không phải `draft` — human đã confirm ở Bước 5 chính là approval). Frontmatter `features` mirror từ `spec.md`.
|
|
288
288
|
|
|
289
289
|
**[6.2] Auto-apply mỗi Changes block** vào `feature/{F-XXX}/tsd.md` tương ứng. Thứ tự apply: theo thứ tự xuất hiện trong frontmatter `features` (deterministic, không có forward reference giữa các feature tsd.md). Bỏ qua feature có operation `no-op` trong Cascade Summary.
|
|
290
290
|
|
|
291
291
|
Cho từng block:
|
|
292
292
|
|
|
293
293
|
- **Operation=create:**
|
|
294
|
-
- Tạo file
|
|
294
|
+
- Tạo file `.specs/main/feature/{F-XXX}-{slug}/tsd.md`
|
|
295
295
|
- Nội dung = nội dung của Changes block (theo format `templates/main/feature/tsd-template.md`)
|
|
296
296
|
- Frontmatter của tsd.md mới: status `draft` (separate lifecycle với integration test.md)
|
|
297
297
|
|
|
@@ -329,7 +329,7 @@ Format entry:
|
|
|
329
329
|
**[6.4] Thông báo kết quả:**
|
|
330
330
|
|
|
331
331
|
```
|
|
332
|
-
✓ specs/integrations/{slug}/test.md đã được tạo (status: approved)
|
|
332
|
+
✓ .specs/integrations/{slug}/test.md đã được tạo (status: approved)
|
|
333
333
|
|
|
334
334
|
Auto-cascade applied:
|
|
335
335
|
✓ feature/F-XXX-{slug}/tsd.md — {created | updated: +N TS, +M TC, modify K TC, remove L TC}
|
package/skills/spec-tsd/SKILL.md
CHANGED
|
@@ -7,7 +7,7 @@ description: Tạo tsd.md (Test Spec Document) trực tiếp tại feature level
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Tạo
|
|
10
|
+
Tạo `.specs/main/feature/{F-XXX}-{slug}/tsd.md` trực tiếp từ frd.md của feature đó — **không qua integration**, không cascade.
|
|
11
11
|
|
|
12
12
|
Skill này song hành với `/spec-prd` và `/spec-sad`: skill có acronym suffix (`prd`/`sad`/`tsd`) → tạo main artifact trực tiếp. Phân biệt với `/spec-test` — skill đó tạo `test.md` integration-level và cascade qua Changes blocks.
|
|
13
13
|
|
|
@@ -39,13 +39,13 @@ Quy tắc:
|
|
|
39
39
|
|
|
40
40
|
**Nếu có ARGUMENT:**
|
|
41
41
|
- Parse argument: có thể là feature ID (`F-001`, `001`) hoặc slug (`F-001-auth`, `auth`)
|
|
42
|
-
- Quét
|
|
42
|
+
- Quét `.specs/main/feature/*/frd.md`, tìm feature khớp
|
|
43
43
|
- Nếu không tìm thấy → báo lỗi:
|
|
44
|
-
> Không tìm thấy feature khớp với "{argument}". Kiểm tra
|
|
44
|
+
> Không tìm thấy feature khớp với "{argument}". Kiểm tra `.specs/main/feature/`.
|
|
45
45
|
|
|
46
46
|
**Nếu không có ARGUMENT:**
|
|
47
47
|
|
|
48
|
-
Quét
|
|
48
|
+
Quét `.specs/main/feature/`. Liệt kê **tất cả** features có `frd.md`, đánh dấu trạng thái tsd:
|
|
49
49
|
|
|
50
50
|
```
|
|
51
51
|
Features có frd.md:
|
|
@@ -66,12 +66,12 @@ Nếu không có feature nào có frd → thông báo:
|
|
|
66
66
|
|
|
67
67
|
**Check 1 — frd.md tồn tại:**
|
|
68
68
|
|
|
69
|
-
Nếu
|
|
69
|
+
Nếu `.specs/main/feature/{F-XXX}-{slug}/frd.md` không tồn tại → dừng:
|
|
70
70
|
> ⛔ `feature/{F-XXX}-{slug}/frd.md` không tồn tại. `/spec-tsd` cần frd làm input.
|
|
71
71
|
|
|
72
72
|
**Check 2 — tsd.md đã tồn tại:**
|
|
73
73
|
|
|
74
|
-
Nếu
|
|
74
|
+
Nếu `.specs/main/feature/{F-XXX}-{slug}/tsd.md` đã tồn tại:
|
|
75
75
|
|
|
76
76
|
> ⚠ `tsd.md` đã tồn tại cho feature **{F-XXX} — {slug}**.
|
|
77
77
|
>
|
|
@@ -90,8 +90,8 @@ Nếu user chọn yes → backup tsd.md cũ thành `tsd.md.bak.{timestamp}` rồ
|
|
|
90
90
|
|
|
91
91
|
Load các file sau:
|
|
92
92
|
|
|
93
|
-
-
|
|
94
|
-
-
|
|
93
|
+
- `.specs/main/feature/{F-XXX}-{slug}/frd.md` — **bắt buộc**, source của TC
|
|
94
|
+
- `.specs/main/feature/{F-XXX}-{slug}/fdd.md` — optional, đọc nếu tồn tại để hint Components Used (cho Dependencies section của tsd)
|
|
95
95
|
|
|
96
96
|
Tóm tắt context:
|
|
97
97
|
|
|
@@ -183,7 +183,7 @@ Hiển thị draft đầy đủ — chưa ghi file.
|
|
|
183
183
|
|
|
184
184
|
### Bước 6: Save
|
|
185
185
|
|
|
186
|
-
Ghi
|
|
186
|
+
Ghi `.specs/main/feature/{F-XXX}-{slug}/tsd.md` với status `draft` (feature-level artifact có lifecycle riêng, không phải `approved` — QC còn fill placeholders nên status `draft` cho đến khi đầy đủ).
|
|
187
187
|
|
|
188
188
|
Nếu overwrite — file backup `tsd.md.bak.{timestamp}` đã tạo ở Bước 2.
|
|
189
189
|
|
|
@@ -200,7 +200,7 @@ Nếu overwrite tsd.md cũ → entry vẫn dùng operation `create` (vì IDs reg
|
|
|
200
200
|
Thông báo kết quả:
|
|
201
201
|
|
|
202
202
|
```
|
|
203
|
-
✓ specs/main/feature/{F-XXX}-{slug}/tsd.md đã được tạo (status: draft)
|
|
203
|
+
✓ .specs/main/feature/{F-XXX}-{slug}/tsd.md đã được tạo (status: draft)
|
|
204
204
|
Coverage: N Flows → N TS, M US/AC → M Functional TC, P VR → ~2P Validation TC, Q FAC → Q Feature AC TC
|
|
205
205
|
{nếu overwrite: backup tại tsd.md.bak.{timestamp}}
|
|
206
206
|
|