spec-lite 1.5.1 → 1.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/README.md +8 -8
- package/package.json +1 -1
- package/skills/ado-create/SKILL.md +1 -1
- package/skills/artifact-audit/SKILL.md +3 -3
- package/skills/artifact-migrate/SKILL.md +3 -3
- package/skills/spec-brownfield-feature/SKILL.md +1 -1
- package/skills/spec-frd/SKILL.md +44 -11
- package/skills/spec-new/SKILL.md +43 -11
- package/skills/spec-test/SKILL.md +60 -59
- package/skills/spec-test-design/SKILL.md +243 -0
- package/skills-overview.md +23 -22
- package/templates/integrations/test-template.md +47 -25
- package/templates/main/feature/frd-template.md +43 -8
- package/templates/main/feature/{tsd-template.md → test-design-template.md} +73 -34
- package/templates/main/prd-template.md +2 -0
- package/skills/spec-tsd/SKILL.md +0 -241
package/README.md
CHANGED
|
@@ -45,7 +45,7 @@ BA author `.specs/main/feature/{F-XXX}-*/frd.md` trực tiếp qua interview, **
|
|
|
45
45
|
|
|
46
46
|
Phạm vi hẹp: **chủ yếu frd.md** (+ tối đa một feature row vào prd nếu register). Reference component frd phụ thuộc (Components Used); component cần-nhưng-chưa-có ghi như *candidate* để `/spec-sad`/architect chốt boundary. **KHÔNG** tạo `crd.md`/`cdd.md` — component artifacts sinh ở integration time qua `/spec-new` cascade. Change History operation = `manual`. Nếu bỏ qua bước này, `/spec-new` vẫn tự tạo frd làm fallback.
|
|
47
47
|
|
|
48
|
-
Sections: Overview · User Flows · Feature Acceptance Criteria · User Stories · Verification Rules · Scope · Dependencies
|
|
48
|
+
Sections: Overview · User Flows · Feature Acceptance Criteria (end-to-end) · Non-Functional Requirements · Data & Migration *(nếu có)* · User Stories · Verification Rules · Scope · Dependencies
|
|
49
49
|
|
|
50
50
|
---
|
|
51
51
|
|
|
@@ -63,7 +63,7 @@ Scan codebase để extract main artifacts, sau đó vào Integration Pipeline.
|
|
|
63
63
|
/spec-brownfield-feature
|
|
64
64
|
│
|
|
65
65
|
▼
|
|
66
|
-
/spec-
|
|
66
|
+
/spec-test-design [F-XXX] (tùy chọn — bootstrap test-design.md cho từng feature)
|
|
67
67
|
│
|
|
68
68
|
▼
|
|
69
69
|
(fill in NEEDS_CLARIFY khi có thêm context)
|
|
@@ -81,8 +81,8 @@ Scan module dirs, tạo `crd.md` + `cdd.md` cho từng component, điền Compon
|
|
|
81
81
|
#### `/spec-brownfield-feature [path]`
|
|
82
82
|
Scan routes/use cases/tests, tạo `frd.md` + `fdd.md` cho từng feature, điền Feature Index vào `prd.md`. Yêu cầu `component` đã chạy (fdd.md cần C-XXX IDs từ Component Index).
|
|
83
83
|
|
|
84
|
-
#### `/spec-
|
|
85
|
-
Bootstrap `feature/{F-XXX}/
|
|
84
|
+
#### `/spec-test-design [F-XXX]`
|
|
85
|
+
Bootstrap `feature/{F-XXX}/test-design.md` (Test Design Document) trực tiếp từ `frd.md` — mechanical derive Test Scenarios + Test Cases (mỗi Flow → TS, mỗi US/AC → Functional TC, mỗi VR → ≥1 positive + 1+ negative, mỗi FAC → E2E TC, mỗi NFR → Non-functional TC, mỗi DM → Data & Migration TC). Không interview, không cần integration. Dùng sau `/spec-brownfield-feature` để có test coverage tracking từ ngày 1, hoặc khi test-design drift khỏi frd cần regenerate fresh.
|
|
86
86
|
|
|
87
87
|
> **NEEDS_CLARIFY:** Các mục chưa rõ khi scan được đánh dấu `[NEEDS_CLARIFY]` — không block workflow, fill in dần khi có thêm context.
|
|
88
88
|
|
|
@@ -99,7 +99,7 @@ Mỗi requirement mới đều đi qua pipeline này.
|
|
|
99
99
|
├─────────────────┐
|
|
100
100
|
▼ ▼
|
|
101
101
|
/spec-tech /spec-test (song song — cả hai chỉ phụ thuộc spec.md)
|
|
102
|
-
(DEV approve) (QC approve, cascade lên feature/*/
|
|
102
|
+
(DEV approve) (QC approve, cascade lên feature/*/test-design.md)
|
|
103
103
|
│ │
|
|
104
104
|
└────────┬────────┘
|
|
105
105
|
▼
|
|
@@ -126,7 +126,7 @@ Tạo `.specs/integrations/{slug}/tech.md` sau khi `spec.md` được approve. C
|
|
|
126
126
|
- Không có argument → hiển thị danh sách tất cả integrations
|
|
127
127
|
|
|
128
128
|
#### `/spec-test [number]`
|
|
129
|
-
Tạo `.specs/integrations/{slug}/test.md` sau khi `spec.md` được approve. Chạy bởi **QC**, **song song / độc lập** với `/spec-tech` — cả hai chỉ phụ thuộc `spec.md`. Mechanical derive Test Scenarios + Test Cases từ frd.md (Flow → TS, US/AC → Functional TC, VR → positive + negative, FAC →
|
|
129
|
+
Tạo `.specs/integrations/{slug}/test.md` sau khi `spec.md` được approve. Chạy bởi **QC**, **song song / độc lập** với `/spec-tech` — cả hai chỉ phụ thuộc `spec.md`. Mechanical derive Test Scenarios + Test Cases từ frd.md (Flow → TS, US/AC → Functional TC, VR → positive + negative, FAC → E2E TC, NFR → Non-functional TC, DM → Data & Migration TC), priority deterministic. Cascade lên `feature/{F-XXX}/test-design.md` qua Changes blocks. Gate: integration phải có `features:` non-empty (component-thuần không áp dụng).
|
|
130
130
|
|
|
131
131
|
#### `/plan`
|
|
132
132
|
Tạo `plan.md` và `todo.md` từ `spec.md` + `tech.md`.
|
|
@@ -171,12 +171,12 @@ Migrate **main artifact** lỗi thời lên structure mới (mọi main type). T
|
|
|
171
171
|
| `/spec-brownfield-init` | `.specs/main/prd.md`, `.specs/main/domain.md`, `.specs/main/sad.md` |
|
|
172
172
|
| `/spec-brownfield-component` | `.specs/main/component/{C-XXX}-*/crd.md + cdd.md` |
|
|
173
173
|
| `/spec-brownfield-feature` | `.specs/main/feature/{F-XXX}-*/frd.md + fdd.md` |
|
|
174
|
-
| `/spec-
|
|
174
|
+
| `/spec-test-design` | `.specs/main/feature/{F-XXX}-*/test-design.md` |
|
|
175
175
|
| `/artifact-audit` | *(báo cáo out-dated; + stamp `template_version` cho main artifact legacy conform)* |
|
|
176
176
|
| `/artifact-migrate` | *(modify in-place main artifact lỗi thời lên structure mới + set `template_version`)* |
|
|
177
177
|
| `/spec-new` | `.specs/integrations/{slug}/spec.md` |
|
|
178
178
|
| `/spec-tech` | `.specs/integrations/{slug}/tech.md` |
|
|
179
|
-
| `/spec-test` | `.specs/integrations/{slug}/test.md`, cascade: `feature/{F-XXX}/
|
|
179
|
+
| `/spec-test` | `.specs/integrations/{slug}/test.md`, cascade: `feature/{F-XXX}/test-design.md` |
|
|
180
180
|
| `/plan` | `.specs/integrations/{slug}/plan.md`, `todo.md` |
|
|
181
181
|
| `/build` | *(implements tasks từ `plan.md`/`todo.md`)* |
|
|
182
182
|
| `/review-integration` | *(findings report — không tạo file)* |
|
package/package.json
CHANGED
|
@@ -216,7 +216,7 @@ Sau khi tất cả tickets đã được tạo, cập nhật `spec.md`:
|
|
|
216
216
|
### Feature: Đăng ký / Đăng nhập (F-001)
|
|
217
217
|
**ADO:** [#12345 — [SDLC-TEST] Đăng ký / Đăng nhập](https://dev.azure.com/...)
|
|
218
218
|
|
|
219
|
-
**Feature
|
|
219
|
+
**Feature Acceptance Criteria:**
|
|
220
220
|
```
|
|
221
221
|
|
|
222
222
|
**Với User Story ticket thành công:** Thêm dòng `**ADO:**` ngay sau heading user story:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: artifact-audit
|
|
3
|
-
description: Audit MAIN artifacts trong .specs/main/ xem có lỗi thời so với template không (chỉ main artifacts — prd/domain/sad/frd/fdd/
|
|
3
|
+
description: Audit MAIN artifacts trong .specs/main/ xem có lỗi thời so với template không (chỉ main artifacts — prd/domain/sad/frd/fdd/test-design/crd/cdd; integration artifacts ngoài scope). So `template_version` của artifact với `template_version` hiện tại đọc thẳng từ template (.claude/templates/). Versioned khớp → up-to-date, lệch → out-dated (in vX → vY). Artifact thiếu version (sinh trước versioning) → đối chiếu structure với template: khớp thì stamp version, lệch thì flag out-dated. KHÔNG tự migrate — chỉ stamp khi chắc chắn khớp + báo cáo. Nhận tùy chọn 1 hay nhiều main type làm scope (vd `frd`, `frd,crd`); không có arg → audit mọi main type.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# artifact-audit
|
|
@@ -9,7 +9,7 @@ description: Audit MAIN artifacts trong .specs/main/ xem có lỗi thời so v
|
|
|
9
9
|
|
|
10
10
|
Trả lời một câu hỏi: **main artifact nào trong `.specs/main/` đã lỗi thời so với template mới nhất?**
|
|
11
11
|
|
|
12
|
-
> **Scope = chỉ main artifacts** (`prd`, `domain`, `sad`, `frd`, `fdd`, `
|
|
12
|
+
> **Scope = chỉ main artifacts** (`prd`, `domain`, `sad`, `frd`, `fdd`, `test-design`, `crd`, `cdd` — đều nằm dưới `.specs/main/`). Integration artifacts (`spec`, `tech`, `test`, `plan`, `todo`, `techdebt` dưới `.specs/integrations/`) **không** thuộc scope của skill này — chúng là ephemeral và immutable sau khi `done`, không audit/migrate theo version.
|
|
13
13
|
|
|
14
14
|
Cơ chế (xem `conventions.md` §7 Template Versioning):
|
|
15
15
|
- **Nguồn sự thật** = `template_version` trong frontmatter template đang cài (`.claude/templates/...`). Đọc thẳng lúc chạy — không manifest, không cache.
|
|
@@ -43,7 +43,7 @@ Type của main artifact resolve theo **filename**. Mỗi type map tới đúng
|
|
|
43
43
|
| `sad.md` | sad | `main/sad-template.md` |
|
|
44
44
|
| `frd.md` | frd | `main/feature/frd-template.md` |
|
|
45
45
|
| `fdd.md` | fdd | `main/feature/fdd-template.md` |
|
|
46
|
-
| `
|
|
46
|
+
| `test-design.md` | test-design | `main/feature/test-design-template.md` |
|
|
47
47
|
| `crd.md` | crd | `main/component/crd-template.md` |
|
|
48
48
|
| `cdd.md` | cdd | `main/component/cdd-template.md` |
|
|
49
49
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: artifact-migrate
|
|
3
|
-
description: Migrate MAIN artifact trong .specs/main/ lên structure template mới nhất (chỉ main artifacts — prd/domain/sad/frd/fdd/
|
|
3
|
+
description: Migrate MAIN artifact trong .specs/main/ lên structure template mới nhất (chỉ main artifacts — prd/domain/sad/frd/fdd/test-design/crd/cdd; integration artifacts ngoài scope). Tự chạy /artifact-audit (classify-only, scoped) để phát hiện out-dated, rồi áp delta từ block `migrations` của template — add section thiếu, remove section deprecated, update format section (vd ASCII→Mermaid) — set template_version = current. Tương tác: confirm add/remove/update, hỏi carry-over khi rename, section nội dung mới thì interview hoặc NEEDS_CLARIFY (không bịa). Single-artifact, KHÔNG cascade. Nhận tùy chọn 1 main artifact (path); không có arg → quét mọi main artifact, migrate từng cái có confirm + skip.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# artifact-migrate
|
|
@@ -9,7 +9,7 @@ description: Migrate MAIN artifact trong .specs/main/ lên structure template m
|
|
|
9
9
|
|
|
10
10
|
Đưa một main artifact (hoặc toàn bộ main artifacts) **lỗi thời** lên đúng structure của template mới nhất, rồi cập nhật `template_version`. Đây là vế **fix** đối xứng với `/artifact-audit` (vế **detect**).
|
|
11
11
|
|
|
12
|
-
> **Scope = chỉ main artifacts** (`prd`, `domain`, `sad`, `frd`, `fdd`, `
|
|
12
|
+
> **Scope = chỉ main artifacts** (`prd`, `domain`, `sad`, `frd`, `fdd`, `test-design`, `crd`, `cdd` — đều dưới `.specs/main/`). Integration artifacts (`spec`, `tech`, `test`, `plan`, `todo`, `techdebt`) **không** thuộc scope — ephemeral + immutable sau `done`, không migrate theo version.
|
|
13
13
|
|
|
14
14
|
Cơ chế (xem `conventions.md` §7 Template Versioning):
|
|
15
15
|
- **Required section hiện tại** = body `##` headings của template (deterministic theo level; `###` = instance).
|
|
@@ -34,7 +34,7 @@ Cơ chế (xem `conventions.md` §7 Template Versioning):
|
|
|
34
34
|
|
|
35
35
|
Resolve type của main artifact theo **filename** (giống `/artifact-audit`). Mỗi type map tới đúng một template tại `.claude/templates/...`:
|
|
36
36
|
|
|
37
|
-
`prd.md`→`main/prd-template.md` · `domain.md`→`main/domain-template.md` · `sad.md`→`main/sad-template.md` · `frd.md`→`main/feature/frd-template.md` · `fdd.md`→`main/feature/fdd-template.md` · `
|
|
37
|
+
`prd.md`→`main/prd-template.md` · `domain.md`→`main/domain-template.md` · `sad.md`→`main/sad-template.md` · `frd.md`→`main/feature/frd-template.md` · `fdd.md`→`main/feature/fdd-template.md` · `test-design.md`→`main/feature/test-design-template.md` · `crd.md`→`main/component/crd-template.md` · `cdd.md`→`main/component/cdd-template.md`
|
|
38
38
|
|
|
39
39
|
**Chỉ main artifacts.** Integration artifacts (`spec`/`tech`/`test`/`plan`/`todo`/`techdebt`) ngoài scope → bỏ qua. File không khớp map → cũng bỏ qua.
|
|
40
40
|
|
|
@@ -289,7 +289,7 @@ Brownfield init hoàn tất! Main artifacts:
|
|
|
289
289
|
└── feature/ ({N} features, mỗi cái có frd.md + fdd.md)
|
|
290
290
|
|
|
291
291
|
Bước tiếp theo (tùy chọn):
|
|
292
|
-
/spec-
|
|
292
|
+
/spec-test-design [F-XXX] → bootstrap test-design.md (Test Design Document) cho từng feature
|
|
293
293
|
— derive 1:1 từ frd.md, có test coverage tracking từ ngày 1.
|
|
294
294
|
|
|
295
295
|
Để bắt đầu implement, dùng /spec-new để tạo integration đầu tiên.
|
package/skills/spec-frd/SKILL.md
CHANGED
|
@@ -9,7 +9,7 @@ description: Author MỚI frd.md (Feature Requirements Document) trực tiếp
|
|
|
9
9
|
|
|
10
10
|
Author `.specs/main/feature/{F-XXX}-{feature-slug}/frd.md` trực tiếp qua interview — **spec-first ở feature level**, do **BA** chạy trước khi bất kỳ integration nào bắt đầu.
|
|
11
11
|
|
|
12
|
-
`frd.md` là **what to build** của một feature: Overview, User Flows, Feature AC, User Stories, Verification Rules, Scope, Dependencies. Đây là baseline ổn định, **author một lần** — mọi thay đổi sau đó đi qua `/spec-new` (delta cascade).
|
|
12
|
+
`frd.md` là **what to build** của một feature: Overview, User Flows, Feature AC (end-to-end), Non-Functional Requirements, Data & Migration, User Stories, Verification Rules, Scope, Dependencies. Đây là baseline ổn định, **author một lần** — mọi thay đổi sau đó đi qua `/spec-new` (delta cascade).
|
|
13
13
|
|
|
14
14
|
Skill này là cặp greenfield đối xứng với `/spec-brownfield-feature` (vốn reverse-engineer frd từ code). Khác biệt: `/spec-frd` author *forward* từ interview, không scan code.
|
|
15
15
|
|
|
@@ -23,7 +23,7 @@ Skill này là cặp greenfield đối xứng với `/spec-brownfield-feature` (
|
|
|
23
23
|
- ✅ Nếu feature mục tiêu là feature mới chưa có trong Index → **register một row vào `prd.md > Features`** (side-effect hợp lệ lên prd).
|
|
24
24
|
- ✅ **Cascade vocabulary lên `domain.md`** (Bước 4b — pha *mô tả hệ thống*/WHAT): glossary term + **định nghĩa entity đầy đủ** (attributes). `Owner` của entity để `TBD` cho `/spec-sad` điền ở pha *thiết kế hệ thống* (HOW). BA duyệt trước khi ghi. Đây là điểm khác với phiên bản trước (`/spec-frd` từng không đụng domain) — vocabulary sinh ra ở feature-authoring time nên seed luôn, thay vì để domain rỗng tới integration đầu tiên.
|
|
25
25
|
- ❌ KHÔNG tạo/sửa `crd.md`/`cdd.md` — component artifacts ra đời ở integration time qua `/spec-new` cascade.
|
|
26
|
-
- ❌ KHÔNG tạo `fdd.md` (inter-component design) hay `
|
|
26
|
+
- ❌ KHÔNG tạo `fdd.md` (inter-component design) hay `test-design.md` (test) — để skill/role khác lo.
|
|
27
27
|
- ❌ KHÔNG carve component / quyết `Owner` của shared entity (để `/spec-sad`/`/spec-new`); KHÔNG đổi status feature đã có; KHÔNG đụng sad.
|
|
28
28
|
|
|
29
29
|
## When to Use
|
|
@@ -43,6 +43,31 @@ Skill này là cặp greenfield đối xứng với `/spec-brownfield-feature` (
|
|
|
43
43
|
|
|
44
44
|
## Process
|
|
45
45
|
|
|
46
|
+
### Pre-flight: chuẩn bị nhánh Git (chạy TRƯỚC Bước 0)
|
|
47
|
+
|
|
48
|
+
Mục tiêu: không bao giờ author frd ngay trên nhánh hiện tại của user (có thể là một nhánh đang làm dở) — luôn bắt đầu từ **nhánh chính mới nhất** rồi tách một **nhánh làm việc riêng**.
|
|
49
|
+
|
|
50
|
+
**Trước tiên, thông báo cho user toàn bộ việc Git skill sẽ làm** (để user biết trước, đúng tinh thần "agent làm các việc này"):
|
|
51
|
+
|
|
52
|
+
> Trước khi author frd, mình sẽ:
|
|
53
|
+
> 1. Pull code mới nhất từ nhánh chính (`{main}`).
|
|
54
|
+
> 2. Tạo & checkout một nhánh mới tách từ `{main}` để làm việc.
|
|
55
|
+
>
|
|
56
|
+
> (Bạn đang ở nhánh `{current}`.)
|
|
57
|
+
|
|
58
|
+
**1. Xác định nhánh chính (`{main}`).**
|
|
59
|
+
- Không phải git repo → bỏ qua toàn bộ pre-flight, note cho user rồi tiếp Bước 0.
|
|
60
|
+
- Có nhánh `develop` → mặc định `{main}` = `develop`. Không có `develop` nhưng có `main`/`master` → dùng nó.
|
|
61
|
+
- Mơ hồ (tồn tại cả `develop` lẫn `main`, hoặc remote default khác) → **hỏi user** nhánh nào là nhánh chính. KHÔNG đoán.
|
|
62
|
+
|
|
63
|
+
**2. Kiểm tra working tree sạch.** `git status` còn thay đổi chưa commit → **DỪNG**, báo user commit/stash trước. KHÔNG tự ý stash/discard.
|
|
64
|
+
|
|
65
|
+
**3. Checkout + pull nhánh chính:** `git checkout {main}` rồi `git pull`. Pull fail (conflict, không có upstream…) → **DỪNG**, surface lỗi cụ thể, để user xử lý.
|
|
66
|
+
|
|
67
|
+
**4. Tạo nhánh làm việc mới off `{main}`.** Cần slug để đặt tên → thực hiện **ngay sau khi xác định feature mục tiêu ở Bước 1c** (xem nhắc ở đó): đề xuất `git checkout -b spec/{F-XXX}-{slug}`, cho user sửa tên rồi tạo. Mọi việc author/cascade từ Bước 2 trở đi diễn ra trên nhánh này.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
46
71
|
### Bước 0: Nạp nguồn yêu cầu (tùy chọn)
|
|
47
72
|
|
|
48
73
|
Giống `/spec-prd` Bước 0. Xác định có nguồn baseline cho feature không (proposal, mô tả feature, ghi chú họp, wireframe note):
|
|
@@ -106,7 +131,7 @@ Chọn feature để author frd:
|
|
|
106
131
|
|
|
107
132
|
Kiểm tra `.specs/main/feature/{F-XXX}-*/frd.md`.
|
|
108
133
|
|
|
109
|
-
- **Chưa tồn tại** → tiếp Bước 2 (author mới).
|
|
134
|
+
- **Chưa tồn tại** → **tạo nhánh làm việc** (Pre-flight bước 4): `git checkout -b spec/{F-XXX}-{slug}` off `{main}` (đề xuất tên, cho user sửa), rồi tiếp Bước 2 (author mới).
|
|
110
135
|
- **Đã tồn tại** → **DỪNG**, redirect `/spec-new`:
|
|
111
136
|
> frd.md cho {F-XXX} đã tồn tại. Mọi thay đổi feature đã được spec phải đi qua `/spec-new` — skill đó phân tích delta, cascade lên frd/crd/prd/domain, và kéo theo việc kỹ thuật/test (`/spec-tech`, `/spec-test`).
|
|
112
137
|
> Chạy: `/spec-new {F-XXX}` (hoặc `/spec-new <mô tả thay đổi>`).
|
|
@@ -155,9 +180,14 @@ Hỏi tuần tự, từng phần — không hỏi tất cả cùng lúc. Nếu B
|
|
|
155
180
|
**Phần 3 — User Stories:**
|
|
156
181
|
> Liệt kê các stories ở cấp feature: "{Persona} muốn {hành động} để {mục tiêu}". Mỗi story có priority (Must/Should/Could) và acceptance criteria (Given/When/Then).
|
|
157
182
|
|
|
158
|
-
**Phần 4 — Feature Acceptance Criteria:**
|
|
159
|
-
> Có criteria nào áp cho *toàn* feature mà story lẻ không cover? (
|
|
160
|
-
|
|
183
|
+
**Phần 4 — Feature Acceptance Criteria (end-to-end):**
|
|
184
|
+
> Có criteria **end-to-end** nào áp cho *toàn* feature mà story lẻ không cover? 3 shape: journey (tuần tự liên story) + consistency (đa màn) + integrity (bất biến liên story, không tuần tự — vd cascade delete, đối soát khớp). Mỗi cái Given/When/Then, **Then phải đo được**. (NFR và data/migration hỏi riêng ở Phần 4b / 4c.)
|
|
185
|
+
|
|
186
|
+
**Phần 4b — Non-Functional Requirements:**
|
|
187
|
+
> Feature có yêu cầu non-functional riêng không? (performance, accessibility, security, browser, i18n). Mỗi cái **tham chiếu `NFR-*` của PRD nếu có** (refine bar chung) hoặc đặc thù-feature. G/W/T, Then đo được. Không có → để section trống (required-emptyable, giữ heading).
|
|
188
|
+
|
|
189
|
+
**Phần 4c — Data & Migration:**
|
|
190
|
+
> Feature có đụng migration / backfill data cũ không? Nếu có: G/W/T, Then đo được (đếm bản ghi / so khớp). Không có → giữ heading, để section trống (required-emptyable).
|
|
161
191
|
|
|
162
192
|
**Phần 5 — Verification Rules:**
|
|
163
193
|
> Với mỗi input field trong các stories, mình sẽ suggest 2-4 phương án validation để BA chọn (xem "Verification Rules — quy ước sinh" bên dưới). BA là người quyết định.
|
|
@@ -221,7 +251,7 @@ BA quyết **định nghĩa entity** (WHAT); `Owner` để `/spec-sad` cascade b
|
|
|
221
251
|
|
|
222
252
|
Dùng `.claude/templates/main/feature/frd-template.md` làm skeleton, điền nội dung từ interview.
|
|
223
253
|
|
|
224
|
-
**ID assignment** (luôn là create — frd mới): US `US-F{NNN}-001+`, Story AC `AC-F{NNN}-001+`, Feature AC `FAC-F{NNN}-001+` (counter độc lập với Story AC), VR `VR-F{NNN}-001+`. `NNN` = số của F-XXX. Flow đánh số từ 1.
|
|
254
|
+
**ID assignment** (luôn là create — frd mới): US `US-F{NNN}-001+`, Story AC `AC-F{NNN}-001+`, Feature AC `FAC-F{NNN}-001+` (counter độc lập với Story AC), NFR `NFR-F{NNN}-001+` (counter độc lập), DM `DM-F{NNN}-001+` (counter độc lập, chỉ khi có Data & Migration), VR `VR-F{NNN}-001+`. `NNN` = số của F-XXX. Flow đánh số từ 1.
|
|
225
255
|
|
|
226
256
|
**Frontmatter** frd mới: theo template, `status: draft`, `owner: BA`, `feature_id: F-XXX`, `template_version` copy từ `frd-template.md` (xem `conventions.md` §7 — chỉ set lúc CREATE; thay đổi sau qua `/spec-new` không đụng version).
|
|
227
257
|
|
|
@@ -306,7 +336,7 @@ Append **một** Change History entry vào `domain.md`, operation = `manual` (au
|
|
|
306
336
|
|
|
307
337
|
(Nếu domain.md đang là skeleton create lần đầu thì entry vẫn `manual`/`update` — file đã được `/spec-prd` scaffold với operation `create` từ trước.) Atomic với 7a: domain cascade fail → rollback cả frd. `Owner` của entity do `/spec-sad`/`/spec-new` cascade bổ sung sau (HOW phase) qua `[MODIFY Owner]`.
|
|
308
338
|
|
|
309
|
-
**7c. KHÔNG đụng gì khác.** Không đổi status của các feature *đã có* (frd tồn tại ≠ integration bắt đầu; marker "→ frd.md tồn tại" derive từ file existence). Không thêm component vào Index (chỉ candidate). Không carve component / không tự quyết `Owner` của shared entity. Không tạo crd/cdd/fdd/
|
|
339
|
+
**7c. KHÔNG đụng gì khác.** Không đổi status của các feature *đã có* (frd tồn tại ≠ integration bắt đầu; marker "→ frd.md tồn tại" derive từ file existence). Không thêm component vào Index (chỉ candidate). Không carve component / không tự quyết `Owner` của shared entity. Không tạo crd/cdd/fdd/test-design. Không đụng sad.
|
|
310
340
|
|
|
311
341
|
**7d. Thông báo kết quả:**
|
|
312
342
|
|
|
@@ -324,7 +354,7 @@ Append **một** Change History entry vào `domain.md`, operation = `manual` (au
|
|
|
324
354
|
- VR-F{NNN}-{seq} — {field}
|
|
325
355
|
|
|
326
356
|
Bước tiếp theo:
|
|
327
|
-
- /spec-
|
|
357
|
+
- /spec-test-design F-XXX → QC bootstrap test design từ frd này
|
|
328
358
|
- /spec-new F-XXX → DEV bắt đầu integration (frd sẽ được consume, crd/cdd sinh qua cascade)
|
|
329
359
|
{nếu có candidate hoặc entity Owner TBD} - /spec-sad → architect chốt boundary component + gán Owner cho shared entity
|
|
330
360
|
```
|
|
@@ -355,6 +385,7 @@ Bước tiếp theo:
|
|
|
355
385
|
|
|
356
386
|
## Verification
|
|
357
387
|
|
|
388
|
+
- [ ] **Pre-flight Git**: đã thông báo plan cho user; xác định đúng nhánh chính (hỏi nếu mơ hồ); working tree sạch; đã `checkout {main}` + `pull`; tạo nhánh làm việc mới off `{main}` trước khi author
|
|
358
389
|
- [ ] `prd.md` tồn tại
|
|
359
390
|
- [ ] **Single-feature gate**: nguồn liên quan đúng 1 feature; nếu >1 đã DỪNG và mô tả rõ lý do tách + redirect `/spec-prd`
|
|
360
391
|
- [ ] **Create-only gate**: frd.md của feature mục tiêu CHƯA tồn tại; nếu đã có đã redirect `/spec-new`
|
|
@@ -362,12 +393,14 @@ Bước tiếp theo:
|
|
|
362
393
|
- [ ] frd.md có đủ 7 core sections (luôn create mới); `Open Questions` chứa câu hỏi clarify + component candidate còn mở, hoặc đã xóa nếu rỗng
|
|
363
394
|
- [ ] Frontmatter có `template_version` copy từ `frd-template.md`
|
|
364
395
|
- [ ] Mỗi User Story có persona + priority + ít nhất 1 AC Given/When/Then
|
|
365
|
-
- [ ] Feature AC
|
|
396
|
+
- [ ] Feature AC chỉ end-to-end (journey + consistency + integrity), ID `FAC-F{NNN}-{seq}` (counter độc lập với `AC-F{NNN}`), Then đo được; authz/access-control functional → AC/VR, không phải NFR
|
|
397
|
+
- [ ] Non-Functional Requirements: heading luôn có (required-emptyable); nếu có item → ID `NFR-F{NNN}-{seq}`, tham chiếu `NFR-*` PRD nếu có thể, Then đo được
|
|
398
|
+
- [ ] Data & Migration (required-emptyable): ID `DM-F{NNN}-{seq}`, Then đo được; không đụng migration → giữ heading, để trống
|
|
366
399
|
- [ ] Verification Rules đã confirm với BA (không tự assert); không chứa regex/code/error message; semantic type
|
|
367
400
|
- [ ] ID bắt đầu từ 001 (create mới)
|
|
368
401
|
- [ ] Components Used reference C-XXX có sẵn; component mới ghi candidate + surface cho /spec-sad
|
|
369
402
|
- [ ] Nếu register feature mới: prd Features có row [NEW] + Change History entry; status feature đã có KHÔNG đổi
|
|
370
403
|
- [ ] Domain cascade (nếu có vocabulary mới, đã BA confirm): Glossary term ghi đủ định nghĩa; Shared Entity ghi đủ definition + attributes với `Owner: TBD` (KHÔNG tự gán C-XXX); domain.md có Change History entry operation = `manual`
|
|
371
|
-
- [ ] KHÔNG tạo crd/cdd/fdd/
|
|
404
|
+
- [ ] KHÔNG tạo crd/cdd/fdd/test-design; KHÔNG carve component / gán Owner entity; KHÔNG đụng sad
|
|
372
405
|
- [ ] Change History entry (frd) operation = `manual` (luôn `create`)
|
|
373
406
|
- [ ] User đã confirm trước khi ghi file
|
package/skills/spec-new/SKILL.md
CHANGED
|
@@ -27,6 +27,31 @@ Tạo `spec.md` cho một integration mới trong `.specs/integrations/{NNN}-{sl
|
|
|
27
27
|
|
|
28
28
|
## Process
|
|
29
29
|
|
|
30
|
+
### Bước 0 · Pre-flight: chuẩn bị nhánh Git (chạy TRƯỚC Bước 1)
|
|
31
|
+
|
|
32
|
+
Mục tiêu: không bao giờ tạo spec/cascade ngay trên nhánh hiện tại của user (có thể là một nhánh đang làm dở) — luôn bắt đầu từ **nhánh chính mới nhất** rồi tách một **nhánh làm việc riêng** cho integration.
|
|
33
|
+
|
|
34
|
+
**Trước tiên, thông báo cho user toàn bộ việc Git skill sẽ làm** (để user biết trước, đúng tinh thần "agent làm các việc này"):
|
|
35
|
+
|
|
36
|
+
> Trước khi tạo spec, mình sẽ:
|
|
37
|
+
> 1. Pull code mới nhất từ nhánh chính (`{main}`).
|
|
38
|
+
> 2. Tạo & checkout một nhánh mới tách từ `{main}` để làm integration này.
|
|
39
|
+
>
|
|
40
|
+
> (Bạn đang ở nhánh `{current}`.)
|
|
41
|
+
|
|
42
|
+
**1. Xác định nhánh chính (`{main}`).**
|
|
43
|
+
- Không phải git repo → bỏ qua toàn bộ pre-flight, note cho user rồi tiếp Bước 1.
|
|
44
|
+
- Có nhánh `develop` → mặc định `{main}` = `develop`. Không có `develop` nhưng có `main`/`master` → dùng nó.
|
|
45
|
+
- Mơ hồ (tồn tại cả `develop` lẫn `main`, hoặc remote default khác) → **hỏi user** nhánh nào là nhánh chính. KHÔNG đoán.
|
|
46
|
+
|
|
47
|
+
**2. Kiểm tra working tree sạch.** `git status` còn thay đổi chưa commit → **DỪNG**, báo user commit/stash trước. KHÔNG tự ý stash/discard.
|
|
48
|
+
|
|
49
|
+
**3. Checkout + pull nhánh chính:** `git checkout {main}` rồi `git pull`. Pull fail (conflict, không có upstream…) → **DỪNG**, surface lỗi cụ thể, để user xử lý.
|
|
50
|
+
|
|
51
|
+
**4. Tạo nhánh làm việc mới off `{main}`.** Cần `{NNN}-{slug}` để đặt tên → thực hiện **ngay sau khi xác định slug + số thứ tự ở Bước 4** (xem nhắc ở đó): đề xuất `git checkout -b feat/{NNN}-{slug}`, cho user sửa tên rồi tạo. Mọi việc ghi spec + auto-cascade từ Bước 5/7 diễn ra trên nhánh này.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
30
55
|
### Bước 1: Xác định input
|
|
31
56
|
|
|
32
57
|
**Nếu có ARGUMENT** → đây là raw requirement, chuyển sang Bước 2.
|
|
@@ -66,11 +91,13 @@ Sections hiện có:
|
|
|
66
91
|
|
|
67
92
|
[1] Overview
|
|
68
93
|
[2] User Flows
|
|
69
|
-
[3] Feature
|
|
70
|
-
[4]
|
|
71
|
-
[5]
|
|
72
|
-
[6]
|
|
73
|
-
[7]
|
|
94
|
+
[3] Feature Acceptance Criteria (end-to-end)
|
|
95
|
+
[4] Non-Functional Requirements
|
|
96
|
+
[5] Data & Migration (required-emptyable)
|
|
97
|
+
[6] User Stories
|
|
98
|
+
[7] Verification Rules
|
|
99
|
+
[8] Scope (In Scope / Out of Scope)
|
|
100
|
+
[9] Dependencies (Feature Dependencies + Components Used)
|
|
74
101
|
[A] All — viết lại toàn bộ từ đầu
|
|
75
102
|
[S] Lên spec từ frd.md hiện tại — frd.md đã đầy đủ, không cần chỉnh
|
|
76
103
|
|
|
@@ -156,6 +183,8 @@ Xác định số thứ tự (`NNN`):
|
|
|
156
183
|
|
|
157
184
|
Output path: `.specs/integrations/{NNN}-{slug}/spec.md`
|
|
158
185
|
|
|
186
|
+
**Tạo nhánh làm việc** (Pre-flight bước 4) — giờ đã có `{NNN}-{slug}`: `git checkout -b feat/{NNN}-{slug}` off `{main}` (đề xuất tên, cho user sửa). Bỏ qua nếu không phải git repo (pre-flight đã note).
|
|
187
|
+
|
|
159
188
|
---
|
|
160
189
|
|
|
161
190
|
### Bước 5: Write — sinh draft
|
|
@@ -214,7 +243,7 @@ Template gốc là single source of truth cho format. KHÔNG duplicate skeleton
|
|
|
214
243
|
|
|
215
244
|
Liệt kê **tất cả** features liên quan đến integration và đánh giá từng cái. Không được bỏ qua feature nào — kể cả feature `Done` vẫn phải đánh giá xem spec mới có làm thay đổi scope không.
|
|
216
245
|
|
|
217
|
-
- Operation=create khi frd.md chưa tồn tại → nội dung đầy đủ
|
|
246
|
+
- Operation=create khi frd.md chưa tồn tại → nội dung đầy đủ các section: Overview, User Flows, Feature Acceptance Criteria (end-to-end), Non-Functional Requirements (required-emptyable), Data & Migration (required-emptyable), User Stories, Verification Rules, Scope, Dependencies.
|
|
218
247
|
- Operation=update khi frd.md đã tồn tại → hỏi user chọn section cần update:
|
|
219
248
|
|
|
220
249
|
```
|
|
@@ -223,11 +252,13 @@ Sections hiện có:
|
|
|
223
252
|
|
|
224
253
|
[1] Overview
|
|
225
254
|
[2] User Flows
|
|
226
|
-
[3] Feature
|
|
227
|
-
[4]
|
|
228
|
-
[5]
|
|
229
|
-
[6]
|
|
230
|
-
[7]
|
|
255
|
+
[3] Feature Acceptance Criteria (end-to-end)
|
|
256
|
+
[4] Non-Functional Requirements
|
|
257
|
+
[5] Data & Migration (required-emptyable)
|
|
258
|
+
[6] User Stories
|
|
259
|
+
[7] Verification Rules
|
|
260
|
+
[8] Scope (In Scope / Out of Scope)
|
|
261
|
+
[9] Dependencies (Feature Dependencies + Components Used)
|
|
231
262
|
[A] All — viết lại toàn bộ từ đầu
|
|
232
263
|
|
|
233
264
|
Chọn section cần cập nhật (có thể chọn nhiều, ví dụ: 2 3):
|
|
@@ -429,6 +460,7 @@ Bước tiếp theo:
|
|
|
429
460
|
|
|
430
461
|
Trước khi user confirm (Bước 6), kiểm tra:
|
|
431
462
|
|
|
463
|
+
- [ ] **Pre-flight Git**: đã thông báo plan cho user; xác định đúng nhánh chính (hỏi nếu mơ hồ); working tree sạch; đã `checkout {main}` + `pull`; tạo nhánh làm việc mới off `{main}` trước khi cascade
|
|
432
464
|
- [ ] Problem Statement từ góc nhìn user/business, không mention tech
|
|
433
465
|
- [ ] Mỗi Acceptance Criterion dùng cú pháp GIVEN / WHEN / THEN, có thể test được
|
|
434
466
|
- [ ] Out of Scope có ít nhất 1 item
|