spec-lite 1.4.6 → 1.4.7
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/package.json
CHANGED
|
@@ -53,16 +53,19 @@ options:
|
|
|
53
53
|
description: "Cập nhật danh sách PE / SE / DE"
|
|
54
54
|
- label: "Epic ticket"
|
|
55
55
|
description: "Tạo mới hoặc thay Epic ticket đang được lưu"
|
|
56
|
+
- label: "Area / Iteration path"
|
|
57
|
+
description: "Cập nhật area_path và iteration_path mặc định cho ticket"
|
|
56
58
|
- label: "Môi trường"
|
|
57
59
|
description: "Cập nhật danh sách environments (dev / stag / prod)"
|
|
58
60
|
```
|
|
59
61
|
|
|
60
62
|
Tuỳ theo lựa chọn:
|
|
61
|
-
- **"Toàn bộ từ đầu"** → chạy Bước 2 → 3 → 4 → 5 → 6 → 7
|
|
62
|
-
- **"Thông tin project"** → chỉ chạy Bước 2, bỏ qua Bước 3, 4, 5, nhảy thẳng đến Bước
|
|
63
|
-
- **"Team members"** → chỉ chạy Bước 3, bỏ qua Bước 2, 4, 5, nhảy thẳng đến Bước
|
|
64
|
-
- **"Epic ticket"** → chỉ chạy Bước 4, bỏ qua Bước 2, 3, 5, nhảy thẳng đến Bước
|
|
65
|
-
- **"
|
|
63
|
+
- **"Toàn bộ từ đầu"** → chạy Bước 2 → 3 → 4 → 5 → 6 → 7 → 8
|
|
64
|
+
- **"Thông tin project"** → chỉ chạy Bước 2, bỏ qua Bước 3, 4, 5, 6, nhảy thẳng đến Bước 7 → 8 (giữ nguyên `team`, `epic`, `area_path/iteration_path`, `environments` từ file cũ)
|
|
65
|
+
- **"Team members"** → chỉ chạy Bước 3, bỏ qua Bước 2, 4, 5, 6, nhảy thẳng đến Bước 7 → 8 (giữ nguyên `organization/project`, `epic`, `area_path/iteration_path`, `environments` từ file cũ)
|
|
66
|
+
- **"Epic ticket"** → chỉ chạy Bước 4, bỏ qua Bước 2, 3, 5, 6, nhảy thẳng đến Bước 7 → 8 (giữ nguyên `organization/project`, `team`, `area_path/iteration_path`, `environments` từ file cũ)
|
|
67
|
+
- **"Area / Iteration path"** → chỉ chạy Bước 5, bỏ qua Bước 2, 3, 4, 6, nhảy thẳng đến Bước 7 → 8 (giữ nguyên tất cả còn lại từ file cũ)
|
|
68
|
+
- **"Môi trường"** → chỉ chạy Bước 6, bỏ qua Bước 2, 3, 4, 5, nhảy thẳng đến Bước 7 → 8 (giữ nguyên tất cả từ file cũ)
|
|
66
69
|
|
|
67
70
|
---
|
|
68
71
|
|
|
@@ -238,7 +241,41 @@ https://dev.azure.com/{organization}/{project_name}/_workitems/edit/{id}
|
|
|
238
241
|
|
|
239
242
|
---
|
|
240
243
|
|
|
241
|
-
### Bước 5: Cấu hình
|
|
244
|
+
### Bước 5: Cấu hình Area & Iteration Path
|
|
245
|
+
|
|
246
|
+
Area Path và Iteration Path mặc định sẽ được gán cho mọi Feature/User Story khi `/ado-create` tạo ticket. Cả hai đều **tùy chọn** — nếu bỏ trống, ADO dùng giá trị mặc định của team.
|
|
247
|
+
|
|
248
|
+
Hỏi user bằng `AskUserQuestion`:
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
question: "Cấu hình Area / Iteration path mặc định cho ticket?"
|
|
252
|
+
options:
|
|
253
|
+
- label: "Nhập area & iteration path"
|
|
254
|
+
description: "Gán area_path và iteration_path mặc định cho mọi ticket tạo qua /ado-create"
|
|
255
|
+
- label: "Bỏ qua"
|
|
256
|
+
description: "Không set — ADO dùng giá trị mặc định của team"
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Nếu user chọn **"Nhập area & iteration path"** → hỏi lần lượt (cho phép Enter trống để bỏ từng field):
|
|
260
|
+
|
|
261
|
+
```
|
|
262
|
+
Area Path (ví dụ: Tickets\Clients\C-GAL\P-GCC):
|
|
263
|
+
> Tickets\Clients\C-GAL\P-GCC
|
|
264
|
+
|
|
265
|
+
Iteration Path (ví dụ: Tickets\Weekly Sprint):
|
|
266
|
+
> Tickets\Weekly Sprint
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Lưu ý khi thu thập:
|
|
270
|
+
- Path dùng dấu backslash `\` phân cách như trên ADO. Chấp nhận cả khi user paste có khoảng trắng ở đầu/cuối → trim.
|
|
271
|
+
- Nếu user nhập area path nhưng không chắc đúng → vẫn lưu nguyên văn, không tự validate qua MCP (tránh fail khi node chưa tồn tại). Validation thực tế sẽ xảy ra lúc `/ado-create` tạo ticket.
|
|
272
|
+
- Field nào để trống → bỏ key tương ứng trong YAML, không ghi `area_path: null`.
|
|
273
|
+
|
|
274
|
+
Nếu user chọn **"Bỏ qua"** → không thêm `area_path`/`iteration_path` vào config.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
### Bước 6: Cấu hình môi trường
|
|
242
279
|
|
|
243
280
|
**Bắt buộc** hỏi user bằng `AskUserQuestion` — không cho phép bỏ qua:
|
|
244
281
|
|
|
@@ -265,7 +302,7 @@ Nếu user chọn "Other" (nhập tay) → parse chuỗi nhập vào (phân các
|
|
|
265
302
|
|
|
266
303
|
---
|
|
267
304
|
|
|
268
|
-
### Bước
|
|
305
|
+
### Bước 7: Preview và xác nhận
|
|
269
306
|
|
|
270
307
|
Hiển thị preview YAML sẽ được ghi — **chưa ghi file**:
|
|
271
308
|
|
|
@@ -287,6 +324,9 @@ team:
|
|
|
287
324
|
DE:
|
|
288
325
|
- d@atstechnology.vn
|
|
289
326
|
|
|
327
|
+
area_path: 'Tickets\Clients\C-GAL\P-GCC'
|
|
328
|
+
iteration_path: 'Tickets\Weekly Sprint'
|
|
329
|
+
|
|
290
330
|
epic:
|
|
291
331
|
id: 42
|
|
292
332
|
title: "[GAL-GCC] Spec Lite Kit"
|
|
@@ -304,11 +344,13 @@ Nếu user yêu cầu chỉnh sửa → cập nhật preview → hỏi lại.
|
|
|
304
344
|
|
|
305
345
|
Nếu user bỏ qua bước Epic (không muốn cấu hình ngay) → bỏ qua key `epic` trong YAML, không ghi `epic: null`.
|
|
306
346
|
|
|
307
|
-
|
|
347
|
+
Nếu user bỏ qua Area/Iteration (Bước 5) → bỏ qua key `area_path`/`iteration_path` tương ứng, không ghi giá trị `null`.
|
|
348
|
+
|
|
349
|
+
**Bước 6 (môi trường) là bắt buộc** — không cho phép bỏ qua. Nếu user chưa chọn, nhắc lại trước khi tiếp tục.
|
|
308
350
|
|
|
309
351
|
---
|
|
310
352
|
|
|
311
|
-
### Bước
|
|
353
|
+
### Bước 8: Ghi file
|
|
312
354
|
|
|
313
355
|
Ghi nội dung đã confirm vào `.claude/ado.yaml`.
|
|
314
356
|
|
|
@@ -345,5 +387,6 @@ Trước khi ghi file, kiểm tra:
|
|
|
345
387
|
- [ ] `team.PE` có ít nhất 1 email — không được để trống
|
|
346
388
|
- [ ] SE và DE có thể là array rỗng `[]`
|
|
347
389
|
- [ ] Nếu có Epic: `epic.id` là số nguyên, `epic.title` có prefix `[{project_code}]`, `epic.url` là full URL dạng `https://dev.azure.com/{org}/{project_name}/_workitems/edit/{id}`
|
|
390
|
+
- [ ] Nếu có `area_path` / `iteration_path`: là chuỗi đã trim, giữ nguyên dấu `\` (dùng YAML single-quote để tránh escape); bỏ qua key nếu user không nhập — không ghi `null`
|
|
348
391
|
- [ ] `environments` là array ít nhất 1 phần tử (bắt buộc), mỗi phần tử là lowercase string không có khoảng trắng, luôn có `prod` ở cuối
|
|
349
392
|
- [ ] User đã confirm preview trước khi ghi file
|
|
@@ -14,6 +14,8 @@ description: Tạo Feature và User Story tickets trên ADO từ spec.md của m
|
|
|
14
14
|
- `.claude/ado.yaml` phải tồn tại và có `epic.id` (chạy `/ado-config` nếu chưa có)
|
|
15
15
|
- `frd.md` tương ứng phải tồn tại trong `.specs/main/features/` cho mỗi feature
|
|
16
16
|
|
|
17
|
+
**Area / Iteration (tùy chọn):** Nếu `.claude/ado.yaml` có `area_path` và/hoặc `iteration_path`, mọi ticket (Feature + User Story) tạo ở Bước 5 và Bước 6 phải set `areaPath` / `iterationPath` tương ứng. Nếu không khai báo → để ADO dùng giá trị mặc định của team.
|
|
18
|
+
|
|
17
19
|
---
|
|
18
20
|
|
|
19
21
|
## Process
|
|
@@ -131,6 +133,8 @@ Gọi `mcp__azure-devops__wit_create_work_item` với:
|
|
|
131
133
|
- `title`: `[{project_code}] [{feature_id}] {feature_name}` — ví dụ: `[SDLC-TEST] [F-001] Đăng ký / Đăng nhập`
|
|
132
134
|
- `description`: toàn bộ nội dung `frd.md` (giữ nguyên format Markdown)
|
|
133
135
|
- `assignedTo`: ADO identity ID của current user (nếu resolve thành công)
|
|
136
|
+
- `areaPath`: giá trị `area_path` từ ado.yaml (nếu có)
|
|
137
|
+
- `iterationPath`: giá trị `iteration_path` từ ado.yaml (nếu có)
|
|
134
138
|
|
|
135
139
|
Sau khi tạo thành công → **ngay lập tức** link parent. Ưu tiên dùng `mcp__azure-devops__wit_add_child_work_items` (parent = Epic ID, child = Feature ticket ID). Nếu tool này không khả dụng, fallback sang `mcp__azure-devops__wit_work_items_link` với:
|
|
136
140
|
- `sourceId`: Feature ticket ID vừa tạo
|
|
@@ -186,6 +190,8 @@ Gọi `mcp__azure-devops__wit_create_work_item` với:
|
|
|
186
190
|
- `title`: `[{project_code}] [{feature_name}] - {US-code} — {story_title}` — ví dụ: `[SDLC-TEST] [Đăng ký / Đăng nhập] - US-F001-001 — Đăng ký`
|
|
187
191
|
- `description`: description đã build ở 6.2
|
|
188
192
|
- `assignedTo`: ADO identity ID của current user
|
|
193
|
+
- `areaPath`: giá trị `area_path` từ ado.yaml (nếu có)
|
|
194
|
+
- `iterationPath`: giá trị `iteration_path` từ ado.yaml (nếu có)
|
|
189
195
|
|
|
190
196
|
Sau khi tạo thành công → **ngay lập tức** link parent. Ưu tiên dùng `mcp__azure-devops__wit_add_child_work_items` (parent = Feature ticket ID, child = User Story ticket ID). Nếu không khả dụng, fallback sang `mcp__azure-devops__wit_work_items_link` với:
|
|
191
197
|
- `sourceId`: User Story ticket ID vừa tạo
|
package/skills/spec-frd/SKILL.md
CHANGED
|
@@ -18,7 +18,7 @@ Skill này là cặp greenfield đối xứng với `/spec-brownfield-feature` (
|
|
|
18
18
|
2. **CREATE-only** — frd.md đã tồn tại → DỪNG, redirect `/spec-new` để phân tích delta + cascade + downstream (tech/test) (Bước 1c).
|
|
19
19
|
|
|
20
20
|
**Phạm vi hẹp — chủ yếu frd.md:**
|
|
21
|
-
- ✅ Author frd.md (7 sections) cho **một** feature **chưa có frd**.
|
|
21
|
+
- ✅ Author frd.md (7 core sections + `Open Questions` tùy chọn) cho **một** feature **chưa có frd**.
|
|
22
22
|
- ✅ *Reference* component frd phụ thuộc (Components Used) + ghi component cần-nhưng-chưa-có như **candidate**.
|
|
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.
|
|
@@ -171,6 +171,8 @@ Hỏi tuần tự, từng phần — không hỏi tất cả cùng lúc. Nếu B
|
|
|
171
171
|
|
|
172
172
|
Câu trả lời vague → hỏi lại để làm rõ (ngưỡng đo được, field cụ thể, nhánh xử lý).
|
|
173
173
|
|
|
174
|
+
**Open Questions — gom trong lúc interview.** Điểm nào BA chưa chốt được ngay (chờ stakeholder, phụ thuộc quyết định khác, ngưỡng/nhánh chưa rõ) → KHÔNG đoán bừa vào AC/VR. Ghi lại thành một mục trong `## Open Questions` của draft (kèm ai trả lời / khi nào), rồi tiếp tục các phần còn lại. Section này gom cả component candidate (Bước 4) lẫn câu hỏi clarify từ interview; rỗng thì xóa khi save.
|
|
175
|
+
|
|
174
176
|
---
|
|
175
177
|
|
|
176
178
|
### Bước 4: Xử lý component (mức reference + candidate)
|
|
@@ -225,6 +227,7 @@ Dùng `.claude/templates/main/feature/frd-template.md` làm skeleton, điền n
|
|
|
225
227
|
|
|
226
228
|
Hiển thị **toàn bộ draft** cho user — chưa ghi file. Kèm:
|
|
227
229
|
- danh sách component candidate (nếu có) và VR còn `TBD`;
|
|
230
|
+
- **Open Questions** còn mở (câu hỏi clarify + component candidate) để BA xác nhận hoặc giải quyết trước khi save;
|
|
228
231
|
- **danh sách domain vocabulary đề xuất** (Bước 4b): glossary term mới + định nghĩa shared entity (`Owner: TBD`), để BA duyệt trước khi cascade lên `domain.md`.
|
|
229
232
|
|
|
230
233
|
#### Verification Rules — quy ước sinh
|
|
@@ -344,6 +347,7 @@ Bước tiếp theo:
|
|
|
344
347
|
- frd dùng từ không đo được trong AC ("hoạt động đúng", "nhanh", "đẹp")
|
|
345
348
|
- User Stories không có persona rõ hoặc không có AC
|
|
346
349
|
- Verification Rules tự điền mà chưa hỏi BA
|
|
350
|
+
- Đoán bừa vào AC/VR thay vì ghi điểm chưa chốt vào Open Questions
|
|
347
351
|
- Tạo crd.md/cdd.md (vượt phạm vi — đó là integration time)
|
|
348
352
|
- Component candidate không được surface cho architect
|
|
349
353
|
- **Update frd đã tồn tại** thay vì redirect `/spec-new` (vi phạm CREATE-only)
|
|
@@ -355,7 +359,7 @@ Bước tiếp theo:
|
|
|
355
359
|
- [ ] **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`
|
|
356
360
|
- [ ] **Create-only gate**: frd.md của feature mục tiêu CHƯA tồn tại; nếu đã có đã redirect `/spec-new`
|
|
357
361
|
- [ ] Feature mục tiêu có trong Index, HOẶC feature mới đơn lẻ đã được user đồng ý register (Bước 1b)
|
|
358
|
-
- [ ] frd.md có đủ 7 sections (luôn create mới)
|
|
362
|
+
- [ ] 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
|
|
359
363
|
- [ ] Mỗi User Story có persona + priority + ít nhất 1 AC Given/When/Then
|
|
360
364
|
- [ ] Feature AC dùng ID `FAC-F{NNN}-{seq}` (counter độc lập với `AC-F{NNN}`), Then đo được
|
|
361
365
|
- [ ] Verification Rules đã confirm với BA (không tự assert); không chứa regex/code/error message; semantic type
|
package/skills-overview.md
CHANGED
|
@@ -550,6 +550,7 @@ Tạo hoặc cập nhật `.claude/ado.yaml` — file config ADO dùng chung cho
|
|
|
550
550
|
- Thông tin project
|
|
551
551
|
- Team members
|
|
552
552
|
- Epic ticket
|
|
553
|
+
- Area / Iteration path
|
|
553
554
|
- Môi trường
|
|
554
555
|
|
|
555
556
|
**Bước 2 — Project:**
|
|
@@ -561,7 +562,9 @@ Tạo hoặc cập nhật `.claude/ado.yaml` — file config ADO dùng chung cho
|
|
|
561
562
|
|
|
562
563
|
**Bước 4 — Epic Ticket:** Tạo Epic mới qua MCP (title được prefix `[{project_code}]`, assignee là PE đầu tiên) hoặc nhập ID ticket có sẵn (validate qua MCP: phải là type `Epic`). Lưu `id`, `title`, `url` vào config.
|
|
563
564
|
|
|
564
|
-
**Bước 5 —
|
|
565
|
+
**Bước 5 — Area / Iteration Path:** (tùy chọn) Collect `area_path` và `iteration_path` mặc định cho ticket. Bỏ qua nếu user không nhập → ADO dùng giá trị mặc định của team.
|
|
566
|
+
|
|
567
|
+
**Bước 6 — Environments:** Collect danh sách môi trường (dev / stag / prod).
|
|
565
568
|
|
|
566
569
|
**Cuối:** Ghi `.claude/ado.yaml`, đảm bảo file không bị ignore bởi `.gitignore` (thêm `!.claude/ado.yaml` nếu `.claude/` đang bị ignore).
|
|
567
570
|
|
|
@@ -581,7 +584,7 @@ Tạo hoặc cập nhật `.claude/ado.yaml` — file config ADO dùng chung cho
|
|
|
581
584
|
|
|
582
585
|
**Bước 4 — Preview:** Hiển thị kế hoạch đầy đủ (Feature và User Story sẽ tạo, skip list) trước khi tạo bất kỳ ticket nào. Chờ user confirm.
|
|
583
586
|
|
|
584
|
-
**Bước 5-6 — Tạo tickets:**
|
|
587
|
+
**Bước 5-6 — Tạo tickets:** (set `areaPath`/`iterationPath` từ `ado.yaml` nếu có)
|
|
585
588
|
- Feature ticket: type `Feature`, title `[{project_code}] [{feature_id}] {feature_name}`, description từ `frd.md`. Link parent → Epic ngay sau khi tạo.
|
|
586
589
|
- User Story ticket: type `User Story`, title `[{project_code}] [{feature_name}] - {US-code} — {story_title}`, description gồm câu story + ACs. Link parent → Feature ngay sau khi tạo.
|
|
587
590
|
- Nếu link parent fail → retry 1 lần → nếu vẫn fail: đánh dấu `orphan` (KHÔNG xóa ticket), báo cáo cuối.
|
|
@@ -155,6 +155,13 @@ Tham chiếu đến `.specs/main/component/{C-XXX}-...`.
|
|
|
155
155
|
| --- | --- |
|
|
156
156
|
| `{C-XXX}-{component-name}` | {component này phục vụ cái gì cho feature này} |
|
|
157
157
|
|
|
158
|
+
## Open Questions
|
|
159
|
+
|
|
160
|
+
<!-- Các câu hỏi cần làm rõ trong interview / với stakeholder trước khi proceed.
|
|
161
|
+
Cũng dùng để note component candidate chưa carve (xem skills/spec-frd). Xóa section nếu không còn câu hỏi nào. -->
|
|
162
|
+
|
|
163
|
+
- [ ] {câu hỏi cần clarify} — {ai trả lời / khi nào}
|
|
164
|
+
|
|
158
165
|
## Change History
|
|
159
166
|
|
|
160
167
|
Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
|