sillyspec 3.9.0 → 3.10.0

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 (206) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +17 -0
  2. package/.claude/skills/sillyspec-auto/SKILL.md +78 -0
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +17 -0
  4. package/{templates/commit.md → .claude/skills/sillyspec-commit/SKILL.md} +32 -47
  5. package/.claude/skills/sillyspec-continue/SKILL.md +45 -0
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +27 -0
  7. package/.claude/skills/sillyspec-execute/SKILL.md +17 -0
  8. package/.claude/skills/sillyspec-explore/SKILL.md +105 -0
  9. package/.claude/skills/sillyspec-export/SKILL.md +53 -0
  10. package/.claude/skills/sillyspec-init/SKILL.md +170 -0
  11. package/.claude/skills/sillyspec-plan/SKILL.md +17 -0
  12. package/.claude/skills/sillyspec-propose/SKILL.md +17 -0
  13. package/.claude/skills/sillyspec-quick/SKILL.md +17 -0
  14. package/.claude/skills/sillyspec-resume/SKILL.md +111 -0
  15. package/.claude/skills/sillyspec-scan/SKILL.md +17 -0
  16. package/.claude/skills/sillyspec-state/SKILL.md +54 -0
  17. package/.claude/skills/sillyspec-status/SKILL.md +17 -0
  18. package/.claude/skills/sillyspec-verify/SKILL.md +17 -0
  19. package/.claude/skills/sillyspec-workspace/SKILL.md +149 -0
  20. package/README.md +19 -11
  21. package/SKILL.md +15 -10
  22. package/package.json +7 -9
  23. package/packages/dashboard/dist/assets/index-BcM2J-hv.css +1 -0
  24. package/packages/dashboard/dist/assets/index-DpLHK4jv.js +7446 -0
  25. package/packages/dashboard/dist/index.html +16 -16
  26. package/packages/dashboard/dist/prototype-dashboard.html +836 -0
  27. package/packages/dashboard/dist/prototype-overview.html +256 -0
  28. package/packages/dashboard/package-lock.json +226 -6
  29. package/packages/dashboard/package.json +8 -5
  30. package/packages/dashboard/public/logo.jpg +0 -0
  31. package/packages/dashboard/public/prototype-dashboard.html +836 -0
  32. package/packages/dashboard/public/prototype-overview.html +256 -0
  33. package/packages/dashboard/server/executor.js +1 -1
  34. package/packages/dashboard/server/index.js +341 -113
  35. package/packages/dashboard/server/parser.js +442 -30
  36. package/packages/dashboard/server/watcher.js +214 -134
  37. package/packages/dashboard/src/App.vue +475 -71
  38. package/packages/dashboard/src/components/ActionBar.vue +36 -43
  39. package/packages/dashboard/src/components/CommandPalette.vue +45 -66
  40. package/packages/dashboard/src/components/DetailPanel.vue +68 -53
  41. package/packages/dashboard/src/components/DocPreview.vue +257 -0
  42. package/packages/dashboard/src/components/DocTree.vue +114 -0
  43. package/packages/dashboard/src/components/HResizeHandle.vue +48 -0
  44. package/packages/dashboard/src/components/LogStream.vue +13 -33
  45. package/packages/dashboard/src/components/PipelineStage.vue +8 -8
  46. package/packages/dashboard/src/components/PipelineView.vue +99 -45
  47. package/packages/dashboard/src/components/ProjectCard.vue +187 -0
  48. package/packages/dashboard/src/components/ProjectList.vue +103 -45
  49. package/packages/dashboard/src/components/ProjectOverview.vue +152 -0
  50. package/packages/dashboard/src/components/StageBadge.vue +13 -13
  51. package/packages/dashboard/src/components/StepCard.vue +15 -15
  52. package/packages/dashboard/src/components/VResizeHandle.vue +61 -0
  53. package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -0
  54. package/packages/dashboard/src/components/detail/GitDetail.vue +61 -0
  55. package/packages/dashboard/src/components/detail/TechDetail.vue +43 -0
  56. package/packages/dashboard/src/composables/useDashboard.js +48 -6
  57. package/packages/dashboard/src/composables/useKeyboard.js +6 -4
  58. package/packages/dashboard/src/composables/useLayout.js +131 -0
  59. package/packages/dashboard/src/main.js +4 -1
  60. package/packages/dashboard/src/style.css +17 -17
  61. package/src/index.js +141 -22
  62. package/src/init.js +93 -231
  63. package/src/migrate.js +117 -0
  64. package/src/progress.js +460 -0
  65. package/src/run.js +635 -0
  66. package/src/setup.js +2 -72
  67. package/src/stages/archive.js +54 -0
  68. package/src/stages/brainstorm.js +264 -0
  69. package/src/stages/doctor.js +303 -0
  70. package/src/stages/execute.js +287 -0
  71. package/src/stages/explore.js +34 -0
  72. package/src/stages/index.js +28 -0
  73. package/src/stages/plan.js +354 -0
  74. package/src/stages/propose.js +115 -0
  75. package/src/stages/quick.js +64 -0
  76. package/src/stages/scan.js +141 -0
  77. package/src/stages/status.js +65 -0
  78. package/src/stages/verify.js +135 -0
  79. package/.sillyspec/changes/dashboard/design.md +0 -219
  80. package/.sillyspec/plans/2026-04-05-dashboard.md +0 -737
  81. package/.sillyspec/specs/2026-04-05-dashboard-design.md +0 -206
  82. package/dist/steps/brainstorm/01-load-context.md +0 -30
  83. package/dist/steps/brainstorm/02-reuse-check.md +0 -6
  84. package/dist/steps/brainstorm/03-prototype-analysis.md +0 -11
  85. package/dist/steps/brainstorm/04-module-split.md +0 -23
  86. package/dist/steps/brainstorm/05-dialog-explore.md +0 -8
  87. package/dist/steps/brainstorm/06-propose-approaches.md +0 -3
  88. package/dist/steps/brainstorm/07-present-design.md +0 -3
  89. package/dist/steps/brainstorm/08-write-design.md +0 -21
  90. package/dist/steps/brainstorm/09-self-review.md +0 -15
  91. package/dist/steps/brainstorm/10-user-confirm.md +0 -3
  92. package/dist/steps/brainstorm/11-output-spec.md +0 -7
  93. package/dist/steps/brainstorm/manifest.yaml +0 -26
  94. package/dist/steps/execute/01-load-context.md +0 -41
  95. package/dist/steps/execute/02-scan-conventions.md +0 -47
  96. package/dist/steps/execute/03-skill-mcp.md +0 -19
  97. package/dist/steps/execute/04-assign-task.md +0 -22
  98. package/dist/steps/execute/04b-prompt-template.md +0 -54
  99. package/dist/steps/execute/05-write-test.md +0 -7
  100. package/dist/steps/execute/06-write-code.md +0 -8
  101. package/dist/steps/execute/07-run-test.md +0 -26
  102. package/dist/steps/execute/08-fix-issues.md +0 -28
  103. package/dist/steps/execute/09-next-task.md +0 -33
  104. package/dist/steps/execute/manifest.yaml +0 -28
  105. package/dist/steps/plan/01-load-context.md +0 -22
  106. package/dist/steps/plan/02-anchor-confirm.md +0 -1
  107. package/dist/steps/plan/03-expand-tasks.md +0 -33
  108. package/dist/steps/plan/04-mark-order.md +0 -15
  109. package/dist/steps/plan/05-e2e-planning.md +0 -17
  110. package/dist/steps/plan/06-self-check.md +0 -16
  111. package/dist/steps/plan/07-save.md +0 -1
  112. package/dist/steps/plan/manifest.yaml +0 -18
  113. package/dist/steps/scan/01-env-detect.md +0 -51
  114. package/dist/steps/scan/02-tech-stack.md +0 -16
  115. package/dist/steps/scan/03-conventions.md +0 -16
  116. package/dist/steps/scan/04-structure.md +0 -19
  117. package/dist/steps/scan/05-quality.md +0 -18
  118. package/dist/steps/scan/06-complete.md +0 -49
  119. package/dist/steps/scan/manifest.yaml +0 -16
  120. package/dist/steps/verify/01-load-specs.md +0 -28
  121. package/dist/steps/verify/02-check-tasks.md +0 -1
  122. package/dist/steps/verify/03-check-design.md +0 -6
  123. package/dist/steps/verify/04-run-tests.md +0 -7
  124. package/dist/steps/verify/05-e2e-tests.md +0 -27
  125. package/dist/steps/verify/05b-e2e-fix.md +0 -33
  126. package/dist/steps/verify/06-code-quality.md +0 -25
  127. package/dist/steps/verify/07-lint-check.md +0 -27
  128. package/dist/steps/verify/08-output-report.md +0 -14
  129. package/dist/steps/verify/manifest.yaml +0 -22
  130. package/docs/.vitepress/config.mts +0 -45
  131. package/docs/.vitepress/dist/404.html +0 -25
  132. package/docs/.vitepress/dist/assets/app.YytxICdd.js +0 -1
  133. package/docs/.vitepress/dist/assets/chunks/framework.Czhw_PXq.js +0 -19
  134. package/docs/.vitepress/dist/assets/chunks/theme.DusTRZQk.js +0 -1
  135. package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.js +0 -1
  136. package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.lean.js +0 -1
  137. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  138. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  139. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  140. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  141. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  142. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  143. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  144. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  145. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  146. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  147. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  148. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  149. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  150. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  151. package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.js +0 -15
  152. package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.lean.js +0 -1
  153. package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.js +0 -4
  154. package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.lean.js +0 -1
  155. package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.js +0 -1
  156. package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.lean.js +0 -1
  157. package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.js +0 -4
  158. package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.lean.js +0 -1
  159. package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.js +0 -5
  160. package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.lean.js +0 -1
  161. package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.js +0 -28
  162. package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.lean.js +0 -1
  163. package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.js +0 -30
  164. package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.lean.js +0 -1
  165. package/docs/.vitepress/dist/assets/style.DFTx90Kk.css +0 -1
  166. package/docs/.vitepress/dist/hashmap.json +0 -1
  167. package/docs/.vitepress/dist/index.html +0 -28
  168. package/docs/.vitepress/dist/sillyspec/commands.html +0 -42
  169. package/docs/.vitepress/dist/sillyspec/dashboard.html +0 -31
  170. package/docs/.vitepress/dist/sillyspec/file-io.html +0 -28
  171. package/docs/.vitepress/dist/sillyspec/getting-started.html +0 -31
  172. package/docs/.vitepress/dist/sillyspec/install.html +0 -32
  173. package/docs/.vitepress/dist/sillyspec/lifecycle.html +0 -55
  174. package/docs/.vitepress/dist/sillyspec/structure.html +0 -57
  175. package/docs/.vitepress/dist/vp-icons.css +0 -1
  176. package/docs/index.md +0 -34
  177. package/docs/sillyspec/commands.md +0 -218
  178. package/docs/sillyspec/dashboard.md +0 -51
  179. package/docs/sillyspec/file-io.md +0 -34
  180. package/docs/sillyspec/getting-started.md +0 -61
  181. package/docs/sillyspec/install.md +0 -51
  182. package/docs/sillyspec/lifecycle.md +0 -146
  183. package/docs/sillyspec/structure.md +0 -62
  184. package/packages/dashboard/dist/assets/index-Bh-GPjKY.css +0 -1
  185. package/packages/dashboard/dist/assets/index-CrCn5Gg6.js +0 -17
  186. package/src/step.js +0 -543
  187. package/templates/archive.md +0 -120
  188. package/templates/brainstorm.md +0 -170
  189. package/templates/continue.md +0 -32
  190. package/templates/execute.md +0 -304
  191. package/templates/explore.md +0 -59
  192. package/templates/export.md +0 -21
  193. package/templates/init.md +0 -61
  194. package/templates/plan.md +0 -146
  195. package/templates/quick.md +0 -135
  196. package/templates/scan-quick.md +0 -49
  197. package/templates/scan.md +0 -156
  198. package/templates/skills/playwright-e2e/SKILL.md +0 -340
  199. package/templates/status.md +0 -75
  200. package/templates/verify.md +0 -236
  201. package/templates/workspace-sync.md +0 -99
  202. package/templates/workspace.md +0 -70
  203. /package/{docs/.vitepress/dist/logo.jpg → logo.jpg} +0 -0
  204. /package/{docs/.vitepress → packages/dashboard}/dist/favicon.jpg +0 -0
  205. /package/{docs/public → packages/dashboard/dist}/logo.jpg +0 -0
  206. /package/{docs → packages/dashboard}/public/favicon.jpg +0 -0
package/src/setup.js CHANGED
@@ -1,25 +1,9 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync } from 'fs';
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
2
2
  import { join, dirname } from 'path';
3
- import { fileURLToPath } from 'url';
4
3
  import { execSync } from 'child_process';
5
4
  import chalk from 'chalk';
6
5
  import ora from 'ora';
7
- import { checkbox, confirm, input, select } from '@inquirer/prompts';
8
-
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = dirname(__filename);
11
-
12
- // ── Skill 定义 ──
13
-
14
- const SKILLS = [
15
- {
16
- id: 'playwright-e2e',
17
- name: 'Playwright E2E 测试参考',
18
- description: 'E2E 测试编写最佳实践,AI 执行测试任务时自动读取',
19
- source: join(__dirname, '..', 'templates', 'skills', 'playwright-e2e'),
20
- target: 'playwright-e2e',
21
- },
22
- ];
6
+ import { checkbox, input } from '@inquirer/prompts';
23
7
 
24
8
  // ── MCP 工具定义 ──
25
9
 
@@ -298,21 +282,6 @@ export async function cmdSetup(dir, options = {}) {
298
282
  ...dbChoices,
299
283
  ...globalChoices.length > 0 ? [{ name: chalk.bold('── 全局工具 ──'), value: '_global_header', disabled: true }] : [],
300
284
  ...globalChoices,
301
- ...[{ name: chalk.bold('── AI Skills(编写参考)──'), value: '_skill_header', disabled: true }],
302
- ...(() => {
303
- const installed = new Set();
304
- for (const { path } of availableTools) {
305
- const skillDir = join(dir, dirname(path), 'skills');
306
- for (const s of SKILLS) {
307
- if (existsSync(join(skillDir, s.target, 'SKILL.md'))) installed.add(s.id);
308
- }
309
- }
310
- return SKILLS.filter(s => !installed.has(s.id)).map(s => ({
311
- name: `${s.name} — ${s.description}`,
312
- value: `skill:${s.id}`,
313
- checked: false,
314
- }));
315
- })(),
316
285
  ];
317
286
 
318
287
  if (allChoices.length === 0) {
@@ -402,41 +371,6 @@ export async function cmdSetup(dir, options = {}) {
402
371
  }
403
372
  }
404
373
 
405
- // ── 安装 Skills ──
406
-
407
- const selectedSkills = SKILLS.filter(s => selected.includes(`skill:${s.id}`));
408
-
409
- if (selectedSkills.length > 0) {
410
- // 跟 MCP 一样,选择安装到哪些 AI 工具
411
- const skillTargets = availableTools.map(t => ({
412
- name: t.tool,
413
- value: t.key,
414
- checked: true,
415
- }));
416
-
417
- const selectedTools = await checkbox({
418
- message: 'Skill 安装到哪些 AI 工具?',
419
- choices: skillTargets,
420
- });
421
-
422
- const targets = availableTools.filter(t => selectedTools.includes(t.key));
423
-
424
- console.log('');
425
- for (const { tool, path } of targets) {
426
- const spinner = ora(`安装 Skills 到 ${tool}...`).start();
427
- for (const skill of selectedSkills) {
428
- try {
429
- const targetDir = join(dir, dirname(path), 'skills', skill.target);
430
- mkdirSync(targetDir, { recursive: true });
431
- cpSync(skill.source, targetDir, { recursive: true });
432
- spinner.succeed(`${tool} → ${dirname(path)}/skills/${skill.target}/SKILL.md`);
433
- } catch (err) {
434
- spinner.fail(`${skill.name} 安装失败: ${err.message}`);
435
- }
436
- }
437
- }
438
- }
439
-
440
374
  // ── 总结 ──
441
375
 
442
376
  console.log('');
@@ -456,10 +390,6 @@ export async function cmdSetup(dir, options = {}) {
456
390
  console.log(` 🛠️ ${chalk.cyan(g.name)} — ${g.description}`);
457
391
  console.log(chalk.dim(` ${g.url}`));
458
392
  }
459
- for (const s of selectedSkills) {
460
- console.log(` 📚 ${chalk.cyan(s.name)} — ${s.description}`);
461
- console.log(chalk.dim(` → ${s.target}/SKILL.md`));
462
- }
463
393
  console.log('');
464
394
  if (selectedMcp.length > 0) {
465
395
  console.log(chalk.dim(' 重启你的 AI 工具以使 MCP 配置生效。'));
@@ -0,0 +1,54 @@
1
+ export const definition = {
2
+ name: 'archive',
3
+ title: '归档变更',
4
+ description: '规范沉淀,可追溯',
5
+ auxiliary: true,
6
+ steps: [
7
+ {
8
+ name: '任务完成度检查',
9
+ prompt: `检查 tasks.md 中所有 checkbox 是否已勾选。
10
+
11
+ ### 操作
12
+ 1. 读取 \`.sillyspec/changes/<change-name>/tasks.md\`
13
+ 2. 检查所有 checkbox 是否已勾选
14
+ 3. 如有遗漏 → 询问用户是否继续归档
15
+
16
+ ### 输出
17
+ 完成度报告`,
18
+ outputHint: '完成度报告',
19
+ optional: false
20
+ },
21
+ {
22
+ name: '确认归档',
23
+ prompt: `展示即将归档的内容,请用户确认。
24
+
25
+ ### 操作
26
+ 1. 展示:变更目录名、包含的文件列表、生成总结
27
+ 2. 请用户确认是否执行归档
28
+ 3. 确认后:将 \`.sillyspec/changes/<change-name>/\` 移动到 \`.sillyspec/changes/archive/YYYY-MM-DD-<change-name>/\`
29
+ 4. 确保所有 checkbox 都已勾选
30
+
31
+ ### 输出
32
+ 归档确认`,
33
+ outputHint: '归档确认',
34
+ optional: false
35
+ },
36
+ {
37
+ name: '更新路线图和提交',
38
+ prompt: `更新路线图并暂存变更。
39
+
40
+ ### 操作
41
+ 1. 如果 \`.sillyspec/ROADMAP.md\` 存在,标记对应 Phase 为已完成
42
+ 2. \`git add .sillyspec/\` — **不要 commit**,由用户通过统一提交工具处理
43
+ 3. 更新 progress.json:
44
+ - 清除当前变更信息(归档后不再活跃)
45
+ - 如果是主变更(有 MASTER.md),标记所有阶段为 ✅,然后清除
46
+ - 历史记录追加时间 + 归档完成
47
+
48
+ ### 输出
49
+ 归档完成确认 + 累积规范统计`,
50
+ outputHint: '归档完成',
51
+ optional: false
52
+ }
53
+ ]
54
+ }
@@ -0,0 +1,264 @@
1
+ export const definition = {
2
+ name: 'brainstorm',
3
+ title: '头脑风暴',
4
+ description: '探索需求、分析技术方案、识别风险',
5
+ steps: [
6
+ {
7
+ name: '状态检查',
8
+ prompt: `检查 .sillyspec/.runtime/progress.json 确认当前状态。
9
+
10
+ ### 操作
11
+ 1. 运行 \`sillyspec progress show\`
12
+ 2. 确认 currentStage 为 "brainstorm"
13
+ 3. 如果有进行中的 brainstorm,提示选择继续或重新开始
14
+ 4. 如果未初始化,提示先运行 sillyspec init
15
+
16
+ ### 输出
17
+ 当前状态摘要(1-2 句话)
18
+
19
+ ### 注意
20
+ - 以 CLI 返回为准,不要自行推断阶段
21
+ - 如果阶段不对,输出正确提示并停止`,
22
+ outputHint: '状态摘要',
23
+ optional: false
24
+ },
25
+ {
26
+ name: '加载项目上下文',
27
+ prompt: `加载项目现有上下文,理解代码结构和约定。
28
+
29
+ ### 操作
30
+ 1. 读取 CODEBASE-OVERVIEW.md + 共享规范 + 子项目上下文
31
+ 2. 加载项目信息:\`cat .sillyspec/projects/*.yaml 2>/dev/null\`
32
+ 3. 加载本地配置:\`cat .sillyspec/local.yaml 2>/dev/null\`
33
+ 4. 询问本次需求属于哪个子项目
34
+ 5. 棕地项目:读取 .sillyspec/docs/<project>/scan/ 下的 STRUCTURE.md、CONVENTIONS.md、ARCHITECTURE.md
35
+ 6. 查看进行中的变更:\`ls .sillyspec/changes/ | grep -v archive\`
36
+
37
+ ### 输出
38
+ 项目现状理解摘要(3-5 句话,关键约定和架构决策)
39
+
40
+ ### 注意
41
+ - 始终询问本次需求属于哪个子项目
42
+ - 棕地项目必须读取数据模型章节`,
43
+ outputHint: '上下文摘要',
44
+ optional: false
45
+ },
46
+ {
47
+ name: '协作与复用检查',
48
+ prompt: `检查是否有同名变更或可复用模板。
49
+
50
+ ### 操作
51
+ 1. 检查已有变更:\`ls .sillyspec/changes/ | grep -v archive\`
52
+ - 有相关变更 → 提示用户,避免重复
53
+ 2. 检查全局模板:\`ls ~/.sillyspec/templates/\`
54
+ - 有匹配模板 → 询问是否基于模板
55
+ 3. 无相关内容 → 跳过,不输出
56
+
57
+ ### 输出
58
+ 检测到的相关变更和可用模板(无则输出"无冲突,继续")`,
59
+ outputHint: '已有变更和可用模板',
60
+ optional: true
61
+ },
62
+ {
63
+ name: '原型/设计图分析',
64
+ prompt: `如果用户提供了截图、图片或 HTML 原型,分析提取结构。
65
+
66
+ ### 操作
67
+ 1. 识别图片中的页面结构(区域、组件、布局)
68
+ 2. 提取表单字段(名称、类型、必填、选项)
69
+ 3. 提取交互流程(页面跳转、按钮行为)
70
+ 4. 提取标注和备注(业务规则、权限说明)
71
+ 5. 展示分析结果,请用户确认遗漏
72
+
73
+ ### 输出
74
+ 页面结构树 + 字段列表 + 交互流程图
75
+
76
+ ### 注意
77
+ - 没有原型则跳过此步骤
78
+ - 多页面时逐页分析,不要一次全部输出
79
+ - 图片信息 > 文字描述,不要忽略视觉信息`,
80
+ outputHint: '页面结构和交互流程',
81
+ optional: true
82
+ },
83
+ {
84
+ name: '需求范围评估',
85
+ prompt: `评估需求复杂度,判断是否需要拆分或走批量模式。
86
+
87
+ ### 操作
88
+ 1. 根据分析结果判断复杂度
89
+ 2. 满足以下任意 2 条建议拆分:
90
+ - 3+ 个可独立交付的功能模块
91
+ - 3+ 种角色有不同权限和视图
92
+ - 跨页面状态流转(审批流、多步表单)
93
+ - 模块间耦合度低可独立开发
94
+ 3. 满足以下条件建议走**批量模式**:
95
+ - 任务数量 > 10 且任务间有重复模式(如 100 个报表、50 个表单、N 个相似页面)
96
+ - 本质是「模板 × 数据」而非 N 个独立功能
97
+ - 直接逐个开发会导致 plan.md 膨胀和上下文溢出
98
+ 4. 需要拆分 → 生成 MASTER.md,规划子阶段
99
+ 5. 检测到批量模式 → 输出提示并建议用户确认
100
+ 6. 都不需要 → 继续
101
+
102
+ ### 批量模式指引
103
+ 确认后,后续 plan/execute 按以下原则调整:
104
+ - **不要**把每个实例列为独立任务(不要写 100 个 checkbox)
105
+ - plan 设计通用架构(引擎/模板/配置格式),任务数控制在 10 个以内
106
+ - 数据转换用脚本完成(Excel → 配置文件),不消耗 AI 上下文
107
+ - execute 每个 Wave 独立模块,Wave 间通过接口定义解耦
108
+ - verify 用脚本全量验证 + AI 抽查边界案例
109
+
110
+ ### 半批量场景
111
+ 如果任务中大部分相似但有少量特殊任务(如 20 个任务中 15 个相似、5 个特殊):
112
+ - **主簇**(>10 个相似)→ 走批量模式(引擎 + 配置)
113
+ - **小簇**(2-5 个相似)→ 走简化版批量(基于主簇模板扩展)
114
+ - **孤立任务**(1 个)→ 走标准开发流程
115
+ - 建议用「继承 + override」配置解决特殊任务,配置解决不了的才写定制代码
116
+ - 架构设计时预留扩展点(hooks/overrides),让特殊任务能"挂上去"而不是"另起炉灶"
117
+
118
+ ### 输出
119
+ 拆分方案 / 批量模式确认 / "无需拆分"确认
120
+
121
+ ### 注意
122
+ - 简单 CRUD 不拆
123
+ - 拆分方案需用户确认
124
+ - 批量模式需用户确认`,
125
+ outputHint: '拆分方案或无需拆分确认',
126
+ optional: true
127
+ },
128
+ {
129
+ name: '对话式探索',
130
+ prompt: `通过对话探索需求细节。
131
+
132
+ ### 操作
133
+ 1. 从最核心的一个问题开始(用户到底想要什么?)
134
+ 2. 等待用户回答后再问下一个
135
+ 3. 根据回答判断:信息够了 → 进入方案 / 需要追问 → 只问一个
136
+ 4. 探索顺序(按需):目的 → 约束 → 边界 → 成功标准
137
+
138
+ ### 输出
139
+ 需求理解摘要(用户确认的需求点列表)
140
+
141
+ ### 铁律
142
+ - 一次只问一个问题
143
+ - 2-3 轮问答就应进入方案讨论
144
+ - 多选题优于开放式问题
145
+ - YAGNI — 砍掉不需要的功能`,
146
+ outputHint: '需求理解摘要',
147
+ optional: false
148
+ },
149
+ {
150
+ name: '提出 2-3 种方案',
151
+ prompt: `基于需求理解,提出 2-3 种实现方案。
152
+
153
+ ### 操作
154
+ 1. 每种方案列出:核心思路、优势、劣势
155
+ 2. 给出推荐方案和理由
156
+ 3. 等待用户选择或调整
157
+
158
+ ### 输出
159
+ 方案对比表 + 推荐方案
160
+
161
+ ### 注意
162
+ - 方案差异要实质性的,不要为了凑数
163
+ - 推荐理由要具体`,
164
+ outputHint: '方案对比和推荐',
165
+ optional: false
166
+ },
167
+ {
168
+ name: '分段展示设计',
169
+ prompt: `按复杂度分段展示设计方案,逐段确认。
170
+
171
+ ### 操作
172
+ 1. 简单项目:几句话整体描述
173
+ 2. 复杂项目:每段 200-300 字,逐段展示
174
+ 3. 每段展示后等待用户确认
175
+ 4. 收集修改意见,调整设计
176
+ 5. 确认设计后,确定变更名(格式:\`YYYY-MM-DD-<简短描述>\`,例如 \`2026-05-13-user-auth\`)
177
+
178
+ ### 输出
179
+ 用户确认的完整设计方案 + 变更名
180
+
181
+ ### 注意
182
+ - 不要一次输出大段文字
183
+ - 逐段确认,确保用户跟上
184
+ - 变更名必须以当天日期开头(YYYY-MM-DD-),后跟英文短横线分隔的简短描述`,
185
+ outputHint: '用户确认的设计方案',
186
+ optional: false
187
+ },
188
+ {
189
+ name: 'HTML 原型生成',
190
+ prompt: `为设计方案生成可交互的 HTML 原型,帮助用户可视化确认。
191
+
192
+ ### 操作
193
+ 1. 判断本次设计是否适合生成 HTML 原型:
194
+ - 适合:有 UI 组件/布局/交互流程/状态转换/架构图
195
+ - 不适合:纯后端逻辑/配置修改/无可视化意义
196
+ 2. 如果适合,生成一个独立的 HTML 文件(内联 CSS + JS),保存到:
197
+ \`.sillyspec/changes/<变更名>/prototype-<名称>.html\`(变更名格式:YYYY-MM-DD-<简短描述>)
198
+ 3. 原型要求:
199
+ - 单文件,浏览器直接打开
200
+ - 展示关键布局结构和交互流程
201
+ - 不需要完整功能,重点是让用户确认设计方向
202
+ - 使用 ASCII/流程图/线框图风格,不需要精美 UI
203
+ 4. 展示给用户确认设计方向
204
+
205
+ ### 输出
206
+ HTML 原型文件路径(或"跳过"如果不适合)`,
207
+ outputHint: '原型文件路径或跳过',
208
+ optional: true
209
+ },
210
+ {
211
+ name: '写设计文档并自审',
212
+ prompt: `撰写 design 文档并进行 AI 自审。
213
+
214
+ ### 操作
215
+ 1. 确认变更目录存在:\`mkdir -p .sillyspec/changes/<变更名>\`(Windows 用 \`mkdir .sillyspec\\changes\\<变更名>\` 或 PowerShell \`New-Item -ItemType Directory -Force -Path .sillyspec/changes/<变更名>\`)
216
+ - 变更名格式必须为 \`YYYY-MM-DD-<简短描述>\`(如 \`2026-05-13-user-auth\`)
217
+ 2. 将确认的设计写入 \`.sillyspec/changes/<变更名>/design.md\`
218
+ 3. 自审检查:
219
+ - 需求覆盖:是否完整覆盖 Step 6 确认的需求
220
+ - 约束一致性:是否与 CONVENTIONS.md、ARCHITECTURE.md 一致
221
+ - 真实性:表名/字段名来自真实 schema 或标注"新增"
222
+ - YAGNI:是否包含不必要功能
223
+ - 验收标准:是否具体可测试
224
+ 3. 自审发现问题 → 修改后重新检查
225
+ 4. 全部通过 → 进入下一步
226
+
227
+ ### 输出
228
+ design.md 文件路径 + 自审结果
229
+
230
+ ### 注意
231
+ - 自审不通过不要进入下一步
232
+ - 不确定的问题标注「⚠️ 自审存疑」`,
233
+ outputHint: 'design.md 路径 + 自审结果',
234
+ optional: false
235
+ },
236
+ {
237
+ name: '用户确认并生成规范文件',
238
+ prompt: `用户确认设计方案,生成规范文件。
239
+
240
+ ### 操作
241
+ 1. 展示 design.md 摘要给用户
242
+ 2. 请用户选择:✅ 确认 / ✏️ 修改 / ❌ 推翻重来
243
+ 3. 确认后,在 \`.sillyspec/changes/<变更名>/\` 下生成所有规范文件:
244
+ - **design.md**:架构决策、文件变更清单、数据模型、API 设计、代码风格参照
245
+ - **proposal.md**:动机、变更范围、不在范围内、成功标准
246
+ - **requirements.md**:功能需求、用户场景(Given/When/Then 格式)、非功能需求
247
+ - **tasks.md**:任务列表(只列名称和对应文件路径,细节在 plan 阶段展开)
248
+ - \`git add .sillyspec/\` — **不要 commit**
249
+
250
+ ### 输出
251
+ 所有规范文件路径
252
+
253
+ ### 注意
254
+ - 必须等待用户明确确认
255
+ - 禁止在确认前推进到后续阶段
256
+ - 禁止自动 commit
257
+ - 推翻重来回到 Step 6
258
+ - 表名/字段名必须来自真实 schema 或标注"新增"
259
+ - tasks.md 只列任务名,细节在 plan 阶段展开`,
260
+ outputHint: '规范文件路径',
261
+ optional: false
262
+ }
263
+ ]
264
+ }