spec-lite 1.1.8 → 1.1.10
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
|
@@ -26,20 +26,24 @@ description: Tạo Feature và User Story tickets trên ADO từ spec.md của m
|
|
|
26
26
|
Chưa có .claude/ado.yaml. Hãy chạy /ado-config trước.
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
**Xác định current user:**
|
|
29
|
+
**Xác định current user:** Gọi `mcp__azure-devops__core_get_identity_ids` với descriptor `me` hoặc `[me]` để lấy identity của user đang authenticated với ADO. Từ kết quả trả về, lấy `providerDisplayName` hoặc `subjectDescriptor` rồi tìm email tương ứng trong toàn bộ `team.PE + team.SE + team.DE` của ado.yaml.
|
|
30
30
|
|
|
31
|
-
**Nếu tìm thấy** → dùng email đó làm assignee.
|
|
31
|
+
**Nếu tìm thấy** → dùng email đó làm assignee, dùng identity ID từ kết quả MCP (không cần gọi lại).
|
|
32
32
|
|
|
33
|
-
**Nếu không
|
|
33
|
+
**Nếu không resolve được (tool lỗi hoặc không match được email)** → hỏi bằng `AskUserQuestion`:
|
|
34
34
|
|
|
35
35
|
```
|
|
36
36
|
question: "Bạn là ai trong team? (dùng để assign ticket)"
|
|
37
37
|
options: [mỗi email trong team.PE + team.SE + team.DE thành 1 option]
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
Sau khi
|
|
40
|
+
Sau khi user chọn email, resolve thành ADO identity ID bằng `mcp__azure-devops__core_get_identity_ids`.
|
|
41
41
|
|
|
42
|
-
Nếu resolve thất bại →
|
|
42
|
+
Nếu resolve thất bại → **dừng và báo lỗi**. Không tạo ticket nếu không xác định được assignee:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
Không resolve được ADO identity ID cho <email>. Kiểm tra lại PAT token hoặc quyền truy cập ADO rồi thử lại.
|
|
46
|
+
```
|
|
43
47
|
|
|
44
48
|
---
|
|
45
49
|
|
|
@@ -300,6 +304,7 @@ Tìm section `## ADO Tickets` trong file.
|
|
|
300
304
|
|
|
301
305
|
Trước khi tạo ticket:
|
|
302
306
|
- [ ] `.claude/ado.yaml` tồn tại và `epic.id` là số nguyên hợp lệ
|
|
307
|
+
- [ ] Current ADO user đã được xác định và resolve thành identity ID — **nếu không xác định được thì dừng, không tạo ticket không có assignee**
|
|
303
308
|
- [ ] Integration được chọn có `spec.md` chứa ít nhất 1 Feature
|
|
304
309
|
- [ ] `frd.md` tìm được cho mỗi Feature (cảnh báo nếu thiếu, không dừng)
|
|
305
310
|
|
package/skills/build/SKILL.md
CHANGED
|
@@ -38,6 +38,38 @@ Chọn số integration:
|
|
|
38
38
|
- Nếu chỉ có 1 integration có task pending → chọn luôn, không hỏi
|
|
39
39
|
- Nếu tất cả đều done → thông báo: "Tất cả integration đã hoàn thành."
|
|
40
40
|
|
|
41
|
+
### Bước 0a: Gate check — plan.md phải approved
|
|
42
|
+
|
|
43
|
+
Đọc frontmatter của `specs/integrations/{slug}/plan.md`.
|
|
44
|
+
|
|
45
|
+
Nếu `plan.md` chưa tồn tại:
|
|
46
|
+
|
|
47
|
+
> ⛔ Chưa có `plan.md` cho integration **{slug}**.
|
|
48
|
+
>
|
|
49
|
+
> Để tiếp tục:
|
|
50
|
+
> 1. Chạy `/plan` để tạo plan.md và todo.md
|
|
51
|
+
> 2. Review và đổi `status: approved` trong plan.md
|
|
52
|
+
>
|
|
53
|
+
> Sau đó chạy lại `/build`.
|
|
54
|
+
|
|
55
|
+
**Dừng hoàn toàn.**
|
|
56
|
+
|
|
57
|
+
Nếu `plan.md` tồn tại nhưng `status` **không phải** `approved`:
|
|
58
|
+
|
|
59
|
+
> ⛔ `plan.md` của integration **{slug}** chưa được approve (status hiện tại: `{status}`).
|
|
60
|
+
>
|
|
61
|
+
> Để tiếp tục:
|
|
62
|
+
> 1. Review `specs/integrations/{slug}/plan.md`
|
|
63
|
+
> 2. Đổi `status: draft` → `status: approved` trong frontmatter
|
|
64
|
+
>
|
|
65
|
+
> Sau khi approve xong, chạy lại `/build`.
|
|
66
|
+
|
|
67
|
+
**Dừng hoàn toàn. Không tiếp tục.**
|
|
68
|
+
|
|
69
|
+
Nếu `status: approved` → tiếp tục sang Bước 0b.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
41
73
|
### Bước 0b: Tạo branch và chọn chế độ worktree
|
|
42
74
|
|
|
43
75
|
**Tạo branch (bắt buộc):**
|
package/skills/plan/SKILL.md
CHANGED
|
@@ -53,6 +53,32 @@ Nếu plan.md / todo.md đã tồn tại → hỏi trước khi ghi đè.
|
|
|
53
53
|
|
|
54
54
|
---
|
|
55
55
|
|
|
56
|
+
### Bước 1b: Gate check — spec.md và tech.md phải approved
|
|
57
|
+
|
|
58
|
+
Đọc frontmatter của `specs/integrations/{slug}/spec.md` và `specs/integrations/{slug}/tech.md`.
|
|
59
|
+
|
|
60
|
+
Nếu `tech.md` chưa tồn tại → coi như `status: missing`.
|
|
61
|
+
|
|
62
|
+
Kiểm tra từng file — nếu **bất kỳ file nào** chưa `approved`:
|
|
63
|
+
|
|
64
|
+
> ⛔ Không thể tạo plan.md — các artifact sau chưa được approve:
|
|
65
|
+
>
|
|
66
|
+
> - `spec.md` — status: `{status}` ← chỉ liệt kê nếu chưa approved
|
|
67
|
+
> - `tech.md` — status: `{status}` ← chỉ liệt kê nếu chưa approved hoặc chưa tồn tại
|
|
68
|
+
>
|
|
69
|
+
> Để tiếp tục:
|
|
70
|
+
> 1. Review từng file chưa approved (chạy `/spec-tech` trước nếu `tech.md` chưa có)
|
|
71
|
+
> 2. Apply Cascade Proposals (nếu có)
|
|
72
|
+
> 3. Đổi `status` thành `approved` trong frontmatter
|
|
73
|
+
>
|
|
74
|
+
> Sau khi approve xong, chạy lại `/plan`.
|
|
75
|
+
|
|
76
|
+
**Dừng hoàn toàn. Không tiếp tục.**
|
|
77
|
+
|
|
78
|
+
Nếu cả hai đều `approved` → tiếp tục sang Bước 2.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
56
82
|
### Bước 2: Load và surface context
|
|
57
83
|
|
|
58
84
|
Load:
|
package/skills/review/SKILL.md
CHANGED
|
@@ -31,5 +31,139 @@ git diff $(git merge-base HEAD $BASE)...HEAD
|
|
|
31
31
|
|
|
32
32
|
## Sau khi review
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
### Chỉ Nit/Optional/FYI hoặc không có finding
|
|
35
|
+
|
|
36
|
+
Approve và thông báo tiếp tục `/build` task tiếp theo.
|
|
37
|
+
|
|
38
|
+
### Có Critical hoặc Important
|
|
39
|
+
|
|
40
|
+
**Bước 1 — Tổng hợp findings thành tasks:**
|
|
41
|
+
|
|
42
|
+
Nhóm các findings thành tasks cụ thể có thể implement được. Mỗi finding Critical/Important là ít nhất một task. Đặt tên task bắt đầu bằng động từ, mô tả rõ việc phải sửa.
|
|
43
|
+
|
|
44
|
+
**Bước 2 — Đề xuất thêm phase mới vào plan.md và todo.md:**
|
|
45
|
+
|
|
46
|
+
Hiển thị preview phase sẽ được thêm:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
Phát hiện {N} Critical / {M} Important findings. Đề xuất thêm phase mới:
|
|
50
|
+
|
|
51
|
+
Phase Review: Fix review findings
|
|
52
|
+
|
|
53
|
+
T0XX · Fix {mô tả finding 1}
|
|
54
|
+
T0XY · Fix {mô tả finding 2}
|
|
55
|
+
...
|
|
56
|
+
|
|
57
|
+
Thêm phase này vào plan.md và todo.md, rồi chạy /build để fix?
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Hỏi user bằng `AskUserQuestion`:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
question: "Thêm phase Review vào plan.md/todo.md và chạy /build ngay?"
|
|
64
|
+
options:
|
|
65
|
+
- label: "Thêm phase và chạy /build"
|
|
66
|
+
description: "Thêm các tasks fix findings vào plan.md và todo.md, rồi gọi /build để thực thi"
|
|
67
|
+
- label: "Thêm phase nhưng không chạy /build"
|
|
68
|
+
description: "Chỉ cập nhật plan.md và todo.md, tự chạy /build sau"
|
|
69
|
+
- label: "Lưu vào techdebt.md"
|
|
70
|
+
description: "Ghi findings vào specs/integrations/{slug}/techdebt.md để theo dõi sau, không fix ngay"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Bước 3 — Nếu user chọn "Thêm phase" (cả hai option đầu):**
|
|
74
|
+
|
|
75
|
+
Xác định số phase tiếp theo từ plan.md (đếm số `### Phase` hiện có, cộng 1).
|
|
76
|
+
|
|
77
|
+
Xác định task ID tiếp theo từ plan.md (lấy task ID lớn nhất hiện có, cộng 1).
|
|
78
|
+
|
|
79
|
+
Append vào `plan.md` (trước section `## Definition of Done`):
|
|
80
|
+
|
|
81
|
+
```markdown
|
|
82
|
+
### Phase {N}: Review Findings
|
|
83
|
+
|
|
84
|
+
#### T{XXX} · {task title — bắt đầu bằng động từ}
|
|
85
|
+
|
|
86
|
+
**Mục tiêu:** {mô tả finding cần fix}
|
|
87
|
+
|
|
88
|
+
**depends:** {task ID cuối cùng trước phase này}
|
|
89
|
+
|
|
90
|
+
**Các bước:**
|
|
91
|
+
1. {bước fix cụ thể từ finding}
|
|
92
|
+
|
|
93
|
+
**Verification:**
|
|
94
|
+
- [ ] {điều kiện verify finding đã được fix}
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Append vào `todo.md`:
|
|
100
|
+
|
|
101
|
+
```markdown
|
|
102
|
+
### Phase {N}: Review Findings
|
|
103
|
+
- [ ] T{XXX} — {mô tả task fix}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Bước 4 — Nếu user chọn "Thêm phase và chạy /build":**
|
|
107
|
+
|
|
108
|
+
Sau khi cập nhật xong plan.md và todo.md, invoke ngay `/build` để thực thi phase Review vừa thêm.
|
|
109
|
+
|
|
110
|
+
**Bước 4 — Nếu user chọn "Lưu vào techdebt.md":**
|
|
111
|
+
|
|
112
|
+
Lấy short SHA hiện tại: `git rev-parse --short HEAD`.
|
|
113
|
+
|
|
114
|
+
Ghi findings vào `specs/integrations/{slug}/techdebt.md`.
|
|
115
|
+
|
|
116
|
+
Nếu file chưa tồn tại, tạo mới từ `.claude/templates/integrations/techdebt-template.md`, điền `slug`, `title`, `created`.
|
|
117
|
+
|
|
118
|
+
Append section mới vào cuối file (không ghi đè section cũ):
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
|
|
122
|
+
## {YYYY-MM-DD} — {short-sha}
|
|
123
|
+
|
|
124
|
+
- [ ] **Critical** — {mô tả finding 1}
|
|
125
|
+
- [ ] **Important** — {mô tả finding 2}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Sau khi ghi xong, thông báo:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
Đã lưu {N} findings vào specs/integrations/{slug}/techdebt.md.
|
|
132
|
+
Integration được đánh dấu có tech debt chưa xử lý.
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Đánh dấu techdebt đã resolved
|
|
138
|
+
|
|
139
|
+
Khi `/build` hoàn thành **thành công** một Phase Review, nó phải tìm và mark các techdebt findings tương ứng là resolved.
|
|
140
|
+
|
|
141
|
+
**Cơ chế liên kết:** Khi append Phase Review vào `plan.md` (Bước 3 ở trên), thêm field `resolves-techdebt` vào task đầu tiên của phase, trỏ đến section date trong techdebt.md:
|
|
142
|
+
|
|
143
|
+
```markdown
|
|
144
|
+
#### T{XXX} · Fix {mô tả finding 1}
|
|
145
|
+
|
|
146
|
+
**Mục tiêu:** {mô tả finding cần fix}
|
|
147
|
+
|
|
148
|
+
**depends:** {task ID cuối cùng trước phase này}
|
|
149
|
+
|
|
150
|
+
**resolves-techdebt:** {YYYY-MM-DD} — {short-sha}
|
|
151
|
+
|
|
152
|
+
**Các bước:**
|
|
153
|
+
...
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**Khi `/build` hoàn thành Phase Review:**
|
|
157
|
+
|
|
158
|
+
1. Đọc field `resolves-techdebt` từ task đầu tiên của Phase Review trong `plan.md`
|
|
159
|
+
2. Tìm section tương ứng trong `techdebt.md` (match theo `## {YYYY-MM-DD} — {short-sha}`)
|
|
160
|
+
3. Với mỗi dòng `- [ ]` trong section đó → đổi thành `- [x]` và append ` *(resolved by T{XXX})*`:
|
|
161
|
+
|
|
162
|
+
```markdown
|
|
163
|
+
## 2026-05-08 — abc1234
|
|
164
|
+
|
|
165
|
+
- [x] **Critical** — {mô tả finding 1} *(resolved by T005)*
|
|
166
|
+
- [x] **Important** — {mô tả finding 2} *(resolved by T005)*
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
4. Nếu không tìm được field `resolves-techdebt` hoặc không tìm được section trong techdebt.md → bỏ qua, không báo lỗi.
|
|
@@ -56,6 +56,27 @@ Nếu integration đã có `tech.md` → hỏi trước khi tiếp tục:
|
|
|
56
56
|
|
|
57
57
|
---
|
|
58
58
|
|
|
59
|
+
### Bước 1b: Gate check — spec.md phải approved
|
|
60
|
+
|
|
61
|
+
Đọc frontmatter của `specs/integrations/{slug}/spec.md`.
|
|
62
|
+
|
|
63
|
+
Nếu `status` **không phải** `approved`:
|
|
64
|
+
|
|
65
|
+
> ⛔ `spec.md` của integration **{slug}** chưa được approve (status hiện tại: `{status}`).
|
|
66
|
+
>
|
|
67
|
+
> Để tiếp tục:
|
|
68
|
+
> 1. Review `specs/integrations/{slug}/spec.md`
|
|
69
|
+
> 2. Apply Cascade Proposals vào main artifacts (nếu có)
|
|
70
|
+
> 3. Đổi `status: draft` → `status: approved` trong frontmatter
|
|
71
|
+
>
|
|
72
|
+
> Sau khi approve xong, chạy lại `/spec-tech`.
|
|
73
|
+
|
|
74
|
+
**Dừng hoàn toàn. Không tiếp tục.**
|
|
75
|
+
|
|
76
|
+
Nếu `status: approved` → tiếp tục sang Bước 2.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
59
80
|
### Bước 2: Load context
|
|
60
81
|
|
|
61
82
|
Load các file sau:
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
slug: "{slug}"
|
|
3
|
+
created: {YYYY-MM-DD}
|
|
4
|
+
referenced_by:
|
|
5
|
+
- skills/review/SKILL.md > Bước 4 — Lưu vào techdebt.md
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Tech Debt — {title}
|
|
9
|
+
|
|
10
|
+
## {YYYY-MM-DD} — {short-sha}
|
|
11
|
+
|
|
12
|
+
- [ ] **Critical** — {mô tả finding}
|
|
13
|
+
- [ ] **Important** — {mô tả finding}
|