sillyspec 3.20.2 → 3.20.3

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 (208) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +1 -5
  2. package/.claude/skills/sillyspec-auto/SKILL.md +2 -8
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +1 -28
  4. package/.claude/skills/sillyspec-commit/SKILL.md +3 -4
  5. package/.claude/skills/sillyspec-continue/SKILL.md +4 -5
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +3 -12
  7. package/.claude/skills/sillyspec-execute/SKILL.md +2 -15
  8. package/.claude/skills/sillyspec-explore/SKILL.md +1 -14
  9. package/.claude/skills/sillyspec-plan/SKILL.md +36 -5
  10. package/.claude/skills/sillyspec-propose/SKILL.md +0 -4
  11. package/.claude/skills/sillyspec-quick/SKILL.md +1 -5
  12. package/.claude/skills/sillyspec-resume/SKILL.md +66 -23
  13. package/.claude/skills/sillyspec-scan/SKILL.md +1 -5
  14. package/.claude/skills/sillyspec-state/SKILL.md +8 -8
  15. package/.claude/skills/sillyspec-status/SKILL.md +1 -5
  16. package/.claude/skills/sillyspec-verify/SKILL.md +1 -5
  17. package/.claude/skills/sillyspec-workspace/SKILL.md +3 -11
  18. package/.sillyspec/changes/archive/2026-04-08-derive-state/design.md +97 -0
  19. package/.sillyspec/changes/archive/2026-04-08-derive-state/plan.md +51 -0
  20. package/.sillyspec/changes/archive/2026-04-08-derive-state/proposal.md +29 -0
  21. package/.sillyspec/changes/archive/2026-04-08-derive-state/requirements.md +34 -0
  22. package/.sillyspec/changes/archive/2026-04-08-derive-state/tasks.md +13 -0
  23. package/.sillyspec/changes/archive/2026-04-08-derive-state/verify-result.md +43 -0
  24. package/.sillyspec/changes/auto-mode/design.md +50 -0
  25. package/.sillyspec/changes/auto-mode/proposal.md +19 -0
  26. package/.sillyspec/changes/auto-mode/requirements.md +21 -0
  27. package/.sillyspec/changes/auto-mode/tasks.md +7 -0
  28. package/.sillyspec/changes/brainstorm-archive/2026-04-05-dashboard-design.md +206 -0
  29. package/.sillyspec/changes/brainstorm-archive/2026-04-05-unified-docs-design.md +199 -0
  30. package/.sillyspec/changes/dashboard/design.md +219 -0
  31. package/.sillyspec/changes/dashboard/design.md.braindraft +206 -0
  32. package/.sillyspec/changes/run-command-design/design.md +1230 -0
  33. package/.sillyspec/changes/unified-docs-design/design.md +199 -0
  34. package/.sillyspec/docs/sillyspec/scan/.gitkeep +0 -0
  35. package/.sillyspec/knowledge/INDEX.md +8 -0
  36. package/.sillyspec/knowledge/uncategorized.md +3 -0
  37. package/.sillyspec/plans/2026-04-05-dashboard.md +737 -0
  38. package/.sillyspec/projects/sillyspec.yaml +3 -0
  39. package/README.md +11 -13
  40. package/SKILL.md +40 -44
  41. package/dist/steps/brainstorm/01-load-context.md +30 -0
  42. package/dist/steps/brainstorm/02-reuse-check.md +6 -0
  43. package/dist/steps/brainstorm/03-prototype-analysis.md +11 -0
  44. package/dist/steps/brainstorm/04-module-split.md +23 -0
  45. package/dist/steps/brainstorm/05-dialog-explore.md +8 -0
  46. package/dist/steps/brainstorm/06-propose-approaches.md +3 -0
  47. package/dist/steps/brainstorm/07-present-design.md +3 -0
  48. package/dist/steps/brainstorm/08-write-design.md +21 -0
  49. package/dist/steps/brainstorm/09-self-review.md +15 -0
  50. package/dist/steps/brainstorm/10-user-confirm.md +3 -0
  51. package/dist/steps/brainstorm/11-output-spec.md +7 -0
  52. package/dist/steps/brainstorm/manifest.yaml +26 -0
  53. package/dist/steps/execute/01-load-context.md +41 -0
  54. package/dist/steps/execute/02-scan-conventions.md +47 -0
  55. package/dist/steps/execute/03-skill-mcp.md +19 -0
  56. package/dist/steps/execute/04-assign-task.md +22 -0
  57. package/dist/steps/execute/04b-prompt-template.md +54 -0
  58. package/dist/steps/execute/05-write-test.md +7 -0
  59. package/dist/steps/execute/06-write-code.md +8 -0
  60. package/dist/steps/execute/07-run-test.md +26 -0
  61. package/dist/steps/execute/08-fix-issues.md +28 -0
  62. package/dist/steps/execute/09-next-task.md +33 -0
  63. package/dist/steps/execute/manifest.yaml +28 -0
  64. package/dist/steps/plan/01-load-context.md +22 -0
  65. package/dist/steps/plan/02-anchor-confirm.md +1 -0
  66. package/dist/steps/plan/03-expand-tasks.md +33 -0
  67. package/dist/steps/plan/04-mark-order.md +15 -0
  68. package/dist/steps/plan/05-e2e-planning.md +17 -0
  69. package/dist/steps/plan/06-self-check.md +16 -0
  70. package/dist/steps/plan/07-save.md +1 -0
  71. package/dist/steps/plan/manifest.yaml +18 -0
  72. package/dist/steps/scan/01-env-detect.md +51 -0
  73. package/dist/steps/scan/02-tech-stack.md +16 -0
  74. package/dist/steps/scan/03-conventions.md +16 -0
  75. package/dist/steps/scan/04-structure.md +19 -0
  76. package/dist/steps/scan/05-quality.md +18 -0
  77. package/dist/steps/scan/06-complete.md +49 -0
  78. package/dist/steps/scan/manifest.yaml +16 -0
  79. package/dist/steps/verify/01-load-specs.md +28 -0
  80. package/dist/steps/verify/02-check-tasks.md +1 -0
  81. package/dist/steps/verify/03-check-design.md +6 -0
  82. package/dist/steps/verify/04-run-tests.md +7 -0
  83. package/dist/steps/verify/05-e2e-tests.md +27 -0
  84. package/dist/steps/verify/05b-e2e-fix.md +33 -0
  85. package/dist/steps/verify/06-code-quality.md +25 -0
  86. package/dist/steps/verify/07-lint-check.md +27 -0
  87. package/dist/steps/verify/08-output-report.md +14 -0
  88. package/dist/steps/verify/manifest.yaml +22 -0
  89. package/package.json +1 -7
  90. package/packages/dashboard/dist/assets/{index-Bq_Z2hne.js → index-D1EVTLmc.js} +1264 -1264
  91. package/packages/dashboard/dist/assets/index-DGe8CqeP.css +1 -0
  92. package/packages/dashboard/dist/index.html +2 -2
  93. package/packages/dashboard/package-lock.json +6 -6
  94. package/packages/dashboard/server/executor.js +1 -1
  95. package/packages/dashboard/server/index.js +18 -98
  96. package/packages/dashboard/server/parser.js +71 -139
  97. package/packages/dashboard/server/watcher.js +6 -14
  98. package/packages/dashboard/src/App.vue +185 -418
  99. package/packages/dashboard/src/components/ActionBar.vue +1 -10
  100. package/packages/dashboard/src/components/CommandPalette.vue +1 -5
  101. package/packages/dashboard/src/components/DocPreview.vue +8 -105
  102. package/packages/dashboard/src/components/DocTree.vue +19 -75
  103. package/packages/dashboard/src/components/PipelineStage.vue +2 -22
  104. package/packages/dashboard/src/components/PipelineView.vue +5 -32
  105. package/packages/dashboard/src/components/ProjectOverview.vue +139 -113
  106. package/packages/dashboard/src/components/StageBadge.vue +3 -17
  107. package/packages/dashboard/src/components/StepCard.vue +2 -7
  108. package/packages/dashboard/src/composables/useDashboard.js +0 -28
  109. package/src/derive.js +147 -0
  110. package/src/index.js +40 -688
  111. package/src/init.js +63 -119
  112. package/src/migrate.js +7 -7
  113. package/src/progress.js +248 -1474
  114. package/src/run.js +302 -3008
  115. package/src/setup.js +64 -2
  116. package/src/stages/archive.js +17 -123
  117. package/src/stages/brainstorm.js +48 -454
  118. package/src/stages/doctor.js +46 -99
  119. package/src/stages/execute.js +59 -420
  120. package/src/stages/index.js +18 -12
  121. package/src/stages/plan.js +189 -492
  122. package/src/stages/propose.js +11 -70
  123. package/src/stages/quick.js +13 -52
  124. package/src/stages/scan.js +68 -485
  125. package/src/stages/status.js +1 -1
  126. package/src/stages/verify.js +16 -203
  127. package/src/step.js +543 -0
  128. package/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
  129. package/.husky/pre-push +0 -13
  130. package/CLAUDE.md +0 -18
  131. package/docs/brainstorm-plan-contract.md +0 -64
  132. package/docs/plan-execute-contract.md +0 -123
  133. package/docs/platform-scan-protocol.md +0 -298
  134. package/docs/revision-mode.md +0 -115
  135. package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +0 -99
  136. package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +0 -218
  137. package/docs/sillyspec/file-lifecycle/stage-artifacts.md +0 -167
  138. package/docs/sillyspec/file-lifecycle/storage-and-state.md +0 -148
  139. package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +0 -193
  140. package/docs/sillyspec/file-lifecycle.md +0 -125
  141. package/docs/workflow-contract-regression.md +0 -106
  142. package/docs/worktree-isolation.md +0 -252
  143. package/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
  144. package/packages/dashboard/dist/prototype-dashboard.html +0 -836
  145. package/packages/dashboard/dist/prototype-overview.html +0 -256
  146. package/packages/dashboard/public/prototype-dashboard.html +0 -836
  147. package/packages/dashboard/public/prototype-overview.html +0 -256
  148. package/packages/dashboard/src/components/HResizeHandle.vue +0 -48
  149. package/packages/dashboard/src/components/ProjectCard.vue +0 -187
  150. package/packages/dashboard/src/components/VResizeHandle.vue +0 -61
  151. package/packages/dashboard/src/composables/useLayout.js +0 -131
  152. package/src/brainstorm-postcheck.js +0 -158
  153. package/src/change-list.js +0 -52
  154. package/src/change-risk-profile.js +0 -352
  155. package/src/classify-change.js +0 -73
  156. package/src/constants.js +0 -70
  157. package/src/contract-matrix.js +0 -278
  158. package/src/db.js +0 -201
  159. package/src/endpoint-extractor.js +0 -315
  160. package/src/hooks/claude-pre-tool-use.cjs +0 -125
  161. package/src/hooks/worktree-guard.js +0 -761
  162. package/src/knowledge-match.js +0 -130
  163. package/src/modules.js +0 -482
  164. package/src/scan-postcheck.js +0 -383
  165. package/src/stage-contract.js +0 -700
  166. package/src/stages/brainstorm-auto.js +0 -229
  167. package/src/stages/explore.js +0 -34
  168. package/src/stages/knowledge.js +0 -498
  169. package/src/stages/plan-postcheck.js +0 -513
  170. package/src/sync.js +0 -497
  171. package/src/task-review.js +0 -346
  172. package/src/workflow.js +0 -785
  173. package/src/worktree-apply.js +0 -549
  174. package/src/worktree.js +0 -932
  175. package/templates/workflows/archive-impact.yaml +0 -79
  176. package/templates/workflows/scan-docs.yaml +0 -132
  177. package/test/brainstorm-plan-contract.test.mjs +0 -273
  178. package/test/check-syntax.mjs +0 -26
  179. package/test/cli-top-level-aliases.test.mjs +0 -174
  180. package/test/contract-artifacts.test.mjs +0 -323
  181. package/test/decision-supersede.test.mjs +0 -277
  182. package/test/knowledge-match.test.mjs +0 -231
  183. package/test/plan-execute-contract.test.mjs +0 -330
  184. package/test/plan-optimization.test.mjs +0 -572
  185. package/test/platform-artifacts.test.mjs +0 -190
  186. package/test/platform-failure-samples.test.mjs +0 -199
  187. package/test/platform-recovery-chain.test.mjs +0 -179
  188. package/test/platform-recovery.test.mjs +0 -167
  189. package/test/platform-scan-p0.test.mjs +0 -175
  190. package/test/revision-v1.test.mjs +0 -1145
  191. package/test/run-sanitize-project-name.test.mjs +0 -51
  192. package/test/run-scan-postcheck-fail.test.mjs +0 -64
  193. package/test/run-scan-project-parse.test.mjs +0 -200
  194. package/test/run-tests.mjs +0 -48
  195. package/test/scan-docs-yaml-placeholders.test.mjs +0 -84
  196. package/test/scan-knowledge.test.mjs +0 -175
  197. package/test/scan-paths.test.mjs +0 -68
  198. package/test/scan-postcheck-project-priority.test.mjs +0 -85
  199. package/test/scan-postcheck.test.mjs +0 -197
  200. package/test/scan-workflow-anyfailed-block.test.mjs +0 -52
  201. package/test/spec-dir.test.mjs +0 -206
  202. package/test/stage-contract-failed-post-check.test.mjs +0 -102
  203. package/test/stage-contract.test.mjs +0 -299
  204. package/test/stage-definitions.test.mjs +0 -39
  205. package/test/wait-gates.test.mjs +0 -501
  206. package/test/workflow-spec-base.test.mjs +0 -142
  207. package/test/worktree-guard.test.mjs +0 -136
  208. package/test/worktree-native-overlay.test.mjs +0 -188
@@ -1,74 +1,6 @@
1
- import { existsSync, readFileSync, readdirSync } from 'fs'
1
+ import { existsSync, readFileSync } from 'fs'
2
2
  import path from 'path'
3
3
 
4
- // 从 plan-postcheck.js 重导出(保持向后兼容)
5
- export {
6
- topoSortWaves,
7
- validateBlueprintConsistency,
8
- validatePlanArtifacts,
9
- validatePlanFeasibility
10
- } from './plan-postcheck.js'
11
-
12
- // 这些解析函数已迁移到 plan-postcheck.js,此处不再定义
13
-
14
- /**
15
- * 校验 design.md 是否满足 plan 执行契约
16
- * 第一版是轻量 markdown 结构检查,不强 schema。
17
- * @param {string} designContent - design.md 文件内容
18
- * @returns {{ ok: boolean, errors: string[], warnings: string[] }}
19
- */
20
- export function validateDesignForPlan(designContent) {
21
- const errors = []
22
- const warnings = []
23
-
24
- if (!designContent || !designContent.trim()) {
25
- return { ok: false, errors: ['design.md 内容为空'], warnings }
26
- }
27
-
28
- const lower = designContent.toLowerCase()
29
-
30
- // 检查 1: 必须包含目标/问题描述(error)
31
- const hasGoal = /(^|\n)#{2,}\s*.*(目标|goal|objective|背景|background|问题|problem|purpose|目的)/i.test(designContent)
32
- if (!hasGoal) {
33
- errors.push('design.md 缺少「目标/背景/问题描述」章节 — plan 需要知道要达成什么')
34
- }
35
-
36
- // 检查 2: 必须包含范围/scope(error)
37
- const hasScope = /(^|\n)#{2,}\s*.*(范围|scope|总体方案|方案|approach|solution|设计|design)/i.test(designContent)
38
- if (!hasScope) {
39
- errors.push('design.md 缺少「范围/总体方案/设计」章节 — plan 需要知道做什么和怎么做')
40
- }
41
-
42
- // 检查 3: 必须包含决策/方案选择(error)
43
- const hasDecisions = /(^|\n)#{2,}\s*.*(决策|decision|选择|choice|方案选择)/i.test(designContent)
44
- || /d-\d+@v\d+/i.test(designContent) // decisions.md 引用 ID
45
- || /decisions?\.md/i.test(designContent) // 引用 decisions.md
46
- if (!hasDecisions) {
47
- errors.push('design.md 缺少「决策/方案选择」— plan 需要基于明确的技术决策来拆分任务')
48
- }
49
-
50
- // 检查 4 (warning): 缺非目标/non-goals
51
- const hasNonGoals = /(^|\n)#{2,}\s*.*(非目标|non-goals?|不做|out of scope|不在范围)/i.test(designContent)
52
- if (!hasNonGoals) {
53
- warnings.push('design.md 缺少「非目标/Non-goals」— 建议明确不做什么,防止 scope creep')
54
- }
55
-
56
- // 检查 5 (warning): 缺约束/风险
57
- const hasConstraints = /(^|\n)#{2,}\s*.*(约束|constraint|限制|limitation|风险|risk|trade-?off)/i.test(designContent)
58
- if (!hasConstraints) {
59
- warnings.push('design.md 缺少「约束/风险/Trade-off」— 建议记录已知约束和风险')
60
- }
61
-
62
- // 检查 6 (warning): 缺文件变更清单
63
- const hasFileChanges = /文件变更|file change|变更清单|changed files/i.test(designContent)
64
- || /^\|\s*(新增|修改|删除|new|modify|delete|update)\s*\|/im.test(designContent)
65
- if (!hasFileChanges) {
66
- warnings.push('design.md 缺少「文件变更清单」— 建议列出预期改动的文件')
67
- }
68
-
69
- return { ok: errors.length === 0, errors, warnings }
70
- }
71
-
72
4
  export const definition = {
73
5
  name: 'plan',
74
6
  title: '实现计划',
@@ -76,507 +8,272 @@ export const definition = {
76
8
  steps: null // 动态生成
77
9
  }
78
10
 
79
- // ═══════════════════════════════════════════════════════════════
80
- // 1 步(LLM):复杂度分类 + 上下文加载(合并原 ①②③④)
81
- // ═══════════════════════════════════════════════════════════════
82
-
83
- const stepClassify = {
84
- id: 'classify',
85
- name: '复杂度分类与上下文加载',
86
- prompt: `在生成计划之前,先加载上下文并判定本次需求的复杂度等级(plan_level)。
11
+ // 固定前缀步骤
12
+ const fixedPrefix = [
13
+ {
14
+ name: '状态检查',
15
+ prompt: `检查当前状态,确认可以执行 plan。
87
16
 
88
17
  ### 操作
89
- 1. 运行 \`sillyspec progress show\`,确认 currentStage 为 "plan"
90
- 2. 读取 CODEBASE-OVERVIEW.md + 各子项目上下文
91
- 3. 读取 proposal.md、design.md、requirements.md、tasks.md
92
- 4. 如果存在 decisions.md,必须读取并提取所有当前版本 D-xxx@vN 决策 ID
93
- - 如果发现 priority=P0/P1 且 status=unresolved/blocking 的决策,停止生成计划,要求先回到 brainstorm 的 Design Grill 修正
94
- - 如果发现 superseded 决策,只引用最新版本,不引用旧版本
95
- 5. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
96
- 6. 读取 local.yaml 获取构建/测试命令
97
- 7. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过)
98
- - 根据 design.md 的文件变更清单匹配模块
99
- - 读取匹配到的模块文档
100
- - 利用模块依赖关系辅助分析(depends_on / used_by)
101
-
102
- ### 分级规则
103
- 判定 plan_level 为 none 时,需**同时满足**以下所有条件:
104
- - 涉及文件 ≤ 2 个
105
- - 不跨模块(改动集中在单个模块内)
106
- - 无 schema / DB / manifest / local.yaml 变更
107
- - 无状态机 / workflow 状态流转变更
108
- - 无 source_root / spec_root / runtime_root 路径隔离规则变更
109
- - 无 validator / postcheck / agent 调度行为变更
110
- - 需求明确,无设计歧义
111
-
112
- 判定为 light(满足任一即升为 light):
113
- - 涉及 3-5 个文件
114
- - 涉及 prompt 行为变更
115
- - 涉及 validator / postcheck 逻辑
116
- - 涉及路径规则变更(但范围可控)
117
- - 涉及 schema/DB/状态机变更,但影响面可控
118
- - 需要明确验收标准来防止范围漂移
119
-
120
- 判定为 full(满足任一即升为 full):
121
- - 预计 8 个以上 task
122
- - 跨 3 个以上模块
123
- - 涉及 CLI + 平台 + DB 联动
124
- - 涉及 agent 调度 / worktree / isolation 逻辑
125
- - 涉及复杂状态恢复(checkpoint / resume)
126
- - 需要并行 sub-agent 执行
127
- - 需要人工审查设计方向
128
- - 涉及 worktree / baseline / sandbox 等基础设施
129
-
130
- ### 输出格式
131
- 在输出开头,以如下格式输出分类结果:
132
-
133
- \`\`\`
134
- plan_level: none | light | full
135
- reason: <一句话说明判定理由>
136
- estimated_files: <N>
137
- cross_module: true | false
138
- has_schema_change: true | false
139
- has_state_machine_change: true | false
140
- needs_parallel_execution: true | false
141
- needs_human_review: true | false
142
- \`\`\`
143
-
144
- 然后列出已加载的文件清单(含 decisions.md 当前版本/未决项状态、模块文档 + 模块依赖关系摘要)。
145
-
146
- 分类完成后,继续进入下一步。`,
147
- outputHint: '复杂度分类结果 + 文件清单',
148
- optional: false
149
- }
18
+ 1. 运行 \`sillyspec progress show\`
19
+ 2. 确认 currentStage "plan"
150
20
 
151
- // ═══════════════════════════════════════════════════════════════
152
- // 第 2 步(LLM):生成分级计划 + 自检(合并原 ⑤⑥)
153
- // ═══════════════════════════════════════════════════════════════
154
-
155
- const stepGeneratePlan = {
156
- id: 'generate_plan',
157
- name: '生成分级计划与自检',
158
- prompt: `根据上一步的 plan_level 结果,按对应级别生成计划,然后立即自检。
21
+ ### 输出
22
+ 当前状态摘要`,
23
+ outputHint: '状态摘要',
24
+ optional: false
25
+ },
26
+ {
27
+ name: '加载上下文',
28
+ prompt: `加载所有规范文件和代码库上下文。
159
29
 
160
30
  ### 操作
161
- 1. 读取上一步输出的 plan_level 分类结果
162
- 2. 读取 tasks.mddesign.md 了解需求范围
163
- 3. plan_level 选择对应模板输出
164
- 4. 生成后立即自检(见下方自检清单)
165
-
166
- ---
31
+ 1. 读取 CODEBASE-OVERVIEW.md + 各子项目上下文
32
+ 2. 读取 proposal.mddesign.md、requirements.md、tasks.md
33
+ 3. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
34
+ 4. 读取 local.yaml 获取构建/测试命令
167
35
 
168
- #### plan_level = none
169
- 生成最小 plan.md(占位文件,保持流程兼容),不生成完整蓝图。格式:
170
- \`\`\`markdown
171
- ---
172
- plan_level: none
173
- ---
174
-
175
- # 计划跳过
176
-
177
- ## 原因
178
- <一句话说明判定理由>
179
-
180
- ## 建议直接 execute
181
- 直接进入 execute 阶段完成下列最小任务。
182
-
183
- ## Tasks
184
- - [ ] task-01: 按用户需求完成小范围明确修改
185
-
186
- ## 验收
187
- - 修改范围符合用户需求
188
- - 不引入额外无关变更
189
- - 必要测试或检查通过
190
- \`\`\`
191
- **注意:** 所有 plan_level 都必须包含 \`- [ ] task-XX:\` 格式的 checkbox 任务,execute 阶段依赖此格式解析任务。
192
-
193
- ---
194
-
195
- #### plan_level = light
196
- 生成轻量 plan.md,保存到变更目录。只包含以下四部分:
197
-
198
- \`\`\`markdown
199
- ---
200
- plan_level: light
201
- ---
202
-
203
- # 轻量计划:<需求简述>
204
-
205
- ## 来源
206
- 直接引用 brainstorm 结论或用户原始需求,不重新扩写。
207
-
208
- ## 范围
209
- - 涉及的文件/模块清单
210
-
211
- ## Tasks
212
- - [ ] task-01: ...(覆盖:FR-01, D-001@v1)
213
- - [ ] task-02: ...
214
- - [ ] task-03: ...
215
-
216
- ## 验收
217
- - 具体可验证的验收条目
218
-
219
- ## 覆盖矩阵(如存在 decisions.md)
220
- | ID | 覆盖任务 | 验收证据 |
221
- |---|---|---|
222
- | D-001@v1 | task-01 | AC-01 |
223
- \`\`\`
224
-
225
- light 计划的约束:
226
- - **禁止**生成 Mermaid 图
227
- - **禁止**估时
228
- - **禁止**泛泛风险分析(如"需要充分测试")
229
- - **禁止**放实现细节(函数签名、代码示例)
230
- - 来源/目标直接引用已有文档,不重新生成
231
- - 如果存在 decisions.md,所有当前版本 D-xxx@vN 必须在 Tasks 或覆盖矩阵中出现
232
- - 如果存在 P0/P1 unresolved blocker,不生成 plan.md
233
- - 任务列表控制在 10 条以内
234
- - **任务必须使用 checkbox 格式**(\`- [ ] task-XX:\`),不要用纯编号列表(\`1. 2.\`),execute 阶段依赖此格式解析任务
36
+ ### 输出
37
+ 已加载的文件清单`,
38
+ outputHint: '文件清单',
39
+ optional: false
40
+ },
41
+ {
42
+ name: '锚定确认',
43
+ prompt: `确认已读取的文件。
235
44
 
236
- ---
45
+ ### 操作
46
+ 列出已读取的文件,标注存在/不存在。
237
47
 
238
- #### plan_level = full
239
- 生成完整 plan.md,保存到变更目录。格式如下:
48
+ ### 输出
49
+ 文件加载确认清单`,
50
+ outputHint: '文件确认清单',
51
+ optional: false
52
+ },
53
+ {
54
+ name: '展开任务并分组',
55
+ prompt: `把 tasks.md 每个 checkbox 展开为任务描述,按 Wave 分组,产出 plan.md 总览。
240
56
 
57
+ ### plan.md 格式(轻量总览,PM 视角)
241
58
  \`\`\`markdown
242
- ---
243
- plan_level: full
244
- ---
245
-
246
59
  # 实现计划
247
60
 
248
- ## Spike 前置验证(如需要)
249
- | Spike | 验证内容 | 不通过后果 |
250
- |---|---|---|
251
- | spike-01 | ... | task-XX 推翻重设计 |
252
-
253
- > 技术不确定性高时才需要 Spike。无不确定性则跳过此节。
254
-
255
61
  ## Wave 1(并行,无依赖)
256
- - [ ] task-01: 添加用户创建接口(覆盖:FR-01, D-001@v1)
257
- - [ ] task-02: 添加角色创建接口(覆盖:FR-02)
62
+ - [ ] task-01: 添加用户创建接口
63
+ - [ ] task-02: 添加角色创建接口
258
64
 
259
65
  ## Wave 2(依赖 Wave 1)
260
66
  - [ ] task-03: 用户创建接口联调
261
67
 
262
- ## 任务总表
263
- | 编号 | 任务 | Wave | 优先级 | 依赖 | 覆盖 FR/D | 说明 |
264
- |---|---|---|---|---|---|---|
265
- | task-01 | 添加用户创建接口 | W1 | P0 | — | FR-01, D-001@v1 | ... |
266
- | task-02 | 添加角色创建接口 | W1 | P0 | — | FR-02 | ... |
267
- | task-03 | 用户创建接口联调 | W2 | P0 | task-01,02 | FR-03 | ... |
268
-
269
- ## 关键路径
270
- task-01 → task-03(最长路径,决定最短交付周期)
271
-
272
68
  ## 全局验收标准
273
69
  - [ ] 所有单元测试通过
274
- - [ ] (brownfield)未配置新功能时行为不变
275
-
276
- ## 覆盖矩阵(如存在 decisions.md)
277
- | ID | 覆盖任务 | 验收证据 |
278
- |---|---|---|
279
- | D-001@v1 | task-01 | AC-01 |
280
70
  \`\`\`
281
71
 
282
- full 计划的约束:
283
- - **禁止**估时(任务总表不含估时列)
284
- - **禁止**泛泛风险分析("需要充分测试"类废话转为具体验收条目)
285
- - Mermaid 依赖关系图**仅当依赖关系非平凡时生成**(线性依赖或全并行时不生成)
286
- - **Wave 下的 checkbox 行必须保留**(execute 阶段解析依赖 \`- [ ] task-XX:\` 格式)
287
- - plan.md 包含 Wave 分组 + 任务总表 + 关键路径 + 全局验收标准,**不放实现细节**
288
- - 如果存在 decisions.md,plan.md 必须包含当前版本 D-xxx@vN/FR-xxx 覆盖矩阵
289
- - 如果存在 P0/P1 unresolved blocker,不生成 plan.md,输出阻塞清单
72
+ ### 关键规则
73
+ - plan.md 只放任务列表 + Wave 划分 + 全局验收标准,**不放实现细节**
290
74
  - 实现细节写到后续的 tasks/task-NN.md 中
291
75
  - 每个任务编号格式:task-01、task-02 ...
292
- - 任务总表的优先级:P0(必须)/ P1(重要)/ P2(可选)
293
- - 总任务数控制在 15 个以内
294
76
 
295
- ### Spike 前置验证(仅 full)
296
- 当存在技术不确定性时,在 Wave 之前设计 Spike:
297
- - 涉及新技术栈/未经验证的集成 → 需要 Spike
298
- - 涉及安全隔离/性能瓶颈 → 需要 Spike
299
- - 纯业务逻辑/确定的技术方案 → 不需要 Spike
300
- - 每个 Spike 定义:验证内容 + 通过标准 + 不通过后果
301
-
302
- ### 批量模式指引(仅 full)
77
+ ### 批量模式指引
303
78
  如果 design.md 或需求中包含批量特征(关键词:批量/模板/引擎/N个相似),按以下原则规划:
304
- - ❌ 不要列出每个实例作为独立任务
305
- - ❌ 不要在文档中嵌入数据
306
- - ✅ 设计通用架构,Wave 1 聚焦架构
307
- - ✅ 数据转换用脚本完成,单独一个 Wave
308
- - ✅ 总任务数控制在 10 个以内
309
-
310
- ---
79
+ ❌ 不要列出每个实例作为独立任务
80
+ ❌ 不要在文档中嵌入数据
81
+ ✅ 设计通用架构,Wave 1 聚焦架构
82
+ ✅ 数据转换用脚本完成,单独一个 Wave
83
+ ✅ 总任务数控制在 10 个以内
311
84
 
312
- ### 通用操作(所有级别)
85
+ ### 操作
313
86
  1. 读取 tasks.md 获取任务列表
314
87
  2. 读取 design.md 获取文件变更清单
315
- 3. 读取上一步的 plan_level 分类结果
316
- 4. 按对应级别模板生成内容
317
- 5. 保存到变更目录下的 plan.md(路径格式:\`.sillyspec/changes/<change-name>/plan.md\`,其中 <change-name> 是变更目录名,直接使用,不加子目录。正确路径示例:\`.sillyspec/changes/2026-05-28-agent-log-streaming/plan.md\`)
318
- **plan_level 为 none 时生成最小 plan.md(占位),不生成完整蓝图。**
319
-
320
- ---
321
-
322
- ### 自检(生成后立即执行,不另开步骤)
323
-
324
- 读取上一步的 plan_level 分类结果,按级别执行对应的自检:
325
-
326
- #### plan_level = none
327
- - [ ] plan.md 文件存在且包含 plan_level: none
328
- - [ ] 给出了可操作的修改建议(2-5 条)
329
- - [ ] 不含 Wave、Mermaid、估时、任务总表、依赖关系等完整蓝图内容
330
- - [ ] 建议了直接 execute
331
- - [ ] 包含至少一个 \`- [ ] task-XX:\` 格式的 checkbox 任务(execute 解析依赖此格式)
332
-
333
- #### plan_level = light
334
- - [ ] 输出明确标注 plan_level: light
335
- - [ ] 有来源、范围、任务列表、验收标准四个部分
336
- - [ ] 来源直接引用已有文档,未重新扩写
337
- - [ ] 任务列表清晰且无实现细节
338
- - [ ] 任务使用 checkbox 格式(\`- [ ] task-XX:\`),不是纯编号列表
339
- - [ ] 验收标准具体可验证(非笼统表述)
340
- - [ ] 如果存在 decisions.md,所有当前版本 D-xxx@vN 在 plan.md 中可追踪
341
- - [ ] 不存在 P0/P1 unresolved blocker
342
- - [ ] 没有 Mermaid 图、估时、风险分析
343
- - [ ] 没有函数签名、代码示例等实现细节
344
- - [ ] plan.md 与 design.md 的文件变更清单一致
345
- - [ ] 包含至少一个 \`- [ ] task-XX:\` 格式的 checkbox 任务(execute 解析依赖此格式)
88
+ 3. 逐个展开为任务描述
89
+ 4. 分析依赖关系,按 Wave 分组
90
+ 5. 保存到 \`.sillyspec/changes/<变更名>/plan.md\`
91
+
92
+ ### 输出
93
+ plan.md 总览内容`,
94
+ outputHint: 'plan.md 总览',
95
+ optional: false
96
+ },
97
+ {
98
+ name: '自检总览',
99
+ prompt: `自检 plan.md 总览质量。
346
100
 
347
- #### plan_level = full
101
+ ### 操作
102
+ 检查以下各项:
348
103
  - [ ] 每个 task 有编号(task-01、task-02 ...)
349
- - [ ] 每个 task Wave 下有 checkbox(\`- [ ] task-XX:\` 格式,execute 解析依赖此格式)
104
+ - [ ] 每个 task checkbox
350
105
  - [ ] 已标注 Wave 分组和依赖关系
351
- - [ ] 有任务总表(含优先级、依赖列,**无估时列**)
352
- - [ ] 有关键路径标注
353
106
  - [ ] 有全局验收标准
354
- - [ ] 如果存在 decisions.md,任务总表或覆盖矩阵覆盖全部当前版本 D-xxx@vN
355
- - [ ] 不存在 P0/P1 unresolved blocker
356
- - [ ] (brownfield)全局验收包含兼容性条款
357
107
  - [ ] 没有实现细节(接口定义、代码示例等不应该在 plan.md 里)
358
108
  - [ ] plan.md 与 design.md 的文件变更清单一致
359
- - [ ] 如果涉及构造函数/接口/DTO/client 方法变更,是否搜索了所有调用点并纳入任务范围?
360
- - [ ] 调用点搜索命令的输出是否记录在 plan.md 或 task-NN.md 中?
361
- - [ ] 如果有 Mermaid 图,依赖关系确实非平凡(非线性/非全并行)
362
- - [ ] 没有泛泛风险分析(如"需要充分测试")
363
109
 
364
110
  ### 输出
365
- plan_level + 计划内容 + 自检结果(一次输出)`,
366
- outputHint: '计划内容 + 自检结果',
367
- optional: false
368
- }
111
+ 自检通过/不通过`,
112
+ outputHint: '自检结果',
113
+ optional: false
114
+ }
115
+ ]
369
116
 
370
- // ═══════════════════════════════════════════════════════════════
371
- // 3 步(LLM):生成紧凑 TaskCard(子代理并行)
372
- // ═══════════════════════════════════════════════════════════════
117
+ // 固定后缀步骤
118
+ const fixedSuffix = [
119
+ {
120
+ name: '审查一致性',
121
+ prompt: `审查所有 task-N.md 的一致性。
373
122
 
374
- /**
375
- * 构建紧凑 TaskCard 协调器步骤(单步,子代理并行写卡片)
376
- * 每个 task 生成 20~40 行紧凑可执行卡片
377
- */
378
- export function buildCoordinatorStep(changeDir, taskNames) {
379
- const taskList = taskNames.map((name, i) => {
380
- const num = String(i + 1).padStart(2, '0')
381
- return `- task-${num}: ${name}`
382
- }).join('\n')
383
-
384
- const subagentPrompts = taskNames.map((name, i) => {
385
- const num = String(i + 1).padStart(2, '0')
386
- return `\`\`\`
387
- 任务编号:task-${num}
388
- 任务名称:${name}
389
- 文件路径:${changeDir}/tasks/task-${num}.md
390
- 当前时间:<now-datetime>(frontmatter 的 created_at 使用此值)
391
- 当前用户:<git-user>(frontmatter 的 author 使用此值)
392
-
393
- 操作:
394
- 1. 读取 ${changeDir}/design.md 和 ${changeDir}/plan.md 了解上下文
395
- 2. 读取相关源文件了解现有代码
396
- 3. 生成紧凑 TaskCard(20~40 行),格式如下:
397
-
398
- ---
399
- id: task-${num}
400
- title: ${name}
401
- author: <git-user>
402
- created_at: <now-datetime>
403
- priority: P0
404
- depends_on: []
405
- blocks: []
406
- requirement_ids: [FR-XX]
407
- decision_ids: [D-XXX@vN]
408
- allowed_paths:
409
- - frontend/src/lib/errors.ts
410
- goal: >
411
- 一句话说明这个 task 要做什么、为什么。
412
- implementation:
413
- - 具体步骤 1
414
- - 具体步骤 2
415
- - 具体步骤 3
416
- acceptance:
417
- - 可验证的验收条件 1
418
- - 可验证的验收条件 2
419
- - 可验证的验收条件 3
420
- verify:
421
- - cd frontend && pnpm exec tsc --noEmit
422
- constraints:
423
- - 边界约束 1(如:不加测试)
424
- - 边界约束 2(如:不修改传入参数)
425
- ---
426
-
427
- TaskCard 格式规则(必须严格遵守):
428
- - 总长度 20~40 行,不要写成长文档
429
- - frontmatter 只含必要字段,不加 estimated_hours
430
- - goal: 一句话,用 > 多行字符串
431
- - implementation: 列表,每条一个具体步骤
432
- - acceptance: 列表,每条可独立验证(不是表格)
433
- - verify: 列表,实际可执行的命令
434
- - constraints: 列表,明确边界(含 brownfield 兼容、异常处理)
435
- - 不需要:修改文件章节、覆盖来源章节、接口定义章节、TDD 步骤章节、参考章节
436
- - 如果存在 decisions.md,无法覆盖的 D-xxx@vN 在 constraints 中标注
437
- - 写完后用 Write tool 保存到文件
438
- \`\`\``
439
- }).join('\n\n')
440
-
441
-
442
- const prompt = `为 plan.md 中的每个任务生成紧凑 TaskCard。
443
-
444
- ## 任务清单
445
- ${taskList}
446
-
447
- ## 时间和用户
448
- 当前时间:<now-datetime>
449
- 当前用户:<git-user>
450
-
451
- ## 执行方式(必须严格遵守)
452
-
453
- **你必须使用 Agent tool 启动子代理来写每个卡片,不要自己写。**
454
-
455
- 1. 确认 \`${changeDir}/tasks/\` 目录存在(不存在则创建)
456
- 2. 为每个任务启动一个独立子代理(Agent tool),可并行启动多个
457
- 3. 每个子代理使用对应的 prompt(见下方模板)
458
- 4. 等待所有子代理完成
459
- 5. 验证每个 task-N.md 文件已生成且非空
460
-
461
- ### 子代理 prompt 模板
462
- 为每个任务使用以下 prompt 启动子代理:
463
-
464
- ${subagentPrompts}
465
-
466
- ## 验收(生成后自查,不另开步骤)
467
- - 每个 task-N.md 文件存在且非空
468
- - frontmatter 包含:id、title、author、created_at、priority、depends_on、blocks、allowed_paths
469
- - body 包含:goal、implementation、acceptance、verify、constraints
470
- - 每个 task 总长度 20~40 行
471
- - **一致性自查**:
472
- - allowed_paths 有无冲突
473
- - depends_on 与 plan.md Wave 分组是否一致
474
- - 如发现矛盾,列出问题清单,不要自动修复`
475
-
476
- return {
477
- id: 'generate_blueprints',
478
- name: '生成 TaskCard(子代理并行)',
479
- prompt,
480
- outputHint: 'TaskCard 生成结果',
123
+ ### 操作
124
+ 1. 读取所有 tasks/task-NN.md
125
+ 2. 检查:
126
+ - 文件路径有没有冲突(两个任务改同一个文件)
127
+ - 依赖关系和 plan.md Wave 分组是否一致
128
+ - 验收标准和 plan.md 的全局标准是否矛盾
129
+ - 接口定义是否自洽
130
+ 3. 发现问题 列出问题清单,暂停等用户决定是否修复
131
+
132
+ ### 输出
133
+ 一致性审查结果`,
134
+ outputHint: '审查结果',
481
135
  optional: false
482
- }
483
- }
136
+ },
137
+ {
138
+ name: '保存并更新进度',
139
+ prompt: `确认所有文件已保存,更新进度。
484
140
 
485
- // ═══════════════════════════════════════════════════════════════
486
- // 4 步(noAI):Wave 重排 + 一致性校验 + 保存(合并原 ⑧⑨⑩,全代码化)
487
- // 核心逻辑已迁移到 plan-postcheck.js,此处只保留步骤定义
488
- // ═══════════════════════════════════════════════════════════════
141
+ ### 操作
142
+ 1. 确认 plan.md 和所有 tasks/task-NN.md 已存在
143
+ 2. \`git add .sillyspec/\` — **不要 commit**
144
+
145
+ ### 输出
146
+ 文件列表 + 下一步命令`,
147
+ outputHint: '文件列表',
148
+ optional: false
149
+ }
150
+ ]
489
151
 
490
152
  /**
491
- * noAI postcheck 步骤:Wave 重排 + 一致性校验 + 可行性校验 + 保存确认
492
- * 核心逻辑见 plan-postcheck.js
153
+ * 解析 plan.md 获取任务名列表
493
154
  */
494
- export function buildPostcheckStep(changeDir) {
495
- return {
496
- id: 'postcheck',
497
- name: 'Wave 重排与可行性校验',
498
- prompt: '', // noAI 步骤不需要 prompt
499
- outputHint: 'Wave 重排 + 校验结果',
500
- optional: false,
501
- noAI: true,
502
- _cliAction: 'planPostcheck'
155
+ function parseTaskNames(planContent) {
156
+ const names = []
157
+ const lines = planContent.split('\n')
158
+ for (const line of lines) {
159
+ const m = line.match(/^[-*]\s*\[[ x]\]\s*task-(\d+):\s*(.+)/i)
160
+ if (m) {
161
+ names.push({ num: parseInt(m[1]), name: m[2].trim() })
162
+ }
503
163
  }
164
+ return names
504
165
  }
505
166
 
506
- // ═══════════════════════════════════════════════════════════════
507
- // 向后兼容:导出 fixedPrefix / fixedSuffix(供 run.js 切片用)
508
- // ═══════════════════════════════════════════════════════════════
509
-
510
- export const fixedPrefix = [stepClassify, stepGeneratePlan]
511
-
512
- export const fixedSuffix = [] // postcheck 是动态生成的(需要 changeDir)
513
-
514
- // ═══════════════════════════════════════════════════════════════
515
- // 工具函数(保持导出兼容)
516
- // ═══════════════════════════════════════════════════════════════
517
-
518
167
  /**
519
168
  * 解析 plan.md 获取任务数量
520
169
  */
521
170
  function parseTaskCount(planContent) {
522
- if (!planContent || typeof planContent !== 'string') return 0
523
171
  const matches = planContent.match(/^[-*]\s*\[[ x]\]\s*task-\d+/gm)
524
172
  return matches ? matches.length : 0
525
173
  }
526
174
 
527
175
  /**
528
- * plan.md 解析任务名列表
176
+ * 生成单个任务的蓝图写作 prompt
529
177
  */
530
- function parseTaskNames(planContent) {
531
- const names = []
532
- const lines = planContent.split('\n')
533
- for (const line of lines) {
534
- const m = line.match(/^[-*]\s*\[[ x]\]\s*task-\d+:\s*(.+)/i)
535
- if (m) names.push(m[1].trim())
536
- }
537
- return names
178
+ function buildTaskPrompt(taskNum, taskName, changeDir) {
179
+ return `编写任务蓝图 tasks/task-${String(taskNum).padStart(2, '0')}.md
180
+
181
+ ### 任务
182
+ ${taskName}
183
+
184
+ ### 文件路径
185
+ \`.sillyspec/changes/<变更名>/tasks/task-${String(taskNum).padStart(2, '0')}.md\`
186
+
187
+ ### 格式要求(必须严格遵守)
188
+ \`\`\`markdown
189
+ # task-${String(taskNum).padStart(2, '0')}: ${taskName}
190
+
191
+ ## 修改文件
192
+ - 具体文件路径列表
193
+
194
+ ## 实现要求
195
+ 1. 具体做什么,写清楚
196
+ 2. ...
197
+
198
+ ## 接口定义
199
+ (代码类任务必填,写方法签名、数据结构)
200
+
201
+ ## 边界处理
202
+ - 异常场景列表
203
+
204
+ ## 参考
205
+ - 已有代码可参考的模式
206
+ - 相关的 CONVENTIONS.md 条目
207
+
208
+ ## TDD 步骤
209
+ 1. 写测试 ...
210
+ 2. 运行 <test-cmd> 确认失败
211
+ 3. 写代码 ...
212
+ 4. 运行 <test-cmd> 确认通过
213
+ (纯配置/文档类任务简化为:1. 实现 2. 验证)
214
+
215
+ ## 验收标准
216
+ - [ ] 具体可测试的验收条件
217
+ \`\`\`
218
+
219
+ ### 关键规则
220
+ - task-N.md 必须独立完整,execute 子代理只读这一个文件就能干活
221
+ - 不要依赖其他 task-N.md 的内容
222
+ - 接口定义写到"搬砖工照着做"的程度
223
+ - 写完后保存到文件
224
+
225
+ ### 操作
226
+ 1. 读取 design.md 和 plan.md 了解上下文
227
+ 2. 读取相关源文件了解现有代码
228
+ 3. 编写任务蓝图
229
+ 4. 保存到 tasks/task-${String(taskNum).padStart(2, '0')}.md
230
+
231
+ ### 输出
232
+ 任务蓝图内容摘要`
538
233
  }
539
234
 
540
235
  /**
541
236
  * 动态构建 plan 步骤列表
542
- * 新架构:3 个 LLM 步骤 + 1 个 noAI 步骤 = 4 阶段
543
- *
544
237
  * @param {string|null} changeDir - 变更目录路径
545
238
  * @param {string|null} planContent - plan.md 内容(可选,用于解析任务数)
546
239
  * @returns {Array} 步骤列表
547
240
  */
548
241
  export function buildPlanSteps(changeDir = null, planContent = null) {
549
242
  let taskCount = 0
243
+ let taskNames = []
550
244
 
551
- // 尝试从 plan.md 解析任务数
245
+ // 尝试从 plan.md 解析任务数和名称
552
246
  if (planContent) {
553
247
  taskCount = parseTaskCount(planContent)
248
+ taskNames = parseTaskNames(planContent)
554
249
  } else if (changeDir) {
555
250
  const planFile = path.join(changeDir, 'plan.md')
556
251
  if (existsSync(planFile)) {
557
- taskCount = parseTaskCount(readFileSync(planFile, 'utf8'))
252
+ planContent = readFileSync(planFile, 'utf8')
253
+ taskCount = parseTaskCount(planContent)
254
+ taskNames = parseTaskNames(planContent)
558
255
  }
559
256
  }
560
257
 
561
- // 没有任务数则用固定步骤(兼容旧流程,无蓝图步骤无 postcheck)
258
+ // 没有任务数则用固定步骤(兼容旧流程)
562
259
  if (taskCount === 0) {
563
- const postcheck = changeDir ? [buildPostcheckStep(changeDir)] : []
564
- return [...fixedPrefix, ...postcheck]
260
+ return [...fixedPrefix, ...fixedSuffix]
565
261
  }
566
262
 
567
- // 解析任务名
568
- let taskNames = []
569
- if (planContent) {
570
- taskNames = parseTaskNames(planContent)
571
- } else if (changeDir) {
572
- const planFile = path.join(changeDir, 'plan.md')
573
- if (existsSync(planFile)) {
574
- taskNames = parseTaskNames(readFileSync(planFile, 'utf8'))
575
- }
263
+ // 动态生成每个任务的蓝图写作步骤
264
+ const taskSteps = []
265
+ for (let i = 1; i <= taskCount; i++) {
266
+ const taskName = taskNames.find(t => t.num === i)?.name || `task-${String(i).padStart(2, '0')}`
267
+ taskSteps.push({
268
+ name: `写任务蓝图 task-${String(i).padStart(2, '0')}`,
269
+ prompt: `### 注意
270
+ 这是第 ${i}/${taskCount} 个任务蓝图。focus 在这一个任务上,不要写其他任务的内容。
271
+
272
+ ${buildTaskPrompt(i, taskName, changeDir)}`,
273
+ outputHint: `task-${String(i).padStart(2, '0')} 蓝图`,
274
+ optional: false
275
+ })
576
276
  }
577
277
 
578
- // 生成协调器步骤(TaskCard 生成)+ postcheck
579
- const coordinatorStep = buildCoordinatorStep(changeDir, taskNames)
580
- const postcheckStep = buildPostcheckStep(changeDir)
581
- return [...fixedPrefix, coordinatorStep, postcheckStep]
278
+ return [...fixedPrefix, ...taskSteps, ...fixedSuffix]
582
279
  }