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.
- package/bin/cli.js +4 -0
- package/package.json +4 -2
- package/references/accessibility-checklist.md +160 -0
- package/references/orchestration-patterns.md +370 -0
- package/references/performance-checklist.md +153 -0
- package/references/security-checklist.md +134 -0
- package/references/testing-patterns.md +236 -0
- package/skills/ado-config/SKILL.md +349 -0
- package/skills/ado-create/SKILL.md +319 -0
- package/skills/ado-update/SKILL.md +295 -0
- package/skills/spec-new/SKILL.md +10 -1
- package/skills-overview.md +443 -0
|
@@ -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
|
package/skills/spec-new/SKILL.md
CHANGED
|
@@ -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
|