spec-lite 1.4.1 → 1.4.3
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 +31 -18
- 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 +13 -13
- package/skills/spec-frd/SKILL.md +311 -0
- package/skills/spec-frd-update/SKILL.md +9 -9
- package/skills/spec-new/SKILL.md +11 -11
- package/skills/spec-prd/SKILL.md +115 -16
- package/skills/spec-remove/SKILL.md +27 -27
- package/skills/spec-sad/SKILL.md +6 -6
- 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 +49 -24
- package/templates/main/domain-template.md +1 -1
- package/templates/main/feature/frd-template.md +2 -1
- package/templates/main/prd-template.md +16 -1
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
|
|
package/skills-overview.md
CHANGED
|
@@ -8,12 +8,13 @@ Dùng khi bắt đầu dự án mới chưa có code. Mục tiêu: bootstrap `pr
|
|
|
8
8
|
|
|
9
9
|
| Command | Reads | Writes |
|
|
10
10
|
| --- | --- | --- |
|
|
11
|
-
| `/spec-prd` | — |
|
|
12
|
-
| `/spec-sad` | `prd.md`, `domain.md` |
|
|
11
|
+
| `/spec-prd` | — *(tùy chọn: nguồn baseline path/@file/paste)* | `.specs/main/prd.md`, `.specs/main/domain.md` *(skeleton)* |
|
|
12
|
+
| `/spec-sad` | `prd.md`, `domain.md` | `.specs/main/sad.md` |
|
|
13
|
+
| `/spec-frd [F-XXX]` *(tùy chọn)* | `prd.md`, `domain.md`, `sad.md`, `crd(s)` *(+ nguồn baseline)* | `.specs/main/feature/{F-XXX}-*/frd.md` *(+ register feature row vào `prd.md` nếu feature mới)* |
|
|
13
14
|
|
|
14
15
|
### `/spec-prd`
|
|
15
16
|
|
|
16
|
-
Tạo hoặc cập nhật
|
|
17
|
+
Tạo hoặc cập nhật `.specs/main/prd.md` thông qua interview có cấu trúc. Ngoài ra **scaffold luôn `.specs/main/domain.md` skeleton** (Glossary placeholder + Shared Entities rỗng) — domain mọc dần qua cascade từ integrations.
|
|
17
18
|
|
|
18
19
|
**Sections template** (7): Problem Statement · Target Users · Scope · Features · Components · Non-Functional Requirements · Business Constraints
|
|
19
20
|
|
|
@@ -32,7 +33,7 @@ Chọn `A` → interview tuần tự 7 sections template (sections thừa không
|
|
|
32
33
|
|
|
33
34
|
### `/spec-sad`
|
|
34
35
|
|
|
35
|
-
Tạo hoặc cập nhật
|
|
36
|
+
Tạo hoặc cập nhật `.specs/main/sad.md`. Yêu cầu `prd.md` và `domain.md` đã tồn tại (cả hai do `/spec-prd` scaffold).
|
|
36
37
|
|
|
37
38
|
Trước khi interview, đọc `prd.md` (NFRs, constraints) và `domain.md` (glossary, shared entities) để surface assumptions và đề xuất options phù hợp khi user chưa quyết định.
|
|
38
39
|
|
|
@@ -48,12 +49,36 @@ Nếu `prd.md` chưa có → dừng, yêu cầu chạy `/spec-prd` trước.
|
|
|
48
49
|
|
|
49
50
|
---
|
|
50
51
|
|
|
52
|
+
### `/spec-frd [F-XXX]` *(tùy chọn)*
|
|
53
|
+
|
|
54
|
+
BA author `.specs/main/feature/{F-XXX}-*/frd.md` trực tiếp qua interview — **spec-first ở feature level**, chạy *trước* khi DEV bắt đầu integration. Cặp greenfield đối xứng với `/spec-brownfield-feature` (vốn reverse-engineer frd từ code).
|
|
55
|
+
|
|
56
|
+
Nhận F-XXX từ argument (hoặc chọn từ prd Feature Index) + tùy chọn nguồn baseline (path/@file/paste như `/spec-prd`). Yêu cầu `prd.md` tồn tại.
|
|
57
|
+
|
|
58
|
+
**Hai gate input (làm chặt) — phải pass cả hai mới author:**
|
|
59
|
+
- **Single-feature**: nguồn liên quan **đúng 1 feature**. Xác định > 1 feature → **dừng + mô tả rõ lý do tách** (outcome/luồng/persona của từng cái) → redirect `/spec-prd` để khai Feature Index.
|
|
60
|
+
- **Create-only**: frd.md của feature mục tiêu **chưa tồn tại**. Đã tồn tại → **dừng, redirect `/spec-new`** (thay đổi feature đã spec phải đi qua integration để delta cascade + kéo theo `/spec-tech`/`/spec-test`).
|
|
61
|
+
- Feature mới **đơn lẻ** chưa có trong Index → offer **register một row vào `prd.md > Features`** rồi author.
|
|
62
|
+
|
|
63
|
+
**Sections template** (7): Overview · User Flows · Feature Acceptance Criteria · User Stories · Verification Rules · Scope · Dependencies
|
|
64
|
+
|
|
65
|
+
**Phạm vi hẹp — chủ yếu `frd.md`:**
|
|
66
|
+
- Reference component frd phụ thuộc (Components Used → C-XXX có sẵn).
|
|
67
|
+
- Component cần-nhưng-chưa-có → ghi *candidate* + Open Question cho `/spec-sad`/architect chốt boundary.
|
|
68
|
+
- Có thể register **một** feature row vào prd (side-effect hợp lệ duy nhất lên prd). **KHÔNG** tạo `crd.md`/`cdd.md` (sinh ở integration time qua `/spec-new` cascade), không tạo `fdd.md`/`tsd.md`, không đổi status feature đã có, không đụng sad/domain.
|
|
69
|
+
- Change History operation = `manual`. Verification Rules dùng quy ước option-suggester của `/spec-new` (BA owns).
|
|
70
|
+
|
|
71
|
+
Bỏ qua bước này cũng được — `/spec-new` sẽ tự tạo frd làm fallback khi integration đầu tiên chạm tới feature.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
51
75
|
### Thứ tự thực hiện
|
|
52
76
|
|
|
53
77
|
```
|
|
54
78
|
/spec-prd → /spec-sad
|
|
55
79
|
│
|
|
56
80
|
│ (có thể chạy /scaffold để khởi tạo project structure)
|
|
81
|
+
│ (tùy chọn /spec-frd [F-XXX] — BA author frd.md trước)
|
|
57
82
|
│
|
|
58
83
|
▼
|
|
59
84
|
→ Integration Pipeline
|
|
@@ -228,17 +253,17 @@ Sau khi main artifacts đã sẵn sàng (từ greenfield hoặc brownfield), m
|
|
|
228
253
|
|
|
229
254
|
| Command | Reads | Writes |
|
|
230
255
|
| --- | --- | --- |
|
|
231
|
-
| `/spec-new [requirement]` | `prd.md`, `domain.md`, frd(s), crd(s) |
|
|
232
|
-
| `/spec-tech [number]` | `sad.md`, `domain.md`, cdd(s), fdd(s), `spec.md` |
|
|
233
|
-
| `/spec-test [number]` | `spec.md`, frd(s), tsd(s), `tech.md` *(optional)* |
|
|
256
|
+
| `/spec-new [requirement]` | `prd.md`, `domain.md`, frd(s), crd(s) | `.specs/integrations/{slug}/spec.md` |
|
|
257
|
+
| `/spec-tech [number]` | `sad.md`, `domain.md`, cdd(s), fdd(s), `spec.md` | `.specs/integrations/{slug}/tech.md` |
|
|
258
|
+
| `/spec-test [number]` | `spec.md`, frd(s), tsd(s), `tech.md` *(optional)* | `.specs/integrations/{slug}/test.md`, `feature/{F-XXX}/tsd.md` |
|
|
234
259
|
| `/plan` | `spec.md`, `tech.md`, `domain.md` | `plan.md`, `todo.md` |
|
|
235
260
|
| `/build` | `plan.md`, `todo.md` | *(source code)* |
|
|
236
261
|
| `/review-integration` | `spec.md`, `tech.md`, `plan.md`, `todo.md`, *(source code)* | *(findings report)* |
|
|
237
|
-
| `/archive` |
|
|
262
|
+
| `/archive` | `.specs/integrations/` | `.specs/archive/` |
|
|
238
263
|
|
|
239
264
|
### `/spec-new [requirement]`
|
|
240
265
|
|
|
241
|
-
Tạo
|
|
266
|
+
Tạo `.specs/integrations/{slug}/spec.md` cho một integration mới. Chạy bởi BA.
|
|
242
267
|
|
|
243
268
|
**Nếu không có argument** → đọc `prd.md`, hiển thị danh sách features có `Status = TODO`, user chọn số.
|
|
244
269
|
|
|
@@ -258,9 +283,9 @@ Sau khi confirm → ghi `spec.md`, cập nhật `prd.md`: Status `TODO → In Pr
|
|
|
258
283
|
|
|
259
284
|
### `/spec-tech [number]`
|
|
260
285
|
|
|
261
|
-
Tạo
|
|
286
|
+
Tạo `.specs/integrations/{slug}/tech.md` cho một integration. Chạy bởi DEV sau khi `spec.md` đã được approve.
|
|
262
287
|
|
|
263
|
-
**Luôn hiển thị danh sách tất cả integrations** trong
|
|
288
|
+
**Luôn hiển thị danh sách tất cả integrations** trong `.specs/integrations/`, đánh dấu `✓` những cái đã có `tech.md`. Nếu có argument → argument là số thứ tự (`1`, `001`...), chọn luôn không cần hiển thị.
|
|
264
289
|
|
|
265
290
|
Nếu integration đã có `tech.md` → hỏi confirm trước khi ghi đè.
|
|
266
291
|
|
|
@@ -274,9 +299,9 @@ Context load: `spec.md` + `sad.md` + `domain.md` + `cdd.md` (cho mỗi component
|
|
|
274
299
|
|
|
275
300
|
### `/spec-test [number]`
|
|
276
301
|
|
|
277
|
-
Tạo
|
|
302
|
+
Tạo `.specs/integrations/{slug}/test.md` cho một integration. Chạy bởi **QC** sau khi `spec.md` đã được approve. **Song song / độc lập** với `/spec-tech` — cả hai chỉ phụ thuộc `spec.md`. Không có thứ tự bắt buộc giữa chúng.
|
|
278
303
|
|
|
279
|
-
**Luôn hiển thị danh sách tất cả integrations** trong
|
|
304
|
+
**Luôn hiển thị danh sách tất cả integrations** trong `.specs/integrations/`, đánh dấu `✓` những cái đã có `test.md`. Nếu có argument → chọn luôn không cần hiển thị.
|
|
280
305
|
|
|
281
306
|
**Gate check:** spec.md phải `approved` + `features:` non-empty. Integration có `features: []` (thuần component) → dừng vì component-level `tsd` không tồn tại trong kit này.
|
|
282
307
|
|
|
@@ -301,7 +326,7 @@ QC review: override priority defaults, fill placeholders (env / data / OOS / str
|
|
|
301
326
|
Tạo `plan.md` và `todo.md` từ `spec.md` + `tech.md`. Là SDD wrapper quanh `planning-and-task-breakdown`.
|
|
302
327
|
|
|
303
328
|
**Bước 1: Xác định integration**
|
|
304
|
-
Quét
|
|
329
|
+
Quét `.specs/integrations/`, hiển thị danh sách với trạng thái `spec✓/—`, `tech✓/—`, `plan✓/—`. Nếu có argument → chọn luôn. Nếu `plan.md`/`todo.md` đã tồn tại → hỏi trước khi ghi đè.
|
|
305
330
|
|
|
306
331
|
**Bước 2: Load và surface context**
|
|
307
332
|
Đọc `spec.md`, `tech.md`, `domain.md`. Surface tóm tắt (features, components, AC IDs, thay đổi kỹ thuật, shared entities) và assumptions để user confirm. Plan mode từ đây — chỉ đọc, không viết code.
|
|
@@ -354,17 +379,17 @@ Review implementation sau `/build` theo năm trục: correctness, readability, a
|
|
|
354
379
|
|
|
355
380
|
### `/archive`
|
|
356
381
|
|
|
357
|
-
Di chuyển integration đã hoàn thành hoặc không còn active từ
|
|
382
|
+
Di chuyển integration đã hoàn thành hoặc không còn active từ `.specs/integrations/` sang `.specs/archive/` để dọn dẹp thư mục làm việc chính.
|
|
358
383
|
|
|
359
|
-
**Bước 1 — Kiểm tra thư mục:** Tự động tạo
|
|
384
|
+
**Bước 1 — Kiểm tra thư mục:** Tự động tạo `.specs/archive/` nếu chưa tồn tại.
|
|
360
385
|
|
|
361
|
-
**Bước 2 — Liệt kê:** Quét
|
|
386
|
+
**Bước 2 — Liệt kê:** Quét `.specs/integrations/`, hiển thị numbered list kèm status (đọc từ `spec.md` nếu có). Nếu không có integration nào → thông báo và dừng.
|
|
362
387
|
|
|
363
388
|
**Bước 3 — Xác nhận:** Hiển thị preview mapping `integrations/{slug}/ → archive/{slug}/` trước khi di chuyển. Chờ user confirm.
|
|
364
389
|
|
|
365
|
-
**Bước 4 — Di chuyển:** Move toàn bộ thư mục, giữ nguyên cấu trúc bên trong. Nếu slug đã tồn tại trong
|
|
390
|
+
**Bước 4 — Di chuyển:** Move toàn bộ thư mục, giữ nguyên cấu trúc bên trong. Nếu slug đã tồn tại trong `.specs/archive/` → bỏ qua và cảnh báo để tránh ghi đè.
|
|
366
391
|
|
|
367
|
-
**Bước 5 — Kết quả:** Liệt kê integrations đã archive, integrations bị bỏ qua (nếu có), và số integration còn lại trong
|
|
392
|
+
**Bước 5 — Kết quả:** Liệt kê integrations đã archive, integrations bị bỏ qua (nếu có), và số integration còn lại trong `.specs/integrations/`.
|
|
368
393
|
|
|
369
394
|
---
|
|
370
395
|
|
|
@@ -407,7 +432,7 @@ Khác với `/review-integration` (chạy sau `/build` cho một integration c
|
|
|
407
432
|
|
|
408
433
|
| Command | Reads | Writes |
|
|
409
434
|
| --- | --- | --- |
|
|
410
|
-
| `/review-everything` | `prd.md`, `domain.md`, `sad.md`, *(source code)* |
|
|
435
|
+
| `/review-everything` | `prd.md`, `domain.md`, `sad.md`, *(source code)* | `.specs/integrations/{NNN}-{slug}/review-findings.md` *(qua /spec-new)* |
|
|
411
436
|
|
|
412
437
|
### `/review-everything`
|
|
413
438
|
|
|
@@ -425,7 +450,7 @@ Review codebase ở project level theo năm trục của `code-review-and-qualit
|
|
|
425
450
|
|
|
426
451
|
Nếu user chọn fix → gom selected findings thành raw requirement, invoke `/spec-new` với ARGUMENT đó. Integration được tạo và xử lý như integration thường (`/spec-tech` → `/plan` → `/build`).
|
|
427
452
|
|
|
428
|
-
`review-findings.md` (full snapshot, gồm cả deferred) được ghi vào
|
|
453
|
+
`review-findings.md` (full snapshot, gồm cả deferred) được ghi vào `.specs/integrations/{NNN}-{slug}/` để traceability.
|
|
429
454
|
|
|
430
455
|
**Khi dùng:**
|
|
431
456
|
|
|
@@ -546,7 +571,7 @@ Tạo hoặc cập nhật `.claude/ado.yaml` — file config ADO dùng chung cho
|
|
|
546
571
|
|
|
547
572
|
**Bước 1 — Current user:** Đọc `git config user.email`, tìm trong `team.*` của `ado.yaml`. Nếu không khớp → hỏi user chọn. Resolve email → ADO identity ID để dùng làm assignee.
|
|
548
573
|
|
|
549
|
-
**Bước 2 — Chọn integration:** List tất cả
|
|
574
|
+
**Bước 2 — Chọn integration:** List tất cả `.specs/integrations/` kèm title và status từ frontmatter `spec.md`.
|
|
550
575
|
|
|
551
576
|
**Bước 3 — Parse spec.md:** Extract Features (`### Feature: <name> (<ID>)`) và User Stories (`#### US-FXXX-YYY — <title>`). Detect ticket đã tồn tại qua dòng `**ADO:**` ngay sau heading — đánh dấu `already_created`, bỏ qua khi tạo.
|
|
552
577
|
|
|
@@ -574,7 +599,7 @@ Cập nhật state đồng loạt cho User Story (và tuỳ chọn Feature) tick
|
|
|
574
599
|
|
|
575
600
|
**Bước 1 — Load config:** Đọc `ado.yaml`. Dừng nếu thiếu file hoặc `environments` rỗng.
|
|
576
601
|
|
|
577
|
-
**Bước 2 — Chọn integration:** List
|
|
602
|
+
**Bước 2 — Chọn integration:** List `.specs/integrations/` kèm title và status.
|
|
578
603
|
|
|
579
604
|
**Bước 3 — Parse & validate:** Extract tất cả Feature và User Story tickets từ dòng `**ADO:**` trong `spec.md`. Nếu bất kỳ ticket nào chưa có → dừng, báo danh sách thiếu, yêu cầu chạy `/ado-create` trước.
|
|
580
605
|
|
|
@@ -595,7 +620,7 @@ Cập nhật state đồng loạt cho User Story (và tuỳ chọn Feature) tick
|
|
|
595
620
|
## Ghi chú
|
|
596
621
|
|
|
597
622
|
- Cascade proposals trong `spec.md` và `tech.md` do human review và apply thủ công — không có skill riêng.
|
|
598
|
-
- **Greenfield**:
|
|
623
|
+
- **Greenfield**: Feature artifacts (`frd.md`) có thể author trước bằng `/spec-frd`, hoặc mọc dần qua cascade từ integrations (`/spec-new` fallback). Component artifacts (`crd.md`/`cdd.md`) chỉ mọc qua cascade — `/spec-frd` chỉ reference component, không tạo crd/cdd.
|
|
599
624
|
- **Brownfield**: Component và Feature artifacts được bootstrap bởi `spec-brownfield-component` và `spec-brownfield-feature` — sau đó tiếp tục mọc qua cascade như bình thường.
|
|
600
625
|
- Thứ tự trong một integration: `spec-new` → `spec-tech` → `plan` → `build`.
|
|
601
626
|
- `frontend-design` và `frontend-ui-engineering` được `build` invoke tự động — không cần gọi thủ công.
|
|
@@ -14,7 +14,7 @@ referenced_by:
|
|
|
14
14
|
|
|
15
15
|
> File này mỏng — chỉ chứa **shared vocabulary** và **shared entities** (entities được dùng bởi 2+ component).
|
|
16
16
|
>
|
|
17
|
-
> Business rules, domain events, internal entities thuộc về component sở hữu — xem
|
|
17
|
+
> Business rules, domain events, internal entities thuộc về component sở hữu — xem `.specs/main/component/{C-XXX}-{component-name}/crd.md`.
|
|
18
18
|
|
|
19
19
|
## Glossary
|
|
20
20
|
|
|
@@ -6,6 +6,7 @@ owner: "{BA}"
|
|
|
6
6
|
feature_id: "{Feature ID từ PRD Feature Index}"
|
|
7
7
|
referenced_by:
|
|
8
8
|
- conventions.md > 3. Main Artifacts > 3.3 Feature level > frd.md > Cấu trúc
|
|
9
|
+
- skills/spec-frd/SKILL.md > Process > Bước 5: Write — sinh draft
|
|
9
10
|
- skills/spec-new/SKILL.md > Process > Bước 5: Write — sinh draft > feature/{F-XXX}/frd.md
|
|
10
11
|
- templates/integrations/spec-template.md > Changes > feature/{F-XXX}/frd.md
|
|
11
12
|
---
|
|
@@ -148,7 +149,7 @@ Sub-rule phức tạp (vd: password complexity với nhiều điều kiện) →
|
|
|
148
149
|
|
|
149
150
|
### Components Used
|
|
150
151
|
|
|
151
|
-
Tham chiếu đến
|
|
152
|
+
Tham chiếu đến `.specs/main/component/{C-XXX}-...`.
|
|
152
153
|
|
|
153
154
|
| Component | Vai trò trong feature |
|
|
154
155
|
| --- | --- |
|
|
@@ -35,13 +35,28 @@ Tại sao cần giải quyết bây giờ.
|
|
|
35
35
|
|
|
36
36
|
## Features
|
|
37
37
|
|
|
38
|
+
Đặt tên feature theo **outcome của một luồng hoàn chỉnh**, kebab-case, đủ khái quát mà vẫn là *một* luồng — không quá rộng (`user-management` là feature area), không quá hẹp (`register-with-google` chỉ là biến thể). ✅ `user-registration`, `password-reset`, `checkout`.
|
|
39
|
+
|
|
38
40
|
| ID | Feature | Mô tả | Priority | Status |
|
|
39
41
|
| --- | --- | --- | --- | --- |
|
|
40
42
|
| F-001 | {tên feature} | {mô tả ngắn — feature làm gì, cho ai} | High/Medium/Low | TODO/DONE |
|
|
41
43
|
|
|
42
44
|
## Components
|
|
43
45
|
|
|
44
|
-
|
|
46
|
+
Một component = một khối có **boundary rõ + interface tường minh** và **một lý do duy nhất để thay đổi**. Không phân loại component thành "domain" hay "kỹ thuật" — mỗi component đều có mặt domain (`crd.md`) lẫn mặt kỹ thuật (`cdd.md`).
|
|
47
|
+
|
|
48
|
+
Đặt tên component theo **năng lực bền vững**, không theo công nghệ hiện tại, kebab-case. ✅ `notification`, `auth`, `file-storage`. ❌ quá cụ thể (`email-sender`, `stripe-client`) hoặc quá mơ hồ (`core`, `utils`, `manager`).
|
|
49
|
+
|
|
50
|
+
Section này **chỉ liệt kê component có boundary _Given_** — tức boundary bị ép từ ngoài, chỉ có một cách vẽ hợp lý. Áp thủ tục:
|
|
51
|
+
- **Câu 1 (External):** bọc/adapt hệ thống ngoài ta buộc phải tích hợp? (vd `payment-gateway` tích hợp Stripe, `email-service` tích hợp SendGrid) → Given, khai ở đây.
|
|
52
|
+
- **Câu 2 (Mandated-substrate):** nền tảng kỹ thuật dùng chung mà yêu cầu bắt buộc, độc lập với cách carve lõi nghiệp vụ? (vd `auth`, `file-storage`, `notification`) → Given, khai ở đây.
|
|
53
|
+
- **Còn lại (Derived):** boundary phụ thuộc cách carve lõi nghiệp vụ hoặc đánh đổi NFR (vd `order`, `pricing`, `inventory`) → **KHÔNG** khai ở đây.
|
|
54
|
+
|
|
55
|
+
**Component Derived mọc dần qua:**
|
|
56
|
+
- `/spec-sad` — architect lock component boundaries dựa trên full feature index + NFRs
|
|
57
|
+
- `/spec-new F-XXX` cascade — khi analyze 1 feature, discover component mới nếu cần và register vào đây qua Change History
|
|
58
|
+
|
|
59
|
+
Chi tiết về vai trò và thiết kế nằm trong `.specs/main/component/{C-XXX}-{component-name}/`.
|
|
45
60
|
|
|
46
61
|
| ID | Component | Mô tả ngắn | Status |
|
|
47
62
|
| --- | --- | --- | --- |
|