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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-lite",
3
- "version": "1.4.6",
3
+ "version": "1.4.7",
4
4
  "description": "Spec-driven development kit for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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 67 (giữ nguyên `team`, `epic`, `environments` từ file cũ)
63
- - **"Team members"** → chỉ chạy Bước 3, bỏ qua Bước 2, 4, 5, nhảy thẳng đến Bước 67 (giữ nguyên `organization/project`, `epic`, `environments` từ file cũ)
64
- - **"Epic ticket"** → chỉ chạy Bước 4, bỏ qua Bước 2, 3, 5, nhảy thẳng đến Bước 67 (giữ nguyên `organization/project`, `team`, `environments` từ file cũ)
65
- - **"Môi trường"** → chỉ chạy Bước 5, bỏ qua Bước 2, 3, 4, nhảy thẳng đến Bước 67 (giữ nguyên tất cả từ file cũ)
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 78 (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 78 (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 78 (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 78 (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 môi trường
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 6: Preview và xác nhận
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
- **Bước 5 (môi trường) 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.
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 7: Ghi file
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
@@ -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
@@ -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 — Environments:** Collect danh sách môi trường (dev / stag / prod).
565
+ **Bước 5 — Area / Iteration Path:** (tùy chọn) Collect `area_path` `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.