sillyspec 3.27.2 → 3.27.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 (398) hide show
  1. package/.claude/skills/sillyspec-execute/SKILL.md +8 -0
  2. package/.claude/skills/sillyspec-quick/SKILL.md +2 -1
  3. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  4. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  5. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  6. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  7. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  8. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  9. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  10. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  11. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-export/SKILL.md +57 -0
  12. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-init/SKILL.md +177 -0
  13. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  14. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  15. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  16. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  17. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  18. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-state/SKILL.md +64 -0
  19. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-status/SKILL.md +54 -0
  20. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  21. package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  22. package/.claude/worktrees/sillyspec-data-model-research/.gitattributes +2 -0
  23. package/.claude/worktrees/sillyspec-data-model-research/.husky/pre-push +20 -0
  24. package/.claude/worktrees/sillyspec-data-model-research/README.md +203 -0
  25. package/.claude/worktrees/sillyspec-data-model-research/SKILL.md +91 -0
  26. package/.claude/worktrees/sillyspec-data-model-research/bin/sillyspec.js +2 -0
  27. package/.claude/worktrees/sillyspec-data-model-research/logo.jpg +0 -0
  28. package/.claude/worktrees/sillyspec-data-model-research/package-lock.json +977 -0
  29. package/.claude/worktrees/sillyspec-data-model-research/package.json +39 -0
  30. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  31. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  32. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/favicon.jpg +0 -0
  33. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/index.html +16 -0
  34. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/logo.jpg +0 -0
  35. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/prototype-dashboard.html +836 -0
  36. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/prototype-overview.html +256 -0
  37. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/package.json +25 -0
  38. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/executor.js +95 -0
  39. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/index.js +679 -0
  40. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/parser.js +526 -0
  41. package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/watcher.js +357 -0
  42. package/.claude/worktrees/sillyspec-data-model-research/src/agent-session-log.js +803 -0
  43. package/.claude/worktrees/sillyspec-data-model-research/src/change-list.js +290 -0
  44. package/.claude/worktrees/sillyspec-data-model-research/src/change-risk-profile.js +270 -0
  45. package/.claude/worktrees/sillyspec-data-model-research/src/check-primitives.js +65 -0
  46. package/.claude/worktrees/sillyspec-data-model-research/src/classify-change.js +109 -0
  47. package/.claude/worktrees/sillyspec-data-model-research/src/commit-suggest.js +202 -0
  48. package/.claude/worktrees/sillyspec-data-model-research/src/config-cat.js +88 -0
  49. package/.claude/worktrees/sillyspec-data-model-research/src/config-schema.js +328 -0
  50. package/.claude/worktrees/sillyspec-data-model-research/src/constants.js +97 -0
  51. package/.claude/worktrees/sillyspec-data-model-research/src/contract-matrix.js +480 -0
  52. package/.claude/worktrees/sillyspec-data-model-research/src/datetime.js +20 -0
  53. package/.claude/worktrees/sillyspec-data-model-research/src/db-engine.js +55 -0
  54. package/.claude/worktrees/sillyspec-data-model-research/src/db.js +381 -0
  55. package/.claude/worktrees/sillyspec-data-model-research/src/decision-distill.js +517 -0
  56. package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/backends/local-agent.js +155 -0
  57. package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/backends/sillyhub-mcp.js +245 -0
  58. package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/probe.js +246 -0
  59. package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/strategy.js +121 -0
  60. package/.claude/worktrees/sillyspec-data-model-research/src/docs-check.js +825 -0
  61. package/.claude/worktrees/sillyspec-data-model-research/src/docs-debt.js +393 -0
  62. package/.claude/worktrees/sillyspec-data-model-research/src/docs-gate.js +107 -0
  63. package/.claude/worktrees/sillyspec-data-model-research/src/doctor-diagnostics.js +1099 -0
  64. package/.claude/worktrees/sillyspec-data-model-research/src/endpoint-extractor.js +420 -0
  65. package/.claude/worktrees/sillyspec-data-model-research/src/foreign-declared.js +78 -0
  66. package/.claude/worktrees/sillyspec-data-model-research/src/fs-atomic.js +73 -0
  67. package/.claude/worktrees/sillyspec-data-model-research/src/git-helper.js +150 -0
  68. package/.claude/worktrees/sillyspec-data-model-research/src/hooks/claude-pre-tool-use.cjs +130 -0
  69. package/.claude/worktrees/sillyspec-data-model-research/src/hooks/worktree-guard.js +892 -0
  70. package/.claude/worktrees/sillyspec-data-model-research/src/index.js +2798 -0
  71. package/.claude/worktrees/sillyspec-data-model-research/src/init.js +626 -0
  72. package/.claude/worktrees/sillyspec-data-model-research/src/knowledge-match.js +231 -0
  73. package/.claude/worktrees/sillyspec-data-model-research/src/local-detect.js +128 -0
  74. package/.claude/worktrees/sillyspec-data-model-research/src/local-register.js +104 -0
  75. package/.claude/worktrees/sillyspec-data-model-research/src/machine-interface.js +543 -0
  76. package/.claude/worktrees/sillyspec-data-model-research/src/migrate.js +127 -0
  77. package/.claude/worktrees/sillyspec-data-model-research/src/module-impact.js +166 -0
  78. package/.claude/worktrees/sillyspec-data-model-research/src/module-resolve.js +222 -0
  79. package/.claude/worktrees/sillyspec-data-model-research/src/modules.js +580 -0
  80. package/.claude/worktrees/sillyspec-data-model-research/src/progress/change-registry.js +336 -0
  81. package/.claude/worktrees/sillyspec-data-model-research/src/progress/consistency-doctor.js +355 -0
  82. package/.claude/worktrees/sillyspec-data-model-research/src/progress/shared.js +36 -0
  83. package/.claude/worktrees/sillyspec-data-model-research/src/progress/stage-machine.js +594 -0
  84. package/.claude/worktrees/sillyspec-data-model-research/src/progress/step-store.js +265 -0
  85. package/.claude/worktrees/sillyspec-data-model-research/src/progress.js +1304 -0
  86. package/.claude/worktrees/sillyspec-data-model-research/src/quick-recommend.js +115 -0
  87. package/.claude/worktrees/sillyspec-data-model-research/src/quicklog.js +852 -0
  88. package/.claude/worktrees/sillyspec-data-model-research/src/review-tier.js +77 -0
  89. package/.claude/worktrees/sillyspec-data-model-research/src/run/command.js +1595 -0
  90. package/.claude/worktrees/sillyspec-data-model-research/src/run/complete-handlers.js +1552 -0
  91. package/.claude/worktrees/sillyspec-data-model-research/src/run/complete.js +1259 -0
  92. package/.claude/worktrees/sillyspec-data-model-research/src/run/concurrent-detect.js +156 -0
  93. package/.claude/worktrees/sillyspec-data-model-research/src/run/gates.js +1084 -0
  94. package/.claude/worktrees/sillyspec-data-model-research/src/run/multi-repo-context.js +208 -0
  95. package/.claude/worktrees/sillyspec-data-model-research/src/run/next.js +128 -0
  96. package/.claude/worktrees/sillyspec-data-model-research/src/run/prompt.js +843 -0
  97. package/.claude/worktrees/sillyspec-data-model-research/src/run/quick-audit.js +186 -0
  98. package/.claude/worktrees/sillyspec-data-model-research/src/run/scan-profile.js +269 -0
  99. package/.claude/worktrees/sillyspec-data-model-research/src/run/shared.js +1562 -0
  100. package/.claude/worktrees/sillyspec-data-model-research/src/run/stage.js +584 -0
  101. package/.claude/worktrees/sillyspec-data-model-research/src/run.js +23 -0
  102. package/.claude/worktrees/sillyspec-data-model-research/src/scan-diff.js +388 -0
  103. package/.claude/worktrees/sillyspec-data-model-research/src/scan-postcheck.js +512 -0
  104. package/.claude/worktrees/sillyspec-data-model-research/src/scan-staleness.js +95 -0
  105. package/.claude/worktrees/sillyspec-data-model-research/src/setup.js +414 -0
  106. package/.claude/worktrees/sillyspec-data-model-research/src/sillyhub-mcp/client.js +597 -0
  107. package/.claude/worktrees/sillyspec-data-model-research/src/sillyhub-mcp/config.js +62 -0
  108. package/.claude/worktrees/sillyspec-data-model-research/src/spec-dir-typo.js +50 -0
  109. package/.claude/worktrees/sillyspec-data-model-research/src/spec-sync.js +358 -0
  110. package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract-engine.js +171 -0
  111. package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract-spec.js +550 -0
  112. package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract.js +889 -0
  113. package/.claude/worktrees/sillyspec-data-model-research/src/stage-review.js +597 -0
  114. package/.claude/worktrees/sillyspec-data-model-research/src/stages/archive.js +199 -0
  115. package/.claude/worktrees/sillyspec-data-model-research/src/stages/brainstorm-auto.js +236 -0
  116. package/.claude/worktrees/sillyspec-data-model-research/src/stages/brainstorm.js +617 -0
  117. package/.claude/worktrees/sillyspec-data-model-research/src/stages/cmd-existence.js +145 -0
  118. package/.claude/worktrees/sillyspec-data-model-research/src/stages/doctor.js +540 -0
  119. package/.claude/worktrees/sillyspec-data-model-research/src/stages/execute.js +1275 -0
  120. package/.claude/worktrees/sillyspec-data-model-research/src/stages/explore.js +43 -0
  121. package/.claude/worktrees/sillyspec-data-model-research/src/stages/index.js +29 -0
  122. package/.claude/worktrees/sillyspec-data-model-research/src/stages/knowledge.js +514 -0
  123. package/.claude/worktrees/sillyspec-data-model-research/src/stages/plan-postcheck.js +1344 -0
  124. package/.claude/worktrees/sillyspec-data-model-research/src/stages/plan.js +650 -0
  125. package/.claude/worktrees/sillyspec-data-model-research/src/stages/quick.js +167 -0
  126. package/.claude/worktrees/sillyspec-data-model-research/src/stages/scan.js +608 -0
  127. package/.claude/worktrees/sillyspec-data-model-research/src/stages/status.js +64 -0
  128. package/.claude/worktrees/sillyspec-data-model-research/src/stages/verify.js +246 -0
  129. package/.claude/worktrees/sillyspec-data-model-research/src/sync.js +1470 -0
  130. package/.claude/worktrees/sillyspec-data-model-research/src/task-review.js +1498 -0
  131. package/.claude/worktrees/sillyspec-data-model-research/src/taskcard.js +210 -0
  132. package/.claude/worktrees/sillyspec-data-model-research/src/verify-postcheck.js +1718 -0
  133. package/.claude/worktrees/sillyspec-data-model-research/src/verify-probes.js +277 -0
  134. package/.claude/worktrees/sillyspec-data-model-research/src/version.js +19 -0
  135. package/.claude/worktrees/sillyspec-data-model-research/src/workflow.js +600 -0
  136. package/.claude/worktrees/sillyspec-data-model-research/src/workspace.js +125 -0
  137. package/.claude/worktrees/sillyspec-data-model-research/src/worktree-apply.js +1446 -0
  138. package/.claude/worktrees/sillyspec-data-model-research/src/worktree-deps.js +576 -0
  139. package/.claude/worktrees/sillyspec-data-model-research/src/worktree.js +1715 -0
  140. package/.claude/worktrees/sillyspec-data-model-research/templates/claude-instruction.md +23 -0
  141. package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/taskcard-rules.md +28 -0
  142. package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/testcase-design.md +12 -0
  143. package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/verify-probes.md +32 -0
  144. package/.claude/worktrees/sillyspec-data-model-research/templates/workflows/archive-impact.yaml +79 -0
  145. package/.claude/worktrees/sillyspec-data-model-research/templates/workflows/scan-docs.yaml +132 -0
  146. package/.worktrees/8d2d0392/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  147. package/.worktrees/8d2d0392/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  148. package/.worktrees/8d2d0392/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  149. package/.worktrees/8d2d0392/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  150. package/.worktrees/8d2d0392/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  151. package/.worktrees/8d2d0392/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  152. package/.worktrees/8d2d0392/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  153. package/.worktrees/8d2d0392/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  154. package/.worktrees/8d2d0392/.claude/skills/sillyspec-export/SKILL.md +57 -0
  155. package/.worktrees/8d2d0392/.claude/skills/sillyspec-init/SKILL.md +177 -0
  156. package/.worktrees/8d2d0392/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  157. package/.worktrees/8d2d0392/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  158. package/.worktrees/8d2d0392/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  159. package/.worktrees/8d2d0392/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  160. package/.worktrees/8d2d0392/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  161. package/.worktrees/8d2d0392/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  162. package/.worktrees/8d2d0392/.claude/skills/sillyspec-state/SKILL.md +64 -0
  163. package/.worktrees/8d2d0392/.claude/skills/sillyspec-status/SKILL.md +54 -0
  164. package/.worktrees/8d2d0392/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  165. package/.worktrees/8d2d0392/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  166. package/.worktrees/8d2d0392/.claude/skills/verify-per-user/SKILL.md +6 -0
  167. package/.worktrees/8d2d0392/.gitattributes +2 -0
  168. package/.worktrees/8d2d0392/.husky/pre-push +20 -0
  169. package/.worktrees/8d2d0392/README.md +203 -0
  170. package/.worktrees/8d2d0392/SKILL.md +91 -0
  171. package/.worktrees/8d2d0392/architecture-analysis.md +448 -0
  172. package/.worktrees/8d2d0392/bin/sillyspec.js +2 -0
  173. package/.worktrees/8d2d0392/eval/README.md +86 -0
  174. package/.worktrees/8d2d0392/eval/eval.config.json +28 -0
  175. package/.worktrees/8d2d0392/eval/lib/adapters/cli.mjs +63 -0
  176. package/.worktrees/8d2d0392/eval/lib/adapters/dryrun.mjs +27 -0
  177. package/.worktrees/8d2d0392/eval/lib/config.mjs +82 -0
  178. package/.worktrees/8d2d0392/eval/lib/db.mjs +76 -0
  179. package/.worktrees/8d2d0392/eval/lib/report.mjs +120 -0
  180. package/.worktrees/8d2d0392/eval/lib/runner.mjs +157 -0
  181. package/.worktrees/8d2d0392/eval/lib/tasks.mjs +73 -0
  182. package/.worktrees/8d2d0392/eval/lib/util.mjs +107 -0
  183. package/.worktrees/8d2d0392/eval/lib/workdir.mjs +30 -0
  184. package/.worktrees/8d2d0392/eval/run.mjs +83 -0
  185. package/.worktrees/8d2d0392/eval/tasks/001-slugify/files/package.json +6 -0
  186. package/.worktrees/8d2d0392/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  187. package/.worktrees/8d2d0392/eval/tasks/001-slugify/task.json +6 -0
  188. package/.worktrees/8d2d0392/eval/tasks/001-slugify/verify.mjs +28 -0
  189. package/.worktrees/8d2d0392/eval/tasks/002-each-day/files/package.json +6 -0
  190. package/.worktrees/8d2d0392/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  191. package/.worktrees/8d2d0392/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  192. package/.worktrees/8d2d0392/eval/tasks/002-each-day/task.json +6 -0
  193. package/.worktrees/8d2d0392/eval/tasks/002-each-day/verify.mjs +31 -0
  194. package/.worktrees/8d2d0392/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  195. package/.worktrees/8d2d0392/eval/tasks/003-word-report/files/package.json +6 -0
  196. package/.worktrees/8d2d0392/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  197. package/.worktrees/8d2d0392/eval/tasks/003-word-report/task.json +6 -0
  198. package/.worktrees/8d2d0392/eval/tasks/003-word-report/verify.mjs +38 -0
  199. package/.worktrees/8d2d0392/logo.jpg +0 -0
  200. package/.worktrees/8d2d0392/package-lock.json +977 -0
  201. package/.worktrees/8d2d0392/package.json +41 -0
  202. package/.worktrees/8d2d0392/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  203. package/.worktrees/8d2d0392/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  204. package/.worktrees/8d2d0392/packages/dashboard/dist/favicon.jpg +0 -0
  205. package/.worktrees/8d2d0392/packages/dashboard/dist/index.html +16 -0
  206. package/.worktrees/8d2d0392/packages/dashboard/dist/logo.jpg +0 -0
  207. package/.worktrees/8d2d0392/packages/dashboard/dist/prototype-dashboard.html +836 -0
  208. package/.worktrees/8d2d0392/packages/dashboard/dist/prototype-overview.html +256 -0
  209. package/.worktrees/8d2d0392/packages/dashboard/package.json +25 -0
  210. package/.worktrees/8d2d0392/packages/dashboard/server/executor.js +95 -0
  211. package/.worktrees/8d2d0392/packages/dashboard/server/index.js +679 -0
  212. package/.worktrees/8d2d0392/packages/dashboard/server/parser.js +526 -0
  213. package/.worktrees/8d2d0392/packages/dashboard/server/watcher.js +357 -0
  214. package/.worktrees/8d2d0392/src/agent-session-log.js +803 -0
  215. package/.worktrees/8d2d0392/src/change-list.js +290 -0
  216. package/.worktrees/8d2d0392/src/change-risk-profile.js +339 -0
  217. package/.worktrees/8d2d0392/src/check-primitives.js +65 -0
  218. package/.worktrees/8d2d0392/src/classify-change.js +109 -0
  219. package/.worktrees/8d2d0392/src/commit-suggest.js +202 -0
  220. package/.worktrees/8d2d0392/src/config-cat.js +88 -0
  221. package/.worktrees/8d2d0392/src/config-schema.js +328 -0
  222. package/.worktrees/8d2d0392/src/constants.js +97 -0
  223. package/.worktrees/8d2d0392/src/contract-matrix.js +533 -0
  224. package/.worktrees/8d2d0392/src/datetime.js +20 -0
  225. package/.worktrees/8d2d0392/src/db-engine.js +55 -0
  226. package/.worktrees/8d2d0392/src/db.js +381 -0
  227. package/.worktrees/8d2d0392/src/decision-distill.js +517 -0
  228. package/.worktrees/8d2d0392/src/dispatch/backends/local-agent.js +155 -0
  229. package/.worktrees/8d2d0392/src/dispatch/backends/sillyhub-mcp.js +245 -0
  230. package/.worktrees/8d2d0392/src/dispatch/probe.js +246 -0
  231. package/.worktrees/8d2d0392/src/dispatch/strategy.js +121 -0
  232. package/.worktrees/8d2d0392/src/docs-check.js +825 -0
  233. package/.worktrees/8d2d0392/src/docs-debt.js +393 -0
  234. package/.worktrees/8d2d0392/src/docs-gate.js +107 -0
  235. package/.worktrees/8d2d0392/src/doctor-diagnostics.js +1099 -0
  236. package/.worktrees/8d2d0392/src/endpoint-extractor.js +409 -0
  237. package/.worktrees/8d2d0392/src/foreign-declared.js +78 -0
  238. package/.worktrees/8d2d0392/src/fs-atomic.js +73 -0
  239. package/.worktrees/8d2d0392/src/git-helper.js +150 -0
  240. package/.worktrees/8d2d0392/src/hooks/claude-pre-tool-use.cjs +130 -0
  241. package/.worktrees/8d2d0392/src/hooks/worktree-guard.js +892 -0
  242. package/.worktrees/8d2d0392/src/index.js +2854 -0
  243. package/.worktrees/8d2d0392/src/init.js +626 -0
  244. package/.worktrees/8d2d0392/src/knowledge-match.js +231 -0
  245. package/.worktrees/8d2d0392/src/local-detect.js +128 -0
  246. package/.worktrees/8d2d0392/src/local-register.js +104 -0
  247. package/.worktrees/8d2d0392/src/machine-interface.js +543 -0
  248. package/.worktrees/8d2d0392/src/migrate.js +127 -0
  249. package/.worktrees/8d2d0392/src/module-impact.js +166 -0
  250. package/.worktrees/8d2d0392/src/module-resolve.js +222 -0
  251. package/.worktrees/8d2d0392/src/modules.js +580 -0
  252. package/.worktrees/8d2d0392/src/plan-adopt-waves.js +126 -0
  253. package/.worktrees/8d2d0392/src/progress/change-registry.js +336 -0
  254. package/.worktrees/8d2d0392/src/progress/consistency-doctor.js +355 -0
  255. package/.worktrees/8d2d0392/src/progress/shared.js +36 -0
  256. package/.worktrees/8d2d0392/src/progress/stage-machine.js +594 -0
  257. package/.worktrees/8d2d0392/src/progress/step-store.js +265 -0
  258. package/.worktrees/8d2d0392/src/progress.js +1304 -0
  259. package/.worktrees/8d2d0392/src/quick-recommend.js +115 -0
  260. package/.worktrees/8d2d0392/src/quicklog.js +883 -0
  261. package/.worktrees/8d2d0392/src/review-tier.js +77 -0
  262. package/.worktrees/8d2d0392/src/run/command.js +1641 -0
  263. package/.worktrees/8d2d0392/src/run/complete-handlers.js +1552 -0
  264. package/.worktrees/8d2d0392/src/run/complete.js +1259 -0
  265. package/.worktrees/8d2d0392/src/run/concurrent-detect.js +156 -0
  266. package/.worktrees/8d2d0392/src/run/gates.js +1094 -0
  267. package/.worktrees/8d2d0392/src/run/multi-repo-context.js +208 -0
  268. package/.worktrees/8d2d0392/src/run/next.js +128 -0
  269. package/.worktrees/8d2d0392/src/run/prompt.js +843 -0
  270. package/.worktrees/8d2d0392/src/run/quick-audit.js +186 -0
  271. package/.worktrees/8d2d0392/src/run/scan-profile.js +269 -0
  272. package/.worktrees/8d2d0392/src/run/shared.js +1562 -0
  273. package/.worktrees/8d2d0392/src/run/stage.js +587 -0
  274. package/.worktrees/8d2d0392/src/run.js +23 -0
  275. package/.worktrees/8d2d0392/src/scan-diff.js +388 -0
  276. package/.worktrees/8d2d0392/src/scan-postcheck.js +524 -0
  277. package/.worktrees/8d2d0392/src/scan-staleness.js +95 -0
  278. package/.worktrees/8d2d0392/src/setup.js +414 -0
  279. package/.worktrees/8d2d0392/src/sillyhub-mcp/client.js +597 -0
  280. package/.worktrees/8d2d0392/src/sillyhub-mcp/config.js +62 -0
  281. package/.worktrees/8d2d0392/src/spec-dir-typo.js +50 -0
  282. package/.worktrees/8d2d0392/src/spec-sync.js +358 -0
  283. package/.worktrees/8d2d0392/src/stage-contract-engine.js +171 -0
  284. package/.worktrees/8d2d0392/src/stage-contract-spec.js +551 -0
  285. package/.worktrees/8d2d0392/src/stage-contract.js +948 -0
  286. package/.worktrees/8d2d0392/src/stage-review.js +597 -0
  287. package/.worktrees/8d2d0392/src/stages/archive.js +199 -0
  288. package/.worktrees/8d2d0392/src/stages/brainstorm-auto.js +285 -0
  289. package/.worktrees/8d2d0392/src/stages/brainstorm.js +624 -0
  290. package/.worktrees/8d2d0392/src/stages/cmd-existence.js +145 -0
  291. package/.worktrees/8d2d0392/src/stages/doctor.js +540 -0
  292. package/.worktrees/8d2d0392/src/stages/execute.js +1277 -0
  293. package/.worktrees/8d2d0392/src/stages/explore.js +43 -0
  294. package/.worktrees/8d2d0392/src/stages/index.js +29 -0
  295. package/.worktrees/8d2d0392/src/stages/knowledge.js +514 -0
  296. package/.worktrees/8d2d0392/src/stages/plan-postcheck.js +1398 -0
  297. package/.worktrees/8d2d0392/src/stages/plan.js +651 -0
  298. package/.worktrees/8d2d0392/src/stages/quick.js +167 -0
  299. package/.worktrees/8d2d0392/src/stages/scan.js +608 -0
  300. package/.worktrees/8d2d0392/src/stages/status.js +64 -0
  301. package/.worktrees/8d2d0392/src/stages/verify.js +246 -0
  302. package/.worktrees/8d2d0392/src/sync.js +1470 -0
  303. package/.worktrees/8d2d0392/src/task-review.js +1498 -0
  304. package/.worktrees/8d2d0392/src/taskcard-placeholders.js +21 -0
  305. package/.worktrees/8d2d0392/src/taskcard.js +217 -0
  306. package/.worktrees/8d2d0392/src/verify-postcheck.js +1718 -0
  307. package/.worktrees/8d2d0392/src/verify-probes.js +327 -0
  308. package/.worktrees/8d2d0392/src/version.js +19 -0
  309. package/.worktrees/8d2d0392/src/workflow.js +600 -0
  310. package/.worktrees/8d2d0392/src/workspace.js +125 -0
  311. package/.worktrees/8d2d0392/src/worktree-apply.js +1611 -0
  312. package/.worktrees/8d2d0392/src/worktree-deps.js +576 -0
  313. package/.worktrees/8d2d0392/src/worktree.js +1838 -0
  314. package/.worktrees/8d2d0392/templates/claude-instruction.md +23 -0
  315. package/.worktrees/8d2d0392/templates/prompts/taskcard-rules.md +29 -0
  316. package/.worktrees/8d2d0392/templates/prompts/testcase-design.md +12 -0
  317. package/.worktrees/8d2d0392/templates/prompts/verify-probes.md +32 -0
  318. package/.worktrees/8d2d0392/templates/workflows/archive-impact.yaml +79 -0
  319. package/.worktrees/8d2d0392/templates/workflows/scan-docs.yaml +132 -0
  320. package/architecture-analysis.md +448 -0
  321. package/eval/README.md +86 -0
  322. package/eval/eval.config.json +28 -0
  323. package/eval/lib/adapters/cli.mjs +63 -0
  324. package/eval/lib/adapters/dryrun.mjs +27 -0
  325. package/eval/lib/config.mjs +82 -0
  326. package/eval/lib/db.mjs +76 -0
  327. package/eval/lib/report.mjs +120 -0
  328. package/eval/lib/runner.mjs +157 -0
  329. package/eval/lib/tasks.mjs +73 -0
  330. package/eval/lib/util.mjs +107 -0
  331. package/eval/lib/workdir.mjs +30 -0
  332. package/eval/run.mjs +83 -0
  333. package/eval/tasks/001-slugify/files/package.json +6 -0
  334. package/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  335. package/eval/tasks/001-slugify/task.json +6 -0
  336. package/eval/tasks/001-slugify/verify.mjs +28 -0
  337. package/eval/tasks/002-each-day/files/package.json +6 -0
  338. package/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  339. package/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  340. package/eval/tasks/002-each-day/task.json +6 -0
  341. package/eval/tasks/002-each-day/verify.mjs +31 -0
  342. package/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  343. package/eval/tasks/003-word-report/files/package.json +6 -0
  344. package/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  345. package/eval/tasks/003-word-report/task.json +6 -0
  346. package/eval/tasks/003-word-report/verify.mjs +38 -0
  347. package/package.json +4 -2
  348. package/src/agent-session-log.js +45 -5
  349. package/src/change-risk-profile.js +83 -14
  350. package/src/config-schema.js +18 -3
  351. package/src/contract-matrix.js +90 -29
  352. package/src/datetime.js +20 -0
  353. package/src/decision-distill.js +517 -0
  354. package/src/dispatch/backends/local-agent.js +4 -4
  355. package/src/docs-check.js +227 -0
  356. package/src/docs-debt.js +187 -24
  357. package/src/doctor-diagnostics.js +102 -2
  358. package/src/endpoint-extractor.js +41 -52
  359. package/src/foreign-declared.js +155 -0
  360. package/src/index.js +95 -13
  361. package/src/init.js +9 -7
  362. package/src/knowledge-match.js +107 -6
  363. package/src/local-register.js +7 -1
  364. package/src/module-resolve.js +12 -1
  365. package/src/modules.js +2 -1
  366. package/src/plan-adopt-waves.js +126 -0
  367. package/src/quicklog.js +50 -4
  368. package/src/run/command.js +124 -44
  369. package/src/run/complete-handlers.js +48 -19
  370. package/src/run/complete.js +5 -2
  371. package/src/run/gates.js +104 -22
  372. package/src/run/prompt.js +84 -42
  373. package/src/run/quick-audit.js +11 -0
  374. package/src/run/shared.js +152 -10
  375. package/src/run/stage.js +8 -5
  376. package/src/run.js +2 -2
  377. package/src/scan-postcheck.js +30 -17
  378. package/src/stage-contract-spec.js +3 -2
  379. package/src/stage-contract.js +68 -4
  380. package/src/stages/archive.js +53 -12
  381. package/src/stages/brainstorm-auto.js +50 -1
  382. package/src/stages/brainstorm.js +13 -0
  383. package/src/stages/doctor.js +157 -1
  384. package/src/stages/execute.js +32 -6
  385. package/src/stages/plan-postcheck.js +76 -17
  386. package/src/stages/plan.js +9 -4
  387. package/src/stages/quick.js +6 -1
  388. package/src/stages/verify.js +32 -15
  389. package/src/sync.js +41 -3
  390. package/src/task-review.js +2 -2
  391. package/src/taskcard-placeholders.js +21 -0
  392. package/src/taskcard.js +43 -1
  393. package/src/verify-postcheck.js +315 -13
  394. package/src/verify-probes.js +73 -10
  395. package/src/worktree-apply.js +569 -227
  396. package/src/worktree-deps.js +150 -1
  397. package/src/worktree.js +285 -77
  398. package/templates/prompts/taskcard-rules.md +2 -1
@@ -0,0 +1,836 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Dashboard 双层布局原型(可拖动)</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+ body {
14
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
15
+ background: #F5F5F7;
16
+ height: 100vh;
17
+ display: flex;
18
+ flex-direction: column;
19
+ overflow: hidden;
20
+ }
21
+
22
+ /* ========== 概览区域 - 默认 30% ========== */
23
+ .overview-section {
24
+ height: 30%;
25
+ min-height: 200px;
26
+ max-height: 70%;
27
+ background: #FFFFFF;
28
+ border-bottom: 2px solid #2A3040;
29
+ padding: 16px 24px;
30
+ display: flex;
31
+ flex-direction: column;
32
+ }
33
+
34
+ .section-header {
35
+ display: flex;
36
+ justify-content: space-between;
37
+ align-items: center;
38
+ margin-bottom: 16px;
39
+ }
40
+ .section-title {
41
+ font-size: 18px;
42
+ font-weight: 600;
43
+ color: #1A1A1A;
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 8px;
47
+ }
48
+ .section-title .badge {
49
+ font-size: 12px;
50
+ padding: 2px 8px;
51
+ background: #E5E7EB;
52
+ border-radius: 10px;
53
+ color: #6B7280;
54
+ font-weight: 500;
55
+ }
56
+ .section-actions {
57
+ display: flex;
58
+ gap: 8px;
59
+ align-items: center;
60
+ }
61
+
62
+ .btn {
63
+ padding: 6px 12px;
64
+ border-radius: 6px;
65
+ border: none;
66
+ cursor: pointer;
67
+ font-size: 13px;
68
+ font-weight: 500;
69
+ transition: all 0.2s;
70
+ }
71
+ .btn:hover {
72
+ opacity: 0.9;
73
+ }
74
+ .btn-primary {
75
+ background: #D97706;
76
+ color: white;
77
+ }
78
+ .btn-secondary {
79
+ background: #E5E7EB;
80
+ color: #374151;
81
+ }
82
+ .btn-icon {
83
+ padding: 6px;
84
+ width: 32px;
85
+ height: 32px;
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: center;
89
+ background: #F3F4F6;
90
+ border-radius: 6px;
91
+ }
92
+ .btn-icon:hover {
93
+ background: #E5E7EB;
94
+ }
95
+
96
+ /* 水平滚动卡片容器 */
97
+ .cards-container {
98
+ flex: 1;
99
+ display: flex;
100
+ gap: 16px;
101
+ overflow-x: auto;
102
+ overflow-y: hidden;
103
+ padding-bottom: 8px;
104
+ }
105
+ .cards-container::-webkit-scrollbar {
106
+ height: 8px;
107
+ }
108
+ .cards-container::-webkit-scrollbar-track {
109
+ background: #F3F4F6;
110
+ border-radius: 4px;
111
+ }
112
+ .cards-container::-webkit-scrollbar-thumb {
113
+ background: #D1D5DB;
114
+ border-radius: 4px;
115
+ }
116
+
117
+ /* 项目卡片 */
118
+ .project-card {
119
+ width: 280px;
120
+ height: 120px;
121
+ background: white;
122
+ border: 2px solid #E5E7EB;
123
+ border-radius: 12px;
124
+ padding: 16px;
125
+ display: flex;
126
+ flex-direction: column;
127
+ justify-content: space-between;
128
+ cursor: pointer;
129
+ transition: all 0.2s;
130
+ flex-shrink: 0;
131
+ }
132
+ .project-card:hover {
133
+ border-color: #D97706;
134
+ box-shadow: 0 4px 12px rgba(217, 119, 6, 0.15);
135
+ }
136
+ .project-card.selected {
137
+ border-color: #D97706;
138
+ box-shadow: 0 0 0 3px rgba(217, 119, 6, 0.2);
139
+ }
140
+
141
+ .card-header {
142
+ display: flex;
143
+ justify-content: space-between;
144
+ align-items: flex-start;
145
+ }
146
+ .project-name {
147
+ font-size: 16px;
148
+ font-weight: 600;
149
+ color: #1A1A1A;
150
+ }
151
+ .last-active {
152
+ font-size: 11px;
153
+ color: #9CA3AF;
154
+ }
155
+
156
+ .stage-badge {
157
+ display: inline-block;
158
+ padding: 4px 10px;
159
+ border-radius: 12px;
160
+ font-size: 12px;
161
+ font-weight: 500;
162
+ }
163
+ .stage-badge.in-progress {
164
+ background: #DBEAFE;
165
+ color: #1D4ED8;
166
+ }
167
+ .stage-badge.completed {
168
+ background: #D1FAE5;
169
+ color: #047857;
170
+ }
171
+ .stage-badge.pending {
172
+ background: #F3F4F6;
173
+ color: #6B7280;
174
+ }
175
+
176
+ .progress-section {
177
+ display: flex;
178
+ align-items: center;
179
+ gap: 8px;
180
+ }
181
+ .progress-bar {
182
+ flex: 1;
183
+ height: 6px;
184
+ background: #E5E7EB;
185
+ border-radius: 3px;
186
+ overflow: hidden;
187
+ }
188
+ .progress-fill {
189
+ height: 100%;
190
+ border-radius: 3px;
191
+ transition: width 0.3s;
192
+ }
193
+ .progress-fill.in-progress { background: #3B82F6; }
194
+ .progress-fill.completed { background: #10B981; }
195
+ .progress-fill.pending { background: #9CA3AF; }
196
+ .progress-text {
197
+ font-size: 12px;
198
+ font-weight: 600;
199
+ color: #374151;
200
+ }
201
+
202
+ /* ========== 垂直拖动分割线(概览 ↔ 详情) ========== */
203
+ .v-resize-handle {
204
+ height: 6px;
205
+ background: #2A3040;
206
+ cursor: row-resize;
207
+ flex-shrink: 0;
208
+ position: relative;
209
+ transition: background 0.2s;
210
+ }
211
+ .v-resize-handle:hover, .v-resize-handle.dragging {
212
+ background: #D97706;
213
+ }
214
+ .v-resize-handle::after {
215
+ content: '';
216
+ position: absolute;
217
+ top: 50%;
218
+ left: 50%;
219
+ transform: translate(-50%, -50%);
220
+ width: 40px;
221
+ height: 4px;
222
+ background: rgba(255,255,255,0.3);
223
+ border-radius: 2px;
224
+ }
225
+
226
+ /* ========== 详情区域 - 默认 70% ========== */
227
+ .detail-section {
228
+ flex: 1;
229
+ background: #FAFAFA;
230
+ display: flex;
231
+ flex-direction: column;
232
+ overflow: hidden;
233
+ min-height: 100px;
234
+ }
235
+
236
+ .detail-header {
237
+ display: flex;
238
+ justify-content: space-between;
239
+ align-items: center;
240
+ padding: 12px 24px;
241
+ background: white;
242
+ border-bottom: 1px solid #E5E7EB;
243
+ flex-shrink: 0;
244
+ }
245
+ .detail-title {
246
+ font-size: 14px;
247
+ font-weight: 600;
248
+ color: #374151;
249
+ }
250
+ .detail-tabs {
251
+ display: flex;
252
+ gap: 4px;
253
+ }
254
+ .detail-tab {
255
+ padding: 6px 12px;
256
+ border-radius: 6px;
257
+ font-size: 13px;
258
+ color: #6B7280;
259
+ cursor: pointer;
260
+ transition: all 0.2s;
261
+ }
262
+ .detail-tab:hover {
263
+ background: #F3F4F6;
264
+ }
265
+ .detail-tab.active {
266
+ background: #D97706;
267
+ color: white;
268
+ }
269
+
270
+ /* 三栏布局容器 */
271
+ .detail-content {
272
+ flex: 1;
273
+ display: flex;
274
+ overflow: hidden;
275
+ }
276
+
277
+ /* 水平拖动分割线 */
278
+ .h-resize-handle {
279
+ width: 4px;
280
+ background: #E5E7EB;
281
+ cursor: col-resize;
282
+ flex-shrink: 0;
283
+ position: relative;
284
+ transition: background 0.2s;
285
+ }
286
+ .h-resize-handle:hover, .h-resize-handle.dragging {
287
+ background: #D97706;
288
+ }
289
+
290
+ /* 左栏 - 项目信息 默认 33.3% */
291
+ .detail-left {
292
+ width: 33.33%;
293
+ min-width: 150px;
294
+ background: white;
295
+ padding: 16px;
296
+ overflow-y: auto;
297
+ }
298
+ .detail-section-title {
299
+ font-size: 12px;
300
+ font-weight: 600;
301
+ color: #9CA3AF;
302
+ text-transform: uppercase;
303
+ margin-bottom: 12px;
304
+ }
305
+ .detail-item {
306
+ margin-bottom: 16px;
307
+ }
308
+ .detail-label {
309
+ font-size: 11px;
310
+ color: #9CA3AF;
311
+ margin-bottom: 4px;
312
+ }
313
+ .detail-value {
314
+ font-size: 14px;
315
+ color: #1A1A1A;
316
+ font-weight: 500;
317
+ }
318
+
319
+ /* 中栏 - Pipeline 默认 33.3% */
320
+ .detail-center {
321
+ width: 33.33%;
322
+ min-width: 200px;
323
+ background: white;
324
+ padding: 16px;
325
+ overflow-y: auto;
326
+ }
327
+ .stage-timeline {
328
+ display: flex;
329
+ flex-direction: column;
330
+ gap: 12px;
331
+ }
332
+ .stage-item {
333
+ display: flex;
334
+ align-items: center;
335
+ gap: 12px;
336
+ padding: 12px;
337
+ border: 1px solid #E5E7EB;
338
+ border-radius: 8px;
339
+ cursor: pointer;
340
+ transition: all 0.2s;
341
+ }
342
+ .stage-item:hover {
343
+ background: #F9FAFB;
344
+ }
345
+ .stage-item.active {
346
+ border-color: #D97706;
347
+ background: #FFFBEB;
348
+ }
349
+ .stage-icon {
350
+ width: 32px;
351
+ height: 32px;
352
+ border-radius: 8px;
353
+ display: flex;
354
+ align-items: center;
355
+ justify-content: center;
356
+ font-size: 14px;
357
+ flex-shrink: 0;
358
+ }
359
+ .stage-icon.completed {
360
+ background: #D1FAE5;
361
+ color: #047857;
362
+ }
363
+ .stage-icon.in-progress {
364
+ background: #DBEAFE;
365
+ color: #1D4ED8;
366
+ }
367
+ .stage-icon.pending {
368
+ background: #F3F4F6;
369
+ color: #9CA3AF;
370
+ }
371
+ .stage-info {
372
+ flex: 1;
373
+ min-width: 0;
374
+ }
375
+ .stage-name {
376
+ font-size: 14px;
377
+ font-weight: 500;
378
+ color: #1A1A1A;
379
+ }
380
+ .stage-status {
381
+ font-size: 12px;
382
+ color: #9CA3AF;
383
+ }
384
+
385
+ /* 右栏 - 详情面板 默认 33.3% */
386
+ .detail-right {
387
+ flex: 1;
388
+ min-width: 200px;
389
+ background: white;
390
+ padding: 16px;
391
+ overflow-y: auto;
392
+ }
393
+ .log-entry {
394
+ font-family: 'JetBrains Mono', monospace;
395
+ font-size: 12px;
396
+ padding: 8px;
397
+ background: #F9FAFB;
398
+ border-radius: 4px;
399
+ margin-bottom: 8px;
400
+ color: #374151;
401
+ }
402
+ .log-entry.success {
403
+ color: #047857;
404
+ background: #D1FAE5;
405
+ }
406
+ .log-entry.error {
407
+ color: #DC2626;
408
+ background: #FEE2E2;
409
+ }
410
+
411
+ /* 尺寸显示 */
412
+ .size-indicator {
413
+ position: fixed;
414
+ bottom: 20px;
415
+ left: 20px;
416
+ background: rgba(0,0,0,0.7);
417
+ color: white;
418
+ padding: 8px 12px;
419
+ border-radius: 6px;
420
+ font-size: 11px;
421
+ font-family: monospace;
422
+ opacity: 0;
423
+ transition: opacity 0.2s;
424
+ }
425
+ .size-indicator.visible {
426
+ opacity: 1;
427
+ }
428
+
429
+ /* 淡入动画 */
430
+ @keyframes fadeIn {
431
+ from { opacity: 0; transform: translateY(4px); }
432
+ to { opacity: 1; transform: translateY(0); }
433
+ }
434
+ .fade-in {
435
+ animation: fadeIn 0.2s ease-out;
436
+ }
437
+
438
+ /* 拖动时禁用选择 */
439
+ body.resizing {
440
+ user-select: none;
441
+ }
442
+ body.resizing * {
443
+ cursor: inherit !important;
444
+ }
445
+ </style>
446
+ </head>
447
+ <body>
448
+ <!-- 概览区域 -->
449
+ <div class="overview-section" id="overview">
450
+ <div class="section-header">
451
+ <h1 class="section-title">
452
+ 项目概览
453
+ <span class="badge">4 个项目</span>
454
+ </h1>
455
+ <div class="section-actions">
456
+ <button class="btn btn-icon" title="刷新">↻</button>
457
+ <button class="btn btn-primary">+ 添加项目</button>
458
+ <button class="btn btn-secondary" id="resetLayout">重置布局</button>
459
+ </div>
460
+ </div>
461
+ <div class="cards-container">
462
+ <!-- 项目卡片 1 -->
463
+ <div class="project-card selected" data-project="sillyspec">
464
+ <div class="card-header">
465
+ <span class="project-name">sillyspec</span>
466
+ <span class="last-active">2分钟前</span>
467
+ </div>
468
+ <div>
469
+ <span class="stage-badge in-progress">需求探索</span>
470
+ </div>
471
+ <div class="progress-section">
472
+ <div class="progress-bar">
473
+ <div class="progress-fill in-progress" style="width: 40%"></div>
474
+ </div>
475
+ <span class="progress-text">40%</span>
476
+ </div>
477
+ </div>
478
+ <!-- 项目卡片 2 -->
479
+ <div class="project-card" data-project="my-blog">
480
+ <div class="card-header">
481
+ <span class="project-name">my-blog</span>
482
+ <span class="last-active">15分钟前</span>
483
+ </div>
484
+ <div>
485
+ <span class="stage-badge in-progress">实现计划</span>
486
+ </div>
487
+ <div class="progress-section">
488
+ <div class="progress-bar">
489
+ <div class="progress-fill in-progress" style="width: 75%"></div>
490
+ </div>
491
+ <span class="progress-text">75%</span>
492
+ </div>
493
+ </div>
494
+ <!-- 项目卡片 3 -->
495
+ <div class="project-card" data-project="user-service">
496
+ <div class="card-header">
497
+ <span class="project-name">user-service</span>
498
+ <span class="last-active">1小时前</span>
499
+ </div>
500
+ <div>
501
+ <span class="stage-badge completed">验证确认</span>
502
+ </div>
503
+ <div class="progress-section">
504
+ <div class="progress-bar">
505
+ <div class="progress-fill completed" style="width: 100%"></div>
506
+ </div>
507
+ <span class="progress-text">100%</span>
508
+ </div>
509
+ </div>
510
+ <!-- 项目卡片 4 -->
511
+ <div class="project-card" data-project="payment-api">
512
+ <div class="card-header">
513
+ <span class="project-name">payment-api</span>
514
+ <span class="last-active">昨天</span>
515
+ </div>
516
+ <div>
517
+ <span class="stage-badge pending">未开始</span>
518
+ </div>
519
+ <div class="progress-section">
520
+ <div class="progress-bar">
521
+ <div class="progress-fill pending" style="width: 0%"></div>
522
+ </div>
523
+ <span class="progress-text">0%</span>
524
+ </div>
525
+ </div>
526
+ </div>
527
+ </div>
528
+
529
+ <!-- 垂直拖动分割线 -->
530
+ <div class="v-resize-handle" id="vResizeHandle"></div>
531
+
532
+ <!-- 详情区域 -->
533
+ <div class="detail-section" id="detail">
534
+ <div class="detail-header">
535
+ <span class="detail-title">sillyspec / 需求探索</span>
536
+ <div class="detail-tabs">
537
+ <span class="detail-tab active">Pipeline</span>
538
+ <span class="detail-tab">文档</span>
539
+ <span class="detail-tab">日志</span>
540
+ </div>
541
+ </div>
542
+ <div class="detail-content fade-in">
543
+ <!-- 左栏:项目信息 -->
544
+ <div class="detail-left" id="detailLeft">
545
+ <div class="detail-section-title">项目信息</div>
546
+ <div class="detail-item">
547
+ <div class="detail-label">项目名称</div>
548
+ <div class="detail-value">sillyspec</div>
549
+ </div>
550
+ <div class="detail-item">
551
+ <div class="detail-label">路径</div>
552
+ <div class="detail-value">/Users/qinyi/...</div>
553
+ </div>
554
+ <div class="detail-item">
555
+ <div class="detail-label">当前阶段</div>
556
+ <div class="detail-value">需求探索</div>
557
+ </div>
558
+ <div class="detail-item">
559
+ <div class="detail-label">进度</div>
560
+ <div class="detail-value">4/10 步骤</div>
561
+ </div>
562
+ <div class="detail-item">
563
+ <div class="detail-label">耗时</div>
564
+ <div class="detail-value">8 分钟</div>
565
+ </div>
566
+ </div>
567
+
568
+ <!-- 水平拖动分割线 1 -->
569
+ <div class="h-resize-handle" id="hResizeHandle1"></div>
570
+
571
+ <!-- 中栏:Pipeline -->
572
+ <div class="detail-center" id="detailCenter">
573
+ <div class="detail-section-title">阶段流程</div>
574
+ <div class="stage-timeline">
575
+ <div class="stage-item">
576
+ <div class="stage-icon completed">✓</div>
577
+ <div class="stage-info">
578
+ <div class="stage-name">✅ 代码扫描</div>
579
+ <div class="stage-status">已完成 · 8分钟</div>
580
+ </div>
581
+ </div>
582
+ <div class="stage-item active">
583
+ <div class="stage-icon in-progress">◷</div>
584
+ <div class="stage-info">
585
+ <div class="stage-name">🧠 需求探索</div>
586
+ <div class="stage-status">进行中 · 步骤 4/10</div>
587
+ </div>
588
+ </div>
589
+ <div class="stage-item">
590
+ <div class="stage-icon pending">○</div>
591
+ <div class="stage-info">
592
+ <div class="stage-name">📐 实现计划</div>
593
+ <div class="stage-status">未开始</div>
594
+ </div>
595
+ </div>
596
+ <div class="stage-item">
597
+ <div class="stage-icon pending">○</div>
598
+ <div class="stage-info">
599
+ <div class="stage-name">⚡ 波次执行</div>
600
+ <div class="stage-status">未开始</div>
601
+ </div>
602
+ </div>
603
+ <div class="stage-item">
604
+ <div class="stage-icon pending">○</div>
605
+ <div class="stage-info">
606
+ <div class="stage-name">🔍 验证确认</div>
607
+ <div class="stage-status">未开始</div>
608
+ </div>
609
+ </div>
610
+ </div>
611
+ </div>
612
+
613
+ <!-- 水平拖动分割线 2 -->
614
+ <div class="h-resize-handle" id="hResizeHandle2"></div>
615
+
616
+ <!-- 右栏:日志 -->
617
+ <div class="detail-right" id="detailRight">
618
+ <div class="detail-section-title">最近活动</div>
619
+ <div class="log-entry">✅ Step 3 完成:协作与复用检查</div>
620
+ <div class="log-entry">✅ Step 4 完成:原型/设计图分析</div>
621
+ <div class="log-entry">✅ Step 5 完成:需求范围评估</div>
622
+ <div class="log-entry">◷ Step 6 进行中:对话式探索...</div>
623
+ <div class="log-entry">📝 正在收集需求细节...</div>
624
+ <div class="log-entry">📝 分析信息架构...</div>
625
+ <div class="log-entry">📝 准备设计方案...</div>
626
+ </div>
627
+ </div>
628
+ </div>
629
+
630
+ <!-- 尺寸指示器 -->
631
+ <div class="size-indicator" id="sizeIndicator">概览 30% | 详情 70%</div>
632
+
633
+ <script>
634
+ // 常量
635
+ const STORAGE_KEY = 'dashboard-layout-v2';
636
+ const DEFAULT_OVERVIEW_HEIGHT = 30; // %
637
+ const DEFAULT_COLUMN_WIDTHS = [33.33, 33.33, 33.33]; // %
638
+
639
+ // 状态
640
+ let layout = {
641
+ overviewHeight: DEFAULT_OVERVIEW_HEIGHT,
642
+ columnWidths: [...DEFAULT_COLUMN_WIDTHS]
643
+ };
644
+
645
+ // DOM 元素
646
+ const overview = document.getElementById('overview');
647
+ const detail = document.getElementById('detail');
648
+ const vResizeHandle = document.getElementById('vResizeHandle');
649
+ const detailLeft = document.getElementById('detailLeft');
650
+ const detailCenter = document.getElementById('detailCenter');
651
+ const detailRight = document.getElementById('detailRight');
652
+ const hResizeHandle1 = document.getElementById('hResizeHandle1');
653
+ const hResizeHandle2 = document.getElementById('hResizeHandle2');
654
+ const sizeIndicator = document.getElementById('sizeIndicator');
655
+ const resetBtn = document.getElementById('resetLayout');
656
+
657
+ // 加载保存的布局
658
+ function loadLayout() {
659
+ try {
660
+ const saved = localStorage.getItem(STORAGE_KEY);
661
+ if (saved) {
662
+ layout = JSON.parse(saved);
663
+ applyLayout();
664
+ }
665
+ } catch (e) {
666
+ console.error('Failed to load layout:', e);
667
+ }
668
+ }
669
+
670
+ // 保存布局
671
+ function saveLayout() {
672
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(layout));
673
+ }
674
+
675
+ // 应用布局
676
+ function applyLayout() {
677
+ overview.style.height = layout.overviewHeight + '%';
678
+ updateColumnWidths();
679
+ }
680
+
681
+ // 更新三栏宽度
682
+ function updateColumnWidths() {
683
+ detailLeft.style.width = layout.columnWidths[0] + '%';
684
+ detailCenter.style.width = layout.columnWidths[1] + '%';
685
+ // detailRight 使用 flex: 1 自动填充
686
+ }
687
+
688
+ // 显示尺寸指示器
689
+ function showSizeIndicator(text) {
690
+ sizeIndicator.textContent = text;
691
+ sizeIndicator.classList.add('visible');
692
+ clearTimeout(sizeIndicator.timeout);
693
+ sizeIndicator.timeout = setTimeout(() => {
694
+ sizeIndicator.classList.remove('visible');
695
+ }, 1500);
696
+ }
697
+
698
+ // 垂直拖动(概览 ↔ 详情)
699
+ function initVResize() {
700
+ let startY, startHeight;
701
+
702
+ vResizeHandle.addEventListener('mousedown', (e) => {
703
+ e.preventDefault();
704
+ document.body.classList.add('resizing');
705
+ vResizeHandle.classList.add('dragging');
706
+ startY = e.clientY;
707
+ startHeight = overview.offsetHeight;
708
+
709
+ const onMove = (e) => {
710
+ const deltaY = e.clientY - startY;
711
+ const newHeight = startHeight + deltaY;
712
+ const newPercent = (newHeight / window.innerHeight) * 100;
713
+
714
+ // 限制范围 15%-75%
715
+ if (newPercent >= 15 && newPercent <= 75) {
716
+ layout.overviewHeight = Math.round(newPercent * 10) / 10;
717
+ overview.style.height = layout.overviewHeight + '%';
718
+ showSizeIndicator(`概览 ${Math.round(layout.overviewHeight)}% | 详情 ${Math.round(100 - layout.overviewHeight)}%`);
719
+ }
720
+ };
721
+
722
+ const onUp = () => {
723
+ document.body.classList.remove('resizing');
724
+ vResizeHandle.classList.remove('dragging');
725
+ window.removeEventListener('mousemove', onMove);
726
+ window.removeEventListener('mouseup', onUp);
727
+ saveLayout();
728
+ };
729
+
730
+ window.addEventListener('mousemove', onMove);
731
+ window.addEventListener('mouseup', onUp);
732
+ });
733
+ }
734
+
735
+ // 水平拖动(三栏分割)
736
+ function initHResize() {
737
+ // 分割线 1:左栏 ↔ 中栏
738
+ hResizeHandle1.addEventListener('mousedown', (e) => {
739
+ e.preventDefault();
740
+ startHResize(e, 0, 1);
741
+ });
742
+
743
+ // 分割线 2:中栏 ↔ 右栏
744
+ hResizeHandle2.addEventListener('mousedown', (e) => {
745
+ e.preventDefault();
746
+ startHResize(e, 1, 2);
747
+ });
748
+ }
749
+
750
+ function startHResize(e, colIndex, nextColIndex) {
751
+ document.body.classList.add('resizing');
752
+ const startX = e.clientX;
753
+ const containerWidth = detailContent.offsetWidth;
754
+ const startWidths = [
755
+ detailLeft.offsetWidth,
756
+ detailCenter.offsetWidth
757
+ ];
758
+
759
+ const handle = colIndex === 0 ? hResizeHandle1 : hResizeHandle2;
760
+ handle.classList.add('dragging');
761
+
762
+ const onMove = (e) => {
763
+ const deltaX = e.clientX - startX;
764
+ const deltaPercent = (deltaX / containerWidth) * 100;
765
+
766
+ let newWidth1, newWidth2;
767
+
768
+ if (colIndex === 0) {
769
+ // 左栏 ↔ 中栏
770
+ newWidth1 = ((startWidths[0] + deltaX) / containerWidth) * 100;
771
+ newWidth2 = ((startWidths[1] - deltaX) / containerWidth) * 100;
772
+ } else {
773
+ // 中栏 ↔ 右栏
774
+ newWidth1 = layout.columnWidths[1];
775
+ newWidth2 = ((startWidths[1] - deltaX) / containerWidth) * 100;
776
+ }
777
+
778
+ // 限制最小宽度
779
+ const minWidth = 10;
780
+ if (newWidth1 >= minWidth && newWidth2 >= minWidth) {
781
+ if (colIndex === 0) {
782
+ layout.columnWidths[0] = Math.round(newWidth1 * 10) / 10;
783
+ layout.columnWidths[1] = Math.round(newWidth2 * 10) / 10;
784
+ } else {
785
+ layout.columnWidths[1] = Math.round(newWidth1 * 10) / 10;
786
+ layout.columnWidths[2] = Math.round(newWidth2 * 10) / 10;
787
+ }
788
+ updateColumnWidths();
789
+ showSizeIndicator(`三栏: ${Math.round(layout.columnWidths[0])}% | ${Math.round(layout.columnWidths[1])}% | ${Math.round(layout.columnWidths[2])}%`);
790
+ }
791
+ };
792
+
793
+ const onUp = () => {
794
+ document.body.classList.remove('resizing');
795
+ handle.classList.remove('dragging');
796
+ window.removeEventListener('mousemove', onMove);
797
+ window.removeEventListener('mouseup', onUp);
798
+ saveLayout();
799
+ };
800
+
801
+ window.addEventListener('mousemove', onMove);
802
+ window.addEventListener('mouseup', onUp);
803
+ }
804
+
805
+ // 重置布局
806
+ resetBtn.addEventListener('click', () => {
807
+ layout = {
808
+ overviewHeight: DEFAULT_OVERVIEW_HEIGHT,
809
+ columnWidths: [...DEFAULT_COLUMN_WIDTHS]
810
+ };
811
+ applyLayout();
812
+ saveLayout();
813
+ showSizeIndicator('布局已重置');
814
+ });
815
+
816
+ // 选择项目
817
+ const cards = document.querySelectorAll('.project-card');
818
+ cards.forEach(card => {
819
+ card.addEventListener('click', () => {
820
+ cards.forEach(c => c.classList.remove('selected'));
821
+ card.classList.add('selected');
822
+ const content = document.querySelector('.detail-content');
823
+ content.classList.remove('fade-in');
824
+ void content.offsetWidth;
825
+ content.classList.add('fade-in');
826
+ });
827
+ });
828
+
829
+ // 初始化
830
+ const detailContent = document.querySelector('.detail-content');
831
+ loadLayout();
832
+ initVResize();
833
+ initHResize();
834
+ </script>
835
+ </body>
836
+ </html>