sillyspec 3.8.5 → 3.8.6

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 (163) hide show
  1. package/README.md +0 -6
  2. package/docs/.vitepress/config.mts +45 -0
  3. package/docs/.vitepress/dist/404.html +25 -0
  4. package/docs/.vitepress/dist/assets/app.YytxICdd.js +1 -0
  5. package/docs/.vitepress/dist/assets/chunks/framework.Czhw_PXq.js +19 -0
  6. package/docs/.vitepress/dist/assets/chunks/theme.DusTRZQk.js +1 -0
  7. package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.js +1 -0
  8. package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.lean.js +1 -0
  9. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  10. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  11. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  12. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  13. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  14. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  15. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  16. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  17. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  18. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  19. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  20. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  21. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  22. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  23. package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.js +15 -0
  24. package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.lean.js +1 -0
  25. package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.js +4 -0
  26. package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.lean.js +1 -0
  27. package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.js +1 -0
  28. package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.lean.js +1 -0
  29. package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.js +4 -0
  30. package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.lean.js +1 -0
  31. package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.js +5 -0
  32. package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.lean.js +1 -0
  33. package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.js +28 -0
  34. package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.lean.js +1 -0
  35. package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.js +30 -0
  36. package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.lean.js +1 -0
  37. package/docs/.vitepress/dist/assets/style.DFTx90Kk.css +1 -0
  38. package/docs/.vitepress/dist/hashmap.json +1 -0
  39. package/docs/.vitepress/dist/index.html +28 -0
  40. package/docs/.vitepress/dist/sillyspec/commands.html +42 -0
  41. package/docs/.vitepress/dist/sillyspec/dashboard.html +31 -0
  42. package/docs/.vitepress/dist/sillyspec/file-io.html +28 -0
  43. package/docs/.vitepress/dist/sillyspec/getting-started.html +31 -0
  44. package/docs/.vitepress/dist/sillyspec/install.html +32 -0
  45. package/docs/.vitepress/dist/sillyspec/lifecycle.html +55 -0
  46. package/docs/.vitepress/dist/sillyspec/structure.html +57 -0
  47. package/docs/.vitepress/dist/vp-icons.css +1 -0
  48. package/docs/index.md +34 -0
  49. package/docs/sillyspec/commands.md +218 -0
  50. package/docs/sillyspec/dashboard.md +51 -0
  51. package/docs/sillyspec/file-io.md +34 -0
  52. package/docs/sillyspec/getting-started.md +61 -0
  53. package/docs/sillyspec/install.md +51 -0
  54. package/docs/sillyspec/lifecycle.md +146 -0
  55. package/docs/sillyspec/structure.md +62 -0
  56. package/package.json +11 -9
  57. package/packages/dashboard/dist/assets/index-Bh-GPjKY.css +1 -0
  58. package/packages/dashboard/dist/assets/index-CrCn5Gg6.js +17 -0
  59. package/packages/dashboard/dist/index.html +2 -2
  60. package/packages/dashboard/package-lock.json +0 -220
  61. package/packages/dashboard/package.json +5 -8
  62. package/packages/dashboard/server/index.js +106 -255
  63. package/packages/dashboard/server/parser.js +29 -333
  64. package/packages/dashboard/server/watcher.js +131 -203
  65. package/packages/dashboard/src/App.vue +10 -181
  66. package/packages/dashboard/src/components/ActionBar.vue +42 -26
  67. package/packages/dashboard/src/components/CommandPalette.vue +65 -40
  68. package/packages/dashboard/src/components/DetailPanel.vue +53 -68
  69. package/packages/dashboard/src/components/LogStream.vue +33 -13
  70. package/packages/dashboard/src/components/PipelineStage.vue +8 -8
  71. package/packages/dashboard/src/components/PipelineView.vue +45 -80
  72. package/packages/dashboard/src/components/ProjectList.vue +45 -103
  73. package/packages/dashboard/src/components/StageBadge.vue +13 -13
  74. package/packages/dashboard/src/components/StepCard.vue +15 -15
  75. package/packages/dashboard/src/composables/useDashboard.js +6 -20
  76. package/packages/dashboard/src/composables/useKeyboard.js +4 -6
  77. package/packages/dashboard/src/main.js +1 -4
  78. package/packages/dashboard/src/style.css +17 -17
  79. package/src/index.js +12 -123
  80. package/src/init.js +227 -86
  81. package/src/setup.js +9 -1
  82. package/templates/archive.md +121 -0
  83. package/templates/brainstorm.md +240 -0
  84. package/{.claude/skills/sillyspec-commit/SKILL.md → templates/commit.md} +47 -29
  85. package/templates/continue.md +32 -0
  86. package/templates/execute.md +314 -0
  87. package/templates/explore.md +60 -0
  88. package/templates/export.md +21 -0
  89. package/templates/init.md +61 -0
  90. package/templates/plan.md +157 -0
  91. package/templates/quick.md +135 -0
  92. package/templates/scan-quick.md +49 -0
  93. package/templates/scan.md +172 -0
  94. package/templates/skills/playwright-e2e/SKILL.md +340 -0
  95. package/templates/status.md +75 -0
  96. package/templates/verify.md +253 -0
  97. package/templates/workspace-sync.md +99 -0
  98. package/templates/workspace.md +70 -0
  99. package/.claude/skills/sillyspec-archive/SKILL.md +0 -17
  100. package/.claude/skills/sillyspec-auto/SKILL.md +0 -77
  101. package/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -17
  102. package/.claude/skills/sillyspec-continue/SKILL.md +0 -44
  103. package/.claude/skills/sillyspec-doctor/SKILL.md +0 -22
  104. package/.claude/skills/sillyspec-execute/SKILL.md +0 -17
  105. package/.claude/skills/sillyspec-explore/SKILL.md +0 -96
  106. package/.claude/skills/sillyspec-export/SKILL.md +0 -53
  107. package/.claude/skills/sillyspec-init/SKILL.md +0 -170
  108. package/.claude/skills/sillyspec-plan/SKILL.md +0 -52
  109. package/.claude/skills/sillyspec-propose/SKILL.md +0 -17
  110. package/.claude/skills/sillyspec-quick/SKILL.md +0 -17
  111. package/.claude/skills/sillyspec-resume/SKILL.md +0 -111
  112. package/.claude/skills/sillyspec-scan/SKILL.md +0 -17
  113. package/.claude/skills/sillyspec-state/SKILL.md +0 -54
  114. package/.claude/skills/sillyspec-status/SKILL.md +0 -17
  115. package/.claude/skills/sillyspec-verify/SKILL.md +0 -17
  116. package/.claude/skills/sillyspec-workspace/SKILL.md +0 -149
  117. package/.sillyspec/changes/archive/2026-04-08-derive-state/design.md +0 -97
  118. package/.sillyspec/changes/archive/2026-04-08-derive-state/plan.md +0 -51
  119. package/.sillyspec/changes/archive/2026-04-08-derive-state/proposal.md +0 -29
  120. package/.sillyspec/changes/archive/2026-04-08-derive-state/requirements.md +0 -34
  121. package/.sillyspec/changes/archive/2026-04-08-derive-state/tasks.md +0 -13
  122. package/.sillyspec/changes/archive/2026-04-08-derive-state/verify-result.md +0 -43
  123. package/.sillyspec/changes/auto-mode/design.md +0 -50
  124. package/.sillyspec/changes/auto-mode/proposal.md +0 -19
  125. package/.sillyspec/changes/auto-mode/requirements.md +0 -21
  126. package/.sillyspec/changes/auto-mode/tasks.md +0 -7
  127. package/.sillyspec/changes/brainstorm-archive/2026-04-05-unified-docs-design.md +0 -199
  128. package/.sillyspec/changes/dashboard/design.md.braindraft +0 -206
  129. package/.sillyspec/changes/run-command-design/design.md +0 -1230
  130. package/.sillyspec/changes/unified-docs-design/design.md +0 -199
  131. package/.sillyspec/docs/sillyspec/scan/.gitkeep +0 -0
  132. package/.sillyspec/knowledge/INDEX.md +0 -8
  133. package/.sillyspec/knowledge/uncategorized.md +0 -3
  134. package/.sillyspec/projects/sillyspec.yaml +0 -3
  135. package/packages/dashboard/dist/assets/index-D1EVTLmc.js +0 -7446
  136. package/packages/dashboard/dist/assets/index-DGe8CqeP.css +0 -1
  137. package/packages/dashboard/public/logo.jpg +0 -0
  138. package/packages/dashboard/src/components/DocPreview.vue +0 -160
  139. package/packages/dashboard/src/components/DocTree.vue +0 -58
  140. package/packages/dashboard/src/components/ProjectOverview.vue +0 -178
  141. package/packages/dashboard/src/components/detail/DocsDetail.vue +0 -48
  142. package/packages/dashboard/src/components/detail/GitDetail.vue +0 -61
  143. package/packages/dashboard/src/components/detail/TechDetail.vue +0 -43
  144. package/src/derive.js +0 -147
  145. package/src/migrate.js +0 -117
  146. package/src/progress.js +0 -495
  147. package/src/run.js +0 -640
  148. package/src/stages/archive.js +0 -54
  149. package/src/stages/brainstorm.js +0 -239
  150. package/src/stages/doctor.js +0 -312
  151. package/src/stages/execute.js +0 -259
  152. package/src/stages/index.js +0 -35
  153. package/src/stages/plan.js +0 -259
  154. package/src/stages/propose.js +0 -115
  155. package/src/stages/quick.js +0 -64
  156. package/src/stages/scan.js +0 -141
  157. package/src/stages/status.js +0 -65
  158. package/src/stages/verify.js +0 -135
  159. /package/.sillyspec/{changes/brainstorm-archive → specs}/2026-04-05-dashboard-design.md +0 -0
  160. /package/{packages/dashboard → docs/.vitepress}/dist/favicon.jpg +0 -0
  161. /package/{logo.jpg → docs/.vitepress/dist/logo.jpg} +0 -0
  162. /package/{packages/dashboard → docs}/public/favicon.jpg +0 -0
  163. /package/{packages/dashboard/dist → docs/public}/logo.jpg +0 -0
@@ -0,0 +1,75 @@
1
+ ## 交互规范
2
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
3
+
4
+ ## 核心约束(必须遵守)
5
+ - ❌ 修改任何文件(只读)
6
+
7
+ ---
8
+
9
+ ## 流程
10
+
11
+ ### Step 1: 检查工作区模式
12
+
13
+ ```bash
14
+ ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .
15
+ ```
16
+
17
+ **工作区模式:** 读取每个 `projects/*.yaml` 子项目列表,对每个子项目检查 PROJECT.md、docs/<project>/scan/ 文档数、进行中变更、归档数。**同时检查工作区根目录 `.sillyspec/changes/` 下的未归档变更。** 检查共享规范和工作区概览。输出汇总后结束,不执行单项目流程。
18
+
19
+ 工作区变更检查命令:
20
+ ```bash
21
+ # 工作区根目录的变更
22
+ ls .sillyspec/changes/ 2>/dev/null | grep -v archive
23
+ ls .sillyspec/changes/archive/ 2>/dev/null | wc -l
24
+
25
+ # 每个子项目的变更
26
+ for f in .sillyspec/projects/*.yaml; do
27
+ [ -f "$f" ] || continue
28
+ proj_name=$(basename "$f" .yaml)
29
+ proj_path=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
30
+ echo "=== $proj_name changes ==="
31
+ ls "$proj_path"/.sillyspec/changes/ 2>/dev/null | grep -v archive
32
+ ls "$proj_path"/.sillyspec/changes/archive/ 2>/dev/null | wc -l
33
+ done
34
+ ```
35
+
36
+ **汇总输出格式:**
37
+ ```
38
+ 📊 SillySpec 状态
39
+ 📋 工作区模式 — N 个子项目
40
+
41
+ 工作区变更:
42
+ 🔄 进行中:sec-bonus-penalty(tasks: 3/5)
43
+ ✅ 已归档:1 个
44
+
45
+ 主项目(工作区根目录):
46
+ 📂 代码库文档:— (主项目通常无独立代码)
47
+ 🔄 进行中:N 个变更
48
+ ✅ 已归档:N 个变更
49
+
50
+ ┌───────────────────┬────────────┬────────────┬────────┬────────┐
51
+ │ 子项目 │ PROJECT.md │ 代码库文档 │ 进行中 │ 已归档 │
52
+ ├───────────────────┼────────────┼────────────┼────────┼────────┤
53
+ │ back-service │ ✗ │ 7 份 │ 1 │ 0 │
54
+ └───────────────────┴────────────┴────────────┴────────┴────────┘
55
+ ```
56
+
57
+ **单项目模式:** 继续 Step 2。
58
+
59
+ ### Step 2-5: 单项目检查
60
+
61
+ 1. **项目基础:** PROJECT.md、docs/<project>/scan/ 文档、REQUIREMENTS.md、ROADMAP.md
62
+ 2. **进行中变更:** 对每个变更检查 design/tasks 完成度
63
+ 3. **归档历史:** `ls .sillyspec/changes/archive/ | wc -l`
64
+ 4. **代码库文档:** `ls .sillyspec/docs/<project>/scan/`
65
+
66
+ ### Step 6: 输出
67
+
68
+ ```
69
+ 📊 SillySpec 状态
70
+ 📋 项目:xxx(已初始化/未初始化)
71
+ 📂 代码库:已扫描(7 份文档)/ 未扫描
72
+ 🔄 进行中:N 个变更
73
+ ✅ 已归档:N 个变更
74
+ 💡 下一步:/sillyspec:continue
75
+ ```
@@ -0,0 +1,253 @@
1
+ ## 交互规范
2
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
3
+
4
+ > **可选阶段。** execute 完成后会询问是否需要 verify,也可以手动调用。
5
+
6
+ ## 核心约束(必须遵守)
7
+ - ❌ 修改任何代码(只做检查和报告)
8
+ - ❌ 跳过状态检查
9
+ - ❌ 自行推进到下一阶段
10
+
11
+ ## 状态检查(必须先执行)
12
+
13
+ ```bash
14
+ cat .sillyspec/STATE.md 2>/dev/null
15
+ ```
16
+
17
+ 检查当前阶段。如果没有 STATE.md,检查是否有未归档变更:
18
+
19
+ ```bash
20
+ ls .sillyspec/changes/ 2>/dev/null | grep -v archive
21
+ ```
22
+
23
+ 无 STATE.md 且无未归档变更 → 提示用户先完成 execute 或用 `/sillyspec:status` 查看状态。
24
+
25
+ ---
26
+
27
+ ## 工作区模式处理
28
+
29
+ 如果 `.sillyspec/projects/` 目录下有 yaml 文件:
30
+
31
+ 1. 检查工作区根目录 `.sillyspec/changes/` 下的未归档变更
32
+ 2. 检查每个子项目 `<子项目路径>/.sillyspec/changes/` 下的未归档变更
33
+ 3. 列出所有未归档变更,让用户选择要验证哪个
34
+ 4. 根据 $ARGUMENTS 或用户选择,cd 到对应目录执行验证
35
+
36
+ ---
37
+
38
+ ## 流程
39
+
40
+ ### 1. 加载规范
41
+
42
+ ```bash
43
+ # 确定变更目录
44
+ if [ -n "$ARGUMENTS" ]; then
45
+ CHANGE_DIR=".sillyspec/changes/$ARGUMENTS"
46
+ else
47
+ CHANGE_DIR=$(ls -d .sillyspec/changes/*/ 2>/dev/null | grep -v archive | tail -1)
48
+ fi
49
+ cat "$CHANGE_DIR"/{design,tasks}.md 2>/dev/null
50
+ cat .sillyspec/local.yaml 2>/dev/null
51
+ ```
52
+
53
+ 锚定确认实际存在的文件。
54
+
55
+ ### 2. 逐项检查 tasks.md
56
+
57
+ 对每个 checkbox 报告:✅ 已完成 / ❌ 未完成 / ⚠️ 部分完成
58
+
59
+ ### 3. 对照 design.md
60
+
61
+ 架构决策?文件变更一致性?数据模型?API 设计?
62
+
63
+ ### 4. 运行测试套件
64
+
65
+ ```bash
66
+ pnpm test 2>/dev/null || npm test 2>/dev/null || pytest 2>/dev/null || go test ./... 2>/dev/null
67
+ ```
68
+
69
+ ### 4b. E2E 测试
70
+
71
+ 检测项目中是否有 E2E 测试或测试步骤文件:
72
+ ```bash
73
+ ls tests/e2e/ e2e/ cypress/e2e/ 2>/dev/null | head -5
74
+ cat .sillyspec/changes/*/e2e-steps.md 2>/dev/null | head -5
75
+ ```
76
+
77
+ **无任何测试** → 跳过此步骤。
78
+
79
+ **有测试** → 确认修复策略(AskUserQuestion):
80
+ 1. 自动修复,同一用例最多 5 次(超过停止,提示人工介入)
81
+ 2. 一直修复直到全绿
82
+ 3. 只报告,不自动修复
83
+
84
+ **按优先级执行:**
85
+
86
+ **优先级 1:专业 E2E 框架(Playwright/Cypress)**
87
+ ```bash
88
+ npx playwright test 2>/dev/null || npx cypress run 2>/dev/null
89
+ ```
90
+
91
+ **优先级 2:通用测试框架(jest/vitest)**
92
+ ```bash
93
+ npx vitest run 2>/dev/null || npx jest 2>/dev/null
94
+ ```
95
+
96
+ **优先级 3:浏览器 MCP + e2e-steps.md(兜底)**
97
+ 读取 `.sillyspec/changes/<变更名>/e2e-steps.md`,按步骤逐条执行。每条标注 ✅/❌,断言失败记为 FAILED。
98
+ > ⚠️ 使用 MCP 执行时 AI 判断可能不如测试框架精确。追求可靠性建议安装 Playwright。
99
+
100
+ **自动修复循环(选了策略 1 或 2 时):**
101
+
102
+ 必须按以下流程严格执行,不可跳过:
103
+
104
+ ```
105
+ ROUND = 1
106
+ MAX_ROUNDS = 策略1时为5,策略2时为50
107
+
108
+ while ROUND <= MAX_ROUNDS:
109
+ 1. 运行失败测试,捕获完整输出(错误信息、堆栈、期望值 vs 实际值)
110
+ 2. 如果全部通过 → 跳出循环,标记 ✅
111
+ 3. 读取 .sillyspec/local.yaml 中当前变更的 fixAttempts
112
+ 4. 对每个失败测试:
113
+ a. 如果 fixAttempts >= MAX_ROUNDS → 跳过,标记 ❌ MAX_REACHED
114
+ b. 否则 → 调 /sillyspec:quick 修复,prompt 必须包含:
115
+ - 失败的测试文件路径和测试名
116
+ - 完整错误信息(含期望值 vs 实际值)
117
+ - 相关源文件路径
118
+ - "只修复这个测试失败,不要改其他代码"
119
+ c. 修复后重跑该测试确认是否通过
120
+ d. 通过 → fixAttempts 保持不变;仍失败 → fixAttempts + 1
121
+ 5. 写入 .sillyspec/local.yaml 更新 fixAttempts
122
+ 6. ROUND++
123
+ 7. 如果本轮无任何修复(所有失败都已 MAX_REACHED)→ 跳出循环
124
+ ```
125
+
126
+ **quick 修复 prompt 模板:**
127
+ ```
128
+ /sillyspec:quick "修复测试失败:<测试文件路径>:<测试名>
129
+
130
+ 错误信息:
131
+ <完整错误输出,包含期望值和实际值>
132
+
133
+ 相关文件:
134
+ <被测源文件路径>
135
+
136
+ 只修复这个测试失败,不要改其他代码。修完后运行该测试确认通过。"
137
+ ```
138
+
139
+ **禁止行为:**
140
+ - ❌ 只看错误摘要就修复(必须看完整输出)
141
+ - ❌ 跳过 fixAttempts 计数
142
+ - ❌ 一次 quick 修复多个不相关的失败(逐个修复,每次修复后重跑确认)
143
+ - ❌ 主代理直接修改代码(verify 阶段禁止改代码,必须通过 /sillyspec:quick)
144
+
145
+ **更新测试结果到 `.sillyspec/local.yaml`(按变更名隔离,覆盖写入):**
146
+ ```yaml
147
+ e2e:
148
+ {变更名}:
149
+ login.spec.ts:
150
+ status: passed
151
+ fixAttempts: 0
152
+ form-submit.spec.ts:
153
+ status: failed
154
+ fixAttempts: 3
155
+ ```
156
+
157
+ ### 5. 代码质量扫描
158
+
159
+ ```bash
160
+ grep -r "TODO\|FIXME\|HACK\|XXX" src/ lib/ app/ --include="*.ts" --include="*.tsx" --include="*.py" --include="*.js" 2>/dev/null | head -20
161
+ ```
162
+
163
+ 审查 design.md「文件变更」中列出的文件:安全问题(输入校验、SQL拼接、硬编码敏感信息)、潜在 bug(空值、边界条件)、与 CONVENTIONS.md 一致性。每个问题标 🔴必须 / 🟡建议 / 🔵优化。
164
+
165
+ ### 5.5 MCP 基础设施验证
166
+
167
+ 检测已配置的 MCP 服务,利用它们做实际验证(不只查文档):
168
+
169
+ **MCP 能力检测:**
170
+
171
+ 不要只检查配置文件路径(不同客户端配置位置不同),直接检查当前可用工具列表中是否存在以下工具:
172
+
173
+ - 数据库相关工具(包含 postgres/sqlite/mysql/redis 关键词)
174
+ - 浏览器相关工具(包含 browser/chrome/puppeteer/playwright/devtools 关键词)
175
+ - 搜索相关工具(包含 search/web_search 关键词)
176
+
177
+ **判断方式:** 尝试调用或列出当前可用的 MCP 工具,有就用来验证,没有就跳过。
178
+
179
+ **按检测结果执行对应验证:**
180
+
181
+ **数据库 MCP(postgres/sqlite/mysql/redis):**
182
+ - 对照 design.md 中的数据模型,验证表/集合是否存在
183
+ - 验证字段类型、约束(主键、外键、唯一索引)是否与设计一致
184
+ - 验证新增的 API 是否能正确读写对应数据
185
+ - ⚠️ 只执行 SELECT 查询,禁止任何写操作
186
+
187
+ **浏览器 MCP(chrome-devtools/puppeteer/playwright):**
188
+ - 验证页面能否正常加载(无 404/500 错误)
189
+ - 验证关键 UI 元素是否存在(导航、表单、按钮等)
190
+ - 验证基础交互(点击、提交、跳转)
191
+
192
+ **API MCP:**
193
+ - 验证新增接口是否可达
194
+ - 验证请求/响应格式是否与设计一致
195
+
196
+ **无 MCP → 跳过此步骤,不影响验证结论。**
197
+
198
+ 将验证结果纳入验证报告。
199
+
200
+ ### 6. Lint / Format 检查
201
+
202
+ 自动检测并运行项目配置的 lint/format 工具,验证代码是否符合规范:
203
+
204
+ ```bash
205
+ # ESLint
206
+ if [ -f .eslintrc -o -f .eslintrc.js -o -f .eslintrc.cjs -o -f .eslintrc.json -o -f .eslintrc.yml ] || grep -q '"eslint"' package.json 2>/dev/null; then
207
+ echo "=== ESLint ==="
208
+ npx eslint . --max-warnings 0 2>&1 | tail -50
209
+ fi
210
+
211
+ # Prettier(检查而非修复)
212
+ if [ -f .prettierrc -o -f .prettierrc.js -o -f .prettierrc.json -o -f .prettierrc.yml ] || grep -q '"prettier"' package.json 2>/dev/null; then
213
+ echo "=== Prettier ==="
214
+ npx prettier --check . 2>&1 | tail -30
215
+ fi
216
+
217
+ # TypeScript 类型检查
218
+ if [ -f tsconfig.json ]; then
219
+ echo "=== TypeScript ==="
220
+ npx tsc --noEmit 2>&1 | tail -30
221
+ fi
222
+
223
+ # Stylelint
224
+ if [ -f .stylelintrc -o -f .stylelintrc.js -o -f .stylelintrc.json ] || grep -q '"stylelint"' package.json 2>/dev/null; then
225
+ echo "=== Stylelint ==="
226
+ npx stylelint "**/*.{css,scss,less}" 2>&1 | tail -30
227
+ fi
228
+ ```
229
+
230
+ **处理策略(AskUserQuestion):**
231
+ 1. **自动修复** — 对支持 `--fix` 的工具(ESLint、Prettier、Stylelint)自动修复后重跑检查,同一问题最多修复 3 次
232
+ 2. **只报告** — 仅列出所有 lint 错误,不修改代码
233
+
234
+ 将 lint 结果纳入验证报告(步骤 7)。
235
+
236
+ ### 7. 输出验证报告
237
+
238
+ ```markdown
239
+ # SillySpec 验证报告
240
+ ## 任务完成度:X/Y
241
+ ## 设计一致性
242
+ ## 测试结果:passed N, failed N
243
+ ## 技术债务标记
244
+ ## 代码审查:🔴 N / 🟡 N / 🔵 N
245
+ ## Lint 检查:ESLint ✅/❌ | Prettier ✅/❌ | TypeScript ✅/❌ | Stylelint ✅/❌
246
+ ## MCP 基础设施验证:数据库 ✅/❌/跳过 | 页面 ✅/❌/跳过 | API ✅/❌/跳过
247
+ ## E2E 测试:passed N / failed N / fixAttempts 详情
248
+ ## 结论:✅ PASS / ⚠️ PASS WITH NOTES / ❌ FAIL
249
+ ```
250
+
251
+ ### 7. 完成
252
+
253
+ 更新 `.sillyspec/STATE.md`(如存在):阶段改为 `verify ✅` 或 `verify ⚠️`,记录精确到秒的时间戳。
@@ -0,0 +1,99 @@
1
+ ## 交互规范
2
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
3
+
4
+ ## 核心约束(必须遵守)
5
+ - ❌ 修改子项目的代码
6
+ - ❌ 删除已有文件(clone 前必须确认)
7
+ - ❌ 跳过冲突检查直接覆盖
8
+
9
+ ## 流程
10
+
11
+ ### Step 1: 读取配置
12
+
13
+ ```bash
14
+ ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .
15
+ ```
16
+
17
+ 无子项目配置 → 提示先执行 `/sillyspec:workspace` 初始化工作区。
18
+
19
+ ### Step 2: 逐个子项目检查
20
+
21
+ 对每个子项目配置文件,按顺序执行:
22
+
23
+ ```bash
24
+ for f in .sillyspec/projects/*.yaml; do
25
+ [ -f "$f" ] || continue
26
+ proj_name=$(basename "$f" .yaml)
27
+ proj_path=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
28
+ proj_repo=$(grep '^repo:' "$f" | head -1 | sed 's/^repo:[[:space:]]*//')
29
+ # ... 检查逻辑
30
+ done
31
+ ```
32
+
33
+ ```bash
34
+ # 检查目录是否存在
35
+ ls -d <path> 2>/dev/null && echo "EXISTS" || echo "MISSING"
36
+ ```
37
+
38
+ #### 情况 A:目录不存在
39
+
40
+ ```bash
41
+ # 检查是否有 repo 配置
42
+ grep '^repo:' .sillyspec/projects/<name>.yaml
43
+ ```
44
+
45
+ - **有 repo** → AskUserQuestion:"子项目 `<name>` 不存在,是否从 `<repo>` clone 到 `<path>`?"
46
+ - 用户确认 → `git clone <repo> <path>` → ✅ 成功
47
+ - clone 失败 → ❌ 报错,提示用户手动 clone
48
+ - **无 repo** → ⚠️ 提示用户:"子项目 `<name>` 不存在且无 repo 配置,请手动放置到 `<path>`"
49
+
50
+ #### 情况 B:目录已存在
51
+
52
+ ```bash
53
+ # 检查是否是 git 仓库
54
+ git -C <path> rev-parse --is-inside-work-tree 2>/dev/null
55
+
56
+ # 如果是,检查 remote 是否匹配
57
+ git -C <path> remote get-url origin 2>/dev/null
58
+ ```
59
+
60
+ - **不是 git 仓库** → AskUserQuestion:"目录 `<path>` 存在但不是 git 仓库,可能和其他项目冲突。"
61
+ - 跳过此子项目
62
+ - 让用户指定正确路径
63
+ - **是 git 仓库,remote 匹配 repo** → ✅ 跳过,状态正常
64
+ - **是 git 仓库,remote 不匹配 repo** → ⚠️ AskUserQuestion:
65
+ - "目录 `<path>` 是 git 仓库但 remote 不匹配(期望 `<repo>`,实际 `<actual>`)。可能是不同项目。"
66
+ - 跳过 / 用户确认覆盖
67
+
68
+ #### 情况 C:路径冲突
69
+
70
+ 检查两个子项目的 path 是否指向同一目录或互相包含:
71
+
72
+ ```bash
73
+ # 将相对路径转为绝对路径后比较
74
+ realpath <path1>
75
+ realpath <path2>
76
+ ```
77
+
78
+ 冲突 → ❌ 报错:"子项目 A 和 B 的路径冲突,请修改对应的 projects/*.yaml"
79
+
80
+ ### Step 3: 汇总报告
81
+
82
+ ```
83
+ 📊 工作区同步结果
84
+
85
+ ┌───────────────────┬──────────┬────────────────────────────────────┐
86
+ │ 子项目 │ 状态 │ 说明 │
87
+ ├───────────────────┼──────────┼────────────────────────────────────┤
88
+ │ back-service │ ✅ 正常 │ 目录存在,git remote 匹配 │
89
+ │ sub-grid-security │ 🔄 已克隆 │ 从 https://... clone 成功 │
90
+ │ frontend │ ⚠️ 缺失 │ 无 repo 配置,请手动放置 │
91
+ └───────────────────┴──────────┴────────────────────────────────────┘
92
+ ```
93
+
94
+ 全部正常 → 提示 `/sillyspec:brainstorm '你的需求'` 继续。
95
+ 有异常 → 提示用户处理后再 sync。
96
+
97
+ ### Step 4: 更新子项目配置
98
+
99
+ 如果 clone 过程中实际 remote 和 `projects/<name>.yaml` 中的 repo 不一致,更新对应 yaml 文件的 repo 字段为实际值。
@@ -0,0 +1,70 @@
1
+ ## 交互规范
2
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
3
+
4
+ ## 核心约束(必须遵守)
5
+ - ❌ 修改子项目目录下的任何文件
6
+ - ❌ 写非法 YAML
7
+ - ❌ 使用绝对路径(必须是相对路径)
8
+
9
+ ## 用户指令
10
+ $ARGUMENTS
11
+
12
+ ---
13
+
14
+ ## 流程
15
+
16
+ ### Step 1: 检查配置
17
+
18
+ ```bash
19
+ ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .
20
+ ```
21
+
22
+ 不存在 → 询问是否初始化工作区。
23
+
24
+ ### Step 2: 解析指令
25
+
26
+ - 无参数 / `status` → 显示状态
27
+ - `add` → 添加子项目
28
+
29
+ **添加流程:**
30
+ 1. AskUserQuestion 询问子项目名称、目录路径、角色描述
31
+ 2. **自动检测 git 远程地址:**
32
+ ```bash
33
+ git -C <path> remote get-url origin 2>/dev/null
34
+ ```
35
+ 检测到则写入 repo 字段,检测不到则留空
36
+ 3. 创建 `.sillyspec/projects/<name>.yaml` 文件
37
+ - `remove` → 删除 `.sillyspec/projects/<name>.yaml` 文件
38
+ - `sync` → 同步子项目(clone 缺失的,检查冲突)
39
+
40
+ ### Step 3: 执行操作
41
+
42
+ **初始化工作区:** 询问名称 → 逐个添加子项目(名称、路径、角色描述,验证路径存在)→ 共享规范 → 创建 `projects/*.yaml` + `.sillyspec/shared/`
43
+
44
+ **添加/移除子项目:** 创建或删除 `projects/<name>.yaml`,Git 提交。
45
+
46
+ **状态显示:** 读取每个子项目的 `.sillyspec/` 内容(PROJECT.md、docs/<project>/scan/ 文档数、进行中变更),输出格式:
47
+
48
+ ```
49
+ 🏢 工作区:<name>
50
+ 📦 子项目(N 个):
51
+ ✅ frontend ./frontend 前端 - Vue3+TS 已扫描(7 份文档)
52
+ ⚠️ backend ./backend 后端 - Node.js 已初始化(未扫描)
53
+ 📄 共享规范:2 份
54
+ 💡 操作:/sillyspec:workspace add | /sillyspec:init | /sillyspec:scan
55
+ ```
56
+
57
+ ### 读取子项目信息
58
+
59
+ ```bash
60
+ for f in .sillyspec/projects/*.yaml; do
61
+ [ -f "$f" ] || continue
62
+ proj_name=$(basename "$f" .yaml)
63
+ proj_path=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
64
+ proj_role=$(grep '^role:' "$f" | head -1 | sed 's/^role:[[:space:]]*//')
65
+ proj_repo=$(grep '^repo:' "$f" | head -1 | sed 's/^repo:[[:space:]]*//')
66
+ # 检查文档数、变更数等
67
+ doc_count=$(ls "$proj_path"/.sillyspec/docs/$proj_name/scan/*.md 2>/dev/null | wc -l)
68
+ echo " $proj_name $proj_path $proj_role docs:$doc_count"
69
+ done
70
+ ```
@@ -1,17 +0,0 @@
1
- ---
2
- name: sillyspec:archive
3
- description: 归档变更 — 规范沉淀,可追溯
4
- ---
5
-
6
- ## 执行
7
-
8
- **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
9
-
10
- 1. 运行 `sillyspec run archive` — 读取输出的步骤 prompt
11
- 2. 按照输出的 prompt **严格执行**,不要跳过或自行添加步骤
12
- 3. 步骤完成后,运行 `sillyspec run archive --done --output "你的摘要"`
13
- 4. 重复 2-3 直到阶段完成
14
- 5. **禁止**在没有运行 CLI 的情况下自行决定流程
15
-
16
- ## 用户指令
17
- $ARGUMENTS
@@ -1,77 +0,0 @@
1
- ---
2
- description: 自动模式 — 全流程自动推进(通用版)
3
- argument-hint: "<需求描述>"
4
- ---
5
-
6
- ## 用法
7
- - /sillyspec:auto 实现用户登录功能
8
- - /sillyspec:auto 修复搜索结果的排序问题
9
-
10
- ## 任务
11
- $ARGUMENTS
12
-
13
- ---
14
-
15
- ## 执行流程
16
-
17
- 你是全流程编排器,按 brainstorm → plan → execute → verify 顺序自动推进。
18
-
19
- ### 启动
20
- 1. 运行 `sillyspec run auto --input "<用户需求>"`
21
- 2. 读取 CLI 输出的 step prompt(包含你的角色描述)
22
- 3. 执行 prompt 中的操作
23
-
24
- ### 步骤循环
25
- 重复以下循环直到 CLI 输出"全部流程已完成":
26
-
27
- 1. **读取 CLI 输出的 step prompt**
28
- 2. **判断是否需要用户确认:**
29
- - prompt 中包含"请用户选择""等待用户回答""展示给用户""用户确认" → **暂停,等用户回复**
30
- - 纯内部操作 → **直接执行**
31
- 3. **执行 prompt 要求的操作**
32
- 4. **完成后运行** `sillyspec run auto --done --output "<你的摘要>"`
33
- 5. **读取 CLI 输出的下一步 prompt**,回到步骤 1
34
-
35
- ### 阶段审核门控
36
-
37
- **brainstorm 完成后:**
38
- 评估需求复杂度(参考 brainstorm Step 5 的判断结果),根据复杂度决定:
39
-
40
- | 复杂度 | 审核策略 |
41
- |--------|---------|
42
- | 简单(无拆分、无批量) | 不审核,直接进入 plan |
43
- | 中等(有拆分或批量) | 启动 1 个审核子代理(QA 视角)审查 design.md |
44
- | 复杂(拆分 + 批量/多角色) | 启动 2-3 个审核子代理多角度审查 |
45
-
46
- 多角度审核子代理分工:
47
- - **架构师** — 审查设计合理性、技术选型 trade-off、模块划分
48
- - **安全专家** — 审查安全隐患、权限设计、数据校验
49
- - **QA 专家** — 审查需求覆盖率、边界场景遗漏、验收标准
50
-
51
- 审核流程:
52
- 1. 暂停,提示用户当前复杂度等级和建议审核策略
53
- 2. 用户确认后,启动审核子代理(读取 design.md + requirements.md + tasks.md)
54
- 3. 子代理输出问题清单
55
- 4. 汇总问题,询问用户"是否需要修改后再继续"
56
- 5. 需要修改 → 修复后重新审核;不需要 → 进入下一阶段
57
-
58
- **plan 完成后:**
59
- 同样评估复杂度,启动审核子代理审查 plan.md:
60
- - **项目经理** — 审查任务拆解粒度、依赖关系、优先级
61
- - **工程师** — 审查任务可行性、工作量评估是否合理
62
- - **QA** — 审查验收标准是否具体可测试
63
-
64
- ### 关键规则
65
- - 不要跳过任何步骤
66
- - 不要手动修改 progress.json
67
- - 不要自动 commit,只 git add
68
- - 不要使用 npx
69
- - 不要编造不存在的 CLI 子命令
70
- - 遇到命令报错 → 展示错误,暂停等用户介入
71
-
72
- ### 异常处理
73
- - 命令执行失败 → 展示错误信息,暂停等待用户指示
74
- - 用户说"停止"或"暂停" → 立即停止,报告当前进度
75
-
76
- ### 完成条件
77
- CLI 输出"全部流程已完成"后,输出完整流程总结,提示用户提交改动。
@@ -1,17 +0,0 @@
1
- ---
2
- name: sillyspec:brainstorm
3
- description: 需求探索 — 结构化头脑风暴,含技术方案输出(创建性工作前必用)
4
- ---
5
-
6
- ## 执行
7
-
8
- **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
9
-
10
- 1. 运行 `sillyspec run brainstorm` — 读取输出的步骤 prompt
11
- 2. 按照输出的 prompt **严格执行**,不要跳过或自行添加步骤
12
- 3. 步骤完成后,运行 `sillyspec run brainstorm --done --output "你的摘要"`
13
- 4. 重复 2-3 直到阶段完成
14
- 5. **禁止**在没有运行 CLI 的情况下自行决定流程
15
-
16
- ## 用户指令
17
- $ARGUMENTS
@@ -1,44 +0,0 @@
1
- ---
2
- name: sillyspec:continue
3
- description: 自动判断并执行下一步
4
- ---
5
-
6
- ---
7
-
8
- 你现在是 SillySpec 的自动推进器。
9
-
10
- ## 判断逻辑
11
-
12
- 按顺序检查,第一个未完成的就执行:
13
-
14
- ```
15
- 1. 有 HANDOFF.json?→ 执行 /sillyspec:resume
16
-
17
- 2. .sillyspec/changes/ 有进行中的变更?
18
- 2a. 没有任何文件 → 提示检查 proposal 是否需要完善
19
- 2b. 没有 design.md → 提示补充 design
20
- 2c. 没有 tasks.md → 执行 /sillyspec:propose(补全规范)
21
- 2d. tasks.md 有未完成项 + 有计划文件 → 执行 /sillyspec:execute
22
- 2e. tasks.md 全完成 + 没验证 → 执行 /sillyspec:verify
23
- 2f. 已验证通过 → 执行 /sillyspec:archive
24
-
25
- 3. 有设计文档但没有对应变更?
26
- → 提示运行 /sillyspec:propose <name>
27
-
28
- 4. 有 docs/*/scan/ 但没有进行中的工作?
29
- → 提示运行 /sillyspec:brainstorm "你的想法"
30
-
31
- 5. 什么都没有?
32
- → 提示运行 /sillyspec:init(新项目)或 /sillyspec:scan(棕地项目)
33
- ```
34
-
35
- ## 输出
36
-
37
- 先报告检测结果,再执行:
38
-
39
- > 🤖 SillySpec 自动检测
40
- >
41
- > 当前状态:[描述]
42
- > 下一步:[执行的命令]
43
- >
44
- > [开始执行...]
@@ -1,22 +0,0 @@
1
- ---
2
- name: sillyspec:doctor
3
- description: 项目自检 — 检查 CLI、配置、构建环境和外部依赖
4
- ---
5
-
6
- ## 前置检查
7
-
8
- **在执行任何检查之前,先确认 SillySpec CLI 是否可用:**
9
-
10
- 1. 运行 `sillyspec --version`
11
- 2. 如果失败:
12
- - 输出:❌ SillySpec CLI 未安装
13
- - 给出安装命令:`npm install -g sillyspec`
14
- - 停止,不要继续后续步骤
15
-
16
- ## 执行
17
-
18
- CLI 可用后,运行 `sillyspec run doctor`,按提示逐步执行。
19
- 每步完成后运行 `sillyspec run doctor --done --output "摘要"`。
20
-
21
- ## 用户指令
22
- $ARGUMENTS