spec-lite 1.1.5 → 1.1.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.
@@ -0,0 +1,295 @@
1
+ ---
2
+ name: ado-update
3
+ description: Cập nhật trạng thái (state) cho tất cả User Story và Feature tickets trên ADO theo tiến trình deploy/verify qua từng môi trường được cấu hình trong ado.yaml.
4
+ ---
5
+
6
+ # ado-update
7
+
8
+ ## Overview
9
+
10
+ Đọc `spec.md` của một integration, kiểm tra ADO tickets đã tồn tại chưa, sau đó cho phép user chọn trạng thái mới để cập nhật đồng loạt toàn bộ User Story tickets — và tuỳ chọn cả Feature tickets.
11
+
12
+ ---
13
+
14
+ ## Prerequisites
15
+
16
+ - `.claude/ado.yaml` phải tồn tại và có `environments` (chạy `/ado-config` nếu chưa có)
17
+ - Tất cả Feature và User Story trong integration phải đã có ADO ticket (chạy `/ado-create` nếu chưa có)
18
+
19
+ ---
20
+
21
+ ## State Source
22
+
23
+ State names **không được generate từ `environments`** — chúng được lấy trực tiếp từ ADO bằng `mcp__azure-devops__wit_get_work_item_type`. Mỗi project có thể đặt tên state khác nhau (ví dụ: `dev` có thể là `Deploy Test` thay vì `Deploy Dev`).
24
+
25
+ - **User Story states**: fetch từ ADO work item type `User Story`
26
+ - **Feature states**: fetch từ ADO work item type `Feature`
27
+
28
+ State list hiển thị cho user là danh sách `states` thực tế từ ADO response, **đã qua bước filter theo environments được cấu hình**.
29
+
30
+ ---
31
+
32
+ ## Environment-State Filtering
33
+
34
+ ADO thường định nghĩa state cho mọi environment có thể có (dev, stag, prod). Sau khi fetch, **filter bớt các state không tương ứng với environments trong `.claude/ado.yaml`** trước khi hiển thị cho user.
35
+
36
+ ### Quy tắc filter
37
+
38
+ **Bước 1 — Tách state thành 2 nhóm:**
39
+
40
+ - **Nhóm environment-specific**: state khớp pattern `Deploy *` hoặc `Verify *` (ví dụ: Deploy Test, Verify Test, Deploy Stag, Verify Stag, Deploy Prod, Verify Prod)
41
+ - **Nhóm general**: tất cả state còn lại (New, Pending, In Progress, Done, Removed, v.v.) — giữ nguyên, không filter
42
+
43
+ **Bước 2 — Group environment-specific states thành pairs:**
44
+
45
+ Sắp xếp theo thứ tự xuất hiện trong ADO response, group thành cặp `(Deploy X, Verify X)` theo thứ tự:
46
+ - Pair 0 → tương ứng `environments[0]`
47
+ - Pair 1 → tương ứng `environments[1]`
48
+ - Pair N → tương ứng `environments[N]`
49
+
50
+ **Bước 3 — Giữ chỉ các pairs có index nằm trong danh sách environments:**
51
+
52
+ Environments trong config có bao nhiêu phần tử → giữ bấy nhiêu pairs (theo đúng thứ tự). Pairs thừa (tương ứng env không có trong config) → loại bỏ.
53
+
54
+ ### Ví dụ
55
+
56
+ Config: `environments: [dev, prod]` → 2 environments
57
+
58
+ ADO trả về states (theo thứ tự): New, Pending, In Progress, Deploy Test, Verify Test, Deploy Stag, Verify Stag, Deploy Prod, Verify Prod, Done, Removed
59
+
60
+ Environment-specific pairs (theo thứ tự ADO):
61
+ - Pair 0: (Deploy Test, Verify Test) → `environments[0]` = dev ✓ giữ
62
+ - Pair 1: (Deploy Stag, Verify Stag) → `environments[1]` = prod ✗ nhưng config[1] = prod, không phải stag → loại
63
+ - Pair 2: (Deploy Prod, Verify Prod) → `environments[2]` = không có (chỉ có 2 env) → loại
64
+
65
+ Vì config có 2 environments → giữ 2 pairs đầu tiên: Pair 0 (dev) và Pair 2 (prod):
66
+ - Pair 0: (Deploy Test, Verify Test) → env[0] = dev ✓
67
+ - Pair 2: (Deploy Prod, Verify Prod) → env[1] = prod ✓
68
+
69
+ State list sau filter: New, Pending, In Progress, Deploy Test, Verify Test, Deploy Prod, Verify Prod, Done, Removed
70
+
71
+ > **Lưu ý về mapping positional:** Tổng số pairs ADO trả về có thể nhiều hơn số environments trong config. Map theo vị trí index trong danh sách pairs: pair thứ 0 → env thứ 0, pair thứ 1 → env thứ 1. Pairs có index ≥ số environments trong config → loại bỏ.
72
+
73
+ ---
74
+
75
+ ## Process
76
+
77
+ ### Bước 1: Load config
78
+
79
+ Đọc `.claude/ado.yaml`. Nếu không tồn tại → dừng:
80
+
81
+ ```
82
+ Chưa có .claude/ado.yaml. Hãy chạy /ado-config trước.
83
+ ```
84
+
85
+ Nếu `environments` trống hoặc không tồn tại trong file → dừng:
86
+
87
+ ```
88
+ .claude/ado.yaml chưa có danh sách environments. Hãy chạy /ado-config để cập nhật.
89
+ ```
90
+
91
+ ---
92
+
93
+ ### Bước 2: Chọn integration
94
+
95
+ List tất cả thư mục trong `specs/integrations/` trừ `000-scaffold`. Với mỗi thư mục, đọc frontmatter của `spec.md` để lấy `title` và `status`.
96
+
97
+ Hỏi user bằng `AskUserQuestion`:
98
+
99
+ ```
100
+ question: "Chọn integration để cập nhật ADO ticket status:"
101
+ options:
102
+ - label: "001-implement-auth — Implement Authentication"
103
+ description: "status: draft | features: F-001"
104
+ - label: "002-implement-todo — Implement Todo Management"
105
+ description: "status: draft | features: F-002, F-003"
106
+ ...
107
+ ```
108
+
109
+ Sau khi user chọn → đọc toàn bộ `spec.md` của integration đó.
110
+
111
+ ---
112
+
113
+ ### Bước 3: Parse và kiểm tra ADO tickets
114
+
115
+ **Parse spec.md** để extract:
116
+
117
+ **Features:** Tìm heading `### Feature: <name> (<ID>)` hoặc heading Feature tương đương. Sau mỗi heading, tìm dòng `**ADO F-XXX:**` hoặc `**ADO:**` để lấy ticket ID.
118
+
119
+ **User Stories:** Tìm heading `#### US-FXXX-YYY — <title>`. Sau mỗi heading, tìm dòng `**ADO:**` để lấy ticket ID.
120
+
121
+ **Quy tắc parse ADO ticket ID:** Tìm pattern `[#(\d+)` trong dòng `**ADO**` và extract số đó làm ticket ID.
122
+
123
+ **Kiểm tra đầy đủ tickets:**
124
+
125
+ - Nếu **bất kỳ** Feature hoặc User Story nào **chưa có** dòng `**ADO:**` → dừng và báo:
126
+
127
+ ```
128
+ Integration "002-implement-todo" chưa có đầy đủ ADO tickets.
129
+
130
+ Thiếu tickets:
131
+ ✗ F-002 — Quản lý todo (chưa có Feature ticket)
132
+ ✗ US-F002-003 — Xóa task (chưa có User Story ticket)
133
+
134
+ Hãy chạy /ado-create trước để tạo đầy đủ tickets.
135
+ ```
136
+
137
+ - Nếu **tất cả** đều có → tiếp tục Bước 4.
138
+
139
+ ---
140
+
141
+ ### Bước 4: Fetch states từ ADO và hiển thị tickets hiện tại
142
+
143
+ Thực hiện **song song**:
144
+
145
+ 1. Gọi `mcp__azure-devops__wit_get_work_items_batch_by_ids` với tất cả ticket IDs (Feature + User Story) để lấy state hiện tại.
146
+ 2. Gọi `mcp__azure-devops__wit_get_work_item_type` với `workItemType: "User Story"` để lấy danh sách states thực tế.
147
+ 3. Gọi `mcp__azure-devops__wit_get_work_item_type` với `workItemType: "Feature"` để lấy danh sách Feature states thực tế.
148
+
149
+ Extract `states[].name` từ response của mỗi work item type — đây là danh sách state hợp lệ sẽ dùng ở Bước 5 và 7.
150
+
151
+ Hiển thị tóm tắt trạng thái hiện tại:
152
+
153
+ ```
154
+ Integration: 002-implement-todo — Implement Todo Management
155
+
156
+ User Story Tickets:
157
+ • #24255 — US-F003-001 — Xem Shared Kanban Board [New]
158
+ • #24256 — US-F002-001 — Tạo task mới [New]
159
+ • #24257 — US-F002-002 — Sửa task [Deploy Test]
160
+ • #24258 — US-F002-003 — Xóa task [Verify Test]
161
+
162
+ Feature Tickets:
163
+ • #24253 — F-002 — Quản lý todo [In Development]
164
+ • #24254 — F-003 — Shared dashboard [In Design]
165
+ ```
166
+
167
+ ---
168
+
169
+ ### Bước 5: Chọn state mới cho User Story tickets
170
+
171
+ Dùng danh sách `states[].name` đã fetch từ ADO ở Bước 4, **áp dụng Environment-State Filtering** (xem phần trên) để loại bỏ các state không tương ứng với environments được cấu hình.
172
+
173
+ In ra danh sách đánh số dạng plain text — **không dùng `AskUserQuestion`** vì số state có thể vượt quá 4 options.
174
+
175
+ Ví dụ output với `environments: [dev, prod]` (đã filter bỏ Deploy Stag, Verify Stag):
176
+
177
+ ```
178
+ Chọn state mới cho tất cả User Story tickets:
179
+
180
+ 1. New
181
+ 2. Pending
182
+ 3. Committed
183
+ 4. In Progress
184
+ 5. Deploy Test
185
+ 6. Verify Test
186
+ 7. Deploy Prod
187
+ 8. Verify Prod
188
+ 9. Done
189
+ 10. Removed
190
+
191
+ Nhập số (1–10):
192
+ ```
193
+
194
+ Chờ user nhập số. Nếu input không hợp lệ → in lại danh sách và nhắc nhập lại.
195
+
196
+ ---
197
+
198
+ ### Bước 6: Xác nhận và cập nhật User Story tickets
199
+
200
+ Hiển thị preview trước khi cập nhật:
201
+
202
+ ```
203
+ Sẽ cập nhật 4 User Story tickets → "Verify Dev":
204
+
205
+ • #24255 — US-F003-001 — Xem Shared Kanban Board [New] → [Verify Dev]
206
+ • #24256 — US-F002-001 — Tạo task mới [New] → [Verify Dev]
207
+ • #24257 — US-F002-002 — Sửa task [Deploy Dev] → [Verify Dev]
208
+ • #24258 — US-F002-003 — Xóa task [Verify Dev] → (không đổi)
209
+
210
+ Tiếp tục? (yes/no)
211
+ ```
212
+
213
+ Các ticket đã ở đúng state rồi → hiển thị "(không đổi)", không gọi API update.
214
+
215
+ Nếu user xác nhận → gọi `mcp__azure-devops__wit_update_work_item` tuần tự cho từng ticket cần cập nhật:
216
+ - `id`: ticket ID
217
+ - `state`: state mới đã chọn
218
+
219
+ Nếu update thất bại → log lỗi, tiếp tục với ticket tiếp theo, báo cáo ở Bước 8.
220
+
221
+ ---
222
+
223
+ ### Bước 7: Hỏi về Feature tickets
224
+
225
+ Sau khi hoàn tất User Story, hỏi user bằng `AskUserQuestion`:
226
+
227
+ ```
228
+ question: "Bạn có muốn cập nhật state cho Feature tickets không?"
229
+ options:
230
+ - label: "Có, cập nhật Feature tickets"
231
+ description: "Chọn state mới và cập nhật tất cả Feature tickets của integration này"
232
+ - label: "Không, bỏ qua"
233
+ description: "Giữ nguyên state hiện tại của Feature tickets"
234
+ ```
235
+
236
+ **Nếu user chọn "Không"** → nhảy thẳng đến Bước 8.
237
+
238
+ **Nếu user chọn "Có":**
239
+
240
+ In danh sách đánh số dạng plain text — **không dùng `AskUserQuestion`** — dùng Feature states đã fetch từ ADO ở Bước 4:
241
+
242
+ ```
243
+ Chọn state mới cho tất cả Feature tickets:
244
+
245
+ 1. New
246
+ 2. In Design
247
+ 3. In Development
248
+ 4. Done
249
+ 5. Removed
250
+
251
+ Nhập số (1–5):
252
+ ```
253
+
254
+ Chờ user nhập số. Nếu input không hợp lệ → in lại danh sách và nhắc nhập lại.
255
+
256
+ Hiển thị preview giống Bước 6 cho Feature tickets, xác nhận rồi gọi `mcp__azure-devops__wit_update_work_item` cho từng ticket cần cập nhật.
257
+
258
+ ---
259
+
260
+ ### Bước 8: Tóm tắt kết quả
261
+
262
+ ```
263
+ ✓ Cập nhật ADO ticket status — integration: 002-implement-todo
264
+
265
+ User Story Tickets → "Verify Dev":
266
+ ✓ #24255 — US-F003-001 — Xem Shared Kanban Board
267
+ ✓ #24256 — US-F002-001 — Tạo task mới
268
+ ✓ #24257 — US-F002-002 — Sửa task
269
+ — #24258 — US-F002-003 — Xóa task (không đổi — đã là Verify Dev)
270
+
271
+ Feature Tickets → "In Development":
272
+ ✓ #24253 — F-002 — Quản lý todo
273
+ — #24254 — F-003 — Shared dashboard (không đổi — đã là In Development)
274
+
275
+ {nếu có lỗi}
276
+ ✗ #24260 — US-F002-004 — ... → cập nhật thất bại: <lý do>
277
+ ```
278
+
279
+ ---
280
+
281
+ ## Verification Checklist
282
+
283
+ Trước khi cập nhật:
284
+ - [ ] `.claude/ado.yaml` tồn tại và có `environments` là array không rỗng
285
+ - [ ] Tất cả Features và User Stories trong `spec.md` đều có dòng `**ADO:**` với ticket ID hợp lệ
286
+ - [ ] State list lấy từ ADO qua `wit_get_work_item_type` — **không generate từ `environments`**, không hardcode
287
+ - [ ] State list đã qua **Environment-State Filtering**: chỉ hiển thị Deploy/Verify pairs tương ứng với environments trong config; general states giữ nguyên
288
+ - [ ] State selection dùng numbered list plain text — **không dùng `AskUserQuestion`** (số options vượt giới hạn 4)
289
+ - [ ] User đã xem preview và xác nhận trước khi gọi API
290
+
291
+ Khi cập nhật:
292
+ - [ ] Chỉ gọi API update cho ticket **chưa ở đúng state** — không update nếu state không đổi
293
+ - [ ] Gọi tuần tự, không batch update (để xử lý lỗi từng ticket riêng lẻ)
294
+ - [ ] Nếu 1 ticket fail → tiếp tục với ticket tiếp theo, không dừng toàn bộ
295
+ - [ ] Feature tickets chỉ update khi user **chủ động chọn "Có"** ở Bước 7
@@ -87,7 +87,7 @@ Lưu lại lựa chọn section.
87
87
 
88
88
  Từ raw requirement, agent xác định features và components liên quan, rồi load các file sau:
89
89
 
90
- - `specs/main/prd.md` — đọc Problem Statement, Target Users, Scope, Feature Index, Component Index
90
+ - `specs/main/prd.md` — đọc Problem Statement, Target Users, Scope, Feature Index, Component Index; **đặc biệt ghi nhận cột `ADO` trong bảng Features** — nếu feature đã có ticket ID thì lưu lại `{feature_id → ado_ticket_id, ado_ticket_title, ado_ticket_url}`
91
91
  - `specs/main/domain.md` — đọc Glossary và Shared Entities
92
92
  - `specs/main/feature/{F-XXX}-{slug}/frd.md` — cho mỗi feature liên quan (nếu file đã tồn tại)
93
93
  - `specs/main/component/{C-XXX}-{slug}/crd.md` — cho mỗi component bị touched (nếu file đã tồn tại)
@@ -163,6 +163,15 @@ Tổng hợp và viết draft `spec.md`:
163
163
 
164
164
  **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.
165
165
 
166
+ **ADO references từ prd.md:** Với mỗi Feature heading (`### Feature: <name> (<ID>)`) trong spec.md, nếu feature đó đã có ADO ticket trong `prd.md` → thêm ngay dòng `**ADO:**` bên dưới heading:
167
+
168
+ ```markdown
169
+ ### Feature: Đăng ký / Đăng nhập (F-001)
170
+ **ADO:** [#12345 — [SDLC-TEST] Đăng ký / Đăng nhập](https://dev.azure.com/...)
171
+ ```
172
+
173
+ Điều này đảm bảo `/ado-create` nhận biết feature đã có ticket và không tạo duplicate.
174
+
166
175
  **Cascade Proposals** — agent đề xuất delta cho main artifacts theo các targets sau (chỉ điền nếu thực sự có thay đổi, không thì ghi "Không có thay đổi đề xuất."):
167
176
 
168
177
  ### prd.md