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
@@ -1,239 +0,0 @@
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. 棕地项目:读取 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
-
177
- ### 输出
178
- 用户确认的完整设计方案
179
-
180
- ### 注意
181
- - 不要一次输出大段文字
182
- - 逐段确认,确保用户跟上`,
183
- outputHint: '用户确认的设计方案',
184
- optional: false
185
- },
186
- {
187
- name: '写设计文档并自审',
188
- prompt: `撰写 design 文档并进行 AI 自审。
189
-
190
- ### 操作
191
- 1. 确认变更目录存在:\`mkdir -p .sillyspec/changes/<变更名>\`(Windows 用 \`mkdir .sillyspec\\changes\\<变更名>\` 或 PowerShell \`New-Item -ItemType Directory -Force -Path .sillyspec/changes/<变更名>\`)
192
- 2. 将确认的设计写入 \`.sillyspec/changes/<变更名>/design.md\`
193
- 3. 自审检查:
194
- - 需求覆盖:是否完整覆盖 Step 6 确认的需求
195
- - 约束一致性:是否与 CONVENTIONS.md、ARCHITECTURE.md 一致
196
- - 真实性:表名/字段名来自真实 schema 或标注"新增"
197
- - YAGNI:是否包含不必要功能
198
- - 验收标准:是否具体可测试
199
- 3. 自审发现问题 → 修改后重新检查
200
- 4. 全部通过 → 进入下一步
201
-
202
- ### 输出
203
- design.md 文件路径 + 自审结果
204
-
205
- ### 注意
206
- - 自审不通过不要进入下一步
207
- - 不确定的问题标注「⚠️ 自审存疑」`,
208
- outputHint: 'design.md 路径 + 自审结果',
209
- optional: false
210
- },
211
- {
212
- name: '用户确认并生成规范文件',
213
- prompt: `用户确认设计方案,生成规范文件。
214
-
215
- ### 操作
216
- 1. 展示 design.md 摘要给用户
217
- 2. 请用户选择:✅ 确认 / ✏️ 修改 / ❌ 推翻重来
218
- 3. 确认后,在 \`.sillyspec/changes/<变更名>/\` 下生成所有规范文件:
219
- - **design.md**:架构决策、文件变更清单、数据模型、API 设计、代码风格参照
220
- - **proposal.md**:动机、变更范围、不在范围内、成功标准
221
- - **requirements.md**:功能需求、用户场景(Given/When/Then 格式)、非功能需求
222
- - **tasks.md**:任务列表(只列名称和对应文件路径,细节在 plan 阶段展开)
223
- - \`git add .sillyspec/\` — **不要 commit**
224
-
225
- ### 输出
226
- 所有规范文件路径
227
-
228
- ### 注意
229
- - 必须等待用户明确确认
230
- - 禁止在确认前推进到后续阶段
231
- - 禁止自动 commit
232
- - 推翻重来回到 Step 6
233
- - 表名/字段名必须来自真实 schema 或标注"新增"
234
- - tasks.md 只列任务名,细节在 plan 阶段展开`,
235
- outputHint: '规范文件路径',
236
- optional: false
237
- }
238
- ]
239
- }
@@ -1,312 +0,0 @@
1
- // SillySpec Doctor — 项目自检阶段
2
- // 检查项通过 prompt 中的 bash 命令执行,此文件仅定义步骤结构
3
-
4
-
5
- export const definition = {
6
- name: 'doctor',
7
- title: '项目自检',
8
- description: '检查 SillySpec 配置、构建环境和外部依赖',
9
- auxiliary: true,
10
- steps: [
11
- {
12
- name: 'SillySpec 内部检查',
13
- prompt: `运行 SillySpec 内部检查。逐项执行以下命令并汇总结果:
14
-
15
- ### 1. 目录结构完整性
16
- \`\`\`bash
17
- # 检查 .sillyspec/ 及子目录
18
- for d in .sillyspec .sillyspec/projects .sillyspec/docs .sillyspec/changes .sillyspec/.runtime; do
19
- [ -d "$d" ] && echo "✅ $d" || echo "❌ $d"
20
- done
21
- # 检查 progress.json
22
- [ -f .sillyspec/.runtime/progress.json ] && echo "✅ progress.json 存在" || echo "❌ progress.json 不存在"
23
- node -e "JSON.parse(require('fs').readFileSync('.sillyspec/.runtime/progress.json','utf8')); console.log('✅ progress.json 可解析')" 2>/dev/null || echo "⚠️ progress.json 不可解析"
24
- \`\`\`
25
-
26
- ### 2. 项目配置检查
27
- \`\`\`bash
28
- ls .sillyspec/projects/*.yaml 2>/dev/null
29
- # 对每个 yaml 文件,检查 name 和 path 字段,验证 path 存在
30
- for f in .sillyspec/projects/*.yaml; do
31
- [ -f "$f" ] || continue
32
- name=$(grep '^name:' "$f" | head -1 | sed 's/^name:[[:space:]]*//')
33
- p=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
34
- [ -z "$name" ] && echo "⚠️ $(basename $f) — 缺少 name"
35
- [ -z "$p" ] && echo "⚠️ $(basename $f) — 缺少 path"
36
- [ -n "$p" ] && [ ! -d "$p" ] && echo "❌ $(basename $f) — path 不存在: $p"
37
- [ -n "$name" ] && [ -n "$p" ] && [ -d "$p" ] && echo "✅ $(basename $f) — $name ($p)"
38
- done
39
- \`\`\`
40
-
41
- ### 3. 进度数据一致性
42
- \`\`\`bash
43
- # 读取 currentChange 并检查目录存在性
44
- node -e "
45
- const p = JSON.parse(require('fs').readFileSync('.sillyspec/.runtime/progress.json','utf8'));
46
- const cc = p.currentChange;
47
- if (!cc) { console.log('ℹ️ 无当前变更'); process.exit(0); }
48
- const dir = '.sillyspec/changes/' + cc;
49
- const exists = require('fs').existsSync(dir);
50
- console.log(exists ? '✅ currentChange 目录存在: ' + cc : '❌ currentChange 目录不存在: ' + cc);
51
- // 检查各阶段产出
52
- const stages = p.stages || {};
53
- for (const [name, sd] of Object.entries(stages)) {
54
- if (sd.status === 'completed' && sd.steps.length > 0) {
55
- const hasOutput = sd.steps.some(s => s.output && s.output.trim());
56
- console.log(' ' + name + ': ' + (hasOutput ? '✅ 有产出' : '⚠️ 已完成但无产出记录'));
57
- }
58
- }
59
- " 2>/dev/null || echo "⚠️ 无法读取 progress.json"
60
- \`\`\`
61
-
62
- ### 4. 孤儿文件检查
63
- \`\`\`bash
64
- node -e "
65
- const fs = require('fs');
66
- const dir = '.sillyspec/changes';
67
- if (!fs.existsSync(dir)) { console.log('ℹ️ changes/ 目录不存在'); process.exit(0); }
68
- const subs = fs.readdirSync(dir).filter(f => fs.statSync(dir+'/'+f).isDirectory());
69
- if (subs.length === 0) { console.log('ℹ️ 无变更目录'); process.exit(0); }
70
- let progress;
71
- try { progress = JSON.parse(fs.readFileSync('.sillyspec/.runtime/progress.json','utf8')); } catch { console.log('⚠️ 无法读取 progress.json'); subs.forEach(s => console.log('❓ ' + s)); process.exit(0); }
72
- const known = new Set();
73
- if (progress.currentChange) known.add(progress.currentChange);
74
- for (const sd of Object.values(progress.stages || {})) {
75
- (sd.steps || []).forEach(s => { if (s.output) known.add(s.output); });
76
- }
77
- subs.forEach(s => {
78
- console.log(known.has(s) ? '✅ ' + s + ' — 已关联' : '⚠️ ' + s + ' — 孤儿目录(可清理)');
79
- });
80
- "
81
- \`\`\`
82
-
83
- ### 5. 配置文件检查
84
- \`\`\`bash
85
- # 检查 local.yaml 和 STACK.md
86
- for f in .sillyspec/projects/*.yaml; do
87
- [ -f "$f" ] || continue
88
- name=$(grep '^name:' "$f" | head -1 | sed 's/^name:[[:space:]]*//')
89
- p=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
90
- [ -z "$p" ] && continue
91
- local_yaml="$p/.sillyspec/local.yaml"
92
- stack_md="$p/.sillyspec/STACK.md"
93
- [ -f "$local_yaml" ] && echo "✅ local.yaml ($name)" || echo "⚠️ local.yaml ($name) — 不存在"
94
- if [ -f "$local_yaml" ]; then
95
- grep -q 'build:' "$local_yaml" && echo " ✅ build 命令已配置" || echo " ⚠️ 缺少 build 命令"
96
- grep -q 'test:' "$local_yaml" && echo " ✅ test 命令已配置" || echo " ⚠️ 缺少 test 命令"
97
- fi
98
- [ -f "$stack_md" ] && echo "✅ STACK.md ($name)" || echo "⚠️ STACK.md ($name) — 不存在"
99
- done
100
- \`\`\`
101
-
102
- ### 输出
103
- 汇总所有检查结果,按以下格式:
104
- \`\`\`
105
- ## SillySpec 内部
106
- ✅/⚠️/❌ 各项状态
107
- \`\`\`
108
-
109
- ### 注意
110
- - 不要编造路径或结果,严格基于命令输出
111
- - 如果 .sillyspec/ 不存在,直接输出 ❌ 并跳过后续检查
112
- - 额外运行 deriveState 全量校验:
113
- \
114
- \
115
- \
116
- node -e "import('./src/derive.js').then(m => { const pm = require('./progress.js'); const r = m.deriveState('.', {mode:'full',fix:false,progress:pm.read('.')}); console.log(JSON.stringify(r, null, 2)); })" 2>/dev/null || echo "deriveState 不可用"
117
- \
118
- \
119
- \
120
- 将 deriveState 的 issues 列表纳入 SillySpec 内部检查结果中`,
121
- outputHint: 'SillySpec 内部检查结果',
122
- optional: false
123
- },
124
- {
125
- name: '构建环境检查',
126
- prompt: `检查项目构建环境。先探测项目使用的构建工具,再逐项检查可用性。
127
-
128
- ### 1. 探测构建工具
129
- \`\`\`bash
130
- # 确定项目路径(使用 progress.json 中的项目或当前目录)
131
- PROJECT_DIR=$(node -e "
132
- const fs=require('fs');
133
- try{const p=JSON.parse(fs.readFileSync('.sillyspec/.runtime/progress.json','utf8'));if(p.project){console.log(p.project);process.exit(0)}}catch{}
134
- const files=fs.readdirSync('.sillyspec/projects').filter(f=>f.endsWith('.yaml'));
135
- if(files.length>0){const c=fs.readFileSync('.sillyspec/projects/'+files[0],'utf8');const m=c.match(/^path:\\s*(.+)/m);console.log(m?m[1].trim():'.')}else console.log('.')
136
- " 2>/dev/null)
137
- echo "项目目录: $PROJECT_DIR"
138
-
139
- # 探测构建工具
140
- for f in pom.xml build.gradle package.json requirements.txt pyproject.toml go.mod Cargo.toml; do
141
- [ -f "$PROJECT_DIR/$f" ] && echo "检测到: $f"
142
- done
143
- [ -f "$PROJECT_DIR/.sillyspec/STACK.md" ] && cat "$PROJECT_DIR/.sillyspec/STACK.md" | head -30
144
- \`\`\`
145
-
146
- ### 2. 构建工具可用性
147
- 根据上面检测到的工具,运行对应检查(未检测到的跳过):
148
-
149
- **Maven 项目:**
150
- \`\`\`bash
151
- timeout 10 mvn -v 2>/dev/null | head -1 && echo "✅ Maven 可用" || echo "❌ Maven 不可用"
152
- [ -f ~/.m2/settings.xml ] && echo "✅ Maven settings.xml 存在" || echo "⚠️ Maven settings.xml 不存在"
153
- timeout 10 java -version 2>&1 | head -1
154
- \`\`\`
155
-
156
- **Gradle 项目:**
157
- \`\`\`bash
158
- timeout 10 gradle -v 2>/dev/null | head -1 && echo "✅ Gradle 可用" || echo "❌ Gradle 不可用"
159
- \`\`\`
160
-
161
- **Node.js 项目:**
162
- \`\`\`bash
163
- timeout 5 node -v 2>/dev/null && echo "✅ Node.js 可用" || echo "❌ Node.js 不可用"
164
- timeout 5 npm -v 2>/dev/null && echo "✅ npm 可用" || echo "❌ npm 不可用"
165
- timeout 5 pnpm -v 2>/dev/null && echo "✅ pnpm 可用" || echo "ℹ️ pnpm 未安装"
166
- # 检查 registry
167
- npm config get registry 2>/dev/null
168
- \`\`\`
169
-
170
- **Python 项目:**
171
- \`\`\`bash
172
- timeout 5 python3 --version 2>/dev/null && echo "✅ Python3 可用" || echo "❌ Python3 不可用"
173
- timeout 5 pip3 --version 2>/dev/null && echo "✅ pip3 可用" || echo "❌ pip3 不可用"
174
- \`\`\`
175
-
176
- ### 3. Maven 私服检查(仅 Maven 项目)
177
- \`\`\`bash
178
- # 从 settings.xml 提取仓库地址
179
- if [ -f ~/.m2/settings.xml ]; then
180
- grep -oP 'https?://[^<"]+:[0-9]+' ~/.m2/settings.xml 2>/dev/null | sort -u | while read url; do
181
- timeout 5 curl -s -o /dev/null -w "%{http_code}" "$url" 2>/dev/null
182
- echo " — $url"
183
- done
184
- fi
185
- # 从 pom.xml 提取
186
- if [ -f "$PROJECT_DIR/pom.xml" ]; then
187
- grep -oP 'https?://[^<"]+:[0-9]+' "$PROJECT_DIR/pom.xml" 2>/dev/null | sort -u | while read url; do
188
- code=$(timeout 5 curl -s -o /dev/null -w "%{http_code}" "$url" 2>/dev/null)
189
- [ "$code" = "000" ] && echo "❌ 私服不可达: $url(超时)" || echo "✅ 私服可达 ($code): $url"
190
- done
191
- fi
192
- \`\`\`
193
-
194
- ### 4. 运行时环境
195
- \`\`\`bash
196
- timeout 5 node -v 2>/dev/null && echo "Node.js: $(node -v)" || echo "❌ Node.js 未安装"
197
- timeout 5 git --version 2>/dev/null && echo "Git: $(git --version)" || echo "❌ Git 未安装"
198
- timeout 10 git remote -v 2>/dev/null | head -2
199
- timeout 5 git ls-remote --heads origin 2>/dev/null >/dev/null && echo "✅ Git remote 可达" || echo "⚠️ Git remote 不可达"
200
- timeout 5 java -version 2>&1 | head -1
201
- timeout 5 python3 --version 2>/dev/null
202
- \`\`\`
203
-
204
- ### 输出
205
- 汇总所有检查结果:
206
- \`\`\`
207
- ## 构建环境
208
- ✅/⚠️/❌ 各项状态
209
- \`\`\`
210
-
211
- ### 注意
212
- - 未检测到的构建工具直接跳过,不要报错
213
- - timeout 超时的命令视为不可用
214
- - 不编造结果`,
215
- outputHint: '构建环境检查结果',
216
- optional: false
217
- },
218
- {
219
- name: '外部依赖检查',
220
- prompt: `检查外部依赖工具是否可用。
221
-
222
- ### 1. Context7 MCP
223
- \`\`\`bash
224
- # 检查 MCP 配置
225
- for f in ~/.config/claude/claude_desktop_config.json ~/.cursor/mcp.json ~/.openclaw/mcp.json; do
226
- [ -f "$f" ] && echo "MCP 配置文件: $f" && grep -i context7 "$f" 2>/dev/null && echo "✅ Context7 已配置" || true
227
- done
228
- # 也检查 sillyspec 自身的 setup
229
- node -e "
230
- try{const m=require(require('path').join(require('os').homedir(),'.sillyspec','config.json'));console.log('✅ sillyspec config 存在')}catch{console.log('ℹ️ 无 sillyspec 全局配置')}
231
- " 2>/dev/null
232
- \`\`\`
233
-
234
- ### 2. grep.app
235
- \`\`\`bash
236
- timeout 5 curl -s -o /dev/null -w "%{http_code}" https://grep.app 2>/dev/null | grep -q "200" && echo "✅ grep.app 可达" || echo "⚠️ grep.app 不可达"
237
- \`\`\`
238
-
239
- ### 3. 其他 AI 工具(可选)
240
- \`\`\`bash
241
- # 检查常用 AI/开发工具
242
- timeout 5 which gh 2>/dev/null && echo "✅ GitHub CLI 可用" || echo "ℹ️ GitHub CLI 未安装"
243
- timeout 5 which docker 2>/dev/null && echo "✅ Docker 可用" || echo "ℹ️ Docker 未安装"
244
- \`\`\`
245
-
246
- ### 输出
247
- \`\`\`
248
- ## 外部依赖
249
- ✅/⚠️/❌ 各项状态
250
- \`\`\`
251
-
252
- ### 注意
253
- - 不编造结果
254
- - 工具未安装用 ℹ️ 标记(非错误),不可达用 ⚠️`,
255
- outputHint: '外部依赖检查结果',
256
- optional: false
257
- },
258
- {
259
- name: '汇总报告',
260
- prompt: `汇总前三步的所有检查结果,生成最终的自检报告。
261
-
262
- ### 输出格式
263
- \`\`\`
264
- 🔍 SillySpec Doctor — 项目自检报告
265
-
266
- ## SillySpec 内部
267
- ✅ .sillyspec/ 目录结构 — 正常
268
- ✅ projects/*.yaml — N 个项目已注册
269
- ⚠️ local.yaml (xxx) — 缺少 test 命令
270
- ❌ progress.json — brainstorm 标记完成但 design.md 不存在
271
-
272
- ## 构建环境
273
- ✅ Node.js v23.4.0 — 可用
274
- ✅ npm 10.x — 可用
275
- ✅ Java 17.0.2 — 可用
276
- ❌ Maven 私服 (10.0.0.1:8081) — 不可达(超时)
277
-
278
- ## 外部依赖
279
- ✅ Context7 MCP — 已配置
280
- ⚠️ grep.app — 不可达
281
- \`\`\`
282
-
283
- ### 要求
284
- - 基于前 3 步的实际输出汇总,不要编造
285
- - 每类问题归入对应分区
286
- - 全部通过给出 🎉
287
- - 如果有 ❌ 或 ⚠️,在末尾逐项给出修复建议
288
-
289
- ### 修复建议模板
290
- 根据问题类型给出具体可操作的修复命令:
291
-
292
- **常见问题及修复:**
293
- - CLI 未安装 → \`npm install -g sillyspec\`
294
- - 缺少 local.yaml → \`sillyspec init\` 重新生成,或手动创建
295
- - local.yaml 缺少 build/test → 补充对应命令
296
- - 缺少 STACK.md → \`sillyspec run scan\` 重新扫描
297
- - progress.json 不一致 → \`sillyspec run <阶段> --reset\` 重置对应阶段
298
- - 孤儿目录 → 确认后 \`rm -rf .sillyspec/changes/<目录名>\`
299
- - Maven 私服不可达 → 检查 VPN、settings.xml 配置、私服状态
300
- - Git remote 不可达 → 检查网络、SSH key 或凭证
301
- - 工具未安装 → 给出安装命令(如 \`brew install maven\`)
302
-
303
- 每条建议格式:
304
- \`\`\`
305
- 💡 修复:<问题描述>
306
- <具体命令或操作>
307
- \`\`\``,
308
- outputHint: '完整自检报告',
309
- optional: false
310
- }
311
- ]
312
- }