spec-lite 1.0.1 → 1.1.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 +21 -22
- package/package.json +1 -1
- package/skills/build/SKILL.md +27 -2
- package/skills/plan/SKILL.md +17 -88
- package/skills/planning-and-task-breakdown/SKILL.md +12 -8
- package/skills/spec-new/SKILL.md +64 -32
- package/skills/spec-prd/SKILL.md +33 -14
- package/skills/spec-sad/SKILL.md +3 -3
- package/skills/spec-tech/SKILL.md +64 -25
- package/templates/integrations/plan-template.md +62 -12
- package/templates/integrations/spec-template.md +42 -14
- package/templates/integrations/tech-template.md +10 -1
- package/templates/integrations/todo-template.md +1 -0
- package/templates/main/component/cdd-template.md +63 -0
- package/templates/main/component/crd-template.md +88 -0
- package/templates/main/domain-template.md +22 -21
- package/templates/main/feature/fdd-template.md +27 -30
- package/templates/main/feature/frd-template.md +32 -17
- package/templates/main/prd-template.md +8 -0
- package/skills/spec-domain/SKILL.md +0 -176
|
@@ -5,7 +5,7 @@ status: draft
|
|
|
5
5
|
owner: "{BA}"
|
|
6
6
|
feature_id: "{Feature ID từ PRD Feature Index}"
|
|
7
7
|
referenced_by:
|
|
8
|
-
- conventions.md > 3. Main Artifacts > 3.
|
|
8
|
+
- conventions.md > 3. Main Artifacts > 3.3 Feature level > frd.md > Cấu trúc
|
|
9
9
|
- skills/spec-new/SKILL.md > Process > Bước 5: Write — sinh draft > Cascade Proposals > frd.md
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -15,44 +15,59 @@ referenced_by:
|
|
|
15
15
|
|
|
16
16
|
{Mô tả feature này giải quyết vấn đề gì cho user nào, trong 2-3 câu.}
|
|
17
17
|
|
|
18
|
+
## Components Consumed
|
|
19
|
+
|
|
20
|
+
Các component mà feature này dùng — tham chiếu đến `specs/main/component/{C-XXX}-...`.
|
|
21
|
+
|
|
22
|
+
| Component | Vai trò trong feature |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `{C-XXX}-{component-name}` | {component này phục vụ cái gì cho feature này} |
|
|
25
|
+
|
|
18
26
|
## Feature-level Acceptance Criteria
|
|
19
27
|
|
|
20
28
|
Criteria áp dụng cho toàn bộ feature — không gắn với story cụ thể (ví dụ: performance, security, accessibility).
|
|
29
|
+
AC ID format: `AC-F{NNN}-{seq}` — đánh số tăng dần toàn feature (không reset giữa sections).
|
|
21
30
|
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
- `AC-{F_ID}-001`
|
|
32
|
+
- **Given** {precondition}
|
|
33
|
+
- **When** {action}
|
|
34
|
+
- **Then** {expected outcome}
|
|
25
35
|
|
|
26
36
|
## User Stories
|
|
27
37
|
|
|
28
|
-
|
|
38
|
+
US ID format: `US-F{NNN}-{seq}` — đánh số tăng dần toàn feature.
|
|
39
|
+
|
|
40
|
+
### US-{F_ID}-001: {Story title}
|
|
29
41
|
|
|
30
|
-
|
|
42
|
+
**{Persona}** muốn **{hành động}** để **{mục tiêu}**.
|
|
31
43
|
|
|
32
44
|
**Priority:** Must / Should / Could
|
|
33
45
|
|
|
34
46
|
**Acceptance Criteria:**
|
|
35
47
|
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
48
|
+
- `AC-{F_ID}-{seq}`
|
|
49
|
+
- **Given** {precondition}
|
|
50
|
+
- **When** {action}
|
|
51
|
+
- **Then** {expected outcome}
|
|
52
|
+
- `AC-{F_ID}-{seq}`
|
|
53
|
+
- **Given** {precondition}
|
|
54
|
+
- **When** {action}
|
|
55
|
+
- **Then** {expected outcome}
|
|
42
56
|
|
|
43
57
|
---
|
|
44
58
|
|
|
45
|
-
### US-002: {Story title}
|
|
59
|
+
### US-{F_ID}-002: {Story title}
|
|
46
60
|
|
|
47
|
-
|
|
61
|
+
**{Persona}** muốn **{hành động}** để **{mục tiêu}**.
|
|
48
62
|
|
|
49
63
|
**Priority:** Must / Should / Could
|
|
50
64
|
|
|
51
65
|
**Acceptance Criteria:**
|
|
52
66
|
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
67
|
+
- `AC-{F_ID}-{seq}`
|
|
68
|
+
- **Given** {precondition}
|
|
69
|
+
- **When** {action}
|
|
70
|
+
- **Then** {expected outcome}
|
|
56
71
|
|
|
57
72
|
---
|
|
58
73
|
|
|
@@ -39,6 +39,14 @@ Tại sao cần giải quyết bây giờ.
|
|
|
39
39
|
| --- | --- | --- | --- | --- |
|
|
40
40
|
| F-001 | {tên feature} | {mô tả ngắn — feature làm gì, cho ai} | High/Medium/Low | TODO/DONE |
|
|
41
41
|
|
|
42
|
+
## Components
|
|
43
|
+
|
|
44
|
+
Các thành phần kỹ thuật của hệ thống — chi tiết về vai trò và thiết kế nằm trong `specs/main/component/{C-XXX}-{component-name}/`.
|
|
45
|
+
|
|
46
|
+
| ID | Component | Mô tả ngắn | Status |
|
|
47
|
+
| --- | --- | --- | --- |
|
|
48
|
+
| C-001 | {tên component} | {1 câu — component này chịu trách nhiệm gì} | TODO/DONE |
|
|
49
|
+
|
|
42
50
|
## Non-Functional Requirements
|
|
43
51
|
|
|
44
52
|
| ID | Category | Requirement | Target | Priority |
|
|
@@ -1,176 +0,0 @@
|
|
|
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
|