adspecs 0.1.19 → 0.1.21

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.
Files changed (74) hide show
  1. package/.adspecs/feature.json +16 -16
  2. package/.adspecs/feature.yml +28 -28
  3. package/.adspecs/paths.json +17 -17
  4. package/.adspecs/templates/04-/345/211/215/347/253/257/345/212/237/350/203/275/350/256/276/350/256/241/346/250/241/346/235/277.md +1 -1
  5. package/.adspecs/templates/05-/345/220/216/347/253/257/344/273/273/345/212/241/346/270/205/345/215/225/346/250/241/346/235/277.md +613 -724
  6. package/.adspecs/templates/05b-/345/211/215/347/253/257/344/273/273/345/212/241/346/270/205/345/215/225/346/250/241/346/235/277.md +51 -51
  7. package/.claude-plugin/marketplace.json +23 -23
  8. package/.claude-plugin/plugin.json +18 -18
  9. package/.qoder-plugin/plugin.json +31 -31
  10. package/CLAUDE.md +1 -5
  11. package/INSTALL.md +3 -3
  12. package/README.md +395 -395
  13. package/bin/adspecs.js +129 -129
  14. package/hooks/commit-queue.js +245 -245
  15. package/hooks/hooks.json +63 -63
  16. package/hooks/session-start.js +44 -44
  17. package/hooks/wiki-queue.js +127 -127
  18. package/package.json +61 -61
  19. package/references/ant6-front-standard/index.md +99 -99
  20. package/references/antd-front-demo/public/mockServiceWorker.js +361 -361
  21. package/references/ecp-end-standard/index.md +63 -63
  22. package/references/python-end-standard/01-Python/345/220/216/347/253/257/347/274/226/347/240/201/350/247/204/350/214/203.md +372 -372
  23. package/references/python-end-standard/02-/346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/344/270/216/344/275/277/347/224/250/350/247/204/350/214/203.md +226 -226
  24. package/references/python-end-standard/03-Celery/345/274/202/346/255/245/344/273/273/345/212/241/350/247/204/350/214/203.md +237 -237
  25. package/references/python-end-standard/04-Redis/344/275/277/347/224/250/350/247/204/350/214/203.md +231 -231
  26. package/scripts/postinstall.js +107 -107
  27. package/scripts/sync-version.js +105 -105
  28. package/skills/.claude/.wiki-update-queue +26 -26
  29. package/skills/adspecs-constitution/SKILL.md +157 -0
  30. package/skills/adspecs-export-word/SKILL.md +498 -498
  31. package/skills/adspecs-export-word/references/md-to-docx.js +862 -862
  32. package/skills/adspecs-export-word/references/package-lock.json +220 -220
  33. package/skills/adspecs-export-word/references/package.json +10 -10
  34. package/skills/adspecs-front-prototype/SKILL.md +405 -405
  35. package/skills/adspecs-front-spec/SKILL.md +4 -4
  36. package/skills/adspecs-front-tasks/SKILL.md +213 -173
  37. package/skills/adspecs-plan/SKILL.md +59 -69
  38. package/skills/adspecs-prd/SKILL.md +13 -5
  39. package/skills/adspecs-prd-to-demo/SKILL.md +532 -0
  40. package/skills/adspecs-tasks/SKILL.md +175 -204
  41. package/skills/adspecs-update-status/SKILL.md +382 -382
  42. package/skills/adspecs-utest/SKILL.md +107 -116
  43. package/skills/grill-me/SKILL.md +7 -0
  44. package/skills/grill-me/agents/openai.yaml +5 -0
  45. package/skills/playwright-cli/SKILL.md +420 -0
  46. package/skills/playwright-cli/references/element-attributes.md +23 -0
  47. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  48. package/skills/playwright-cli/references/request-mocking.md +87 -0
  49. package/skills/playwright-cli/references/running-code.md +241 -0
  50. package/skills/playwright-cli/references/session-management.md +225 -0
  51. package/skills/playwright-cli/references/storage-state.md +275 -0
  52. package/skills/playwright-cli/references/test-generation.md +433 -0
  53. package/skills/playwright-cli/references/tracing.md +139 -0
  54. package/skills/playwright-cli/references/video-recording.md +143 -0
  55. package/skills/playwright-trace/SKILL.md +171 -0
  56. package/skills/project-init/SKILL.md +93 -22
  57. package/skills/project-init/references/front-demo/.claude/settings.local.json +9 -0
  58. package/skills/wiki-update/SKILL.md +232 -232
  59. package/src/commands/doctor.js +197 -197
  60. package/src/commands/init.js +83 -83
  61. package/src/commands/plugin.js +165 -165
  62. package/src/commands/update.js +87 -87
  63. package/src/lib/area-scanner.js +129 -129
  64. package/src/lib/copier.js +104 -104
  65. package/src/lib/dir-utils.js +161 -133
  66. package/src/lib/json-merge.js +114 -114
  67. package/src/lib/paths-defaults.js +37 -37
  68. package/src/lib/prompts.js +428 -347
  69. package/src/lib/readme-gen.js +143 -143
  70. package/src/lib/report.js +338 -327
  71. package/src/lib/scaffolder.js +551 -518
  72. package/src/lib/short-name.js +36 -36
  73. package/src/utils.js +80 -80
  74. package/references/antd-front-demo/.env +0 -15
@@ -1,382 +1,382 @@
1
- ---
2
- name: adspecs-update-status
3
- description: "更新 .adspecs/feature.json 中各阶段数组的功能状态值。首次执行时输出功能追踪矩阵(各功能所处阶段、状态、创建时间及汇总统计)。支持 requirement、prd、frontDemos、endDesigns、frontDesigns、endCodes、unitTests、situationTests、uats、deploys 十类数组。Use when the user asks to update feature status, change stage status, mark requirement as reviewed, or update feature.json status."
4
- argument-hint: "[<功能ID> <状态值>] [--category <数组类别>] [--list]"
5
- user-invocable: true
6
- ---
7
-
8
- # 功能状态更新 (Feature Status Update)
9
-
10
- ## 概述
11
-
12
- 管理 `.adspecs/feature.json` 中各开发阶段数组里功能条目的 `status` 状态值。首次执行时自动输出**功能追踪矩阵**,展示各功能所处阶段、当前状态和创建时间,并按阶段和状态进行汇总统计。支持单个更新或批量更新。
13
-
14
- ## 适用场景
15
-
16
- - 查看当前各阶段功能的状态分布(功能追踪矩阵)
17
- - 需求评审通过后,将 `requirement` 中的状态从"草稿"改为"评审通过"
18
- - PRD 进入评审阶段,更新 `prd` 数组中的状态
19
- - 系统设计完成评审,更新 `endDesigns` 中的状态
20
- - 批量推进功能状态
21
-
22
- ## 用户输入
23
-
24
- ```text
25
- $ARGUMENTS
26
- ```
27
-
28
- ### 参数说明
29
-
30
- | 参数 | 必填 | 说明 | 示例 |
31
- | ------------ | ---- | --------------------------------------------------------------------- | --------------------------------- |
32
- | `<功能ID>` | 否 | 功能条目的 `id` 字段值(支持前缀匹配),省略时仅输出追踪矩阵 | `p05-01-aluminum-ingot-receiving` |
33
- | `<状态值>` | 是 | 目标状态:`草稿` / `评审中` / `修改中` / `评审通过` / `暂停` / `取消` | `评审通过` |
34
- | `--category` | 是 | 指定数组类别(不指定时自动搜索全部数组) | `--category requirement` |
35
- | `--list` | 否 | 仅输出功能追踪矩阵(同省略参数) | `--list` |
36
-
37
- ### 状态值映射
38
-
39
- | 中文显示 | 内部存储值 | 说明 |
40
- | -------- | ----------- | ---------------------- |
41
- | 草稿 | `drafting` | 初始创建,尚未提交评审 |
42
- | 评审中 | `reviewing` | 已提交评审,等待审核 |
43
- | 修改中 | `revising` | 评审发现问题,正在修改 |
44
- | 通过 | `approved` | 评审通过,进入下一阶段 |
45
- | 暂停 | `paused` | 功能暂停,暂不推进 |
46
- | 取消 | `canceled` | 功能取消,不再推进 |
47
-
48
- ### phase 阶段数组类别
49
-
50
- | 类别名称 | 对应 JSON 键 | 阶段说明 |
51
- | ------------ | ---------------- | ------------------ |
52
- | 业务需求 | `requirement` | 业务需求分析阶段 |
53
- | 产品需求 | `prd` | 产品需求说明书阶段 |
54
- | 前端演示 | `frontDemos` | 前端演示项目 |
55
- | 后端设计 | `endDesigns` | 后端系统设计阶段 |
56
- | 前端设计 | `frontDesigns` | 前端功能设计阶段 |
57
- | 后端代码 | `endCodes` | 后端代码实现阶段 |
58
- | 前端代码 | `frontCodes` | 前端代码实现阶段 |
59
- | 单元测试 | `unitTests` | 单元测试阶段 |
60
- | 集成测试 | `situationTests` | 系统集成测试阶段 |
61
- | 代码评审 | `codeReviews` | 代码评审阶段 |
62
- | 用户验收测试 | `uats` | 用户验收测试阶段 |
63
- | 部署 | `deploys` | 部署上线阶段 |
64
-
65
- ## CR 状态机
66
-
67
- ```mermaid
68
- stateDiagram-v2
69
- [*] --> drafting
70
- drafting --> requirement_reviewing: review-requirement
71
- requirement_reviewing --> requirement_approved: approve-requirement
72
- requirement_approved --> tech_designing: write-tech-design
73
- tech_designing --> tech_design_review_pending: write-tech-design complete
74
- tech_design_review_pending --> tech_designing: review-tech-design block
75
- tech_design_review_pending --> tech_design_reviewed: approve-tech-design
76
- tech_design_reviewed --> task_breakdown: write-dev-tasks
77
- task_breakdown --> developing: approve-dev-start
78
- developing --> code_reviewing: review-code pass
79
- code_reviewing --> code_approved: approve-code
80
- code_approved --> merging: merge-feature-branch
81
- merging --> writing_back: writeback-prd-sdd
82
- writing_back --> archived: cr-archive
83
- ```
84
-
85
- `human_approval` 只表示人工确认,不直接改状态。所有状态推进必须由显式 Skill 完成。`tech-design-review-pending` 同时覆盖”SDD 已写完待自动 Review”和”自动 Review 已通过待人工审批”,因此恢复/看板/人工接续时必须读取 `review-annotations/sdd.yml`:只有 `verdict=pass` 且 `blockers=[]` 时,下一步才是 `human_approval -> approve-tech-design`。
86
-
87
- ### 状态流转表
88
-
89
- | # | 当前状态 | 目标状态 | 触发 Skill | 触发条件 | 说明 |
90
- | --- | ---------------------------- | ---------------------------- | ----------------------------- | --------------------------------------- | -------------------------------------------------------------------------------------- |
91
- | 1 | `[*]`(初始) | `drafting` | CR 注册 | 用户发起 `/requirement` | 创建 CR 目录与 `cr.md`,进入需求草稿阶段 |
92
- | 2 | `drafting` | `requirement_reviewing` | `review-requirement` | PRD 草稿完成 | 自动需求评审;若产出 blockers 则回退 `drafting` 修复,最多 3 次 |
93
- | 3 | `requirement_reviewing` | `requirement_approved` | `approve-requirement` | `verdict=pass` 且人工确认 | 需求评审通过后人工审批推进 |
94
- | 4 | `requirement_approved` | `tech_designing` | `write-tech-design` | 需求已审批 | 开始编写技术设计文档(SDD) |
95
- | 5 | `tech_designing` | `tech_design_review_pending` | `write-tech-design`(完成) | SDD 编写完成 | SDD 写完后进入待评审状态 |
96
- | 6 | `tech_design_review_pending` | `tech_designing` | `review-tech-design`(block) | 评审发现 blockers | SDD 评审不通过,回到设计修订,最多 3 次 |
97
- | 7 | `tech_design_review_pending` | `tech_design_reviewed` | `approve-tech-design` | `verdict=pass` 且人工确认 | 技术设计评审通过后人工审批推进 |
98
- | 8 | `tech_design_reviewed` | `task_breakdown` | `write-dev-tasks` | 技术设计已审批 | 基于已审批的 SDD 拆解开发任务 |
99
- | 9 | `task_breakdown` | `developing` | `approve-dev-start` | 任务拆解完成且人工确认 | 开发启动确认,进入编码阶段 |
100
- | 10 | `developing` | `code_reviewing` | `review-code`(pass) | 代码实现完成且测试报告 `status=pass` | 代码评审通过,进入代码审批待确认 |
101
- | 11 | `code_reviewing` | `developing` | `review-code`(block) | 评审发现 blockers | 代码评审不通过,按 `replayNodes` 重跑修复闭环,最多 3 次 |
102
- | 12 | `code_reviewing` | `code_approved` | `approve-code` | `verdict=pass` 且测试证据完备且人工确认 | 代码审批通过 |
103
- | 13 | `code_approved` | `merging` | `merge-feature-branch` | 代码已审批 | 合并特性分支到主干 |
104
- | 14 | `merging` | `writing_back` | `writeback-prd-sdd` | 分支合并完成 | 将 PRD / SDD 回写到 `specs/{id}/`,任务回写到 `delivery/task/` |
105
- | 15 | `writing_back` | `archived` | `cr-archive` | 回写完成 | CR 从 `_backlog.yml` 移至 `_history.yml`,保留 `change-requests/{CR-ID}/` 作为历史痕迹 |
106
-
107
- ## 工作流程
108
-
109
- ### 步骤 0:定位并读取 feature.json
110
-
111
- 1. 检查项目根目录下是否存在 `.adspecs/feature.json`
112
- 2. 如不存在 → 输出错误:`❌ 未找到 .adspecs/feature.json,请先执行 /project-init 初始化项目`
113
- 3. 读取文件内容
114
-
115
- ### 步骤 1:输出功能追踪矩阵
116
-
117
- **每次执行本技能时,必须先输出功能追踪矩阵**,然后再执行后续的状态更新操作。
118
-
119
- 遍历 `feature.json` 中的十一个阶段数组,按以下格式输出:
120
-
121
- ```markdown
122
- ## 功能追踪矩阵 📊
123
-
124
- > 生成时间:{当前日期时间}
125
-
126
- ### 各阶段功能明细
127
-
128
- #### 📋 业务需求 (requirement)
129
-
130
- | ID | 名称 | 状态 | 创建时间 | 目录 |
131
- | ---- | ------ | ------------ | --------- | ----------- |
132
- | {id} | {name} | {status中文} | {created} | {directory} |
133
-
134
- #### 📄 产品需求 (prd)
135
-
136
- | ID | 名称 | 状态 | 创建时间 | 目录 |
137
- | ---- | ------ | ------------ | --------- | ----------- |
138
- | {id} | {name} | {status中文} | {created} | {directory} |
139
-
140
- #### 🎨 前端演示 (frontDemos)
141
-
142
- | ID | 名称 | 状态 | 创建时间 | 目录 |
143
- | ---- | ------ | ------------ | --------- | ----------- |
144
- | {id} | {name} | {status中文} | {created} | {directory} |
145
-
146
- #### 🔧 后端设计 (endDesigns)
147
-
148
- | ID | 名称 | 状态 | 创建时间 | 目录 |
149
- | ---- | ------ | ------------ | --------- | ----------- |
150
- | {id} | {name} | {status中文} | {created} | {directory} |
151
-
152
- #### 🎯 前端设计 (frontDesigns)
153
-
154
- | ID | 名称 | 状态 | 创建时间 | 目录 |
155
- | ---- | ------ | ------------ | --------- | ----------- |
156
- | {id} | {name} | {status中文} | {created} | {directory} |
157
-
158
- #### 💻 后端代码 (endCodes)
159
-
160
- | ID | 名称 | 状态 | 创建时间 | 目录 |
161
- | ---- | ------ | ------------ | --------- | ----------- |
162
- | {id} | {name} | {status中文} | {created} | {directory} |
163
-
164
- #### 🖥️ 前端代码 (frontCodes)
165
-
166
- | ID | 名称 | 状态 | 创建时间 | 目录 |
167
- | ---- | ------ | ------------ | --------- | ----------- |
168
- | {id} | {name} | {status中文} | {created} | {directory} |
169
-
170
- #### 🧪 单元测试 (unitTests)
171
-
172
- | ID | 名称 | 状态 | 创建时间 | 目录 |
173
- | ---- | ------ | ------------ | --------- | ----------- |
174
- | {id} | {name} | {status中文} | {created} | {directory} |
175
-
176
- #### 🔬 集成测试 (situationTests)
177
-
178
- | ID | 名称 | 状态 | 创建时间 | 目录 |
179
- | ---- | ------ | ------------ | --------- | ----------- |
180
- | {id} | {name} | {status中文} | {created} | {directory} |
181
-
182
- #### ✅ 用户验收测试 (uats)
183
-
184
- | ID | 名称 | 状态 | 创建时间 | 目录 |
185
- | ---- | ------ | ------------ | --------- | ----------- |
186
- | {id} | {name} | {status中文} | {created} | {directory} |
187
-
188
- #### 🚀 部署 (depolys)
189
-
190
- | ID | 名称 | 状态 | 创建时间 | 目录 |
191
- | ---- | ------ | ------------ | --------- | ----------- |
192
- | {id} | {name} | {status中文} | {created} | {directory} |
193
-
194
- > 空数组显示 "(暂无条目)"
195
-
196
- ### 汇总统计
197
-
198
- #### 按阶段统计
199
-
200
- | 阶段 | 条目数 | 草稿 | 评审中 | 修改中 | 评审通过 |
201
- | -------- | ----------- | -------- | -------- | -------- | -------- |
202
- | 业务需求 | {N} | {n} | {n} | {n} | {n} |
203
- | 产品需求 | {N} | {n} | {n} | {n} | {n} |
204
- | 前端演示 | {N} | {n} | {n} | {n} | {n} |
205
- | 后端设计 | {N} | {n} | {n} | {n} | {n} |
206
- | 前端设计 | {N} | {n} | {n} | {n} | {n} |
207
- | 后端代码 | {N} | {n} | {n} | {n} | {n} |
208
- | 前端代码 | {N} | {n} | {n} | {n} | {n} |
209
- | 单元测试 | {N} | {n} | {n} | {n} | {n} |
210
- | 集成测试 | {N} | {n} | {n} | {n} | {n} |
211
- | 用户验收 | {N} | {n} | {n} | {n} | {n} |
212
- | 部署 | {N} | {n} | {n} | {n} | {n} |
213
- | **合计** | **{total}** | **{t1}** | **{t2}** | **{t3}** | **{t4}** |
214
-
215
- #### 按状态统计
216
-
217
- | 状态 | 数量 | 占比 |
218
- | ------------------- | ----------- | -------- |
219
- | 草稿 (drafting) | {N} | {%} |
220
- | 评审中 (reviewing) | {N} | {%} |
221
- | 修改中 (revising) | {N} | {%} |
222
- | 评审通过 (approved) | {N} | {%} |
223
- | **合计** | **{total}** | **100%** |
224
- ```
225
-
226
- **输出规则**:
227
-
228
- - 状态值自动转换为中文显示(`drafting` → 草稿、`reviewing` → 评审中、`revising` → 修改中、`approved` → 评审通过)
229
- - 空数组在明细表中显示"(暂无条目)",在汇总统计中显示 0
230
- - 占比保留一位小数
231
- - 如果 `$ARGUMENTS` 仅为 `--list` 或为空 → 输出追踪矩阵后结束,不执行后续更新步骤
232
-
233
- ### 步骤 2:解析参数
234
-
235
- 从 `$ARGUMENTS` 中解析(如果提供了功能 ID 和状态值):
236
-
237
- - `feature_id`:功能 ID
238
- - `target_status`:目标状态(支持中文或英文值)
239
- - `category`:数组类别(可选)
240
-
241
- **状态值转换**:
242
-
243
- - 用户输入"草稿" → 存储 `drafting`
244
- - 用户输入"评审中" → 存储 `reviewing`
245
- - 用户输入"修改中" → 存储 `revising`
246
- - 用户输入"评审通过" → 存储 `approved`
247
- - 用户直接输入英文值(如 `approved`)→ 直接使用
248
-
249
- **类别名称转换**:
250
-
251
- - 用户输入"业务需求"或"requirement" → `requirement`
252
- - 用户输入"产品需求"或"prd" → `prd`
253
- - 用户输入"前端演示"或"frontDemos" → `frontDemos`
254
- - 用户输入"后端设计"或"endDesigns" → `endDesigns`
255
- - 用户输入"前端设计"或"frontDesigns" → `frontDesigns`
256
- - 用户输入"后端代码"或"endCodes" → `endCodes`
257
- - 用户输入"前端代码"或"frontCodes" → `frontCodes`
258
- - 用户输入"单元测试"或"unitTests" → `unitTests`
259
- - 用户输入"集成测试"或"situationTests" → `situationTests`
260
- - 用户输入"用户验收"或"uats" → `uats`
261
- - 用户输入"部署"或"depolys" → `depolys`
262
-
263
- ### 步骤 3:查找匹配条目
264
-
265
- 1. 如果指定了 `category` → 仅在对应数组中搜索
266
- 2. 如果未指定 `category` → 按以下顺序搜索全部数组:
267
- `requirement` → `prd` → `frontDemos` → `endDesigns` → `frontDesigns` → `endCodes` → `frontCodes` → `unitTests` → `situationTests` → `uats` → `depolys`
268
-
269
- 3. **匹配规则**(按优先级):
270
- - **精确匹配**:`id` 字段完全等于 `feature_id`
271
- - **前缀匹配**:`id` 字段以 `feature_id` 开头(当精确匹配无结果时)
272
- - **名称匹配**:`name` 字段包含 `feature_id`(当前缀匹配也无结果时)
273
-
274
- 4. 如果找到多个匹配 → 列出所有匹配项,询问用户确认要更新哪一个
275
- 5. 如果无匹配 → 输出错误:`❌ 未找到匹配的功能条目(ID: {feature_id}),请检查 ID 是否正确`
276
-
277
- ### 步骤 4:执行更新
278
-
279
- 1. 显示当前状态和目标状态:
280
-
281
- ```
282
- 📋 功能: {name}
283
- 📂 ID: {id}
284
- 📁 目录: {directory}
285
- 🔄 状态变更: {旧状态中文} → {新状态中文}
286
- ```
287
-
288
- 2. 将匹配条目的 `status` 字段更新为目标状态值
289
-
290
- ### 步骤 5:写回文件
291
-
292
- 1. 使用 Write 工具将更新后的 JSON 写回 `.adspecs/feature.json`
293
- 2. 保持 2-space 缩进格式
294
- 3. 保持文件末尾有一个换行符
295
-
296
- 4. **同步 YAML 文件**:如果项目根目录下存在 `.adspecs/feature.yml`,将更新后的数据同步写入该文件:
297
- - 读取刚写入的 `feature.json` 内容
298
- - 转换为 YAML 格式(保持键顺序一致)
299
- - 使用 Write 工具写回 `.adspecs/feature.yml`
300
- - YAML 文件头部保留注释说明(`# adspecs Feature Tracking - YAML format`)
301
- - 如果 `feature.yml` 不存在,跳过此步骤(不自动创建)
302
-
303
- ### 步骤 6:输出结果
304
-
305
- ```
306
- ✅ 状态更新完成
307
-
308
- 功能: {name}
309
- ID: {id}
310
- 类别: {类别中文名称}
311
- 状态: {旧状态中文} → {新状态中文}
312
- ```
313
-
314
- ### 批量更新模式
315
-
316
- 当 `feature_id` 使用通配符或关键词匹配到多个条目时,支持批量更新。
317
-
318
- **触发条件**:
319
-
320
- - `feature_id` 为 `*` 或 `all` → 更新指定类别(或全部类别)中的所有条目
321
- - `feature_id` 匹配到多个条目且用户确认批量更新
322
-
323
- **执行流程**:
324
-
325
- 1. 列出所有将被更新的条目及其当前状态
326
- 2. 询问用户确认:`确认将以上 {N} 个条目的状态更新为 {目标状态}?`
327
- 3. 用户确认后,批量更新所有匹配条目
328
- 4. 输出批量更新结果摘要
329
-
330
- ## 扩展钩子
331
-
332
- ### 执行前检查
333
-
334
- 检查项目根目录下是否存在 `.adspecs/extensions.yml`。如果存在且配置了 `before_update_status` 钩子,执行相应操作。
335
-
336
- ### 执行后钩子
337
-
338
- 状态更新完成后,检查 `.adspecs/extensions.yml` 中 `hooks.after_update_status` 键下的条目,按规则处理。
339
-
340
- ## 错误处理
341
-
342
- | 场景 | 处理方式 |
343
- | -------------------------------------- | ------------------------------------------------------- |
344
- | `.adspecs/feature.json` 不存在 | 输出错误并提示执行 `/project-init` |
345
- | `feature.json` 格式错误(非有效 JSON) | 输出错误并提示检查文件格式 |
346
- | 功能 ID 未找到 | 输出错误并列出所有可用 ID(前 10 个) |
347
- | 状态值无效 | 输出错误并列出有效状态值 |
348
- | 目标数组不存在或为 null | 输出警告并跳过该数组 |
349
- | 条目当前状态已与目标相同 | 输出提示 `ℹ️ 状态未变更(当前已是 {状态})`,不写入文件 |
350
-
351
- ## 使用示例
352
-
353
- ```bash
354
- # 仅查看功能追踪矩阵
355
- /adspecs-update-status
356
-
357
- # 更新业务需求状态为评审通过
358
- /adspecs-update-status p05-01-aluminum-ingot-receiving 评审通过 --category requirement
359
-
360
- # 自动搜索所有数组,找到匹配 ID 后更新
361
- /adspecs-update-status p05-01 评审中
362
-
363
- # 列出所有功能状态(同省略参数)
364
- /adspecs-update-status --list
365
-
366
- # 批量更新所有业务需求为评审通过
367
- /adspecs-update-status all 评审通过 --category requirement
368
-
369
- # 使用中文类别名
370
- /adspecs-update-status p05-01 草稿 --category 后端设计
371
- ```
372
-
373
- ## 完成标志
374
-
375
- - [ ] 已正确定位并读取 `.adspecs/feature.json` 文件
376
- - [ ] 已输出功能追踪矩阵(含各阶段明细和汇总统计)
377
- - [ ] 已正确解析功能 ID 和目标状态值(如有提供)
378
- - [ ] 已按匹配规则找到目标功能条目(如有提供)
379
- - [ ] 状态值已正确转换(中文 → 英文存储值)
380
- - [ ] 已更新 `status` 字段并写回 `feature.json`(保持 JSON 格式)
381
- - [ ] 已同步 `feature.yml`(如存在)
382
- - [ ] 已输出更新结果(含变更前后状态对比)
1
+ ---
2
+ name: adspecs-update-status
3
+ description: "更新 .adspecs/feature.json 中各阶段数组的功能状态值。首次执行时输出功能追踪矩阵(各功能所处阶段、状态、创建时间及汇总统计)。支持 requirement、prd、frontDemos、endDesigns、frontDesigns、endCodes、unitTests、situationTests、uats、deploys 十类数组。Use when the user asks to update feature status, change stage status, mark requirement as reviewed, or update feature.json status."
4
+ argument-hint: "[<功能ID> <状态值>] [--category <数组类别>] [--list]"
5
+ user-invocable: true
6
+ ---
7
+
8
+ # 功能状态更新 (Feature Status Update)
9
+
10
+ ## 概述
11
+
12
+ 管理 `.adspecs/feature.json` 中各开发阶段数组里功能条目的 `status` 状态值。首次执行时自动输出**功能追踪矩阵**,展示各功能所处阶段、当前状态和创建时间,并按阶段和状态进行汇总统计。支持单个更新或批量更新。
13
+
14
+ ## 适用场景
15
+
16
+ - 查看当前各阶段功能的状态分布(功能追踪矩阵)
17
+ - 需求评审通过后,将 `requirement` 中的状态从"草稿"改为"评审通过"
18
+ - PRD 进入评审阶段,更新 `prd` 数组中的状态
19
+ - 系统设计完成评审,更新 `endDesigns` 中的状态
20
+ - 批量推进功能状态
21
+
22
+ ## 用户输入
23
+
24
+ ```text
25
+ $ARGUMENTS
26
+ ```
27
+
28
+ ### 参数说明
29
+
30
+ | 参数 | 必填 | 说明 | 示例 |
31
+ | ------------ | ---- | --------------------------------------------------------------------- | --------------------------------- |
32
+ | `<功能ID>` | 否 | 功能条目的 `id` 字段值(支持前缀匹配),省略时仅输出追踪矩阵 | `p05-01-aluminum-ingot-receiving` |
33
+ | `<状态值>` | 是 | 目标状态:`草稿` / `评审中` / `修改中` / `评审通过` / `暂停` / `取消` | `评审通过` |
34
+ | `--category` | 是 | 指定数组类别(不指定时自动搜索全部数组) | `--category requirement` |
35
+ | `--list` | 否 | 仅输出功能追踪矩阵(同省略参数) | `--list` |
36
+
37
+ ### 状态值映射
38
+
39
+ | 中文显示 | 内部存储值 | 说明 |
40
+ | -------- | ----------- | ---------------------- |
41
+ | 草稿 | `drafting` | 初始创建,尚未提交评审 |
42
+ | 评审中 | `reviewing` | 已提交评审,等待审核 |
43
+ | 修改中 | `revising` | 评审发现问题,正在修改 |
44
+ | 通过 | `approved` | 评审通过,进入下一阶段 |
45
+ | 暂停 | `paused` | 功能暂停,暂不推进 |
46
+ | 取消 | `canceled` | 功能取消,不再推进 |
47
+
48
+ ### phase 阶段数组类别
49
+
50
+ | 类别名称 | 对应 JSON 键 | 阶段说明 |
51
+ | ------------ | ---------------- | ------------------ |
52
+ | 业务需求 | `requirement` | 业务需求分析阶段 |
53
+ | 产品需求 | `prd` | 产品需求说明书阶段 |
54
+ | 前端演示 | `frontDemos` | 前端演示项目 |
55
+ | 后端设计 | `endDesigns` | 后端系统设计阶段 |
56
+ | 前端设计 | `frontDesigns` | 前端功能设计阶段 |
57
+ | 后端代码 | `endCodes` | 后端代码实现阶段 |
58
+ | 前端代码 | `frontCodes` | 前端代码实现阶段 |
59
+ | 单元测试 | `unitTests` | 单元测试阶段 |
60
+ | 集成测试 | `situationTests` | 系统集成测试阶段 |
61
+ | 代码评审 | `codeReviews` | 代码评审阶段 |
62
+ | 用户验收测试 | `uats` | 用户验收测试阶段 |
63
+ | 部署 | `deploys` | 部署上线阶段 |
64
+
65
+ ## CR 状态机
66
+
67
+ ```mermaid
68
+ stateDiagram-v2
69
+ [*] --> drafting
70
+ drafting --> requirement_reviewing: review-requirement
71
+ requirement_reviewing --> requirement_approved: approve-requirement
72
+ requirement_approved --> tech_designing: write-tech-design
73
+ tech_designing --> tech_design_review_pending: write-tech-design complete
74
+ tech_design_review_pending --> tech_designing: review-tech-design block
75
+ tech_design_review_pending --> tech_design_reviewed: approve-tech-design
76
+ tech_design_reviewed --> task_breakdown: write-dev-tasks
77
+ task_breakdown --> developing: approve-dev-start
78
+ developing --> code_reviewing: review-code pass
79
+ code_reviewing --> code_approved: approve-code
80
+ code_approved --> merging: merge-feature-branch
81
+ merging --> writing_back: writeback-prd-sdd
82
+ writing_back --> archived: cr-archive
83
+ ```
84
+
85
+ `human_approval` 只表示人工确认,不直接改状态。所有状态推进必须由显式 Skill 完成。`tech-design-review-pending` 同时覆盖”SDD 已写完待自动 Review”和”自动 Review 已通过待人工审批”,因此恢复/看板/人工接续时必须读取 `review-annotations/sdd.yml`:只有 `verdict=pass` 且 `blockers=[]` 时,下一步才是 `human_approval -> approve-tech-design`。
86
+
87
+ ### 状态流转表
88
+
89
+ | # | 当前状态 | 目标状态 | 触发 Skill | 触发条件 | 说明 |
90
+ | --- | ---------------------------- | ---------------------------- | ----------------------------- | --------------------------------------- | -------------------------------------------------------------------------------------- |
91
+ | 1 | `[*]`(初始) | `drafting` | CR 注册 | 用户发起 `/requirement` | 创建 CR 目录与 `cr.md`,进入需求草稿阶段 |
92
+ | 2 | `drafting` | `requirement_reviewing` | `review-requirement` | PRD 草稿完成 | 自动需求评审;若产出 blockers 则回退 `drafting` 修复,最多 3 次 |
93
+ | 3 | `requirement_reviewing` | `requirement_approved` | `approve-requirement` | `verdict=pass` 且人工确认 | 需求评审通过后人工审批推进 |
94
+ | 4 | `requirement_approved` | `tech_designing` | `write-tech-design` | 需求已审批 | 开始编写技术设计文档(SDD) |
95
+ | 5 | `tech_designing` | `tech_design_review_pending` | `write-tech-design`(完成) | SDD 编写完成 | SDD 写完后进入待评审状态 |
96
+ | 6 | `tech_design_review_pending` | `tech_designing` | `review-tech-design`(block) | 评审发现 blockers | SDD 评审不通过,回到设计修订,最多 3 次 |
97
+ | 7 | `tech_design_review_pending` | `tech_design_reviewed` | `approve-tech-design` | `verdict=pass` 且人工确认 | 技术设计评审通过后人工审批推进 |
98
+ | 8 | `tech_design_reviewed` | `task_breakdown` | `write-dev-tasks` | 技术设计已审批 | 基于已审批的 SDD 拆解开发任务 |
99
+ | 9 | `task_breakdown` | `developing` | `approve-dev-start` | 任务拆解完成且人工确认 | 开发启动确认,进入编码阶段 |
100
+ | 10 | `developing` | `code_reviewing` | `review-code`(pass) | 代码实现完成且测试报告 `status=pass` | 代码评审通过,进入代码审批待确认 |
101
+ | 11 | `code_reviewing` | `developing` | `review-code`(block) | 评审发现 blockers | 代码评审不通过,按 `replayNodes` 重跑修复闭环,最多 3 次 |
102
+ | 12 | `code_reviewing` | `code_approved` | `approve-code` | `verdict=pass` 且测试证据完备且人工确认 | 代码审批通过 |
103
+ | 13 | `code_approved` | `merging` | `merge-feature-branch` | 代码已审批 | 合并特性分支到主干 |
104
+ | 14 | `merging` | `writing_back` | `writeback-prd-sdd` | 分支合并完成 | 将 PRD / SDD 回写到 `specs/{id}/`,任务回写到 `delivery/task/` |
105
+ | 15 | `writing_back` | `archived` | `cr-archive` | 回写完成 | CR 从 `_backlog.yml` 移至 `_history.yml`,保留 `change-requests/{CR-ID}/` 作为历史痕迹 |
106
+
107
+ ## 工作流程
108
+
109
+ ### 步骤 0:定位并读取 feature.json
110
+
111
+ 1. 检查项目根目录下是否存在 `.adspecs/feature.json`
112
+ 2. 如不存在 → 输出错误:`❌ 未找到 .adspecs/feature.json,请先执行 /project-init 初始化项目`
113
+ 3. 读取文件内容
114
+
115
+ ### 步骤 1:输出功能追踪矩阵
116
+
117
+ **每次执行本技能时,必须先输出功能追踪矩阵**,然后再执行后续的状态更新操作。
118
+
119
+ 遍历 `feature.json` 中的十一个阶段数组,按以下格式输出:
120
+
121
+ ```markdown
122
+ ## 功能追踪矩阵 📊
123
+
124
+ > 生成时间:{当前日期时间}
125
+
126
+ ### 各阶段功能明细
127
+
128
+ #### 📋 业务需求 (requirement)
129
+
130
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
131
+ | ---- | ------ | ------------ | --------- | ----------- |
132
+ | {id} | {name} | {status中文} | {created} | {directory} |
133
+
134
+ #### 📄 产品需求 (prd)
135
+
136
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
137
+ | ---- | ------ | ------------ | --------- | ----------- |
138
+ | {id} | {name} | {status中文} | {created} | {directory} |
139
+
140
+ #### 🎨 前端演示 (frontDemos)
141
+
142
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
143
+ | ---- | ------ | ------------ | --------- | ----------- |
144
+ | {id} | {name} | {status中文} | {created} | {directory} |
145
+
146
+ #### 🔧 后端设计 (endDesigns)
147
+
148
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
149
+ | ---- | ------ | ------------ | --------- | ----------- |
150
+ | {id} | {name} | {status中文} | {created} | {directory} |
151
+
152
+ #### 🎯 前端设计 (frontDesigns)
153
+
154
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
155
+ | ---- | ------ | ------------ | --------- | ----------- |
156
+ | {id} | {name} | {status中文} | {created} | {directory} |
157
+
158
+ #### 💻 后端代码 (endCodes)
159
+
160
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
161
+ | ---- | ------ | ------------ | --------- | ----------- |
162
+ | {id} | {name} | {status中文} | {created} | {directory} |
163
+
164
+ #### 🖥️ 前端代码 (frontCodes)
165
+
166
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
167
+ | ---- | ------ | ------------ | --------- | ----------- |
168
+ | {id} | {name} | {status中文} | {created} | {directory} |
169
+
170
+ #### 🧪 单元测试 (unitTests)
171
+
172
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
173
+ | ---- | ------ | ------------ | --------- | ----------- |
174
+ | {id} | {name} | {status中文} | {created} | {directory} |
175
+
176
+ #### 🔬 集成测试 (situationTests)
177
+
178
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
179
+ | ---- | ------ | ------------ | --------- | ----------- |
180
+ | {id} | {name} | {status中文} | {created} | {directory} |
181
+
182
+ #### ✅ 用户验收测试 (uats)
183
+
184
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
185
+ | ---- | ------ | ------------ | --------- | ----------- |
186
+ | {id} | {name} | {status中文} | {created} | {directory} |
187
+
188
+ #### 🚀 部署 (depolys)
189
+
190
+ | ID | 名称 | 状态 | 创建时间 | 目录 |
191
+ | ---- | ------ | ------------ | --------- | ----------- |
192
+ | {id} | {name} | {status中文} | {created} | {directory} |
193
+
194
+ > 空数组显示 "(暂无条目)"
195
+
196
+ ### 汇总统计
197
+
198
+ #### 按阶段统计
199
+
200
+ | 阶段 | 条目数 | 草稿 | 评审中 | 修改中 | 评审通过 |
201
+ | -------- | ----------- | -------- | -------- | -------- | -------- |
202
+ | 业务需求 | {N} | {n} | {n} | {n} | {n} |
203
+ | 产品需求 | {N} | {n} | {n} | {n} | {n} |
204
+ | 前端演示 | {N} | {n} | {n} | {n} | {n} |
205
+ | 后端设计 | {N} | {n} | {n} | {n} | {n} |
206
+ | 前端设计 | {N} | {n} | {n} | {n} | {n} |
207
+ | 后端代码 | {N} | {n} | {n} | {n} | {n} |
208
+ | 前端代码 | {N} | {n} | {n} | {n} | {n} |
209
+ | 单元测试 | {N} | {n} | {n} | {n} | {n} |
210
+ | 集成测试 | {N} | {n} | {n} | {n} | {n} |
211
+ | 用户验收 | {N} | {n} | {n} | {n} | {n} |
212
+ | 部署 | {N} | {n} | {n} | {n} | {n} |
213
+ | **合计** | **{total}** | **{t1}** | **{t2}** | **{t3}** | **{t4}** |
214
+
215
+ #### 按状态统计
216
+
217
+ | 状态 | 数量 | 占比 |
218
+ | ------------------- | ----------- | -------- |
219
+ | 草稿 (drafting) | {N} | {%} |
220
+ | 评审中 (reviewing) | {N} | {%} |
221
+ | 修改中 (revising) | {N} | {%} |
222
+ | 评审通过 (approved) | {N} | {%} |
223
+ | **合计** | **{total}** | **100%** |
224
+ ```
225
+
226
+ **输出规则**:
227
+
228
+ - 状态值自动转换为中文显示(`drafting` → 草稿、`reviewing` → 评审中、`revising` → 修改中、`approved` → 评审通过)
229
+ - 空数组在明细表中显示"(暂无条目)",在汇总统计中显示 0
230
+ - 占比保留一位小数
231
+ - 如果 `$ARGUMENTS` 仅为 `--list` 或为空 → 输出追踪矩阵后结束,不执行后续更新步骤
232
+
233
+ ### 步骤 2:解析参数
234
+
235
+ 从 `$ARGUMENTS` 中解析(如果提供了功能 ID 和状态值):
236
+
237
+ - `feature_id`:功能 ID
238
+ - `target_status`:目标状态(支持中文或英文值)
239
+ - `category`:数组类别(可选)
240
+
241
+ **状态值转换**:
242
+
243
+ - 用户输入"草稿" → 存储 `drafting`
244
+ - 用户输入"评审中" → 存储 `reviewing`
245
+ - 用户输入"修改中" → 存储 `revising`
246
+ - 用户输入"评审通过" → 存储 `approved`
247
+ - 用户直接输入英文值(如 `approved`)→ 直接使用
248
+
249
+ **类别名称转换**:
250
+
251
+ - 用户输入"业务需求"或"requirement" → `requirement`
252
+ - 用户输入"产品需求"或"prd" → `prd`
253
+ - 用户输入"前端演示"或"frontDemos" → `frontDemos`
254
+ - 用户输入"后端设计"或"endDesigns" → `endDesigns`
255
+ - 用户输入"前端设计"或"frontDesigns" → `frontDesigns`
256
+ - 用户输入"后端代码"或"endCodes" → `endCodes`
257
+ - 用户输入"前端代码"或"frontCodes" → `frontCodes`
258
+ - 用户输入"单元测试"或"unitTests" → `unitTests`
259
+ - 用户输入"集成测试"或"situationTests" → `situationTests`
260
+ - 用户输入"用户验收"或"uats" → `uats`
261
+ - 用户输入"部署"或"depolys" → `depolys`
262
+
263
+ ### 步骤 3:查找匹配条目
264
+
265
+ 1. 如果指定了 `category` → 仅在对应数组中搜索
266
+ 2. 如果未指定 `category` → 按以下顺序搜索全部数组:
267
+ `requirement` → `prd` → `frontDemos` → `endDesigns` → `frontDesigns` → `endCodes` → `frontCodes` → `unitTests` → `situationTests` → `uats` → `depolys`
268
+
269
+ 3. **匹配规则**(按优先级):
270
+ - **精确匹配**:`id` 字段完全等于 `feature_id`
271
+ - **前缀匹配**:`id` 字段以 `feature_id` 开头(当精确匹配无结果时)
272
+ - **名称匹配**:`name` 字段包含 `feature_id`(当前缀匹配也无结果时)
273
+
274
+ 4. 如果找到多个匹配 → 列出所有匹配项,询问用户确认要更新哪一个
275
+ 5. 如果无匹配 → 输出错误:`❌ 未找到匹配的功能条目(ID: {feature_id}),请检查 ID 是否正确`
276
+
277
+ ### 步骤 4:执行更新
278
+
279
+ 1. 显示当前状态和目标状态:
280
+
281
+ ```
282
+ 📋 功能: {name}
283
+ 📂 ID: {id}
284
+ 📁 目录: {directory}
285
+ 🔄 状态变更: {旧状态中文} → {新状态中文}
286
+ ```
287
+
288
+ 2. 将匹配条目的 `status` 字段更新为目标状态值
289
+
290
+ ### 步骤 5:写回文件
291
+
292
+ 1. 使用 Write 工具将更新后的 JSON 写回 `.adspecs/feature.json`
293
+ 2. 保持 2-space 缩进格式
294
+ 3. 保持文件末尾有一个换行符
295
+
296
+ 4. **同步 YAML 文件**:如果项目根目录下存在 `.adspecs/feature.yml`,将更新后的数据同步写入该文件:
297
+ - 读取刚写入的 `feature.json` 内容
298
+ - 转换为 YAML 格式(保持键顺序一致)
299
+ - 使用 Write 工具写回 `.adspecs/feature.yml`
300
+ - YAML 文件头部保留注释说明(`# adspecs Feature Tracking - YAML format`)
301
+ - 如果 `feature.yml` 不存在,跳过此步骤(不自动创建)
302
+
303
+ ### 步骤 6:输出结果
304
+
305
+ ```
306
+ ✅ 状态更新完成
307
+
308
+ 功能: {name}
309
+ ID: {id}
310
+ 类别: {类别中文名称}
311
+ 状态: {旧状态中文} → {新状态中文}
312
+ ```
313
+
314
+ ### 批量更新模式
315
+
316
+ 当 `feature_id` 使用通配符或关键词匹配到多个条目时,支持批量更新。
317
+
318
+ **触发条件**:
319
+
320
+ - `feature_id` 为 `*` 或 `all` → 更新指定类别(或全部类别)中的所有条目
321
+ - `feature_id` 匹配到多个条目且用户确认批量更新
322
+
323
+ **执行流程**:
324
+
325
+ 1. 列出所有将被更新的条目及其当前状态
326
+ 2. 询问用户确认:`确认将以上 {N} 个条目的状态更新为 {目标状态}?`
327
+ 3. 用户确认后,批量更新所有匹配条目
328
+ 4. 输出批量更新结果摘要
329
+
330
+ ## 扩展钩子
331
+
332
+ ### 执行前检查
333
+
334
+ 检查项目根目录下是否存在 `.adspecs/extensions.yml`。如果存在且配置了 `before_update_status` 钩子,执行相应操作。
335
+
336
+ ### 执行后钩子
337
+
338
+ 状态更新完成后,检查 `.adspecs/extensions.yml` 中 `hooks.after_update_status` 键下的条目,按规则处理。
339
+
340
+ ## 错误处理
341
+
342
+ | 场景 | 处理方式 |
343
+ | -------------------------------------- | ------------------------------------------------------- |
344
+ | `.adspecs/feature.json` 不存在 | 输出错误并提示执行 `/project-init` |
345
+ | `feature.json` 格式错误(非有效 JSON) | 输出错误并提示检查文件格式 |
346
+ | 功能 ID 未找到 | 输出错误并列出所有可用 ID(前 10 个) |
347
+ | 状态值无效 | 输出错误并列出有效状态值 |
348
+ | 目标数组不存在或为 null | 输出警告并跳过该数组 |
349
+ | 条目当前状态已与目标相同 | 输出提示 `ℹ️ 状态未变更(当前已是 {状态})`,不写入文件 |
350
+
351
+ ## 使用示例
352
+
353
+ ```bash
354
+ # 仅查看功能追踪矩阵
355
+ /adspecs-update-status
356
+
357
+ # 更新业务需求状态为评审通过
358
+ /adspecs-update-status p05-01-aluminum-ingot-receiving 评审通过 --category requirement
359
+
360
+ # 自动搜索所有数组,找到匹配 ID 后更新
361
+ /adspecs-update-status p05-01 评审中
362
+
363
+ # 列出所有功能状态(同省略参数)
364
+ /adspecs-update-status --list
365
+
366
+ # 批量更新所有业务需求为评审通过
367
+ /adspecs-update-status all 评审通过 --category requirement
368
+
369
+ # 使用中文类别名
370
+ /adspecs-update-status p05-01 草稿 --category 后端设计
371
+ ```
372
+
373
+ ## 完成标志
374
+
375
+ - [ ] 已正确定位并读取 `.adspecs/feature.json` 文件
376
+ - [ ] 已输出功能追踪矩阵(含各阶段明细和汇总统计)
377
+ - [ ] 已正确解析功能 ID 和目标状态值(如有提供)
378
+ - [ ] 已按匹配规则找到目标功能条目(如有提供)
379
+ - [ ] 状态值已正确转换(中文 → 英文存储值)
380
+ - [ ] 已更新 `status` 字段并写回 `feature.json`(保持 JSON 格式)
381
+ - [ ] 已同步 `feature.yml`(如存在)
382
+ - [ ] 已输出更新结果(含变更前后状态对比)