sillyspec 3.9.0 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +17 -0
  2. package/.claude/skills/sillyspec-auto/SKILL.md +78 -0
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +17 -0
  4. package/{templates/commit.md → .claude/skills/sillyspec-commit/SKILL.md} +32 -47
  5. package/.claude/skills/sillyspec-continue/SKILL.md +45 -0
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +27 -0
  7. package/.claude/skills/sillyspec-execute/SKILL.md +17 -0
  8. package/.claude/skills/sillyspec-explore/SKILL.md +105 -0
  9. package/.claude/skills/sillyspec-export/SKILL.md +53 -0
  10. package/.claude/skills/sillyspec-init/SKILL.md +170 -0
  11. package/.claude/skills/sillyspec-plan/SKILL.md +17 -0
  12. package/.claude/skills/sillyspec-propose/SKILL.md +17 -0
  13. package/.claude/skills/sillyspec-quick/SKILL.md +17 -0
  14. package/.claude/skills/sillyspec-resume/SKILL.md +111 -0
  15. package/.claude/skills/sillyspec-scan/SKILL.md +17 -0
  16. package/.claude/skills/sillyspec-state/SKILL.md +54 -0
  17. package/.claude/skills/sillyspec-status/SKILL.md +17 -0
  18. package/.claude/skills/sillyspec-verify/SKILL.md +17 -0
  19. package/.claude/skills/sillyspec-workspace/SKILL.md +149 -0
  20. package/README.md +19 -11
  21. package/SKILL.md +15 -10
  22. package/package.json +7 -9
  23. package/packages/dashboard/dist/assets/index-BcM2J-hv.css +1 -0
  24. package/packages/dashboard/dist/assets/index-DpLHK4jv.js +7446 -0
  25. package/packages/dashboard/dist/index.html +16 -16
  26. package/packages/dashboard/dist/prototype-dashboard.html +836 -0
  27. package/packages/dashboard/dist/prototype-overview.html +256 -0
  28. package/packages/dashboard/package-lock.json +226 -6
  29. package/packages/dashboard/package.json +8 -5
  30. package/packages/dashboard/public/logo.jpg +0 -0
  31. package/packages/dashboard/public/prototype-dashboard.html +836 -0
  32. package/packages/dashboard/public/prototype-overview.html +256 -0
  33. package/packages/dashboard/server/executor.js +1 -1
  34. package/packages/dashboard/server/index.js +341 -113
  35. package/packages/dashboard/server/parser.js +442 -30
  36. package/packages/dashboard/server/watcher.js +214 -134
  37. package/packages/dashboard/src/App.vue +475 -71
  38. package/packages/dashboard/src/components/ActionBar.vue +36 -43
  39. package/packages/dashboard/src/components/CommandPalette.vue +45 -66
  40. package/packages/dashboard/src/components/DetailPanel.vue +68 -53
  41. package/packages/dashboard/src/components/DocPreview.vue +257 -0
  42. package/packages/dashboard/src/components/DocTree.vue +114 -0
  43. package/packages/dashboard/src/components/HResizeHandle.vue +48 -0
  44. package/packages/dashboard/src/components/LogStream.vue +13 -33
  45. package/packages/dashboard/src/components/PipelineStage.vue +8 -8
  46. package/packages/dashboard/src/components/PipelineView.vue +99 -45
  47. package/packages/dashboard/src/components/ProjectCard.vue +187 -0
  48. package/packages/dashboard/src/components/ProjectList.vue +103 -45
  49. package/packages/dashboard/src/components/ProjectOverview.vue +152 -0
  50. package/packages/dashboard/src/components/StageBadge.vue +13 -13
  51. package/packages/dashboard/src/components/StepCard.vue +15 -15
  52. package/packages/dashboard/src/components/VResizeHandle.vue +61 -0
  53. package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -0
  54. package/packages/dashboard/src/components/detail/GitDetail.vue +61 -0
  55. package/packages/dashboard/src/components/detail/TechDetail.vue +43 -0
  56. package/packages/dashboard/src/composables/useDashboard.js +48 -6
  57. package/packages/dashboard/src/composables/useKeyboard.js +6 -4
  58. package/packages/dashboard/src/composables/useLayout.js +131 -0
  59. package/packages/dashboard/src/main.js +4 -1
  60. package/packages/dashboard/src/style.css +17 -17
  61. package/src/index.js +141 -22
  62. package/src/init.js +93 -231
  63. package/src/migrate.js +117 -0
  64. package/src/progress.js +460 -0
  65. package/src/run.js +635 -0
  66. package/src/setup.js +2 -72
  67. package/src/stages/archive.js +54 -0
  68. package/src/stages/brainstorm.js +264 -0
  69. package/src/stages/doctor.js +303 -0
  70. package/src/stages/execute.js +287 -0
  71. package/src/stages/explore.js +34 -0
  72. package/src/stages/index.js +28 -0
  73. package/src/stages/plan.js +354 -0
  74. package/src/stages/propose.js +115 -0
  75. package/src/stages/quick.js +64 -0
  76. package/src/stages/scan.js +141 -0
  77. package/src/stages/status.js +65 -0
  78. package/src/stages/verify.js +135 -0
  79. package/.sillyspec/changes/dashboard/design.md +0 -219
  80. package/.sillyspec/plans/2026-04-05-dashboard.md +0 -737
  81. package/.sillyspec/specs/2026-04-05-dashboard-design.md +0 -206
  82. package/dist/steps/brainstorm/01-load-context.md +0 -30
  83. package/dist/steps/brainstorm/02-reuse-check.md +0 -6
  84. package/dist/steps/brainstorm/03-prototype-analysis.md +0 -11
  85. package/dist/steps/brainstorm/04-module-split.md +0 -23
  86. package/dist/steps/brainstorm/05-dialog-explore.md +0 -8
  87. package/dist/steps/brainstorm/06-propose-approaches.md +0 -3
  88. package/dist/steps/brainstorm/07-present-design.md +0 -3
  89. package/dist/steps/brainstorm/08-write-design.md +0 -21
  90. package/dist/steps/brainstorm/09-self-review.md +0 -15
  91. package/dist/steps/brainstorm/10-user-confirm.md +0 -3
  92. package/dist/steps/brainstorm/11-output-spec.md +0 -7
  93. package/dist/steps/brainstorm/manifest.yaml +0 -26
  94. package/dist/steps/execute/01-load-context.md +0 -41
  95. package/dist/steps/execute/02-scan-conventions.md +0 -47
  96. package/dist/steps/execute/03-skill-mcp.md +0 -19
  97. package/dist/steps/execute/04-assign-task.md +0 -22
  98. package/dist/steps/execute/04b-prompt-template.md +0 -54
  99. package/dist/steps/execute/05-write-test.md +0 -7
  100. package/dist/steps/execute/06-write-code.md +0 -8
  101. package/dist/steps/execute/07-run-test.md +0 -26
  102. package/dist/steps/execute/08-fix-issues.md +0 -28
  103. package/dist/steps/execute/09-next-task.md +0 -33
  104. package/dist/steps/execute/manifest.yaml +0 -28
  105. package/dist/steps/plan/01-load-context.md +0 -22
  106. package/dist/steps/plan/02-anchor-confirm.md +0 -1
  107. package/dist/steps/plan/03-expand-tasks.md +0 -33
  108. package/dist/steps/plan/04-mark-order.md +0 -15
  109. package/dist/steps/plan/05-e2e-planning.md +0 -17
  110. package/dist/steps/plan/06-self-check.md +0 -16
  111. package/dist/steps/plan/07-save.md +0 -1
  112. package/dist/steps/plan/manifest.yaml +0 -18
  113. package/dist/steps/scan/01-env-detect.md +0 -51
  114. package/dist/steps/scan/02-tech-stack.md +0 -16
  115. package/dist/steps/scan/03-conventions.md +0 -16
  116. package/dist/steps/scan/04-structure.md +0 -19
  117. package/dist/steps/scan/05-quality.md +0 -18
  118. package/dist/steps/scan/06-complete.md +0 -49
  119. package/dist/steps/scan/manifest.yaml +0 -16
  120. package/dist/steps/verify/01-load-specs.md +0 -28
  121. package/dist/steps/verify/02-check-tasks.md +0 -1
  122. package/dist/steps/verify/03-check-design.md +0 -6
  123. package/dist/steps/verify/04-run-tests.md +0 -7
  124. package/dist/steps/verify/05-e2e-tests.md +0 -27
  125. package/dist/steps/verify/05b-e2e-fix.md +0 -33
  126. package/dist/steps/verify/06-code-quality.md +0 -25
  127. package/dist/steps/verify/07-lint-check.md +0 -27
  128. package/dist/steps/verify/08-output-report.md +0 -14
  129. package/dist/steps/verify/manifest.yaml +0 -22
  130. package/docs/.vitepress/config.mts +0 -45
  131. package/docs/.vitepress/dist/404.html +0 -25
  132. package/docs/.vitepress/dist/assets/app.YytxICdd.js +0 -1
  133. package/docs/.vitepress/dist/assets/chunks/framework.Czhw_PXq.js +0 -19
  134. package/docs/.vitepress/dist/assets/chunks/theme.DusTRZQk.js +0 -1
  135. package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.js +0 -1
  136. package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.lean.js +0 -1
  137. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  138. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  139. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  140. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  141. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  142. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  143. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  144. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  145. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  146. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  147. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  148. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  149. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  150. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  151. package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.js +0 -15
  152. package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.lean.js +0 -1
  153. package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.js +0 -4
  154. package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.lean.js +0 -1
  155. package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.js +0 -1
  156. package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.lean.js +0 -1
  157. package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.js +0 -4
  158. package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.lean.js +0 -1
  159. package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.js +0 -5
  160. package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.lean.js +0 -1
  161. package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.js +0 -28
  162. package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.lean.js +0 -1
  163. package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.js +0 -30
  164. package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.lean.js +0 -1
  165. package/docs/.vitepress/dist/assets/style.DFTx90Kk.css +0 -1
  166. package/docs/.vitepress/dist/hashmap.json +0 -1
  167. package/docs/.vitepress/dist/index.html +0 -28
  168. package/docs/.vitepress/dist/sillyspec/commands.html +0 -42
  169. package/docs/.vitepress/dist/sillyspec/dashboard.html +0 -31
  170. package/docs/.vitepress/dist/sillyspec/file-io.html +0 -28
  171. package/docs/.vitepress/dist/sillyspec/getting-started.html +0 -31
  172. package/docs/.vitepress/dist/sillyspec/install.html +0 -32
  173. package/docs/.vitepress/dist/sillyspec/lifecycle.html +0 -55
  174. package/docs/.vitepress/dist/sillyspec/structure.html +0 -57
  175. package/docs/.vitepress/dist/vp-icons.css +0 -1
  176. package/docs/index.md +0 -34
  177. package/docs/sillyspec/commands.md +0 -218
  178. package/docs/sillyspec/dashboard.md +0 -51
  179. package/docs/sillyspec/file-io.md +0 -34
  180. package/docs/sillyspec/getting-started.md +0 -61
  181. package/docs/sillyspec/install.md +0 -51
  182. package/docs/sillyspec/lifecycle.md +0 -146
  183. package/docs/sillyspec/structure.md +0 -62
  184. package/packages/dashboard/dist/assets/index-Bh-GPjKY.css +0 -1
  185. package/packages/dashboard/dist/assets/index-CrCn5Gg6.js +0 -17
  186. package/src/step.js +0 -543
  187. package/templates/archive.md +0 -120
  188. package/templates/brainstorm.md +0 -170
  189. package/templates/continue.md +0 -32
  190. package/templates/execute.md +0 -304
  191. package/templates/explore.md +0 -59
  192. package/templates/export.md +0 -21
  193. package/templates/init.md +0 -61
  194. package/templates/plan.md +0 -146
  195. package/templates/quick.md +0 -135
  196. package/templates/scan-quick.md +0 -49
  197. package/templates/scan.md +0 -156
  198. package/templates/skills/playwright-e2e/SKILL.md +0 -340
  199. package/templates/status.md +0 -75
  200. package/templates/verify.md +0 -236
  201. package/templates/workspace-sync.md +0 -99
  202. package/templates/workspace.md +0 -70
  203. /package/{docs/.vitepress/dist/logo.jpg → logo.jpg} +0 -0
  204. /package/{docs/.vitepress → packages/dashboard}/dist/favicon.jpg +0 -0
  205. /package/{docs/public → packages/dashboard/dist}/logo.jpg +0 -0
  206. /package/{docs → packages/dashboard}/public/favicon.jpg +0 -0
@@ -0,0 +1,65 @@
1
+ export const definition = {
2
+ name: 'status',
3
+ title: '状态查看',
4
+ description: '查看项目进度和状态',
5
+ auxiliary: true,
6
+ steps: [
7
+ {
8
+ name: '项目基础信息',
9
+ prompt: `收集项目基础信息。
10
+
11
+ ### 操作
12
+ 1. \`cat .sillyspec/PROJECT.md 2>/dev/null || echo "未初始化"\`
13
+ 2. 获取 project 名
14
+ 3. \`ls .sillyspec/docs/<project>/scan/ 2>/dev/null | head -10\`
15
+ 4. \`cat .sillyspec/REQUIREMENTS.md 2>/dev/null | head -20\`
16
+ 5. \`cat .sillyspec/ROADMAP.md 2>/dev/null\`
17
+
18
+ ### 输出
19
+ 项目基础信息摘要`,
20
+ outputHint: '项目基础信息',
21
+ optional: false
22
+ },
23
+ {
24
+ name: '变更状态',
25
+ prompt: `检查进行中的变更和归档历史。
26
+
27
+ ### 操作
28
+ 1. \`ls .sillyspec/changes/ 2>/dev/null | grep -v archive\`
29
+ 2. 对每个进行中的变更:检查 proposal.md ✅/❌、design.md ✅/❌、requirements.md ✅/❌、tasks.md — X/Y 完成
30
+ 3. \`ls .sillyspec/changes/archive/ 2>/dev/null | wc -l\`
31
+ 4. \`cat .sillyspec/HANDOFF.json 2>/dev/null\`
32
+
33
+ ### 输出
34
+ 变更状态列表`,
35
+ outputHint: '变更状态',
36
+ optional: false
37
+ },
38
+ {
39
+ name: '输出状态报告',
40
+ prompt: `生成完整状态报告。
41
+
42
+ ### 输出格式:
43
+ \`\`\`
44
+ 📊 SillySpec 状态
45
+
46
+ 📋 项目:xxx(已初始化 / 未初始化)
47
+ 📂 代码库:已扫描(7 份文档)/ 未扫描
48
+
49
+ 🔄 进行中:N 个变更
50
+ - [change-1] Phase 3 (Execute) — tasks 5/8
51
+
52
+ ✅ 已归档:N 个变更
53
+ 📝 设计文档:N 份
54
+ 📝 实现计划:N 份
55
+
56
+ 💡 下一步:/sillyspec:continue
57
+ \`\`\`
58
+
59
+ ### 注意
60
+ - 不修改任何文件`,
61
+ outputHint: '状态报告',
62
+ optional: false
63
+ }
64
+ ]
65
+ }
@@ -0,0 +1,135 @@
1
+ export const definition = {
2
+ name: 'verify',
3
+ title: '验证确认',
4
+ description: '对照规范检查 + 测试套件',
5
+ steps: [
6
+ {
7
+ name: '状态检查',
8
+ prompt: `检查当前状态,确认可以执行 verify。
9
+
10
+ ### 操作
11
+ 1. 运行 \`sillyspec progress show\`
12
+ 2. 确认 currentStage 为 "verify"
13
+
14
+ ### 输出
15
+ 当前状态摘要`,
16
+ outputHint: '状态摘要',
17
+ optional: false
18
+ },
19
+ {
20
+ name: '加载规范并锚定',
21
+ prompt: `加载规范文件并确认。
22
+
23
+ ### 操作
24
+ 1. 读取 proposal.md、design.md、tasks.md、requirements.md
25
+ 2. 加载项目信息:\`cat .sillyspec/projects/*.yaml 2>/dev/null\`
26
+ 3. 加载本地配置:\`cat .sillyspec/local.yaml 2>/dev/null\`(构建命令、测试命令、lint 命令等)
27
+ 4. 加载代码规范:\`cat .sillyspec/docs/<project>/scan/CONVENTIONS.md 2>/dev/null\`
28
+ 5. 标注每个文件的存在/不存在状态
29
+
30
+ ### 输出
31
+ 文件加载确认清单`,
32
+ outputHint: '文件确认清单',
33
+ optional: false
34
+ },
35
+ {
36
+ name: '逐项检查任务',
37
+ prompt: `对照 tasks.md 检查每个任务完成状态。
38
+
39
+ ### 操作
40
+ 对每个 checkbox:
41
+ 1. 检查相关文件是否存在
42
+ 2. 检查代码是否实现了描述的功能
43
+ 3. 标记:✅ 已完成 / ❌ 未完成 / ⚠️ 部分完成
44
+
45
+ ### 批量模式验证指引
46
+ 如果 tasks.md 中有批量特征(引擎/模板/配置/批量生成),采用分层验证:
47
+ - **L1 自动化(100%)**:运行验证脚本(如有),检查所有实例的文件存在、格式正确、Schema 校验通过
48
+ - **L2 AI 抽查(5-10 个)**:选择最复杂的 3 个 + 最简单的 2 个 + 有特殊逻辑的,检查业务逻辑正确性
49
+ - **L3 模式性 bug 检测**:L2 发现 bug → 判断是否为系统性问题 → 系统性 bug 则回退修复引擎并重新生成所有实例
50
+
51
+ ### 输出
52
+ 任务完成度列表 + 完成率
53
+
54
+ ### 注意
55
+ - 不修改任何代码,只做检查和报告`,
56
+ outputHint: '任务完成度报告',
57
+ optional: false
58
+ },
59
+ {
60
+ name: '对照设计检查',
61
+ prompt: `对照 design.md 检查实现一致性。**design.md 是唯一 truth source,不符合 design.md 的实现 = Bug。**
62
+
63
+ ### 操作
64
+ 1. 架构决策是否遵循
65
+ 2. 文件变更清单是否一致
66
+ 3. 数据模型是否符合
67
+ 4. API 设计是否符合
68
+ 5. **Reverse Sync 检查**:如果发现实现合理但 design.md 未覆盖,先更新 design.md 补充遗漏
69
+
70
+ ### 输出
71
+ 一致性检查结果`,
72
+ outputHint: '设计一致性报告',
73
+ optional: false
74
+ },
75
+ {
76
+ name: '任务蓝图验收',
77
+ prompt: `检查每个 task-N.md 的验收标准是否全部满足。
78
+
79
+ ### 操作
80
+ 1. 检查变更目录下 tasks/ 是否存在
81
+ 2. 如果存在:
82
+ - 逐个读取 tasks/task-NN.md
83
+ - 检查每个文件的「验收标准」checkbox 是否全部勾选
84
+ - 未勾选的项列为不通过
85
+ 3. 如果不存在:跳过此步骤
86
+
87
+ ### 输出
88
+ 验收结果:通过/不通过 + 未通过的项`,
89
+ outputHint: '验收结果',
90
+ optional: false
91
+ },
92
+ {
93
+ name: '运行测试和质量扫描',
94
+ prompt: `运行测试和代码质量扫描。
95
+
96
+ ### 操作
97
+ 1. 读取 \`.sillyspec/local.yaml\` 获取构建和测试命令
98
+ 2. 如果 local.yaml 有 test 命令,使用它(仅测试变更涉及的模块,非全量)
99
+ 3. 如果 local.yaml 无 test 命令,根据项目类型选择:
100
+ - Maven:\`mvn test -pl <变更模块> -am\`(仅编译变更模块及其依赖)
101
+ - Gradle:\`./gradlew :<模块>:test\`
102
+ - npm/pnpm:\`pnpm test --filter=<包名>\` 或 \`npm test -- --testPathPattern=<相关文件>\`
103
+ - Python:\`pytest <变更模块路径>/\`
104
+ 4. 记录通过/失败数量,分析失败原因
105
+ 5. 搜索技术债务:grep TODO/FIXME/HACK/XXX(仅限变更文件)
106
+ 6. 如果 local.yaml 有 lint 命令,运行 lint 检查
107
+
108
+ ### 注意
109
+ - 不要全量编译/测试整个项目,只测变更涉及的模块
110
+ - 如果变更模块不确定,优先使用 local.yaml 中的命令
111
+
112
+ ### 输出
113
+ 测试结果 + 技术债务标记`,
114
+ outputHint: '测试结果 + 技术债务',
115
+ optional: false
116
+ },
117
+ {
118
+ name: '输出验证报告',
119
+ prompt: `生成完整验证报告。
120
+
121
+ ### 操作
122
+ 1. 汇总以上所有检查结果
123
+ 2. 给出结论:PASS / PASS WITH NOTES / FAIL
124
+
125
+ ### 输出
126
+ 验证报告 markdown + 下一步命令
127
+
128
+ ### 注意
129
+ - PASS → 下一步 archive
130
+ - FAIL → 修复后重新 verify`,
131
+ outputHint: '验证报告',
132
+ optional: false
133
+ }
134
+ ]
135
+ }
@@ -1,219 +0,0 @@
1
- # SillySpec Dashboard — 技术方案
2
-
3
- ## 架构决策
4
-
5
- | 决策 | 选择 | 理由 |
6
- |---|---|---|
7
- | 前端框架 | Vue 3 + Vite | 轻量、打包快、SillySpec 用户已有 Node.js |
8
- | CSS | Tailwind CSS | 原子化、深色主题变量管理方便 |
9
- | 后端 | Node.js 原生 http + ws | 不引入 Express,零重依赖 |
10
- | 文件监听 | chokidar | 跨平台、成熟稳定 |
11
- | 数据库 | 无 | 纯文件系统,与 SillySpec 哲学一致 |
12
- | 包结构 | SillySpec 子包 packages/dashboard | 独立 package.json,可单独开发 |
13
-
14
- ## 文件变更清单
15
-
16
- ### 新增文件
17
-
18
- | 文件 | 说明 |
19
- |---|---|
20
- | `packages/dashboard/package.json` | 子包配置,依赖 vue/vite/tailwind/chokidar/ws |
21
- | `packages/dashboard/vite.config.js` | Vite 构建配置,构建产物输出到 dist/ |
22
- | `packages/dashboard/server/index.js` | HTTP + WebSocket 服务启动入口 |
23
- | `packages/dashboard/server/watcher.js` | chokidar 监听 .sillyspec/,解析文件变化,emit 事件 |
24
- | `packages/dashboard/server/api.js` | REST 路由:GET /api/projects, GET /api/project/:name/status |
25
- | `packages/dashboard/server/executor.js` | CLI 命令执行器(child_process.spawn + stdout 流式推送) |
26
- | `packages/dashboard/src/main.js` | Vue 应用入口 |
27
- | `packages/dashboard/src/App.vue` | 根组件,三栏布局 |
28
- | `packages/dashboard/src/components/ProjectList.vue` | 左栏项目列表 |
29
- | `packages/dashboard/src/components/PipelineView.vue` | 中栏阶段 pipeline + 时间线 |
30
- | `packages/dashboard/src/components/StepCard.vue` | 步骤卡片(三级信息密度) |
31
- | `packages/dashboard/src/components/DetailPanel.vue` | 右栏详情 + 日志 |
32
- | `packages/dashboard/src/components/LogStream.vue` | 终端风格日志流(等宽字体、语法高亮、搜索过滤) |
33
- | `packages/dashboard/src/components/CommandPalette.vue` | Cmd+K 命令面板 |
34
- | `packages/dashboard/src/components/StageBadge.vue` | 阶段状态标签组件 |
35
- | `packages/dashboard/src/components/ActionBar.vue` | CLI 操作按钮(下一步、阶段切换) |
36
- | `packages/dashboard/src/composables/useWebSocket.js` | WebSocket 连接管理(自动重连、心跳) |
37
- | `packages/dashboard/src/composables/useKeyboard.js` | 全局键盘快捷键 |
38
- | `packages/dashboard/src/styles/theme.css` | CSS 变量(配色、间距、动效) |
39
- | `packages/dashboard/index.html` | Vite HTML 入口 |
40
- | `packages/dashboard/tailwind.config.js` | Tailwind 配置(自定义颜色) |
41
-
42
- ### 修改文件
43
-
44
- | 文件 | 变更 |
45
- |---|---|
46
- | `src/index.js` | 新增 `dashboard` 命令分支 |
47
- | `package.json` | workspace 引用 packages/dashboard |
48
-
49
- ## 数据模型
50
-
51
- ### 前端状态(composable/store)
52
-
53
- ```javascript
54
- {
55
- projects: [
56
- {
57
- name: 'my-project',
58
- path: '/Users/x/my-project',
59
- currentStage: 'plan',
60
- stages: {
61
- brainstorm: { status: 'completed', steps: 10, completedSteps: 10, duration: '25min' },
62
- plan: { status: 'in-progress', steps: 5, completedSteps: 2, duration: '8min' },
63
- execute: { status: 'pending', steps: 0, completedSteps: 0 },
64
- verify: { status: 'pending', steps: 0, completedSteps: 0 }
65
- },
66
- lastActive: '2026-04-05T14:30:00Z'
67
- }
68
- ],
69
- activeProject: 'my-project', // 当前选中
70
- activeStep: 3, // 当前选中步骤
71
- logs: [], // 实时日志行
72
- isPanelOpen: true // 右侧面板是否展开
73
- }
74
- ```
75
-
76
- ### WebSocket 消息协议
77
-
78
- ```javascript
79
- // 服务端 → 客户端
80
- { type: 'project:updated', project: { name, stages, currentStage } }
81
- { type: 'step:updated', project: 'name', step: { id, status, summary } }
82
- { type: 'log:append', project: 'name', lines: ['> analyzing...', '> done ✅'] }
83
- { type: 'cli:output', project: 'name', data: 'stdout/stderr 流' }
84
- { type: 'cli:complete', project: 'name', exitCode: 0 }
85
-
86
- // 客户端 → 服务端
87
- { type: 'cli:execute', project: 'name', command: 'sillyspec next' }
88
- { type: 'project:select', name: 'my-project' }
89
- ```
90
-
91
- ### REST API
92
-
93
- ```
94
- GET /api/projects → 项目列表(扫描用户目录下的 .sillyspec/)
95
- GET /api/project/:name → 项目完整状态(STATE.md + progress.json 合并)
96
- GET /api/project/:name/logs → 最近日志(user-inputs.md)
97
- ```
98
-
99
- ## 关键组件实现
100
-
101
- ### StepCard.vue — 三级信息密度
102
-
103
- ```vue
104
- <template>
105
- <div class="step-card" :class="[statusClass]"
106
- @mouseenter="hovered = true" @mouseleave="hovered = false"
107
- @click="select">
108
- <!-- 低密度:始终显示 -->
109
- <div class="step-header">
110
- <span class="step-icon">{{ icon }}</span>
111
- <span class="step-title">{{ step.title }}</span>
112
- </div>
113
-
114
- <!-- 中密度:hover 显示 -->
115
- <transition name="fade">
116
- <div v-if="hovered && step.summary?.conclusion" class="step-summary">
117
- {{ step.summary.conclusion }}
118
- </div>
119
- </transition>
120
-
121
- <!-- 高密度:点击后在右侧 DetailPanel 展示 -->
122
- </div>
123
- </template>
124
- ```
125
-
126
- ### LogStream.vue — 终端风格日志
127
-
128
- - 等宽字体(JetBrains Mono / monospace)
129
- - 新行淡入动画(CSS transition opacity)
130
- - 搜索过滤:顶部搜索框,实时过滤匹配行
131
- - 自动滚动到底部,用户上翻时暂停自动滚动
132
- - ANSI 颜色码支持(使用 ansi-to-html)
133
-
134
- ### CommandPalette.vue
135
-
136
- - `Cmd/Ctrl+K` 打开,`Escape` 关闭
137
- - 模糊搜索项目名、阶段名
138
- - 选中后跳转视图
139
- - 参考 shadcn/ui 的 Command 组件风格
140
-
141
- ## CLI 集成
142
-
143
- ### src/index.js 新增命令
144
-
145
- ```javascript
146
- // 在现有 commander 配置中新增
147
- program
148
- .command('dashboard')
149
- .description('启动可视化仪表盘')
150
- .option('--port <number>', '端口号', 3456)
151
- .option('--no-open', '不自动打开浏览器')
152
- .action(async (options) => {
153
- const { startServer } = await import('../packages/dashboard/server/index.js');
154
- await startServer(options);
155
- });
156
- ```
157
-
158
- ### server/index.js 启动流程
159
-
160
- ```javascript
161
- async function startServer({ port = 3456, open = true }) {
162
- // 1. 启动 HTTP 服务,serve 前端静态文件
163
- const server = http.createServer(handler);
164
-
165
- // 2. 挂载 WebSocket
166
- const wss = new WebSocketServer({ server });
167
-
168
- // 3. 启动文件监听
169
- const watcher = new ProjectWatcher();
170
- watcher.on('change', (event) => wss.broadcast(event));
171
-
172
- // 4. 启动服务
173
- server.listen(port, () => {
174
- console.log(`🚀 SillySpec Dashboard: http://localhost:${port}`);
175
- if (open) openBrowser(`http://localhost:${port}`);
176
- });
177
- }
178
- ```
179
-
180
- ## 项目发现机制
181
-
182
- 扫描用户常用项目目录,查找包含 `.sillyspec/` 的目录:
183
-
184
- ```javascript
185
- // 优先级:
186
- // 1. 当前工作目录
187
- // 2. HOME 目录下第一层子目录
188
- // 3. 用户可通过设置文件配置额外路径 ~/.sillyspec/dashboard.json
189
- ```
190
-
191
- ## 构建与发布
192
-
193
- ### 开发模式
194
-
195
- ```bash
196
- cd packages/dashboard
197
- npm run dev # Vite dev server + 后端热重载
198
- ```
199
-
200
- ### 生产构建
201
-
202
- ```bash
203
- cd packages/dashboard
204
- npm run build # Vite 构建 → dist/
205
- ```
206
-
207
- 前端构建产物(dist/)嵌入 npm 包,`sillyspec dashboard` 启动时 serve 静态文件。
208
-
209
- ### 发布
210
-
211
- 作为 SillySpec 的子包,跟随主包版本一起发布。不需要独立版本号。
212
-
213
- ## 代码风格参照
214
-
215
- - Vue 3 Composition API(`<script setup>`)
216
- - Tailwind CSS utility-first
217
- - 组件命名:PascalCase
218
- - composable 命名:use 前缀
219
- - 不使用 Vuex/Pinia,composable 管理状态即可(项目规模不需要)