sillyspec 3.26.10 → 3.26.13

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 (101) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +85 -85
  2. package/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -114
  3. package/.claude/skills/sillyspec-commit/SKILL.md +109 -109
  4. package/.claude/skills/sillyspec-continue/SKILL.md +45 -45
  5. package/.claude/skills/sillyspec-doctor/SKILL.md +76 -76
  6. package/.claude/skills/sillyspec-execute/SKILL.md +200 -200
  7. package/.claude/skills/sillyspec-explore/SKILL.md +95 -95
  8. package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
  9. package/.claude/skills/sillyspec-plan/SKILL.md +148 -148
  10. package/.claude/skills/sillyspec-quick/SKILL.md +115 -111
  11. package/.claude/skills/sillyspec-resume/SKILL.md +68 -68
  12. package/.claude/skills/sillyspec-scan/SKILL.md +79 -79
  13. package/.claude/skills/sillyspec-state/SKILL.md +64 -64
  14. package/.claude/skills/sillyspec-status/SKILL.md +54 -54
  15. package/.claude/skills/sillyspec-verify/SKILL.md +83 -83
  16. package/.claude/skills/sillyspec-workspace/SKILL.md +169 -169
  17. package/.gitattributes +2 -0
  18. package/.husky/pre-push +20 -20
  19. package/README.md +203 -201
  20. package/SKILL.md +91 -90
  21. package/package.json +39 -39
  22. package/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -7446
  23. package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -1
  24. package/packages/dashboard/dist/index.html +16 -16
  25. package/packages/dashboard/package.json +25 -25
  26. package/packages/dashboard/server/executor.js +95 -86
  27. package/packages/dashboard/server/index.js +663 -601
  28. package/packages/dashboard/server/parser.js +526 -526
  29. package/src/change-risk-profile.js +254 -254
  30. package/src/classify-change.js +109 -109
  31. package/src/config-schema.js +313 -310
  32. package/src/contract-matrix.js +388 -379
  33. package/src/db.js +370 -350
  34. package/src/dispatch/backends/local-agent.js +155 -155
  35. package/src/dispatch/backends/sillyhub-mcp.js +245 -245
  36. package/src/dispatch/probe.js +246 -210
  37. package/src/dispatch/strategy.js +121 -121
  38. package/src/docs-check.js +188 -16
  39. package/src/docs-debt.js +6 -2
  40. package/src/docs-gate.js +1 -0
  41. package/src/doctor-diagnostics.js +898 -711
  42. package/src/endpoint-extractor.js +401 -401
  43. package/src/fs-atomic.js +71 -69
  44. package/src/git-helper.js +82 -79
  45. package/src/hooks/claude-pre-tool-use.cjs +125 -125
  46. package/src/hooks/worktree-guard.js +854 -848
  47. package/src/index.js +251 -20
  48. package/src/init.js +624 -623
  49. package/src/knowledge-match.js +130 -130
  50. package/src/local-detect.js +128 -120
  51. package/src/machine-interface.js +543 -543
  52. package/src/migrate.js +127 -127
  53. package/src/modules.js +7 -5
  54. package/src/progress/change-registry.js +297 -260
  55. package/src/progress/consistency-doctor.js +355 -355
  56. package/src/progress/shared.js +36 -36
  57. package/src/progress/stage-machine.js +589 -550
  58. package/src/progress/step-store.js +261 -261
  59. package/src/progress.js +1285 -1127
  60. package/src/quicklog.js +724 -693
  61. package/src/review-tier.js +77 -77
  62. package/src/run/command.js +1408 -1364
  63. package/src/run/complete-handlers.js +1450 -1399
  64. package/src/run/complete.js +1181 -920
  65. package/src/run/gates.js +878 -755
  66. package/src/run/prompt.js +765 -761
  67. package/src/run/quick-audit.js +155 -146
  68. package/src/run/shared.js +1348 -1215
  69. package/src/run/stage.js +527 -479
  70. package/src/scan-postcheck.js +371 -371
  71. package/src/setup.js +414 -416
  72. package/src/sillyhub-mcp/client.js +597 -529
  73. package/src/spec-dir-typo.js +3 -24
  74. package/src/spec-sync.js +358 -319
  75. package/src/stage-contract.js +871 -897
  76. package/src/stage-review.js +549 -549
  77. package/src/stages/archive.js +156 -155
  78. package/src/stages/brainstorm-auto.js +236 -236
  79. package/src/stages/brainstorm.js +597 -597
  80. package/src/stages/cmd-existence.js +145 -145
  81. package/src/stages/doctor.js +386 -371
  82. package/src/stages/execute.js +1014 -1003
  83. package/src/stages/explore.js +34 -34
  84. package/src/stages/index.js +29 -29
  85. package/src/stages/knowledge.js +498 -498
  86. package/src/stages/plan-postcheck.js +1323 -1302
  87. package/src/stages/plan.js +642 -623
  88. package/src/stages/quick.js +153 -151
  89. package/src/stages/scan.js +607 -607
  90. package/src/stages/status.js +64 -64
  91. package/src/stages/verify.js +264 -264
  92. package/src/sync.js +1325 -1135
  93. package/src/task-review.js +1204 -1019
  94. package/src/taskcard.js +178 -0
  95. package/src/verify-postcheck.js +1199 -1186
  96. package/src/workflow.js +600 -600
  97. package/src/worktree-apply.js +1237 -1136
  98. package/src/worktree-deps.js +453 -353
  99. package/src/worktree.js +1527 -1481
  100. package/templates/workflows/archive-impact.yaml +79 -79
  101. package/templates/workflows/scan-docs.yaml +132 -132
@@ -1,371 +1,386 @@
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
- > ⚠️ Windows 兼容:下列 sqlite3 查询依赖外部 sqlite3 CLI(Windows 默认没有)。若某条 sqlite3 失败,改用 sillyspec 自身命令替代——sillyspec progress show 查看当前变更与各阶段状态(等价于查 changes/stages 表),sillyspec doctor --json 查看 db 健康与活跃变更列表。
16
-
17
- ### 1. 目录结构完整性
18
- \`\`\`bash
19
- # 检查 .sillyspec/ 及子目录
20
- for d in .sillyspec .sillyspec/projects .sillyspec/docs .sillyspec/changes .sillyspec/.runtime; do
21
- [ -d "$d" ] && echo "✅ $d" || echo "❌ $d"
22
- done
23
- # 检查 sillyspec.db(SQLite 权威状态源)
24
- DB_FILE='.sillyspec/.runtime/sillyspec.db'
25
- [ -f "$DB_FILE" ] && echo "✅ sillyspec.db 存在" || echo "❌ sillyspec.db 不存在"
26
- # 用 sillyspec 自身命令验证 db 可读(fallback 不依赖外部 sqlite3 CLI,兼容 Windows)
27
- sqlite3 "$DB_FILE" "SELECT count(*) FROM project" 2>/dev/null && echo "✅ sillyspec.db 可查询" || (sillyspec progress show >/dev/null 2>&1 && echo "✅ sillyspec.db 可查询(经 sillyspec 命令)" || echo "⚠️ sillyspec.db 不可查询")
28
- \`\`\`
29
-
30
- ### 2. 项目配置检查
31
- \`\`\`bash
32
- ls .sillyspec/projects/*.yaml 2>/dev/null
33
- # 对每个 yaml 文件,检查 name 和 path 字段,验证 path 存在
34
- for f in .sillyspec/projects/*.yaml; do
35
- [ -f "$f" ] || continue
36
- name=$(grep '^name:' "$f" | head -1 | sed 's/^name:[[:space:]]*//')
37
- p=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
38
- [ -z "$name" ] && echo "⚠️ $(basename $f) — 缺少 name"
39
- [ -z "$p" ] && echo "⚠️ $(basename $f) — 缺少 path"
40
- [ -n "$p" ] && [ ! -d "$p" ] && echo "❌ $(basename $f) — path 不存在: $p"
41
- [ -n "$name" ] && [ -n "$p" ] && [ -d "$p" ] && echo "✅ $(basename $f) — $name ($p)"
42
- done
43
- \`\`\`
44
-
45
- ### 3. 进度数据一致性
46
- \`\`\`bash
47
- # 从 sillyspec.db 读取活跃变更并检查目录存在性
48
- DB_FILE='.sillyspec/.runtime/sillyspec.db'
49
- if [ ! -f "$DB_FILE" ]; then echo "⚠️ sillyspec.db 不存在"; exit 0; fi
50
- ACTIVE_CHANGE=$(sqlite3 "$DB_FILE" "SELECT name FROM changes WHERE status='active' ORDER BY last_active DESC LIMIT 1" 2>/dev/null)
51
- if [ -z "$ACTIVE_CHANGE" ]; then echo "ℹ️ 无当前变更"; exit 0; fi
52
- echo "当前变更: $ACTIVE_CHANGE"
53
- DIR=".sillyspec/changes/$ACTIVE_CHANGE"
54
- [ -d "$DIR" ] && echo "✅ 变更目录存在: $ACTIVE_CHANGE" || echo "❌ 变更目录不存在: $ACTIVE_CHANGE"
55
- # 检查各阶段状态
56
- sqlite3 -header -column "$DB_FILE" "SELECT stage, status FROM stages s JOIN changes c ON s.change_id=c.id WHERE c.name='$ACTIVE_CHANGE' ORDER BY s.stage" 2>/dev/null || echo "⚠️ 无法查询阶段数据"
57
- \`\`\`
58
-
59
- ### 4. 孤儿文件检查
60
- \`\`\`bash
61
- DB_FILE='.sillyspec/.runtime/sillyspec.db'
62
- if [ ! -f "$DB_FILE" ]; then echo "⚠️ sillyspec.db 不存在"; exit 0; fi
63
- node -e "
64
- const fs = require('fs');
65
- const dir = '.sillyspec/changes';
66
- const subs = fs.existsSync(dir) ? fs.readdirSync(dir).filter(f => { try { return fs.statSync(dir+'/'+f).isDirectory(); } catch { return false; } }) : [];
67
- const { execSync } = require('child_process');
68
- let known;
69
- try { const rows = execSync('sqlite3 -json \".sillyspec/.runtime/sillyspec.db\" \"SELECT name FROM changes WHERE status=\\\"active\\\"\"', {encoding:'utf8'}).trim(); known = new Set(JSON.parse(rows).map(r => r.name)); } catch { known = new Set(); }
70
- subs.forEach(s => {
71
- console.log(known.has(s) ? '✅ ' + s + ' — 已关联' : '⚠️ ' + s + ' — 孤儿目录(可清理)');
72
- });
73
- // 反向检查(multi-agent-review Q1):DB active 且匹配 quick-<hex> 但无目录 → 僵尸 quick 会话
74
- // (quick 收尾未注销,active 行累积污染 listChanges/doctor)。新代码已修收尾,此项清理历史残留。
75
- const QUICK_RE = /^quick-[0-9a-f]{8}$/;
76
- const zombieQuick = [...known].filter(n => QUICK_RE.test(n) && !subs.includes(n));
77
- if (zombieQuick.length > 0) {
78
- console.log('⚠️ 检测到 ' + zombieQuick.length + ' 个僵尸 quick 会话(DB active 但无目录):');
79
- zombieQuick.forEach(n => console.log(' - ' + n));
80
- }
81
- "
82
- \`\`\`
83
-
84
- ### 5. 配置文件检查
85
- \`\`\`bash
86
- # 检查 local.yaml 和 scan 总览文档
87
- for f in .sillyspec/projects/*.yaml; do
88
- [ -f "$f" ] || continue
89
- name=$(grep '^name:' "$f" | head -1 | sed 's/^name:[[:space:]]*//')
90
- p=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
91
- [ -z "$p" ] && continue
92
- local_yaml="$p/.sillyspec/local.yaml"
93
- arch_md=".sillyspec/docs/$name/scan/ARCHITECTURE.md"
94
- [ -f "$local_yaml" ] && echo "✅ local.yaml ($name)" || echo "⚠️ local.yaml ($name) — 不存在"
95
- if [ -f "$local_yaml" ]; then
96
- grep -q 'test:' "$local_yaml" && echo " ✅ test 命令已配置" || echo " ⚠️ 缺少 test 命令"
97
- fi
98
- [ -f "$arch_md" ] && echo "✅ scan/ARCHITECTURE.md ($name)" || echo "⚠️ scan/ARCHITECTURE.md ($name) — 不存在(运行 sillyspec run scan)"
99
- done
100
- \`\`\`
101
-
102
- ### 6. Worktree 隔离环境检查
103
- \`\`\`bash
104
- # 检测当前目录是否在 submodule 中
105
- SUPERPROJECT=$(git rev-parse --show-superproject-working-tree 2>/dev/null)
106
- if [ -n "$SUPERPROJECT" ]; then
107
- echo "⚠️ 当前目录在 git submodule 内,worktree 隔离不可用"
108
- else
109
- echo "✅ 不在 submodule 中"
110
- fi
111
-
112
- # 检测是否已在 linked worktree 中
113
- GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
114
- GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
115
- if [ "$GIT_DIR" != "$GIT_COMMON" ] && [ -z "$SUPERPROJECT" ]; then
116
- echo "✅ 已在 linked worktree 中"
117
- else
118
- echo "ℹ️ 在主仓库中(非 worktree)"
119
- fi
120
-
121
- # 检查 worktree 存储目录是否被 .gitignore 忽略
122
- WT_DIR='.sillyspec/.runtime/worktrees'
123
- if git check-ignore -q "$WT_DIR" 2>/dev/null; then
124
- echo "✅ worktree 目录已被 .gitignore 忽略 ($WT_DIR)"
125
- else
126
- echo "❌ worktree 目录未被 .gitignore 忽略 ($WT_DIR) — worktree 创建将被阻断"
127
- echo " 修复: 在 .gitignore 中添加 $WT_DIR/"
128
- fi
129
-
130
- # 检查 DB 中的 isolation 状态
131
- DB_FILE='.sillyspec/.runtime/sillyspec.db'
132
- if [ -f "$DB_FILE" ]; then
133
- echo ""
134
- echo "isolation 状态(来自 sillyspec.db):"
135
- sqlite3 -header -column "$DB_FILE" "SELECT name, isolation_status AS status, isolation_mode AS mode, isolation_reason AS reason FROM changes WHERE status='active'" 2>/dev/null || echo "⚠️ 查询 isolation 失败"
136
- else
137
- echo ""
138
- echo "ℹ️ sillyspec.db 不存在(尚未初始化)"
139
- fi
140
- \`\`\`\n
141
- ### 输出
142
- 汇总所有检查结果,按以下格式:
143
- \`\`\`
144
- ## SillySpec 内部
145
- ✅/⚠️/❌ 各项状态
146
- \`\`\`
147
-
148
- ### 注意
149
- - 不要编造路径或结果,严格基于命令输出
150
- - 如果 .sillyspec/ 不存在,直接输出 ❌ 并跳过后续检查`,
151
- outputHint: 'SillySpec 内部检查结果',
152
- optional: false
153
- },
154
- {
155
- name: '构建环境检查',
156
- prompt: `检查项目构建环境。先探测项目使用的构建工具,再逐项检查可用性。
157
-
158
- ### 1. 探测构建工具
159
- \`\`\`bash
160
- # 确定项目路径(使用 sillyspec.db 中的项目路径或当前目录)
161
- PROJECT_DIR=$(sqlite3 -json '.sillyspec/.runtime/sillyspec.db' "SELECT name FROM project WHERE id=1" 2>/dev/null | node -e "const r=JSON.parse(require('fs').readFileSync(0,'utf8'));console.log(r.length>0&&r[0].name?r[0].name:'.')" 2>/dev/null || node -e "
162
- const fs=require('fs');
163
- try{const files=fs.readdirSync('.sillyspec/projects').filter(f=>f.endsWith('.yaml'));
164
- 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('.')
165
- }catch{console.log('.')}
166
- " 2>/dev/null)
167
- echo "项目目录: $PROJECT_DIR"
168
-
169
- # 探测构建工具
170
- for f in pom.xml build.gradle package.json requirements.txt pyproject.toml go.mod Cargo.toml; do
171
- [ -f "$PROJECT_DIR/$f" ] && echo "检测到: $f"
172
- done
173
- cat .sillyspec/docs/*/scan/ARCHITECTURE.md 2>/dev/null | head -30 || echo "(无 scan/ARCHITECTURE.md)"
174
- \`\`\`
175
-
176
- ### 2. 构建工具可用性
177
- 根据上面检测到的工具,运行对应检查(未检测到的跳过):
178
-
179
- **Maven 项目:**
180
- \`\`\`bash
181
- timeout 10 mvn -v 2>/dev/null | head -1 && echo "✅ Maven 可用" || echo "❌ Maven 不可用"
182
- [ -f ~/.m2/settings.xml ] && echo "✅ Maven settings.xml 存在" || echo "⚠️ Maven settings.xml 不存在"
183
- timeout 10 java -version 2>&1 | head -1
184
- \`\`\`
185
-
186
- **Gradle 项目:**
187
- \`\`\`bash
188
- timeout 10 gradle -v 2>/dev/null | head -1 && echo "✅ Gradle 可用" || echo "❌ Gradle 不可用"
189
- \`\`\`
190
-
191
- **Node.js 项目:**
192
- \`\`\`bash
193
- timeout 5 node -v 2>/dev/null && echo "✅ Node.js 可用" || echo "❌ Node.js 不可用"
194
- timeout 5 npm -v 2>/dev/null && echo "✅ npm 可用" || echo "❌ npm 不可用"
195
- timeout 5 pnpm -v 2>/dev/null && echo "✅ pnpm 可用" || echo "ℹ️ pnpm 未安装"
196
- # 检查 registry
197
- npm config get registry 2>/dev/null
198
- \`\`\`
199
-
200
- **Python 项目:**
201
- \`\`\`bash
202
- timeout 5 python3 --version 2>/dev/null && echo "✅ Python3 可用" || echo "❌ Python3 不可用"
203
- timeout 5 pip3 --version 2>/dev/null && echo "✅ pip3 可用" || echo "❌ pip3 不可用"
204
- \`\`\`
205
-
206
- ### 3. Maven 私服检查(仅 Maven 项目)
207
- \`\`\`bash
208
- # 从 settings.xml 提取仓库地址
209
- if [ -f ~/.m2/settings.xml ]; then
210
- grep -oP 'https?://[^<"]+:[0-9]+' ~/.m2/settings.xml 2>/dev/null | sort -u | while read url; do
211
- timeout 5 curl -s -o /dev/null -w "%{http_code}" "$url" 2>/dev/null
212
- echo " — $url"
213
- done
214
- fi
215
- # 从 pom.xml 提取
216
- if [ -f "$PROJECT_DIR/pom.xml" ]; then
217
- grep -oP 'https?://[^<"]+:[0-9]+' "$PROJECT_DIR/pom.xml" 2>/dev/null | sort -u | while read url; do
218
- code=$(timeout 5 curl -s -o /dev/null -w "%{http_code}" "$url" 2>/dev/null)
219
- [ "$code" = "000" ] && echo "❌ 私服不可达: $url(超时)" || echo "✅ 私服可达 ($code): $url"
220
- done
221
- fi
222
- \`\`\`
223
-
224
- ### 4. 运行时环境
225
- \`\`\`bash
226
- timeout 5 node -v 2>/dev/null && echo "Node.js: $(node -v)" || echo "❌ Node.js 未安装"
227
- timeout 5 git --version 2>/dev/null && echo "Git: $(git --version)" || echo "❌ Git 未安装"
228
- timeout 10 git remote -v 2>/dev/null | head -2
229
- timeout 5 git ls-remote --heads origin 2>/dev/null >/dev/null && echo "✅ Git remote 可达" || echo "⚠️ Git remote 不可达"
230
- timeout 5 java -version 2>&1 | head -1
231
- timeout 5 python3 --version 2>/dev/null
232
- \`\`\`
233
-
234
- ### 输出
235
- 汇总所有检查结果:
236
- \`\`\`
237
- ## 构建环境
238
- ✅/⚠️/❌ 各项状态
239
- \`\`\`
240
-
241
- ### 注意
242
- - 未检测到的构建工具直接跳过,不要报错
243
- - timeout 超时的命令视为不可用
244
- - 不编造结果`,
245
- outputHint: '构建环境检查结果',
246
- optional: false
247
- },
248
- {
249
- name: '外部依赖检查',
250
- prompt: `检查外部依赖工具是否可用。
251
-
252
- ### 1. Context7 MCP
253
- \`\`\`bash
254
- # 检查 MCP 配置
255
- for f in ~/.config/claude/claude_desktop_config.json ~/.cursor/mcp.json ~/.openclaw/mcp.json; do
256
- [ -f "$f" ] && echo "MCP 配置文件: $f" && grep -i context7 "$f" 2>/dev/null && echo "✅ Context7 已配置" || true
257
- done
258
- # 也检查 sillyspec 自身的 setup
259
- node -e "
260
- try{const m=require(require('path').join(require('os').homedir(),'.sillyspec','config.json'));console.log('✅ sillyspec config 存在')}catch{console.log('ℹ️ 无 sillyspec 全局配置')}
261
- " 2>/dev/null
262
- \`\`\`
263
-
264
- ### 2. grep.app
265
- \`\`\`bash
266
- 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 不可达"
267
- \`\`\`
268
-
269
- ### 3. 其他 AI 工具(可选)
270
- \`\`\`bash
271
- # 检查常用 AI/开发工具
272
- timeout 5 which gh 2>/dev/null && echo "✅ GitHub CLI 可用" || echo "ℹ️ GitHub CLI 未安装"
273
- timeout 5 which docker 2>/dev/null && echo "✅ Docker 可用" || echo "ℹ️ Docker 未安装"
274
- \`\`\`
275
-
276
- ### 输出
277
- \`\`\`
278
- ## 外部依赖
279
- ✅/⚠️/❌ 各项状态
280
- \`\`\`
281
-
282
- ### 注意
283
- - 不编造结果
284
- - 工具未安装用 ℹ️ 标记(非错误),不可达用 ⚠️`,
285
- outputHint: '外部依赖检查结果',
286
- optional: false
287
- },
288
- {
289
- name: '模块文档健康检查',
290
- prompt: `检查模块索引和卡片文档的健康状态。
291
-
292
- ### 操作
293
- 1. 运行 \`sillyspec modules status\` 查看模块索引概览
294
- 2. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
295
- 3. 对每个模块,检查:
296
- - module_id 是否有对应的卡片文件(modules/<module-id>.md)
297
- - 卡片文件是否有有效的 frontmatter(schema_version, doc_type, module_id)
298
- - 人工备注标记是否配对(MANUAL_NOTES_START 和 MANUAL_NOTES_END 必须成对出现)
299
- - needs_review 为 true 的模块列表
300
- 4. 汇总结果
301
-
302
- ### 输出格式
303
- \`\`\`
304
- 📋 模块文档健康检查
305
- ✅ _module-map.yaml — 存在,N 个模块
306
- ⚠️ auth-service — needs_review=true,原因:...
307
- ❌ payment-service — 卡片文件缺失
308
- ✅ 所有模块人工备注标记配对正常
309
- \`\`\`
310
-
311
- ### 注意
312
- - 如果 _module-map.yaml 不存在,输出"模块索引未生成,建议运行 scan"
313
- `,
314
- outputHint: '模块文档健康状态',
315
- optional: false
316
- },
317
- {
318
- name: '汇总报告',
319
- prompt: `汇总前四步的所有检查结果,生成最终的自检报告。
320
-
321
- ### 输出格式
322
- \`\`\`
323
- 🔍 SillySpec Doctor — 项目自检报告
324
-
325
- ## SillySpec 内部
326
- ✅ .sillyspec/ 目录结构 — 正常
327
- ✅ projects/*.yaml — N 个项目已注册
328
- ⚠️ local.yaml (xxx) — 缺少 test 命令
329
- ❌ sillyspec.db 阶段状态 — brainstorm 标记完成但 design.md 不存在
330
-
331
- ## 构建环境
332
- ✅ Node.js v23.4.0 — 可用
333
- ✅ npm 10.x — 可用
334
- ✅ Java 17.0.2 — 可用
335
- ❌ Maven 私服 (10.0.0.1:8081) — 不可达(超时)
336
-
337
- ## 外部依赖
338
- ✅ Context7 MCP — 已配置
339
- ⚠️ grep.app — 不可达
340
- \`\`\`
341
-
342
- ### 要求
343
- - 基于前 3 步的实际输出汇总,不要编造
344
- - 每类问题归入对应分区
345
- - 全部通过给出 🎉
346
- - 如果有 ❌ 或 ⚠️,在末尾逐项给出修复建议
347
-
348
- ### 修复建议模板
349
- 根据问题类型给出具体可操作的修复命令:
350
-
351
- **常见问题及修复:**
352
- - CLI 未安装 → \`npm install -g sillyspec\`
353
- - 缺少 local.yaml → \`sillyspec local detect\` 重新生成,或手动创建
354
- - local.yaml 缺少 test 命令 → 补充对应命令
355
- - 缺少 scan 文档(ARCHITECTURE.md 等)→ \`sillyspec run scan\` 重新扫描
356
- - sillyspec.db 状态不一致 → \`sillyspec run <阶段> --reset\` 重置对应阶段
357
- - 孤儿目录 → 确认后 \`rm -rf .sillyspec/changes/<目录名>\`
358
- - Maven 私服不可达 → 检查 VPN、settings.xml 配置、私服状态
359
- - Git remote 不可达 → 检查网络、SSH key 或凭证
360
- - 工具未安装 → 给出安装命令(如 \`brew install maven\`)
361
-
362
- 每条建议格式:
363
- \`\`\`
364
- 💡 修复:<问题描述>
365
- <具体命令或操作>
366
- \`\`\``,
367
- outputHint: '完整自检报告',
368
- optional: false
369
- }
370
- ]
371
- }
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
+ > ✅ Windows 兼容(SS-1,2026-08-20):db 查询已全部改走 node:sqlite(node≥22.13 内置),不再依赖外部 sqlite3 CLI。若 node 脚本失败,改用 sillyspec 自身命令替代——sillyspec progress show 查看当前变更与各阶段状态,sillyspec doctor --json 查看 db 健康与活跃变更列表。
16
+
17
+ ### 1. 目录结构完整性
18
+ \`\`\`bash
19
+ # 检查 .sillyspec/ 及子目录
20
+ for d in .sillyspec .sillyspec/projects .sillyspec/docs .sillyspec/changes .sillyspec/.runtime; do
21
+ [ -d "$d" ] && echo "✅ $d" || echo "❌ $d"
22
+ done
23
+ # 检查 sillyspec.db(SQLite 权威状态源)
24
+ DB_FILE='.sillyspec/.runtime/sillyspec.db'
25
+ [ -f "$DB_FILE" ] && echo "✅ sillyspec.db 存在" || echo "❌ sillyspec.db 不存在"
26
+ # 用 sillyspec 自身命令验证 db 可读(fallback 不依赖外部 sqlite3 CLI,兼容 Windows)
27
+ sqlite3 "$DB_FILE" "SELECT count(*) FROM project" 2>/dev/null && echo "✅ sillyspec.db 可查询" || (sillyspec progress show >/dev/null 2>&1 && echo "✅ sillyspec.db 可查询(经 sillyspec 命令)" || echo "⚠️ sillyspec.db 不可查询")
28
+ \`\`\`
29
+
30
+ ### 2. 项目配置检查
31
+ \`\`\`bash
32
+ ls .sillyspec/projects/*.yaml 2>/dev/null
33
+ # 对每个 yaml 文件,检查 name 和 path 字段,验证 path 存在
34
+ for f in .sillyspec/projects/*.yaml; do
35
+ [ -f "$f" ] || continue
36
+ name=$(grep '^name:' "$f" | head -1 | sed 's/^name:[[:space:]]*//')
37
+ p=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
38
+ [ -z "$name" ] && echo "⚠️ $(basename $f) — 缺少 name"
39
+ [ -z "$p" ] && echo "⚠️ $(basename $f) — 缺少 path"
40
+ [ -n "$p" ] && [ ! -d "$p" ] && echo "❌ $(basename $f) — path 不存在: $p"
41
+ [ -n "$name" ] && [ -n "$p" ] && [ -d "$p" ] && echo "✅ $(basename $f) — $name ($p)"
42
+ done
43
+ \`\`\`
44
+
45
+ ### 3. 进度数据一致性
46
+ \`\`\`bash
47
+ # 从 sillyspec.db 读取活跃变更并检查目录存在性(node:sqlite 主路径,Windows 无 sqlite3 CLI)
48
+ DB_FILE='.sillyspec/.runtime/sillyspec.db'
49
+ if [ ! -f "$DB_FILE" ]; then echo "⚠️ sillyspec.db 不存在"; exit 0; fi
50
+ node --input-type=module -e "
51
+ import { DatabaseSync } from 'node:sqlite';
52
+ import { existsSync } from 'node:fs';
53
+ const db = new DatabaseSync(process.argv[1], { readOnly: true });
54
+ const row = db.prepare(\\"SELECT name FROM changes WHERE status='active' ORDER BY last_active DESC LIMIT 1\\").get();
55
+ if (!row) { console.log('ℹ️ 无当前变更'); process.exit(0); }
56
+ console.log('当前变更: ' + row.name);
57
+ const dir = '.sillyspec/changes/' + row.name;
58
+ console.log(existsSync(dir) ? '✅ 变更目录存在: ' + row.name : '❌ 变更目录不存在: ' + row.name);
59
+ const stages = db.prepare('SELECT s.stage AS stage, s.status AS status FROM stages s JOIN changes c ON s.change_id=c.id WHERE c.name=? ORDER BY s.stage').all(row.name);
60
+ if (stages.length === 0) console.log('⚠️ 无阶段数据'); else for (const s of stages) console.log(' ' + s.stage + ': ' + s.status);
61
+ db.close();
62
+ " "$DB_FILE" 2>/dev/null || echo "⚠️ 无法查询阶段数据"
63
+ \`\`\`
64
+
65
+ ### 4. 孤儿文件检查
66
+ \`\`\`bash
67
+ DB_FILE='.sillyspec/.runtime/sillyspec.db'
68
+ if [ ! -f "$DB_FILE" ]; then echo "⚠️ sillyspec.db 不存在"; exit 0; fi
69
+ node -e "
70
+ const fs = require('fs');
71
+ const { DatabaseSync } = require('node:sqlite');
72
+ const dir = '.sillyspec/changes';
73
+ const subs = fs.existsSync(dir) ? fs.readdirSync(dir).filter(f => { try { return fs.statSync(dir+'/'+f).isDirectory() && f !== 'archive'; } catch { return false; } }) : [];
74
+ let known;
75
+ try { const db = new DatabaseSync('.sillyspec/.runtime/sillyspec.db', { readOnly: true }); known = new Set(db.prepare(\"SELECT name FROM changes WHERE status='active'\").all().map(r => r.name)); db.close(); } catch (e) { console.log('⚠️ db 读取失败: ' + e.message + '(跳过孤儿判定,不做任何清理建议)'); known = null; }
76
+ if (known) subs.forEach(s => {
77
+ console.log(known.has(s) ? '✅ ' + s + ' — 已关联' : '⚠️ ' + s + ' — 孤儿目录(先 dump 取证再手工归位,勿直接 rm)');
78
+ });
79
+ subs.forEach(s => {
80
+ console.log(known.has(s) ? '✅ ' + s + ' — 已关联' : '⚠️ ' + s + ' — 孤儿目录(可清理)');
81
+ });
82
+ // 反向检查(multi-agent-review Q1):DB active 且匹配 quick-<hex> 但无目录 → 僵尸 quick 会话
83
+ // (quick 收尾未注销,active 行累积污染 listChanges/doctor)。新代码已修收尾,此项清理历史残留。
84
+ const QUICK_RE = /^quick-[0-9a-f]{8}$/;
85
+ const zombieQuick = [...known].filter(n => QUICK_RE.test(n) && !subs.includes(n));
86
+ if (zombieQuick.length > 0) {
87
+ console.log('⚠️ 检测到 ' + zombieQuick.length + ' 个僵尸 quick 会话(DB active 但无目录):');
88
+ zombieQuick.forEach(n => console.log(' - ' + n));
89
+ }
90
+ "
91
+ \`\`\`
92
+
93
+ ### 5. 配置文件检查
94
+ \`\`\`bash
95
+ # 检查 local.yaml 和 scan 总览文档
96
+ for f in .sillyspec/projects/*.yaml; do
97
+ [ -f "$f" ] || continue
98
+ name=$(grep '^name:' "$f" | head -1 | sed 's/^name:[[:space:]]*//')
99
+ p=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
100
+ [ -z "$p" ] && continue
101
+ local_yaml="$p/.sillyspec/local.yaml"
102
+ arch_md=".sillyspec/docs/$name/scan/ARCHITECTURE.md"
103
+ [ -f "$local_yaml" ] && echo "✅ local.yaml ($name)" || echo "⚠️ local.yaml ($name) — 不存在"
104
+ if [ -f "$local_yaml" ]; then
105
+ grep -q 'test:' "$local_yaml" && echo " ✅ test 命令已配置" || echo " ⚠️ 缺少 test 命令"
106
+ fi
107
+ [ -f "$arch_md" ] && echo "✅ scan/ARCHITECTURE.md ($name)" || echo "⚠️ scan/ARCHITECTURE.md ($name) — 不存在(运行 sillyspec run scan)"
108
+ done
109
+ \`\`\`
110
+
111
+ ### 6. Worktree 隔离环境检查
112
+ \`\`\`bash
113
+ # 检测当前目录是否在 submodule 中
114
+ SUPERPROJECT=$(git rev-parse --show-superproject-working-tree 2>/dev/null)
115
+ if [ -n "$SUPERPROJECT" ]; then
116
+ echo "⚠️ 当前目录在 git submodule 内,worktree 隔离不可用"
117
+ else
118
+ echo "✅ 不在 submodule 中"
119
+ fi
120
+
121
+ # 检测是否已在 linked worktree 中
122
+ GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
123
+ GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
124
+ if [ "$GIT_DIR" != "$GIT_COMMON" ] && [ -z "$SUPERPROJECT" ]; then
125
+ echo "✅ 已在 linked worktree 中"
126
+ else
127
+ echo "ℹ️ 在主仓库中(非 worktree)"
128
+ fi
129
+
130
+ # 检查 worktree 存储目录是否被 .gitignore 忽略
131
+ WT_DIR='.sillyspec/.runtime/worktrees'
132
+ if git check-ignore -q "$WT_DIR" 2>/dev/null; then
133
+ echo "✅ worktree 目录已被 .gitignore 忽略 ($WT_DIR)"
134
+ else
135
+ echo "❌ worktree 目录未被 .gitignore 忽略 ($WT_DIR) — worktree 创建将被阻断"
136
+ echo " 修复: 在 .gitignore 中添加 $WT_DIR/"
137
+ fi
138
+
139
+ # 检查 DB 中的 isolation 状态
140
+ DB_FILE='.sillyspec/.runtime/sillyspec.db'
141
+ if [ -f "$DB_FILE" ]; then
142
+ echo ""
143
+ echo "isolation 状态(来自 sillyspec.db):"
144
+ node -e "
145
+ const { DatabaseSync } = require('node:sqlite');
146
+ const db = new DatabaseSync(process.argv[1], { readOnly: true });
147
+ const rows = db.prepare(\"SELECT name, isolation_status AS status, isolation_mode AS mode, isolation_reason AS reason FROM changes WHERE status='active'\").all();
148
+ for (const r of rows) console.log(' ' + r.name + ' | ' + r.status + ' | ' + r.mode + ' | ' + (r.reason || ''));
149
+ db.close();
150
+ " "$DB_FILE" 2>/dev/null || echo "⚠️ 查询 isolation 失败"
151
+ else
152
+ echo ""
153
+ echo "ℹ️ sillyspec.db 不存在(尚未初始化)"
154
+ fi
155
+ \`\`\`\n
156
+ ### 输出
157
+ 汇总所有检查结果,按以下格式:
158
+ \`\`\`
159
+ ## SillySpec 内部
160
+ ✅/⚠️/❌ 各项状态
161
+ \`\`\`
162
+
163
+ ### 注意
164
+ - 不要编造路径或结果,严格基于命令输出
165
+ - 如果 .sillyspec/ 不存在,直接输出 ❌ 并跳过后续检查`,
166
+ outputHint: 'SillySpec 内部检查结果',
167
+ optional: false
168
+ },
169
+ {
170
+ name: '构建环境检查',
171
+ prompt: `检查项目构建环境。先探测项目使用的构建工具,再逐项检查可用性。
172
+
173
+ ### 1. 探测构建工具
174
+ \`\`\`bash
175
+ # 确定项目路径(使用 sillyspec.db 中的项目路径或当前目录)
176
+ PROJECT_DIR=$(sqlite3 -json '.sillyspec/.runtime/sillyspec.db' "SELECT name FROM project WHERE id=1" 2>/dev/null | node -e "const r=JSON.parse(require('fs').readFileSync(0,'utf8'));console.log(r.length>0&&r[0].name?r[0].name:'.')" 2>/dev/null || node -e "
177
+ const fs=require('fs');
178
+ try{const files=fs.readdirSync('.sillyspec/projects').filter(f=>f.endsWith('.yaml'));
179
+ 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('.')
180
+ }catch{console.log('.')}
181
+ " 2>/dev/null)
182
+ echo "项目目录: $PROJECT_DIR"
183
+
184
+ # 探测构建工具
185
+ for f in pom.xml build.gradle package.json requirements.txt pyproject.toml go.mod Cargo.toml; do
186
+ [ -f "$PROJECT_DIR/$f" ] && echo "检测到: $f"
187
+ done
188
+ cat .sillyspec/docs/*/scan/ARCHITECTURE.md 2>/dev/null | head -30 || echo "(无 scan/ARCHITECTURE.md)"
189
+ \`\`\`
190
+
191
+ ### 2. 构建工具可用性
192
+ 根据上面检测到的工具,运行对应检查(未检测到的跳过):
193
+
194
+ **Maven 项目:**
195
+ \`\`\`bash
196
+ timeout 10 mvn -v 2>/dev/null | head -1 && echo "✅ Maven 可用" || echo "❌ Maven 不可用"
197
+ [ -f ~/.m2/settings.xml ] && echo "✅ Maven settings.xml 存在" || echo "⚠️ Maven settings.xml 不存在"
198
+ timeout 10 java -version 2>&1 | head -1
199
+ \`\`\`
200
+
201
+ **Gradle 项目:**
202
+ \`\`\`bash
203
+ timeout 10 gradle -v 2>/dev/null | head -1 && echo "✅ Gradle 可用" || echo "❌ Gradle 不可用"
204
+ \`\`\`
205
+
206
+ **Node.js 项目:**
207
+ \`\`\`bash
208
+ timeout 5 node -v 2>/dev/null && echo "✅ Node.js 可用" || echo "❌ Node.js 不可用"
209
+ timeout 5 npm -v 2>/dev/null && echo "✅ npm 可用" || echo "❌ npm 不可用"
210
+ timeout 5 pnpm -v 2>/dev/null && echo "✅ pnpm 可用" || echo "ℹ️ pnpm 未安装"
211
+ # 检查 registry
212
+ npm config get registry 2>/dev/null
213
+ \`\`\`
214
+
215
+ **Python 项目:**
216
+ \`\`\`bash
217
+ timeout 5 python3 --version 2>/dev/null && echo "✅ Python3 可用" || echo "❌ Python3 不可用"
218
+ timeout 5 pip3 --version 2>/dev/null && echo "✅ pip3 可用" || echo "❌ pip3 不可用"
219
+ \`\`\`
220
+
221
+ ### 3. Maven 私服检查(仅 Maven 项目)
222
+ \`\`\`bash
223
+ # 从 settings.xml 提取仓库地址
224
+ if [ -f ~/.m2/settings.xml ]; then
225
+ grep -oP 'https?://[^<"]+:[0-9]+' ~/.m2/settings.xml 2>/dev/null | sort -u | while read url; do
226
+ timeout 5 curl -s -o /dev/null -w "%{http_code}" "$url" 2>/dev/null
227
+ echo " — $url"
228
+ done
229
+ fi
230
+ # 从 pom.xml 提取
231
+ if [ -f "$PROJECT_DIR/pom.xml" ]; then
232
+ grep -oP 'https?://[^<"]+:[0-9]+' "$PROJECT_DIR/pom.xml" 2>/dev/null | sort -u | while read url; do
233
+ code=$(timeout 5 curl -s -o /dev/null -w "%{http_code}" "$url" 2>/dev/null)
234
+ [ "$code" = "000" ] && echo "❌ 私服不可达: $url(超时)" || echo "✅ 私服可达 ($code): $url"
235
+ done
236
+ fi
237
+ \`\`\`
238
+
239
+ ### 4. 运行时环境
240
+ \`\`\`bash
241
+ timeout 5 node -v 2>/dev/null && echo "Node.js: $(node -v)" || echo "❌ Node.js 未安装"
242
+ timeout 5 git --version 2>/dev/null && echo "Git: $(git --version)" || echo "❌ Git 未安装"
243
+ timeout 10 git remote -v 2>/dev/null | head -2
244
+ timeout 5 git ls-remote --heads origin 2>/dev/null >/dev/null && echo "✅ Git remote 可达" || echo "⚠️ Git remote 不可达"
245
+ timeout 5 java -version 2>&1 | head -1
246
+ timeout 5 python3 --version 2>/dev/null
247
+ \`\`\`
248
+
249
+ ### 输出
250
+ 汇总所有检查结果:
251
+ \`\`\`
252
+ ## 构建环境
253
+ ✅/⚠️/❌ 各项状态
254
+ \`\`\`
255
+
256
+ ### 注意
257
+ - 未检测到的构建工具直接跳过,不要报错
258
+ - timeout 超时的命令视为不可用
259
+ - 不编造结果`,
260
+ outputHint: '构建环境检查结果',
261
+ optional: false
262
+ },
263
+ {
264
+ name: '外部依赖检查',
265
+ prompt: `检查外部依赖工具是否可用。
266
+
267
+ ### 1. Context7 MCP
268
+ \`\`\`bash
269
+ # 检查 MCP 配置
270
+ for f in ~/.config/claude/claude_desktop_config.json ~/.cursor/mcp.json ~/.openclaw/mcp.json; do
271
+ [ -f "$f" ] && echo "MCP 配置文件: $f" && grep -i context7 "$f" 2>/dev/null && echo "✅ Context7 已配置" || true
272
+ done
273
+ # 也检查 sillyspec 自身的 setup
274
+ node -e "
275
+ try{const m=require(require('path').join(require('os').homedir(),'.sillyspec','config.json'));console.log('✅ sillyspec config 存在')}catch{console.log('ℹ️ 无 sillyspec 全局配置')}
276
+ " 2>/dev/null
277
+ \`\`\`
278
+
279
+ ### 2. grep.app
280
+ \`\`\`bash
281
+ 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 不可达"
282
+ \`\`\`
283
+
284
+ ### 3. 其他 AI 工具(可选)
285
+ \`\`\`bash
286
+ # 检查常用 AI/开发工具
287
+ timeout 5 which gh 2>/dev/null && echo "✅ GitHub CLI 可用" || echo "ℹ️ GitHub CLI 未安装"
288
+ timeout 5 which docker 2>/dev/null && echo "✅ Docker 可用" || echo "ℹ️ Docker 未安装"
289
+ \`\`\`
290
+
291
+ ### 输出
292
+ \`\`\`
293
+ ## 外部依赖
294
+ ✅/⚠️/❌ 各项状态
295
+ \`\`\`
296
+
297
+ ### 注意
298
+ - 不编造结果
299
+ - 工具未安装用 ℹ️ 标记(非错误),不可达用 ⚠️`,
300
+ outputHint: '外部依赖检查结果',
301
+ optional: false
302
+ },
303
+ {
304
+ name: '模块文档健康检查',
305
+ prompt: `检查模块索引和卡片文档的健康状态。
306
+
307
+ ### 操作
308
+ 1. 运行 \`sillyspec modules status\` 查看模块索引概览
309
+ 2. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
310
+ 3. 对每个模块,检查:
311
+ - module_id 是否有对应的卡片文件(modules/<module-id>.md)
312
+ - 卡片文件是否有有效的 frontmatter(schema_version, doc_type, module_id)
313
+ - 人工备注标记是否配对(MANUAL_NOTES_START 和 MANUAL_NOTES_END 必须成对出现)
314
+ - needs_review 为 true 的模块列表
315
+ 4. 汇总结果
316
+
317
+ ### 输出格式
318
+ \`\`\`
319
+ 📋 模块文档健康检查
320
+ ✅ _module-map.yaml — 存在,N 个模块
321
+ ⚠️ auth-service — needs_review=true,原因:...
322
+ ❌ payment-service — 卡片文件缺失
323
+ ✅ 所有模块人工备注标记配对正常
324
+ \`\`\`
325
+
326
+ ### 注意
327
+ - 如果 _module-map.yaml 不存在,输出"模块索引未生成,建议运行 scan"
328
+ `,
329
+ outputHint: '模块文档健康状态',
330
+ optional: false
331
+ },
332
+ {
333
+ name: '汇总报告',
334
+ prompt: `汇总前四步的所有检查结果,生成最终的自检报告。
335
+
336
+ ### 输出格式
337
+ \`\`\`
338
+ 🔍 SillySpec Doctor — 项目自检报告
339
+
340
+ ## SillySpec 内部
341
+ ✅ .sillyspec/ 目录结构 — 正常
342
+ ✅ projects/*.yaml — N 个项目已注册
343
+ ⚠️ local.yaml (xxx) — 缺少 test 命令
344
+ ❌ sillyspec.db 阶段状态 — brainstorm 标记完成但 design.md 不存在
345
+
346
+ ## 构建环境
347
+ ✅ Node.js v23.4.0 — 可用
348
+ ✅ npm 10.x — 可用
349
+ ✅ Java 17.0.2 — 可用
350
+ ❌ Maven 私服 (10.0.0.1:8081) — 不可达(超时)
351
+
352
+ ## 外部依赖
353
+ ✅ Context7 MCP — 已配置
354
+ ⚠️ grep.app — 不可达
355
+ \`\`\`
356
+
357
+ ### 要求
358
+ - 基于前 3 步的实际输出汇总,不要编造
359
+ - 每类问题归入对应分区
360
+ - 全部通过给出 🎉
361
+ - 如果有 ❌ 或 ⚠️,在末尾逐项给出修复建议
362
+
363
+ ### 修复建议模板
364
+ 根据问题类型给出具体可操作的修复命令:
365
+
366
+ **常见问题及修复:**
367
+ - CLI 未安装 → \`npm install -g sillyspec\`
368
+ - 缺少 local.yaml → \`sillyspec local detect\` 重新生成,或手动创建
369
+ - local.yaml 缺少 test 命令 → 补充对应命令
370
+ - 缺少 scan 文档(ARCHITECTURE.md 等)→ \`sillyspec run scan\` 重新扫描
371
+ - sillyspec.db 状态不一致 → \`sillyspec run <阶段> --reset\` 重置对应阶段
372
+ - 孤儿目录 → 确认后 \`rm -rf .sillyspec/changes/<目录名>\`
373
+ - Maven 私服不可达 → 检查 VPN、settings.xml 配置、私服状态
374
+ - Git remote 不可达 → 检查网络、SSH key 或凭证
375
+ - 工具未安装 → 给出安装命令(如 \`brew install maven\`)
376
+
377
+ 每条建议格式:
378
+ \`\`\`
379
+ 💡 修复:<问题描述>
380
+ <具体命令或操作>
381
+ \`\`\``,
382
+ outputHint: '完整自检报告',
383
+ optional: false
384
+ }
385
+ ]
386
+ }