spec-lite 1.1.8 → 1.1.9

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.1.8",
3
+ "version": "1.1.9",
4
4
  "description": "Spec-driven development kit for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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:** Đọc `git config user.email`. Tìm email này trong toàn bộ `team.PE + team.SE + team.DE` của ado.yaml.
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 tìm thấy** → hỏi bằng `AskUserQuestion`:
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 xác định email, resolve thành ADO identity ID bằng `mcp__azure-devops__core_get_identity_ids`.
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 → tiếp tục nhưng không set assignee; thông báo để user tự assign trên ADO sau.
42
+ Nếu resolve thất bại → **dừng 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
 
@@ -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):**
@@ -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:
@@ -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: