spec-lite 1.0.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/cli.js +26 -0
- package/package.json +20 -0
- package/skills/planning-and-task-breakdown/SKILL.md +249 -0
- package/skills/scaffold/SKILL.md +294 -0
- package/skills/spec-domain/SKILL.md +176 -0
- package/skills/spec-new/SKILL.md +263 -0
- package/skills/spec-plan/SKILL.md +193 -0
- package/skills/spec-prd/SKILL.md +176 -0
- package/skills/spec-sad/SKILL.md +202 -0
- package/skills/spec-tech/SKILL.md +195 -0
- package/skills/test-driven-development/SKILL.md +379 -0
- package/templates/integrations/plan-template.md +42 -0
- package/templates/integrations/spec-template.md +68 -0
- package/templates/integrations/tech-template.md +59 -0
- package/templates/integrations/todo-template.md +22 -0
- package/templates/main/domain-template.md +60 -0
- package/templates/main/feature/fdd-template.md +55 -0
- package/templates/main/feature/frd-template.md +73 -0
- package/templates/main/prd-template.md +53 -0
- package/templates/main/sad-template.md +68 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-domain
|
|
3
|
+
description: Điền hoặc cập nhật domain.md — Domain Knowledge (entities, business rules, terminology). Dùng sau khi prd.md đã có nội dung.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# spec-domain
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Tạo nội dung cho `specs/main/domain.md` thông qua interview có cấu trúc. Domain là ngôn ngữ chung của hệ thống — nó định nghĩa các khái niệm business, entities, business rules, và events mà toàn bộ team (cả business lẫn tech) dùng chung.
|
|
11
|
+
|
|
12
|
+
Domain không chứa: implementation details, DB schema, framework-specific code, hay bất cứ thứ gì thuộc về `sad.md`, `fdd.md`.
|
|
13
|
+
|
|
14
|
+
## When to Use
|
|
15
|
+
|
|
16
|
+
- `domain.md` chưa có hoặc còn rỗng, và `prd.md` đã có nội dung
|
|
17
|
+
- Cần bổ sung entity hoặc business rule mới phát sinh từ một integration
|
|
18
|
+
- Cascade proposals từ `spec.md` hoặc `tech.md` yêu cầu cập nhật domain
|
|
19
|
+
|
|
20
|
+
## When NOT to Use
|
|
21
|
+
|
|
22
|
+
- `prd.md` chưa có nội dung → chạy `/spec-prd` trước
|
|
23
|
+
- Đang muốn thiết kế kiến trúc kỹ thuật → dùng `/spec-sad`
|
|
24
|
+
- Đang muốn định nghĩa feature-level requirements → dùng `/spec-frd`
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Process
|
|
29
|
+
|
|
30
|
+
### Bước 1: Kiểm tra preconditions
|
|
31
|
+
|
|
32
|
+
**Đọc `specs/main/prd.md`:**
|
|
33
|
+
|
|
34
|
+
- **Chưa tồn tại hoặc là template** → dừng ngay:
|
|
35
|
+
> `prd.md` chưa có nội dung. Hãy chạy `/spec-prd` trước để có PRD trước khi định nghĩa domain.
|
|
36
|
+
|
|
37
|
+
- **Đã có nội dung** → đọc để lấy context: scope, problem statement, target users. Dùng làm nền để hỏi về entities.
|
|
38
|
+
|
|
39
|
+
**Đọc `specs/main/domain.md`:**
|
|
40
|
+
|
|
41
|
+
- **Chưa tồn tại** → tạo thư mục `specs/main/` nếu chưa có, tiến hành Bước 2 (full interview).
|
|
42
|
+
|
|
43
|
+
- **Đã có nội dung thực** → quét toàn bộ sections, hiển thị trạng thái từng section, rồi hỏi user muốn làm gì.
|
|
44
|
+
|
|
45
|
+
**Các sections cần quét** (theo thứ tự):
|
|
46
|
+
|
|
47
|
+
| # | Section | Có nội dung thực? |
|
|
48
|
+
| --- | --- | --- |
|
|
49
|
+
| 1 | Terminology | ✓ đã có / ✗ trống/thiếu |
|
|
50
|
+
| 2 | Entities | ✓ đã có / ✗ trống/thiếu |
|
|
51
|
+
| 3 | Business Rules | ✓ đã có / ✗ trống/thiếu |
|
|
52
|
+
| 4 | Domain Events | ✓ đã có / ✗ trống/thiếu |
|
|
53
|
+
|
|
54
|
+
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.
|
|
55
|
+
|
|
56
|
+
Sau khi quét, liệt kê tất cả sections **theo đúng thứ tự xuất hiện trong file**, đánh số liên tục:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
domain.md hiện tại:
|
|
60
|
+
[1] Terminology ✓ đã có
|
|
61
|
+
[2] Entities ✓ đã có
|
|
62
|
+
[3] Business Rules ✗ chưa có — cần bổ sung
|
|
63
|
+
[4] Risks ⚠ không có trong template
|
|
64
|
+
[5] Domain Events ✓ đã có
|
|
65
|
+
[A] Interview tất cả sections
|
|
66
|
+
|
|
67
|
+
Chọn số hoặc A:
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
- User chọn số section thuộc template → interview section đó rồi merge vào file.
|
|
71
|
+
- User chọn số section thừa (⚠) → xoá section đó khỏi file ngay, không hỏi thêm.
|
|
72
|
+
- User chọn A → interview tuần tự tất cả sections thuộc template (sections thừa không bị đụng tới).
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### Bước 2: Gather — interview có cấu trúc
|
|
77
|
+
|
|
78
|
+
Trước khi hỏi, tóm tắt ngắn context đọc được từ `prd.md` (nếu có) và surface assumptions:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
TỪ PRD TÔI HIỂU:
|
|
82
|
+
- Hệ thống giải quyết: {problem statement ngắn gọn}
|
|
83
|
+
- Các khái niệm tôi thấy xuất hiện: {list terms từ prd}
|
|
84
|
+
|
|
85
|
+
ASSUMPTIONS TÔI ĐANG ĐẶT RA:
|
|
86
|
+
1. {assumption 1}
|
|
87
|
+
2. {assumption 2}
|
|
88
|
+
→ Sửa lại nếu sai trước khi tiếp tục.
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Sau đó hỏi tuần tự từng phần — không hỏi tất cả cùng lúc:
|
|
92
|
+
|
|
93
|
+
**Phần 1 — Terminology:**
|
|
94
|
+
> Có thuật ngữ nghiệp vụ nào đặc thù cần định nghĩa rõ không? (Ví dụ: "đơn hàng" trong hệ thống này nghĩa là gì chính xác?)
|
|
95
|
+
> Liệt kê những term hay bị dùng sai hoặc có nhiều cách hiểu.
|
|
96
|
+
|
|
97
|
+
**Phần 2 — Entities:**
|
|
98
|
+
> Hệ thống làm việc với những "đối tượng" nghiệp vụ nào? (Ví dụ: User, Order, Product...)
|
|
99
|
+
> Với mỗi entity: nó đại diện cho cái gì trong business? Attributes nào quan trọng? Có lifecycle (state machine) không?
|
|
100
|
+
|
|
101
|
+
Với mỗi entity được đề cập, hỏi tiếp:
|
|
102
|
+
> Entity này có trạng thái (state) thay đổi theo thời gian không? Nếu có, các trạng thái đó là gì và khi nào chuyển đổi?
|
|
103
|
+
|
|
104
|
+
**Phần 3 — Business Rules:**
|
|
105
|
+
> Có quy tắc nghiệp vụ nào bất biến không? (Ví dụ: "Không thể hủy đơn hàng đã giao", "User chưa verify không được thanh toán")
|
|
106
|
+
> Ghi theo format: rule — khi nào apply — ngoại lệ nếu có.
|
|
107
|
+
|
|
108
|
+
**Phần 4 — Domain Events:** *(hỏi nếu hệ thống có event-driven behavior)*
|
|
109
|
+
> Có sự kiện nghiệp vụ nào quan trọng cần track không? (Ví dụ: OrderPlaced, PaymentFailed...)
|
|
110
|
+
> Khi nào xảy ra? Data gì đi kèm?
|
|
111
|
+
|
|
112
|
+
Nếu câu trả lời vague → hỏi lại. Ví dụ:
|
|
113
|
+
- "có nhiều loại user" → "liệt kê cụ thể từng loại và điểm khác nhau giữa chúng là gì?"
|
|
114
|
+
- "đơn hàng có nhiều trạng thái" → "liệt kê hết các trạng thái và vẽ luồng chuyển đổi"
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### Bước 3: Write — sinh draft
|
|
119
|
+
|
|
120
|
+
Dùng `.claude/templates/main/domain-template.md` làm skeleton, điền nội dung từ interview vào từng section.
|
|
121
|
+
|
|
122
|
+
Hiển thị draft cho user xem — **chưa ghi file**.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### Bước 4: Review — xác nhận với user
|
|
127
|
+
|
|
128
|
+
Trình bày draft và hỏi:
|
|
129
|
+
> Draft Domain trên đã đúng chưa? Có entity nào thiếu, business rule nào sai không?
|
|
130
|
+
|
|
131
|
+
Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → cập nhật draft → hỏi lại.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
### Bước 5: Save
|
|
136
|
+
|
|
137
|
+
Ghi nội dung đã được confirm vào `specs/main/domain.md`.
|
|
138
|
+
|
|
139
|
+
Thông báo kết quả:
|
|
140
|
+
```
|
|
141
|
+
✓ specs/main/domain.md đã được cập nhật (status: draft)
|
|
142
|
+
|
|
143
|
+
Bước tiếp theo:
|
|
144
|
+
- /spec-sad → thiết kế kiến trúc kỹ thuật (dùng prd.md + domain.md làm context)
|
|
145
|
+
- (sau sad) /spec-frd {feature-name} → định nghĩa requirements của từng feature
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Common Rationalizations
|
|
151
|
+
|
|
152
|
+
| Rationalization | Reality |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| "Entities thì ai cũng biết rồi, không cần ghi" | Entity chưa được viết ra là entity chưa được đồng thuận. Dev và BA có thể hiểu khác nhau. |
|
|
155
|
+
| "Business rules thì ghi trong code thôi" | Business rules trong code không ai đọc được ngoài dev. Domain là ngôn ngữ chung cho cả team. |
|
|
156
|
+
| "State machine phức tạp, thêm sau" | State machine ảnh hưởng trực tiếp đến data model và API design. Thiếu nó là thiếu constraint quan trọng. |
|
|
157
|
+
| "Terminology thì khỏi cần, ai cũng hiểu" | "Order" trong hệ thống bán lẻ khác "Order" trong hệ thống sản xuất. Định nghĩa rõ tránh miscommunication. |
|
|
158
|
+
|
|
159
|
+
## Red Flags
|
|
160
|
+
|
|
161
|
+
- Entity chỉ có tên, không có attributes hay mô tả
|
|
162
|
+
- Business rules ghi dưới dạng technical ("validate bằng regex") thay vì business ("số điện thoại phải là số Việt Nam")
|
|
163
|
+
- Terminology section trống trong khi domain có nhiều thuật ngữ đặc thù
|
|
164
|
+
- Attributes dùng DB type (`VARCHAR`, `INT`) thay vì business type (`text`, `number`)
|
|
165
|
+
|
|
166
|
+
## Verification
|
|
167
|
+
|
|
168
|
+
Trước khi kết thúc, kiểm tra:
|
|
169
|
+
|
|
170
|
+
- [ ] Frontmatter đầy đủ và đúng schema
|
|
171
|
+
- [ ] Mỗi term trong Terminology có definition rõ ràng, không mơ hồ
|
|
172
|
+
- [ ] Mỗi entity có mô tả business context (không chỉ là tên)
|
|
173
|
+
- [ ] Attributes dùng business type, không phải DB type
|
|
174
|
+
- [ ] State machine chỉ có ở entity có lifecycle thực sự
|
|
175
|
+
- [ ] Business rules có ID (`DOM-R01`...), condition, và exception rõ ràng
|
|
176
|
+
- [ ] User đã confirm trước khi file được ghi
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-new
|
|
3
|
+
description: Tạo spec.md cho một integration mới thông qua interview có cấu trúc. Dùng khi bắt đầu implement một feature hoặc requirement mới. Nhận raw requirement từ argument hoặc chọn feature TODO từ prd.md.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# spec-new
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Tạo `spec.md` cho một integration mới trong `specs/integrations/{NNN}-{slug}/`.
|
|
11
|
+
|
|
12
|
+
`spec.md` là functional spec — định nghĩa **what to build**: vấn đề, requirements, acceptance criteria, out of scope. Không chứa technical design.
|
|
13
|
+
|
|
14
|
+
## When to Use
|
|
15
|
+
|
|
16
|
+
- Bắt đầu implement một feature mới
|
|
17
|
+
- Có raw requirement chưa được spec hóa
|
|
18
|
+
- Muốn chọn một feature TODO từ prd.md để bắt đầu
|
|
19
|
+
|
|
20
|
+
## When NOT to Use
|
|
21
|
+
|
|
22
|
+
- `prd.md` hoặc `domain.md` chưa có → chạy `/spec-prd`, `/spec-domain` trước
|
|
23
|
+
- Muốn thiết kế technical design → dùng `/spec-tech` (cần `spec.md` đã approve trước)
|
|
24
|
+
- Chỉ muốn cập nhật spec đã có → edit file trực tiếp
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Process
|
|
29
|
+
|
|
30
|
+
### Bước 1: Xác định input
|
|
31
|
+
|
|
32
|
+
**Nếu có ARGUMENT** → đây là raw requirement, chuyển sang Bước 2.
|
|
33
|
+
|
|
34
|
+
**Nếu không có ARGUMENT:**
|
|
35
|
+
|
|
36
|
+
Đọc `specs/main/prd.md`. Nếu file không tồn tại hoặc là template rỗng → dừng:
|
|
37
|
+
> `prd.md` chưa có nội dung. Hãy chạy `/spec-prd` trước.
|
|
38
|
+
|
|
39
|
+
Đọc toàn bộ bảng Features. Hiển thị **tất cả** features kèm trạng thái — không lọc — để thấy rõ feature nào có FRD cần update:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Features trong PRD:
|
|
43
|
+
|
|
44
|
+
[1] F-001 — Authentication (High) [TODO]
|
|
45
|
+
[2] F-002 — User Profile (Medium) [In Progress] → frd.md tồn tại
|
|
46
|
+
[3] F-003 — App Browsing & Opt-in (High) [TODO]
|
|
47
|
+
[4] F-004 — Credit System (High) [Done] → frd.md tồn tại
|
|
48
|
+
[5] F-006 — Admin Panel (Medium) [TODO]
|
|
49
|
+
|
|
50
|
+
Chọn số feature để bắt đầu spec:
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Ghi chú `→ frd.md tồn tại` nếu file `specs/main/features/{feature-id}-*/frd.md` đã có.
|
|
54
|
+
|
|
55
|
+
Nếu tất cả features đều Done → thông báo:
|
|
56
|
+
> Tất cả features trong prd.md đã được implement. Nếu có yêu cầu mới, hãy truyền nó trực tiếp: `/spec-new <yêu cầu>`.
|
|
57
|
+
|
|
58
|
+
Sau khi user chọn feature:
|
|
59
|
+
|
|
60
|
+
- Nếu feature **chưa có frd.md** → lấy feature đó làm requirement, chuyển sang Bước 2.
|
|
61
|
+
- Nếu feature **đã có frd.md** → đọc file frd.md, liệt kê các sections và hỏi ngay:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
frd.md — F-001 Authentication đã tồn tại.
|
|
65
|
+
Sections hiện có:
|
|
66
|
+
|
|
67
|
+
[1] Overview
|
|
68
|
+
[2] Feature-level Acceptance Criteria
|
|
69
|
+
[3] User Stories
|
|
70
|
+
[4] Scope (In Scope / Out of Scope)
|
|
71
|
+
[5] Dependencies
|
|
72
|
+
[A] All — viết lại toàn bộ từ đầu
|
|
73
|
+
|
|
74
|
+
Chọn section cần cập nhật (có thể chọn nhiều, ví dụ: 2 3):
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Lưu lại lựa chọn section. Nếu chọn `A` → xử lý như tạo mới toàn bộ. Sau đó chuyển sang Bước 2.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### Bước 2: Load context
|
|
82
|
+
|
|
83
|
+
Load các file sau (bất kể input là raw requirement hay từ prd.md):
|
|
84
|
+
|
|
85
|
+
- `specs/main/prd.md` — đọc Problem Statement, Target Users, Scope, và mô tả feature liên quan nếu có
|
|
86
|
+
- `specs/main/domain.md` — đọc Entities và Business Rules
|
|
87
|
+
- Nếu input từ prd.md và có `specs/main/features/{feature-id}/frd.md` → đọc User Stories và Acceptance Criteria
|
|
88
|
+
|
|
89
|
+
Tóm tắt context và surface assumptions:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
TỪ PRD & DOMAIN TÔI HIỂU:
|
|
93
|
+
- Vấn đề đang giải quyết: {problem statement ngắn từ prd}
|
|
94
|
+
- Personas liên quan: {từ prd Target Users}
|
|
95
|
+
- Entities liên quan: {từ domain.md}
|
|
96
|
+
{nếu có feature cụ thể} - Feature: {ID} — {tên} — {mô tả}
|
|
97
|
+
|
|
98
|
+
ASSUMPTIONS TÔI ĐANG ĐẶT RA:
|
|
99
|
+
1. {assumption về scope}
|
|
100
|
+
2. {assumption về persona}
|
|
101
|
+
→ Sửa lại nếu sai trước khi tiếp tục.
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
### Bước 3: Interview
|
|
107
|
+
|
|
108
|
+
Hỏi tuần tự, từng phần — không hỏi tất cả cùng lúc:
|
|
109
|
+
|
|
110
|
+
**Phần 1 — Problem Statement:**
|
|
111
|
+
> Vấn đề cụ thể cần giải quyết trong integration này là gì? Tại sao cần làm ngay bây giờ?
|
|
112
|
+
> (Đây là scope của integration này — không phải toàn bộ feature)
|
|
113
|
+
|
|
114
|
+
**Phần 2 — Requirements:**
|
|
115
|
+
> Requirements cụ thể là gì? Ghi theo dạng user stories: "As a {persona}, I want to {action} so that {value}"
|
|
116
|
+
> Hoặc liệt kê functional requirements nếu không theo user story format.
|
|
117
|
+
|
|
118
|
+
**Phần 3 — Acceptance Criteria:**
|
|
119
|
+
> Điều kiện nào để biết integration này là done? Phân theo 2 loại:
|
|
120
|
+
> - **Feature-level AC** (`AC-F-xxx`): criterion áp dụng cho toàn flow — không gắn với story cụ thể (ví dụ: error format, auth guard, cross-story constraints)
|
|
121
|
+
> - **Story-level AC** (`AC-S-xxx`): criterion gắn với từng user story cụ thể
|
|
122
|
+
> Viết theo cú pháp: GIVEN {precondition} / WHEN {action} / THEN {expected outcome}
|
|
123
|
+
> `AC-F` và `AC-S` đánh số độc lập, tăng dần xuyên suốt toàn spec (không reset qua feature/story).
|
|
124
|
+
|
|
125
|
+
**Phần 4 — Out of Scope:**
|
|
126
|
+
> Có gì liên quan nhưng sẽ KHÔNG làm trong integration này không? Ghi rõ lý do.
|
|
127
|
+
|
|
128
|
+
Nếu câu trả lời vague → hỏi lại để làm rõ. Ví dụ:
|
|
129
|
+
- "user phải login được" → "login bằng gì? email/password, OAuth, hay cả hai? Response là gì?"
|
|
130
|
+
- "hiển thị danh sách" → "hiển thị những field nào? có filter/sort/pagination không?"
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
### Bước 4: Xác định slug và output path
|
|
135
|
+
|
|
136
|
+
Từ title của integration, sinh slug:
|
|
137
|
+
- Lowercase, dùng dấu gạch ngang, không có ký tự đặc biệt
|
|
138
|
+
- Ví dụ: "User Authentication" → `user-authentication`
|
|
139
|
+
- Nếu từ prd.md: dùng `{feature-id}-{feature-slug}`, ví dụ: `f001-authentication`
|
|
140
|
+
|
|
141
|
+
Xác định số thứ tự (`NNN`):
|
|
142
|
+
- Liệt kê các thư mục hiện có trong `specs/integrations/` theo pattern `{NNN}-*`
|
|
143
|
+
- Lấy số lớn nhất hiện có và cộng thêm 1, format 3 chữ số (ví dụ: `001`, `002`, `012`)
|
|
144
|
+
- Nếu chưa có thư mục nào → bắt đầu từ `001`
|
|
145
|
+
|
|
146
|
+
Output path: `specs/integrations/{NNN}-{slug}/spec.md`
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
### Bước 5: Write — sinh draft
|
|
151
|
+
|
|
152
|
+
Tổng hợp và viết draft `spec.md`:
|
|
153
|
+
|
|
154
|
+
**Cấu trúc file**: dùng `.claude/templates/integrations/spec-template.md` làm skeleton, điền nội dung từ interview vào.
|
|
155
|
+
|
|
156
|
+
**Cascade Proposals** — điền theo hướng dẫn sau:
|
|
157
|
+
|
|
158
|
+
### prd.md
|
|
159
|
+
|
|
160
|
+
{Đề xuất cập nhật nếu phát hiện scope/feature mới cần ghi lại, hoặc "Không có thay đổi đề xuất."}
|
|
161
|
+
|
|
162
|
+
### domain.md
|
|
163
|
+
|
|
164
|
+
{Đề xuất cập nhật nếu phát hiện entity hoặc business rule mới, hoặc "Không có thay đổi đề xuất."}
|
|
165
|
+
|
|
166
|
+
### frd.md
|
|
167
|
+
|
|
168
|
+
Liệt kê **tất cả** features từ PRD và đánh giá từng cái:
|
|
169
|
+
|
|
170
|
+
| Feature | Status | frd.md | Đề xuất |
|
|
171
|
+
| --- | --- | --- | --- |
|
|
172
|
+
| F-001 — Authentication | In Progress | tồn tại | **Cập nhật** — bổ sung US-003, AC mới về rate limiting |
|
|
173
|
+
| F-002 — User Profile | TODO | chưa có | **Tạo mới** |
|
|
174
|
+
| F-003 — Credit System | Done | tồn tại | Không liên quan |
|
|
175
|
+
|
|
176
|
+
Với từng feature có đề xuất thay đổi, ghi rõ:
|
|
177
|
+
|
|
178
|
+
**Tạo mới** `specs/main/features/{number}-{feature-slug}/frd.md`
|
|
179
|
+
- Dùng khi integration này là lần đầu tiên implement feature này
|
|
180
|
+
- Thư mục đặt tên theo convention: `{number}-{feature-slug}` (ví dụ: `001-authentication`)
|
|
181
|
+
- Nội dung đề xuất: {tóm tắt User Stories và Acceptance Criteria từ spec.md}
|
|
182
|
+
|
|
183
|
+
**Cập nhật** `specs/main/features/{number}-{feature-slug}/frd.md`
|
|
184
|
+
- Dùng khi frd.md đã tồn tại và integration này bổ sung thêm stories hoặc criteria
|
|
185
|
+
- Đọc file frd.md hiện tại, liệt kê các sections và hỏi user muốn update section nào:
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
frd.md — F-001 Authentication đã tồn tại.
|
|
189
|
+
Sections hiện có:
|
|
190
|
+
|
|
191
|
+
[1] Overview
|
|
192
|
+
[2] Feature-level Acceptance Criteria
|
|
193
|
+
[3] User Stories
|
|
194
|
+
[4] Scope (In Scope / Out of Scope)
|
|
195
|
+
[5] Dependencies
|
|
196
|
+
[A] All — viết lại toàn bộ từ đầu
|
|
197
|
+
|
|
198
|
+
Chọn section cần cập nhật (có thể chọn nhiều, ví dụ: 2 3):
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Sau khi user chọn → chỉ sinh nội dung cho section đó. Nếu chọn `A` → sinh lại toàn bộ frd.md như tạo mới.
|
|
202
|
+
|
|
203
|
+
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.
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Hiển thị draft cho user xem — **chưa ghi file**.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
### Bước 6: Review — xác nhận với user
|
|
211
|
+
|
|
212
|
+
> Draft trên đã đúng chưa?
|
|
213
|
+
> - Acceptance Criteria có đủ và đo được không?
|
|
214
|
+
> - Cascade Proposals (nếu có) — cần approve trước khi tiến hành.
|
|
215
|
+
|
|
216
|
+
Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → cập nhật draft → hỏi lại.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
### Bước 7: Save
|
|
221
|
+
|
|
222
|
+
Tạo thư mục `specs/integrations/{NNN}-{slug}/` nếu chưa có.
|
|
223
|
+
|
|
224
|
+
Ghi nội dung đã confirm vào `specs/integrations/{NNN}-{slug}/spec.md`.
|
|
225
|
+
|
|
226
|
+
Nếu integration này đến từ prd.md, cập nhật `specs/main/prd.md`: đổi Status của feature từ `TODO` → `In Progress` và điền link vào cột FRD.
|
|
227
|
+
|
|
228
|
+
Thông báo kết quả:
|
|
229
|
+
```
|
|
230
|
+
✓ specs/integrations/{NNN}-{slug}/spec.md đã được tạo (status: draft)
|
|
231
|
+
{nếu có} ✓ prd.md — F-XXX status cập nhật: TODO → In Progress
|
|
232
|
+
|
|
233
|
+
Bước tiếp theo:
|
|
234
|
+
- Review và approve spec.md
|
|
235
|
+
- /spec-tech → thiết kế technical design dựa trên spec.md này
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Common Rationalizations
|
|
241
|
+
|
|
242
|
+
| Rationalization | Reality |
|
|
243
|
+
| --- | --- |
|
|
244
|
+
| "Requirement rõ rồi, bỏ qua spec.md" | Acceptance Criteria chưa viết = không biết khi nào là done. Code xong vẫn có thể sai. |
|
|
245
|
+
| "Out of scope thì ai cũng hiểu rồi" | Không ghi = scope creep không kiểm soát được. DEV sẽ tự quyết định implement hay không. |
|
|
246
|
+
| "Cascade Proposals thì sau cập nhật cũng được" | Domain là shared context. Cập nhật trễ = các spec sau dùng context sai. |
|
|
247
|
+
|
|
248
|
+
## Red Flags
|
|
249
|
+
|
|
250
|
+
- Acceptance Criteria dùng từ không đo được: "hoạt động đúng", "hiển thị đẹp", "nhanh"
|
|
251
|
+
- Out of Scope trống — mọi integration đều có thứ liên quan nhưng không làm
|
|
252
|
+
- Open Questions để trống nhưng vẫn còn điểm mơ hồ trong requirements
|
|
253
|
+
- Cascade Proposals không được review trước khi approve
|
|
254
|
+
|
|
255
|
+
## Verification
|
|
256
|
+
|
|
257
|
+
Trước khi ghi file, kiểm tra:
|
|
258
|
+
|
|
259
|
+
- [ ] Problem Statement từ góc nhìn user/business, không mention tech
|
|
260
|
+
- [ ] Mỗi Acceptance Criterion dùng cú pháp GIVEN / WHEN / THEN, có thể test được
|
|
261
|
+
- [ ] Out of Scope có ít nhất 1 item
|
|
262
|
+
- [ ] Cascade Proposals đã được user review
|
|
263
|
+
- [ ] User đã confirm draft trước khi ghi file
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-plan
|
|
3
|
+
description: Tạo plan.md và todo.md cho một integration — phân rã tasks từ spec.md và tech.md. SDD wrapper quanh planning-and-task-breakdown — chỉ làm context loading, delegate toàn bộ breakdown cho planning-and-task-breakdown.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# spec-plan
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
SDD wrapper quanh `planning-and-task-breakdown`. Nhiệm vụ duy nhất của skill này là:
|
|
11
|
+
1. Load và surface đúng context từ SDD artifacts
|
|
12
|
+
2. Handoff sang `planning-and-task-breakdown` để thực hiện breakdown
|
|
13
|
+
|
|
14
|
+
Mọi quyết định về sizing, slicing đều thuộc về `planning-and-task-breakdown`. Output format được định nghĩa trong SKILL này.
|
|
15
|
+
|
|
16
|
+
## When to Use
|
|
17
|
+
|
|
18
|
+
- Có `spec.md` và/hoặc `tech.md` cho integration cần plan
|
|
19
|
+
|
|
20
|
+
## When NOT to Use
|
|
21
|
+
|
|
22
|
+
- Hotfix nhỏ, single-file → implement trực tiếp không cần plan
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Process
|
|
27
|
+
|
|
28
|
+
### Bước 1: Xác định integration
|
|
29
|
+
|
|
30
|
+
Quét `specs/integrations/`. Liệt kê tất cả integrations:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Integrations:
|
|
34
|
+
|
|
35
|
+
[1] f001-authentication — User Authentication spec✓ tech✓ plan—
|
|
36
|
+
[2] f003-app-browsing — App Browsing & Opt-in spec✓ tech—
|
|
37
|
+
[3] f004-credit-system — Credit System spec—
|
|
38
|
+
|
|
39
|
+
Chọn số integration:
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Legend: `✓` = có, `—` = chưa có
|
|
43
|
+
|
|
44
|
+
Nếu có ARGUMENT → chọn luôn, không hiển thị danh sách.
|
|
45
|
+
|
|
46
|
+
Nếu plan.md / todo.md đã tồn tại → hỏi trước khi ghi đè.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### Bước 2: Load và surface context
|
|
51
|
+
|
|
52
|
+
Load:
|
|
53
|
+
|
|
54
|
+
- `specs/integrations/{slug}/spec.md` — Requirements, Acceptance Criteria (ghi chú số AC và IDs)
|
|
55
|
+
- `specs/integrations/{slug}/tech.md` — Technical Design, Interface Changes, Data Model Changes, Implementation Notes
|
|
56
|
+
- `specs/main/domain.md` — Entities và Business Rules liên quan
|
|
57
|
+
|
|
58
|
+
Surface tóm tắt để planning-and-task-breakdown có đủ context:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
CONTEXT CHO PLANNING:
|
|
62
|
+
- Integration: {title}
|
|
63
|
+
- Yêu cầu chính: {tóm tắt từ spec.md — 2-4 bullet}
|
|
64
|
+
- Acceptance Criteria: {số lượng} — Feature-level: {AC-F-001, AC-F-002...} / Story-level: {AC-S-001, AC-S-002...}
|
|
65
|
+
- Thay đổi kỹ thuật: {modules, data model, interfaces từ tech.md}
|
|
66
|
+
- Entities liên quan: {từ domain.md}
|
|
67
|
+
|
|
68
|
+
ASSUMPTIONS:
|
|
69
|
+
1. {assumption về ordering nếu có}
|
|
70
|
+
→ Sửa lại nếu sai trước khi tiếp tục.
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
> **Plan mode từ đây** — chỉ đọc, không viết code.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
### Bước 3: Handoff sang planning-and-task-breakdown
|
|
78
|
+
|
|
79
|
+
Invoke `planning-and-task-breakdown` với context đã load. Skill đó sẽ thực hiện: dependency graph, slicing, write tasks. Output phải theo **Output Format** định nghĩa bên dưới — không dùng format mặc định của `planning-and-task-breakdown`.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Output Format
|
|
84
|
+
|
|
85
|
+
### plan.md
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
---
|
|
89
|
+
id: "{slug}"
|
|
90
|
+
slug: "{slug}"
|
|
91
|
+
title: "{title} — Implementation Plan"
|
|
92
|
+
features: ["{F-XXX}"]
|
|
93
|
+
status: draft
|
|
94
|
+
created: {YYYY-MM-DD}
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Summary
|
|
98
|
+
|
|
99
|
+
[2-3 sentences on what will be implemented]
|
|
100
|
+
|
|
101
|
+
## Dependency Graph
|
|
102
|
+
|
|
103
|
+
[ASCII diagram — bottom = foundations, top = UI. Ví dụ:]
|
|
104
|
+
|
|
105
|
+
UI Components
|
|
106
|
+
│
|
|
107
|
+
API Routes ──── Middleware
|
|
108
|
+
│
|
|
109
|
+
Services
|
|
110
|
+
│
|
|
111
|
+
Prisma Schema
|
|
112
|
+
|
|
113
|
+
## Tasks
|
|
114
|
+
|
|
115
|
+
### Phase 1: [Phase name]
|
|
116
|
+
|
|
117
|
+
#### T001 · [task title — starts with a verb]
|
|
118
|
+
|
|
119
|
+
**Mục tiêu:** [One sentence: what this task delivers]
|
|
120
|
+
|
|
121
|
+
**depends:** — (hoặc T-IDs)
|
|
122
|
+
|
|
123
|
+
**Các bước:**
|
|
124
|
+
1. [Concrete implementation step]
|
|
125
|
+
2. [Concrete implementation step]
|
|
126
|
+
|
|
127
|
+
**Verification:**
|
|
128
|
+
- [ ] [AC-F-001] [specific test case]
|
|
129
|
+
- [ ] [smoke check or observable result]
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### Phase N: Verification
|
|
134
|
+
|
|
135
|
+
#### T00N · Integration tests — [flow name]
|
|
136
|
+
|
|
137
|
+
**Mục tiêu:** [End-to-end flow being tested]
|
|
138
|
+
|
|
139
|
+
**depends:** T001, T002, ...
|
|
140
|
+
|
|
141
|
+
**Các bước:**
|
|
142
|
+
1. [Test setup / seed data]
|
|
143
|
+
2. [Execute happy path]
|
|
144
|
+
3. [Execute error cases]
|
|
145
|
+
|
|
146
|
+
**Verification:**
|
|
147
|
+
- [ ] Happy path: [description]
|
|
148
|
+
- [ ] Error case: [description]
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Definition of Done
|
|
153
|
+
|
|
154
|
+
- [ ] [AC-F-001 / AC-S-001] [AC description — concise, preserve intent]
|
|
155
|
+
- [ ] All unit tests pass
|
|
156
|
+
- [ ] All integration tests pass
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Lưu ý format:**
|
|
160
|
+
- Task ID dùng `·` (middle dot), không dùng `—`
|
|
161
|
+
- `**Các bước:**` là numbered list, đủ cụ thể để agent implement không cần đoán
|
|
162
|
+
- `**Verification:**` là checklist `- [ ]`, gắn AC ID khi có
|
|
163
|
+
- `**depends:**` luôn có, dùng `—` nếu không có dependency
|
|
164
|
+
|
|
165
|
+
### todo.md
|
|
166
|
+
|
|
167
|
+
```markdown
|
|
168
|
+
# [title] — Todo
|
|
169
|
+
|
|
170
|
+
### Phase 1: [Phase name]
|
|
171
|
+
- [ ] T001 · [task title]
|
|
172
|
+
- [ ] T002 · [task title]
|
|
173
|
+
|
|
174
|
+
### Phase N: Verification
|
|
175
|
+
- [ ] T00N · Integration tests — [flow name]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Cascade Proposals
|
|
181
|
+
|
|
182
|
+
Không có Cascade Proposals — plan.md là terminal artifact.
|
|
183
|
+
|
|
184
|
+
Nếu trong quá trình breakdown phát hiện delta cần cập nhật `sad.md`, `domain.md`, hay artifacts khác → **không tự cập nhật**. Thông báo user và đề xuất tạo integration riêng để xử lý.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Verification
|
|
189
|
+
|
|
190
|
+
- [ ] Context đã được surface và user confirm trước khi breakdown
|
|
191
|
+
- [ ] plan.md có section **Dependency Graph**
|
|
192
|
+
- [ ] Mỗi task có đủ: Mục tiêu / depends / Các bước / Verification
|
|
193
|
+
- [ ] Không viết code trong suốt quá trình
|