sillyspec 3.9.1 → 3.10.1

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 (69) hide show
  1. package/.claude/skills/sillyspec-commit/SKILL.md +1 -1
  2. package/.claude/skills/sillyspec-continue/SKILL.md +1 -1
  3. package/.claude/skills/sillyspec-explore/SKILL.md +9 -0
  4. package/.claude/skills/sillyspec-plan/SKILL.md +0 -35
  5. package/.claude/skills/sillyspec-resume/SKILL.md +5 -5
  6. package/.claude/skills/sillyspec-state/SKILL.md +1 -1
  7. package/.claude/skills/sillyspec-workspace/SKILL.md +1 -1
  8. package/README.md +7 -6
  9. package/SKILL.md +15 -10
  10. package/package.json +1 -1
  11. package/packages/dashboard/dist/assets/index-BcM2J-hv.css +1 -0
  12. package/packages/dashboard/dist/assets/{index-RsLVPAy7.js → index-DpLHK4jv.js} +974 -974
  13. package/packages/dashboard/dist/index.html +16 -17
  14. package/packages/dashboard/dist/prototype-dashboard.html +836 -0
  15. package/packages/dashboard/dist/prototype-overview.html +256 -0
  16. package/packages/dashboard/public/prototype-dashboard.html +836 -0
  17. package/packages/dashboard/public/prototype-overview.html +256 -0
  18. package/packages/dashboard/server/index.js +18 -13
  19. package/packages/dashboard/server/parser.js +109 -1
  20. package/packages/dashboard/server/watcher.js +14 -6
  21. package/packages/dashboard/src/App.vue +414 -186
  22. package/packages/dashboard/src/components/ActionBar.vue +10 -1
  23. package/packages/dashboard/src/components/CommandPalette.vue +5 -1
  24. package/packages/dashboard/src/components/DocPreview.vue +105 -8
  25. package/packages/dashboard/src/components/DocTree.vue +75 -19
  26. package/packages/dashboard/src/components/HResizeHandle.vue +48 -0
  27. package/packages/dashboard/src/components/PipelineView.vue +23 -4
  28. package/packages/dashboard/src/components/ProjectCard.vue +187 -0
  29. package/packages/dashboard/src/components/ProjectOverview.vue +113 -139
  30. package/packages/dashboard/src/components/VResizeHandle.vue +61 -0
  31. package/packages/dashboard/src/composables/useDashboard.js +28 -0
  32. package/packages/dashboard/src/composables/useLayout.js +131 -0
  33. package/src/index.js +7 -0
  34. package/src/init.js +17 -10
  35. package/src/migrate.js +5 -5
  36. package/src/progress.js +2 -1
  37. package/src/run.js +141 -64
  38. package/src/stages/archive.js +14 -8
  39. package/src/stages/brainstorm.js +29 -4
  40. package/src/stages/execute.js +115 -35
  41. package/src/stages/explore.js +34 -0
  42. package/src/stages/index.js +11 -6
  43. package/src/stages/plan.js +86 -15
  44. package/src/stages/quick.js +1 -1
  45. package/src/stages/scan.js +51 -12
  46. package/src/stages/status.js +1 -1
  47. package/src/stages/verify.js +35 -6
  48. package/.sillyspec/changes/archive/2026-04-08-derive-state/design.md +0 -97
  49. package/.sillyspec/changes/archive/2026-04-08-derive-state/plan.md +0 -51
  50. package/.sillyspec/changes/archive/2026-04-08-derive-state/proposal.md +0 -29
  51. package/.sillyspec/changes/archive/2026-04-08-derive-state/requirements.md +0 -34
  52. package/.sillyspec/changes/archive/2026-04-08-derive-state/tasks.md +0 -13
  53. package/.sillyspec/changes/archive/2026-04-08-derive-state/verify-result.md +0 -43
  54. package/.sillyspec/changes/auto-mode/design.md +0 -50
  55. package/.sillyspec/changes/auto-mode/proposal.md +0 -19
  56. package/.sillyspec/changes/auto-mode/requirements.md +0 -21
  57. package/.sillyspec/changes/auto-mode/tasks.md +0 -7
  58. package/.sillyspec/changes/brainstorm-archive/2026-04-05-dashboard-design.md +0 -206
  59. package/.sillyspec/changes/brainstorm-archive/2026-04-05-unified-docs-design.md +0 -199
  60. package/.sillyspec/changes/dashboard/design.md +0 -219
  61. package/.sillyspec/changes/dashboard/design.md.braindraft +0 -206
  62. package/.sillyspec/changes/run-command-design/design.md +0 -1230
  63. package/.sillyspec/changes/unified-docs-design/design.md +0 -199
  64. package/.sillyspec/docs/sillyspec/scan/.gitkeep +0 -0
  65. package/.sillyspec/knowledge/INDEX.md +0 -8
  66. package/.sillyspec/knowledge/uncategorized.md +0 -3
  67. package/.sillyspec/plans/2026-04-05-dashboard.md +0 -737
  68. package/.sillyspec/projects/sillyspec.yaml +0 -3
  69. package/packages/dashboard/dist/assets/index-CntACGUN.css +0 -1
@@ -140,7 +140,6 @@ export const fixedSuffix = [
140
140
 
141
141
  ### 操作
142
142
  1. 确认 plan.md 和所有 tasks/task-NN.md 已存在
143
- 2. \`git add .sillyspec/\` — **不要 commit**
144
143
 
145
144
  ### 输出
146
145
  文件列表 + 下一步命令`,
@@ -218,6 +217,88 @@ ${taskName}
218
217
  任务蓝图内容摘要`
219
218
  }
220
219
 
220
+ /**
221
+ * 构建任务蓝图协调器步骤(单步,子代理并行写蓝图)
222
+ */
223
+ export function buildCoordinatorStep(changeDir, taskNames) {
224
+ const taskList = taskNames.map((name, i) => {
225
+ const num = String(i + 1).padStart(2, '0')
226
+ return `- task-${num}: ${name}`
227
+ }).join('\n')
228
+
229
+ const subagentPrompts = taskNames.map((name, i) => {
230
+ const num = String(i + 1).padStart(2, '0')
231
+ return `\`\`\`
232
+ 任务编号:task-${num}
233
+ 任务名称:${name}
234
+ 文件路径:${changeDir}/tasks/task-${num}.md
235
+
236
+ 操作:
237
+ 1. 读取 ${changeDir}/design.md 和 ${changeDir}/plan.md 了解上下文
238
+ 2. 读取相关源文件了解现有代码
239
+ 3. 按以下格式编写任务蓝图并保存到 ${changeDir}/tasks/task-${num}.md:
240
+
241
+ # task-${num}: ${name}
242
+
243
+ ## 修改文件
244
+ - 文件路径列表
245
+
246
+ ## 实现要求
247
+ 1. 具体做什么
248
+
249
+ ## 接口定义
250
+ (代码类任务必填)
251
+
252
+ ## 边界处理
253
+ - 异常场景
254
+
255
+ ## 参考
256
+ - 可参考的模式
257
+
258
+ ## TDD 步骤
259
+ 1. 写测试 → 2. 确认失败 → 3. 写代码 → 4. 确认通过
260
+
261
+ ## 验收标准
262
+ - [ ] 具体可测试的条件
263
+
264
+ 关键规则:
265
+ - 必须独立完整,execute 子代理只读这一个文件就能干活
266
+ - 不要依赖其他 task-N.md 的内容
267
+ - 接口定义写到"搬砖工照着做"的程度
268
+ - 写完后用 Write tool 保存到文件
269
+ \`\`\``
270
+ }).join('\n\n')
271
+
272
+ return {
273
+ name: '生成任务蓝图(子代理并行)',
274
+ prompt: `为 plan.md 中的每个任务生成独立蓝图文件。
275
+
276
+ ## 任务清单
277
+ ${taskList}
278
+
279
+ ## 执行方式(必须严格遵守)
280
+
281
+ **你必须使用 Agent tool 启动子代理来写每个蓝图,不要自己写。**
282
+
283
+ 1. 确认 \`${changeDir}/tasks/\` 目录存在(不存在则创建)
284
+ 2. 为每个任务启动一个独立子代理(Agent tool),可并行启动多个
285
+ 3. 每个子代理使用对应的 prompt(见下方模板)
286
+ 4. 等待所有子代理完成
287
+ 5. 验证每个 task-N.md 文件已生成且非空
288
+
289
+ ### 子代理 prompt 模板
290
+ 为每个任务使用以下 prompt 启动子代理:
291
+
292
+ ${subagentPrompts}
293
+
294
+ ## 验收
295
+ - 每个 task-N.md 文件存在且非空
296
+ - 包含所有必要章节:修改文件、实现要求、接口定义、边界处理、TDD 步骤、验收标准`,
297
+ outputHint: '蓝图生成结果',
298
+ optional: false
299
+ }
300
+ }
301
+
221
302
  /**
222
303
  * 从 plan.md 解析任务名列表
223
304
  */
@@ -255,8 +336,7 @@ export function buildPlanSteps(changeDir = null, planContent = null) {
255
336
  return [...fixedPrefix, ...fixedSuffix]
256
337
  }
257
338
 
258
- // 动态生成每个任务的蓝图写作步骤
259
- // 尝试从 plan.md 解析任务名
339
+ // 解析任务名
260
340
  let taskNames = []
261
341
  if (planContent) {
262
342
  taskNames = parseTaskNames(planContent)
@@ -267,16 +347,7 @@ export function buildPlanSteps(changeDir = null, planContent = null) {
267
347
  }
268
348
  }
269
349
 
270
- const taskSteps = []
271
- for (let i = 1; i <= taskCount; i++) {
272
- const taskName = taskNames[i - 1] || '(从 plan.md 读取任务名)'
273
- taskSteps.push({
274
- name: `写任务蓝图 task-${String(i).padStart(2, '0')}`,
275
- prompt: `### 注意\n这是第 ${i}/${taskCount} 个任务蓝图。focus 在这一个任务上,不要写其他任务的内容。\n\n${buildTaskPrompt(i, taskName, changeDir)}`,
276
- outputHint: `task-${String(i).padStart(2, '0')} 蓝图`,
277
- optional: false
278
- })
279
- }
280
-
281
- return [...fixedPrefix, ...taskSteps, ...fixedSuffix]
350
+ // 生成单个协调器步骤(子代理并行写蓝图)
351
+ const coordinatorStep = buildCoordinatorStep(changeDir, taskNames)
352
+ return [...fixedPrefix, coordinatorStep, ...fixedSuffix]
282
353
  }
@@ -47,7 +47,7 @@ export const definition = {
47
47
  prompt: `Git 暂存并记录任务。
48
48
 
49
49
  ### 操作
50
- 1. \`git add -A\` — **不要 commit**,由用户通过统一提交
50
+ 1. \`git add -A\` — 暂存改动文件(不要 commit,由用户通过统一提交工具处理)
51
51
  2. 记录:
52
52
  - 有 \`--change\`:在 \`.sillyspec/changes/<变更名>/tasks.md\` 追加 task 并勾选,记录精确到秒的时间戳
53
53
  - 无 \`--change\`:记录到 \`.sillyspec/quicklog/QUICKLOG-<git用户名>.md\`(按 git 用户名隔离)
@@ -10,8 +10,8 @@ export const definition = {
10
10
 
11
11
  ### 操作
12
12
  1. \`ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .\` — 检查已有文档
13
- 1. \`ls docs/*/scan/ 2>/dev/null\` — 检查已有文档
14
- 2. \`wc -l docs/*/scan/*.md 2>/dev/null\` — 文档行数
13
+ 1. \`ls .sillyspec/docs/*/scan/ 2>/dev/null\` — 检查已有文档
14
+ 2. \`wc -l .sillyspec/docs/*/scan/*.md 2>/dev/null\` — 文档行数
15
15
  3. 已有 3 份 → 建议升级深度扫描;已有 7 份 → 建议刷新或跳过
16
16
  5. 显示子项目列表供选择扫描范围
17
17
 
@@ -27,7 +27,7 @@ export const definition = {
27
27
  ### 操作
28
28
  1. \`cat package.json pom.xml build.gradle go.mod Cargo.toml requirements.txt pyproject.toml Gemfile composer.json 2>/dev/null\`
29
29
  2. \`find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null\`
30
- 3. 结果保存到 \`docs/<project>/scan/_env-detect.md\`(临时文件,扫描完删除)
30
+ 3. 结果保存到 \`.sillyspec/docs/<project>/scan/_env-detect.md\`(临时文件,扫描完删除)
31
31
 
32
32
  ### 输出
33
33
  环境探测结果摘要`,
@@ -56,7 +56,7 @@ export const definition = {
56
56
  ### 操作
57
57
  1. 用 grep/rg 搜索(\`@Entity\`、\`schema.prisma\`、\`models.py\` 等),**禁止读源码全文**
58
58
  2. Schema 只记表名+说明+字段数
59
- 3. 写入 \`docs/<project>/scan/ARCHITECTURE.md\`
59
+ 3. 写入 \`.sillyspec/docs/<project>/scan/ARCHITECTURE.md\`
60
60
  4. 包含 \`## 技术栈\` \`## 架构概览\` \`## 数据模型(摘要)\`
61
61
 
62
62
  ### 输出
@@ -75,7 +75,7 @@ ARCHITECTURE.md 路径
75
75
  1. 用 grep 搜索拦截器/插件/逻辑删除/基类/审计字段,**禁止读源码全文**
76
76
  2. 根据检测到的语言/框架自行决定搜索什么模式
77
77
  3. 提取 3-5 个典型示例
78
- 4. 写入 \`docs/<project>/scan/CONVENTIONS.md\`
78
+ 4. 写入 \`.sillyspec/docs/<project>/scan/CONVENTIONS.md\`
79
79
  5. 包含 \`## 框架隐形规则\` \`## 实体继承规范\` \`## 代码风格\`
80
80
 
81
81
  ### 输出
@@ -93,8 +93,8 @@ CONVENTIONS.md 路径
93
93
  ### 操作
94
94
  1. 用 find/ls/tree 和 grep,**禁止读源码全文**
95
95
  2. 搜索 API 调用、MQ 配置、缓存、第三方 SDK
96
- 3. 写入 \`docs/<project>/scan/STRUCTURE.md\`(目录树+模块说明)
97
- 4. 写入 \`docs/<project>/scan/INTEGRATIONS.md\`(按类型分组)
96
+ 3. 写入 \`.sillyspec/docs/<project>/scan/STRUCTURE.md\`(目录树+模块说明)
97
+ 4. 写入 \`.sillyspec/docs/<project>/scan/INTEGRATIONS.md\`(按类型分组)
98
98
 
99
99
  ### 输出
100
100
  STRUCTURE.md 和 INTEGRATIONS.md 路径
@@ -110,15 +110,54 @@ STRUCTURE.md 和 INTEGRATIONS.md 路径
110
110
 
111
111
  ### 操作
112
112
  1. 用 grep 搜索测试文件、TODO/FIXME、过时依赖,**禁止读源码全文**
113
- 2. 写入 \`docs/<project>/scan/TESTING.md\`(测试结构)
114
- 3. 写入 \`docs/<project>/scan/CONCERNS.md\`(按严重程度分组)
115
- 4. 写入 \`docs/<project>/scan/PROJECT.md\`(项目信息)
113
+ 2. 写入 \`.sillyspec/docs/<project>/scan/TESTING.md\`(测试结构)
114
+ 3. 写入 \`.sillyspec/docs/<project>/scan/CONCERNS.md\`(按严重程度分组)
115
+ 4. 写入 \`.sillyspec/docs/<project>/scan/PROJECT.md\`(项目信息)
116
116
 
117
117
  ### 输出
118
118
  TESTING.md、CONCERNS.md、PROJECT.md 路径`,
119
119
  outputHint: '三份文档路径',
120
120
  optional: false
121
121
  },
122
+ {
123
+ name: '生成本地配置',
124
+ prompt: `自动生成 .sillyspec/.runtime/local.yaml 本地配置文件。
125
+
126
+ ### 操作
127
+ 1. 检查 .sillyspec/.runtime/local.yaml 是否已存在,已存在则跳过(提示"local.yaml 已存在,跳过生成")
128
+ 2. 根据项目类型生成默认配置:
129
+ - **Node.js**(有 package.json):build: "npm run build", test: "npm test", lint: "npm run lint", type: nodejs
130
+ - **Maven**(有 pom.xml):build: "mvn compile", test: "mvn test", lint: "mvn checkstyle:check", type: maven
131
+ - **Gradle**(有 build.gradle):build: "./gradlew build", test: "./gradlew test", type: gradle
132
+ - **通用项目**:只写注释模板, type: generic
133
+ 3. 确保目录存在:mkdir -p .sillyspec/.runtime
134
+ 4. 原子写入(先写 tmp 文件再 rename)
135
+
136
+ ### 文件格式
137
+ \`\`\`yaml
138
+ # SillySpec 本地配置(自动生成,可手动修改)
139
+ project:
140
+ type: nodejs # nodejs/maven/gradle/generic
141
+
142
+ commands:
143
+ build: "npm run build"
144
+ test: "npm test"
145
+ lint: "npm run lint"
146
+
147
+ # 测试策略:full=全量测试, module=只测变更模块, skip=跳过测试
148
+ test_strategy: module
149
+
150
+ # 模块测试路径映射(可选)
151
+ # module_paths:
152
+ # user-service: "user/"
153
+ # order-service: "order/"
154
+ \`\`\`
155
+
156
+ ### 输出
157
+ local.yaml 生成结果(已存在/已生成)`,
158
+ outputHint: 'local.yaml 生成状态',
159
+ optional: false
160
+ },
122
161
  {
123
162
  name: '自检和提交',
124
163
  prompt: `验证扫描完整性,清理并提交。
@@ -126,8 +165,8 @@ TESTING.md、CONCERNS.md、PROJECT.md 路径`,
126
165
  ### 操作
127
166
  1. 检查 7 份文档是否全部生成
128
167
  2. 自检门控:ARCHITECTURE(技术栈+Schema摘要)、CONVENTIONS(隐形规则+代码风格)、STRUCTURE(目录结构)、INTEGRATIONS(外部依赖)、TESTING(测试现状)、CONCERNS(技术债务)、PROJECT(项目概览)
129
- 3. 清理:\`rm -f docs/<project>/scan/_env-detect.md\`
130
- 4. \`git add .\`**不要 commit**,由用户通过统一提交工具处理
168
+ 3. 清理:\`rm -f .sillyspec/docs/<project>/scan/_env-detect.md\`
169
+ 4. \`git add .sillyspec/\`暂存扫描结果(不要 commit,由用户通过统一提交工具处理)
131
170
 
132
171
  ### 输出
133
172
  扫描完整性报告
@@ -11,7 +11,7 @@ export const definition = {
11
11
  ### 操作
12
12
  1. \`cat .sillyspec/PROJECT.md 2>/dev/null || echo "未初始化"\`
13
13
  2. 获取 project 名
14
- 3. \`ls docs/<project>/scan/ 2>/dev/null | head -10\`
14
+ 3. \`ls .sillyspec/docs/<project>/scan/ 2>/dev/null | head -10\`
15
15
  4. \`cat .sillyspec/REQUIREMENTS.md 2>/dev/null | head -20\`
16
16
  5. \`cat .sillyspec/ROADMAP.md 2>/dev/null\`
17
17
 
@@ -58,9 +58,38 @@ export const definition = {
58
58
  },
59
59
  {
60
60
  name: '对照设计检查',
61
- prompt: `对照 design.md 检查实现一致性。**design.md 是唯一 truth source,不符合 design.md 的实现 = Bug。**
62
-
63
- ### 操作
61
+ prompt: `先运行自动探针,再对照 design.md 检查实现一致性。**design.md 是唯一 truth source,不符合 design.md 的实现 = Bug。**
62
+
63
+ ### 自动探针(必须先执行)
64
+ 在检查前,依次运行以下三个探针,将结果作为验证输入:
65
+
66
+ **探针 1:未实现标记扫描**
67
+ 在项目源码目录中搜索未实现标记:
68
+ \`\`\`bash
69
+ grep -rn "尚未实现\|TODO\|FIXME\|HACK\|XXX" <源码目录>/ --include="*.java" --include="*.js" --include="*.ts" --include="*.jsx" --include="*.tsx" --include="*.py"
70
+ \`\`\`
71
+ 记录每个匹配的文件、行号和内容。
72
+
73
+ **探针 2:设计关键词覆盖探针**
74
+ 1. 读取 design.md,从中提取所有能力关键词(如"登录"、"导出"、"批量"、"删除"、"搜索"等动作词)
75
+ 2. 对每个关键词,在源码目录中 grep 确认是否有对应的实现代码:
76
+ \`\`\`bash
77
+ grep -rl "<关键词>" <源码目录>/ --include="*.java" --include="*.js" --include="*.ts" --include="*.jsx" --include="*.tsx" --include="*.py"
78
+ \`\`\`
79
+ 3. 如果某个关键词在源码中完全没有匹配,标记为 ⚠️ 可能未实现
80
+
81
+ **探针 3:验收标准测试覆盖探针**
82
+ 1. 读取变更目录下的 tasks.md,提取所有 checkbox 任务
83
+ 2. 对每个 task,检查对应模块目录下是否存在测试文件(*test*、*spec*、*Test*、*Spec*)
84
+ 3. 没有测试文件的 task 标记为 ⚠️ 缺少测试
85
+
86
+ ### 探针结果处理
87
+ - 将三个探针的结果汇总为「探针报告」
88
+ - 如果探针发现问题(未实现标记、关键词缺失、测试缺失),在最终验证报告中明确标注
89
+ - 探针发现的问题不等同于验证失败,但必须在报告中列出
90
+
91
+ ### 设计一致性检查
92
+ 基于探针结果,继续检查:
64
93
  1. 架构决策是否遵循
65
94
  2. 文件变更清单是否一致
66
95
  3. 数据模型是否符合
@@ -68,7 +97,7 @@ export const definition = {
68
97
  5. **Reverse Sync 检查**:如果发现实现合理但 design.md 未覆盖,先更新 design.md 补充遗漏
69
98
 
70
99
  ### 输出
71
- 一致性检查结果`,
100
+ 探针报告 + 设计一致性检查结果`,
72
101
  outputHint: '设计一致性报告',
73
102
  optional: false
74
103
  },
@@ -126,8 +155,8 @@ export const definition = {
126
155
  验证报告 markdown + 下一步命令
127
156
 
128
157
  ### 注意
129
- - PASS → 下一步 archive
130
- - FAIL → 修复后重新 verify`,
158
+ - PASS → 运行 \`sillyspec run archive\` 归档
159
+ - FAIL → 修复后运行 \`sillyspec run verify\` 重新验证`,
131
160
  outputHint: '验证报告',
132
161
  optional: false
133
162
  }
@@ -1,97 +0,0 @@
1
- # deriveState 状态推导
2
-
3
- author: qinyi
4
- created_at: 2026-04-08 07:10:00
5
-
6
- ## 背景
7
-
8
- 当前 sillyspec 的状态管理依赖 `progress.json` 作为唯一数据源。如果 AI 崩溃或异常中断,progress.json 可能与实际产出不一致(如 artifacts 文件已生成但步骤未标记完成)。
9
-
10
- 借鉴 GSD v2 的 deriveState 架构,从文件系统反推状态,与 progress.json 交叉校验。
11
-
12
- ## 需求
13
-
14
- 1. `--done` 完成步骤时轻量校验当前步骤
15
- 2. `doctor` 自检时全量扫描所有阶段
16
- 3. `progress validate --deep` 支持手动触发全量校验
17
- 4. 安全修复策略:明显正确的情况自动修复,有歧义的不动
18
-
19
- ## 设计
20
-
21
- ### 新增文件:`src/derive.js`
22
-
23
- 纯函数模块,零外部依赖(仅 fs/path)。
24
-
25
- ```js
26
- export function deriveState(cwd, options = {}) {
27
- // options.mode: 'light' | 'full'(默认 light)
28
- // options.fix: boolean(默认 false,只报告不修复)
29
- // 返回 { issues: [{type, severity, step, artifact, suggestion}], fixed: number }
30
- }
31
- ```
32
-
33
- #### 扫描逻辑
34
-
35
- 1. 读取 progress.json,获取所有阶段步骤状态
36
- 2. 扫描 `.sillyspec/.runtime/artifacts/` 目录
37
- 3. 文件名格式:`{stage}-step{N}-{timestamp}.txt`
38
- 4. 解析文件名提取 stage、stepIndex 信息
39
- 5. 对比规则:
40
-
41
- | 情况 | 严重度 | 自动修复 |
42
- |------|--------|----------|
43
- | artifacts 有文件但 progress 标记未完成 | issue | ✅ 标记为 done |
44
- | progress 标记已完成但 artifacts 无文件 | warning | ❌ 可能被手动清理 |
45
- | artifacts 有 step5 但 progress 只到 step3 | issue | ✅ 补齐中间步骤 |
46
-
47
- #### 模式
48
-
49
- - **light**:只检查 currentStage 的当前步骤和前一步
50
- - **full**:检查所有阶段所有步骤
51
-
52
- ### 集成方式
53
-
54
- #### 1. run.js — `--done` 轻量校验
55
-
56
- 在 `completeStep` 末尾:
57
- ```js
58
- import { deriveState } from './derive.js';
59
- const result = deriveState(cwd, { mode: 'light', fix: true });
60
- if (result.fixed > 0) {
61
- console.log(`⚠️ 状态修复:${result.fixed} 个步骤已从 artifacts 恢复`);
62
- }
63
- ```
64
-
65
- #### 2. doctor.js — 全量扫描
66
-
67
- 第一步(SillySpec 内部检查)调用:
68
- ```js
69
- const result = deriveState(cwd, { mode: 'full', fix: false });
70
- // 将 issues 加入自检报告
71
- ```
72
-
73
- #### 3. progress.js — `validate --deep`
74
-
75
- validate 方法支持 deep 参数:
76
- ```js
77
- validate(cwd, deep = false) {
78
- // ...现有校验逻辑...
79
- if (deep) {
80
- const result = deriveState(cwd, { mode: 'full', fix: true });
81
- // 输出校验结果
82
- }
83
- }
84
- ```
85
-
86
- CLI:`sillyspec progress validate --deep`
87
-
88
- ## 改动范围
89
-
90
- - 新增:`src/derive.js`(~80 行)
91
- - 修改:`src/run.js`(2 行)、`src/stages/doctor.js`(3 行)、`src/progress.js`(5 行)、`src/index.js`(parse --deep)
92
-
93
- ## 不做的事
94
-
95
- - 不引入 SQLite 或其他新依赖
96
- - 不改变 progress.json 的数据结构
97
- - 不自动删除 progress 中有但 artifacts 无的步骤(可能被手动清理)
@@ -1,51 +0,0 @@
1
- # deriveState 状态推导 — 实现计划
2
-
3
- author: qinyi
4
- created_at: 2026-04-08 07:12:00
5
-
6
- ## Wave 1(核心,无依赖)
7
-
8
- - [ ] 实现 derive.js 核心函数
9
- - 新增: `src/derive.js`
10
- - 步骤:
11
- 1. 实现 `deriveState(cwd, options)` 纯函数
12
- 2. 实现 artifacts 文件名解析(`{stage}-step{N}-{timestamp}.txt`)
13
- 3. 实现 light/full 模式扫描逻辑
14
- 4. 实现安全修复策略(issues 分类 + fix 逻辑)
15
- 5. 验证: 在 sillyspec 项目上手动创建测试 artifacts,运行 `node -e "import('./src/derive.js').then(m => console.log(m.deriveState(process.cwd(), {mode:'full'})))"` 确认输出
16
-
17
- ## Wave 2(集成,依赖 Wave 1)
18
-
19
- - [ ] 集成 run.js --done 轻量校验
20
- - 修改: `src/run.js`
21
- - 参考: `completeStep` 函数末尾
22
- - 步骤:
23
- 1. 在 completeStep 末尾 import 并调用 deriveState(cwd, {mode:'light', fix:true})
24
- 2. 有修复时输出警告信息
25
- 3. 验证: 运行 brainstorm 完成 --done,确认无报错
26
-
27
- - [ ] 扩展 validate 支持 --deep
28
- - 修改: `src/progress.js`
29
- - 参考: `validate()` 方法
30
- - 步骤:
31
- 1. validate 方法加 deep 参数
32
- 2. deep=true 时调用 deriveState(cwd, {mode:'full', fix:true})
33
- 3. 验证: `sillyspec progress validate --deep` 确认输出校验结果
34
-
35
- - [ ] CLI parse --deep 参数
36
- - 修改: `src/index.js`
37
- - 参考: progress 子命令的参数解析
38
- - 步骤:
39
- 1. 在 progress validate 命令中解析 --deep flag
40
- 2. 传递给 validate 方法
41
- 3. 验证: `sillyspec progress validate --deep` 确认 flag 生效
42
-
43
- ## Wave 3(集成,依赖 Wave 1)
44
-
45
- - [ ] 集成 doctor.js 全量扫描
46
- - 修改: `src/stages/doctor.js`
47
- - 参考: doctor 第一步(SillySpec 内部检查)的 prompt
48
- - 步骤:
49
- 1. 在第一步 prompt 中加入 deriveState 全量扫描指令
50
- 2. 将 issues 列表纳入自检报告
51
- 3. 验证: `sillyspec run doctor` 确认第一步输出包含状态一致性检查
@@ -1,29 +0,0 @@
1
- # deriveState 状态推导 — 提案
2
-
3
- author: qinyi
4
- created_at: 2026-04-08 07:11:00
5
-
6
- ## 动机
7
-
8
- 当前 progress.json 是 sillyspec 唯一的状态数据源。AI 崩溃或异常中断时,progress.json 可能与实际产出不一致(artifacts 已生成但步骤未标记完成)。需要从文件系统反推状态,交叉校验。
9
-
10
- ## 变更范围
11
-
12
- - 新增 `src/derive.js`(状态推导纯函数)
13
- - 修改 `src/run.js`(--done 轻量校验)
14
- - 修改 `src/stages/doctor.js`(全量扫描)
15
- - 修改 `src/progress.js`(validate --deep)
16
- - 修改 `src/index.js`(parse --deep 参数)
17
-
18
- ## 不在范围内
19
-
20
- - 不改 progress.json 数据结构
21
- - 不引入新依赖
22
- - 不自动删除 progress 中有但 artifacts 无的步骤
23
-
24
- ## 成功标准
25
-
26
- 1. `--done` 完成步骤时自动校验并修复当前步骤
27
- 2. `doctor` 输出全量状态一致性报告
28
- 3. `sillyspec progress validate --deep` 可手动触发全量校验
29
- 4. 所有校验通过现有测试
@@ -1,34 +0,0 @@
1
- # deriveState 状态推导 — 需求
2
-
3
- author: qinyi
4
- created_at: 2026-04-08 07:11:00
5
-
6
- ## 功能需求
7
-
8
- ### FR1: deriveState 核心函数
9
- - 从 artifacts 目录扫描文件,解析 `{stage}-step{N}-{timestamp}.txt` 格式
10
- - 与 progress.json 步骤状态对比
11
- - 返回 issues 列表和修复计数
12
-
13
- ### FR2: 轻量模式(light)
14
- - 只检查 currentStage 的当前步骤和前一步
15
- - 用于 `--done` 完成时
16
-
17
- ### FR3: 全量模式(full)
18
- - 检查所有阶段所有步骤
19
- - 用于 doctor 和 validate --deep
20
-
21
- ### FR4: 安全修复策略
22
- - artifacts 有但 progress 漏记 → 自动修复为 done
23
- - artifacts 有 step5 但 progress 只到 step3 → 自动补齐
24
- - progress 有但 artifacts 无 → 只警告,不修复
25
-
26
- ### FR5: CLI 集成
27
- - `--done` 时静默调用轻量校验,有修复才输出
28
- - `doctor` 第一步输出全量报告
29
- - `sillyspec progress validate --deep` 手动触发
30
-
31
- ## 非功能需求
32
- - 零外部依赖(仅 fs/path)
33
- - 纯函数,易于测试
34
- - 不改变现有 API 行为
@@ -1,13 +0,0 @@
1
- # deriveState 状态推导 — 任务
2
-
3
- author: qinyi
4
- created_at: 2026-04-08 07:11:00
5
-
6
- ## 任务列表
7
-
8
- - [x] 实现 derive.js 核心函数 — `src/derive.js`
9
- - [x] 集成 run.js --done 轻量校验 — `src/run.js`
10
- - [x] 集成 doctor.js 全量扫描 — `src/stages/doctor.js`
11
- - [x] 扩展 validate 支持 --deep — `src/progress.js`
12
- - [x] CLI parse --deep 参数 — `src/index.js`
13
- - [ ] 测试验证
@@ -1,43 +0,0 @@
1
- # derive-state 验证报告
2
-
3
- author: qinyi
4
- created_at: 2026-04-08 07:21:00
5
-
6
- ## 结论:✅ PASS
7
-
8
- ## 检查结果
9
-
10
- ### 1. 规范文件加载
11
- - ✅ design.md
12
- - ✅ proposal.md
13
- - ✅ requirements.md
14
- - ✅ tasks.md
15
- - ✅ plan.md
16
-
17
- ### 2. 任务完成度:5/6 (83%)
18
- - ✅ 实现 derive.js 核心函数
19
- - ✅ 集成 run.js --done 轻量校验
20
- - ✅ 集成 doctor.js 全量扫描
21
- - ✅ 扩展 validate 支持 --deep
22
- - ✅ CLI parse --deep 参数
23
- - ⬜ 测试验证(本项目无自动化测试套件,通过手动验证替代)
24
-
25
- ### 3. 设计一致性
26
- - ✅ derive.js 纯函数模块,零外部依赖(仅 fs/path)
27
- - ✅ light/full 模式
28
- - ✅ fix 参数 + 安全修复策略
29
- - ✅ run.js --done 轻量校验集成
30
- - ✅ doctor.js 全量扫描集成
31
- - ✅ progress.js validate --deep 支持
32
- - ✅ index.js CLI --deep 参数
33
- - ✅ 改动文件范围与 design.md 一致
34
-
35
- ### 4. 测试和质量
36
- - ✅ derive.js 模块导入正常
37
- - ✅ sillyspec progress validate --deep 通过
38
- - ✅ 无 TODO/FIXME/HACK/XXX 技术债务
39
- - ✅ sillyspec run quick --status 正常
40
- - ✅ sillyspec run doctor --status 正常
41
-
42
- ## 下一步
43
- sillyspec run archive
@@ -1,50 +0,0 @@
1
- # auto mode — 设计文档
2
-
3
- author: qinyi
4
- created_at: 2026-04-08 07:28:00
5
-
6
- ## 背景
7
-
8
- 当前 sillyspec 的每个阶段(brainstorm → plan → execute → verify)需要用户手动执行 `sillyspec run <stage>` 和 `sillyspec run <stage> --done`。用户希望一个自动模式,从 brainstorm 一路推进到 verify 完成。
9
-
10
- ## 需求
11
-
12
- 1. 用户启动一次,AI 自动循环所有阶段和步骤
13
- 2. 步骤内部的用户确认点保留不变
14
- 3. 不修改 CLI 代码,纯 skill 文件实现
15
-
16
- ## 设计
17
-
18
- ### 新增文件:`.claude/skills/sillyspec-auto/SKILL.md`
19
-
20
- **核心逻辑:**
21
-
22
- 1. 读 `$ARGUMENTS` 作为用户需求
23
- 2. 阶段循环(brainstorm → plan → execute → verify)
24
- 3. 每个阶段内步骤循环:
25
- - `sillyspec run <stage> --input "需求"` → 读 step prompt
26
- - 执行 prompt 中的操作
27
- - 需要用户确认的步骤 → 暂停等回复
28
- - 完成后自动 `sillyspec run <stage> --done --output "摘要"`
29
- - 读下一步 prompt,继续
30
- 4. 当前阶段全部完成 → 自动进入下一阶段
31
- 5. verify 完成 → 输出总结,停止
32
- 6. 命令失败 → 暂停,等用户介入
33
-
34
- **确认点保留规则:**
35
- - prompt 中有"请用户选择""等待用户回答""展示给用户"等字样 → 暂停
36
- - prompt 中有"自审""检查"等纯内部操作 → 自动完成
37
-
38
- ### 同步到 npm 包
39
-
40
- init.js 已有逻辑复制 `sillyspec-*` skills 到项目 `.claude/skills/`,新 skill 自动生效。
41
-
42
- ## 改动范围
43
-
44
- - 新增:`.claude/skills/sillyspec-auto/SKILL.md`(~60 行)
45
-
46
- ## 不做的事
47
-
48
- - 不修改任何 JS 源码
49
- - 不改变现有阶段流程
50
- - 不自动 commit 或发布
@@ -1,19 +0,0 @@
1
- # auto mode — 提案
2
-
3
- author: qinyi
4
- created_at: 2026-04-08 07:29:00
5
-
6
- ## 动机
7
- 用户希望一次启动就自动完成 brainstorm → plan → execute → verify 全流程,不需要手动输入 `sillyspec run <stage>` 和 `--done`。
8
-
9
- ## 变更范围
10
- 新增 `.claude/skills/sillyspec-auto/SKILL.md`
11
-
12
- ## 不在范围内
13
- - 不修改 JS 源码
14
- - 不改变阶段流程
15
-
16
- ## 成功标准
17
- 1. `/sillyspec:auto "需求"` 能自动推进全流程
18
- 2. 步骤内部确认点正常暂停
19
- 3. 异常时暂停等用户介入