sillyspec 3.27.6 → 3.27.9

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 (923) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +87 -87
  2. package/.claude/skills/sillyspec-auto/SKILL.md +93 -93
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -114
  4. package/.claude/skills/sillyspec-commit/SKILL.md +67 -67
  5. package/.claude/skills/sillyspec-continue/SKILL.md +47 -47
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +76 -76
  7. package/.claude/skills/sillyspec-execute/SKILL.md +214 -214
  8. package/.claude/skills/sillyspec-explore/SKILL.md +102 -102
  9. package/.claude/skills/sillyspec-export/SKILL.md +57 -57
  10. package/.claude/skills/sillyspec-init/SKILL.md +177 -177
  11. package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
  12. package/.claude/skills/sillyspec-plan/SKILL.md +156 -156
  13. package/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  14. package/.claude/skills/sillyspec-quick/SKILL.md +116 -116
  15. package/.claude/skills/sillyspec-resume/SKILL.md +70 -70
  16. package/.claude/skills/sillyspec-scan/SKILL.md +79 -79
  17. package/.claude/skills/sillyspec-state/SKILL.md +64 -64
  18. package/.claude/skills/sillyspec-status/SKILL.md +54 -54
  19. package/.claude/skills/sillyspec-verify/SKILL.md +87 -87
  20. package/.claude/skills/sillyspec-workspace/SKILL.md +175 -175
  21. package/.claude/skills/verify-per-user/SKILL.md +6 -0
  22. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  23. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  24. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  25. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  26. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  27. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  28. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  29. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  30. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-export/SKILL.md +57 -0
  31. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-init/SKILL.md +177 -0
  32. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  33. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  34. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  35. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  36. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  37. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  38. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-state/SKILL.md +64 -0
  39. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-status/SKILL.md +54 -0
  40. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  41. package/.worktrees/2c37b1d7/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  42. package/.worktrees/2c37b1d7/.claude/skills/verify-per-user/SKILL.md +6 -0
  43. package/.worktrees/2c37b1d7/.gitattributes +2 -0
  44. package/.worktrees/2c37b1d7/.husky/pre-push +20 -0
  45. package/.worktrees/2c37b1d7/README.md +203 -0
  46. package/.worktrees/2c37b1d7/SKILL.md +91 -0
  47. package/.worktrees/2c37b1d7/architecture-analysis.md +448 -0
  48. package/.worktrees/2c37b1d7/bin/sillyspec.js +2 -0
  49. package/.worktrees/2c37b1d7/eval/README.md +86 -0
  50. package/.worktrees/2c37b1d7/eval/eval.config.json +28 -0
  51. package/.worktrees/2c37b1d7/eval/lib/adapters/cli.mjs +63 -0
  52. package/.worktrees/2c37b1d7/eval/lib/adapters/dryrun.mjs +27 -0
  53. package/.worktrees/2c37b1d7/eval/lib/config.mjs +82 -0
  54. package/.worktrees/2c37b1d7/eval/lib/db.mjs +76 -0
  55. package/.worktrees/2c37b1d7/eval/lib/report.mjs +120 -0
  56. package/.worktrees/2c37b1d7/eval/lib/runner.mjs +157 -0
  57. package/.worktrees/2c37b1d7/eval/lib/tasks.mjs +73 -0
  58. package/.worktrees/2c37b1d7/eval/lib/util.mjs +107 -0
  59. package/.worktrees/2c37b1d7/eval/lib/workdir.mjs +30 -0
  60. package/.worktrees/2c37b1d7/eval/run.mjs +83 -0
  61. package/.worktrees/2c37b1d7/eval/tasks/001-slugify/files/package.json +6 -0
  62. package/.worktrees/2c37b1d7/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  63. package/.worktrees/2c37b1d7/eval/tasks/001-slugify/task.json +6 -0
  64. package/.worktrees/2c37b1d7/eval/tasks/001-slugify/verify.mjs +28 -0
  65. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/package.json +6 -0
  66. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  67. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  68. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/task.json +6 -0
  69. package/.worktrees/2c37b1d7/eval/tasks/002-each-day/verify.mjs +31 -0
  70. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  71. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/package.json +6 -0
  72. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  73. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/task.json +6 -0
  74. package/.worktrees/2c37b1d7/eval/tasks/003-word-report/verify.mjs +38 -0
  75. package/.worktrees/2c37b1d7/logo.jpg +0 -0
  76. package/.worktrees/2c37b1d7/package-lock.json +977 -0
  77. package/.worktrees/2c37b1d7/package.json +41 -0
  78. package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  79. package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  80. package/.worktrees/2c37b1d7/packages/dashboard/dist/favicon.jpg +0 -0
  81. package/.worktrees/2c37b1d7/packages/dashboard/dist/index.html +16 -0
  82. package/.worktrees/2c37b1d7/packages/dashboard/dist/logo.jpg +0 -0
  83. package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-dashboard.html +836 -0
  84. package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-overview.html +256 -0
  85. package/.worktrees/2c37b1d7/packages/dashboard/package.json +25 -0
  86. package/.worktrees/2c37b1d7/packages/dashboard/server/executor.js +95 -0
  87. package/.worktrees/2c37b1d7/packages/dashboard/server/index.js +679 -0
  88. package/.worktrees/2c37b1d7/packages/dashboard/server/parser.js +526 -0
  89. package/.worktrees/2c37b1d7/packages/dashboard/server/watcher.js +357 -0
  90. package/.worktrees/2c37b1d7/src/agent-session-log.js +803 -0
  91. package/.worktrees/2c37b1d7/src/change-list.js +290 -0
  92. package/.worktrees/2c37b1d7/src/change-risk-profile.js +339 -0
  93. package/.worktrees/2c37b1d7/src/check-primitives.js +65 -0
  94. package/.worktrees/2c37b1d7/src/classify-change.js +109 -0
  95. package/.worktrees/2c37b1d7/src/commit-suggest.js +202 -0
  96. package/.worktrees/2c37b1d7/src/config-cat.js +88 -0
  97. package/.worktrees/2c37b1d7/src/config-schema.js +328 -0
  98. package/.worktrees/2c37b1d7/src/constants.js +97 -0
  99. package/.worktrees/2c37b1d7/src/contract-matrix.js +533 -0
  100. package/.worktrees/2c37b1d7/src/datetime.js +20 -0
  101. package/.worktrees/2c37b1d7/src/db-engine.js +55 -0
  102. package/.worktrees/2c37b1d7/src/db.js +381 -0
  103. package/.worktrees/2c37b1d7/src/decision-distill.js +517 -0
  104. package/.worktrees/2c37b1d7/src/dispatch/backends/local-agent.js +155 -0
  105. package/.worktrees/2c37b1d7/src/dispatch/backends/sillyhub-mcp.js +245 -0
  106. package/.worktrees/2c37b1d7/src/dispatch/probe.js +246 -0
  107. package/.worktrees/2c37b1d7/src/dispatch/strategy.js +121 -0
  108. package/.worktrees/2c37b1d7/src/docs-check.js +825 -0
  109. package/.worktrees/2c37b1d7/src/docs-debt.js +393 -0
  110. package/.worktrees/2c37b1d7/src/docs-gate.js +107 -0
  111. package/.worktrees/2c37b1d7/src/doctor-diagnostics.js +1099 -0
  112. package/.worktrees/2c37b1d7/src/endpoint-extractor.js +409 -0
  113. package/.worktrees/2c37b1d7/src/foreign-declared.js +155 -0
  114. package/.worktrees/2c37b1d7/src/fs-atomic.js +73 -0
  115. package/.worktrees/2c37b1d7/src/git-helper.js +150 -0
  116. package/.worktrees/2c37b1d7/src/hooks/claude-pre-tool-use.cjs +130 -0
  117. package/.worktrees/2c37b1d7/src/hooks/worktree-guard.js +892 -0
  118. package/.worktrees/2c37b1d7/src/index.js +2854 -0
  119. package/.worktrees/2c37b1d7/src/init.js +626 -0
  120. package/.worktrees/2c37b1d7/src/knowledge-match.js +231 -0
  121. package/.worktrees/2c37b1d7/src/local-detect.js +128 -0
  122. package/.worktrees/2c37b1d7/src/local-register.js +104 -0
  123. package/.worktrees/2c37b1d7/src/machine-interface.js +543 -0
  124. package/.worktrees/2c37b1d7/src/migrate.js +127 -0
  125. package/.worktrees/2c37b1d7/src/module-impact.js +166 -0
  126. package/.worktrees/2c37b1d7/src/module-resolve.js +222 -0
  127. package/.worktrees/2c37b1d7/src/modules.js +580 -0
  128. package/.worktrees/2c37b1d7/src/plan-adopt-waves.js +126 -0
  129. package/.worktrees/2c37b1d7/src/progress/change-registry.js +336 -0
  130. package/.worktrees/2c37b1d7/src/progress/consistency-doctor.js +355 -0
  131. package/.worktrees/2c37b1d7/src/progress/shared.js +36 -0
  132. package/.worktrees/2c37b1d7/src/progress/stage-machine.js +594 -0
  133. package/.worktrees/2c37b1d7/src/progress/step-store.js +265 -0
  134. package/.worktrees/2c37b1d7/src/progress.js +1304 -0
  135. package/.worktrees/2c37b1d7/src/quick-recommend.js +115 -0
  136. package/.worktrees/2c37b1d7/src/quicklog.js +883 -0
  137. package/.worktrees/2c37b1d7/src/review-tier.js +77 -0
  138. package/.worktrees/2c37b1d7/src/run/command.js +1641 -0
  139. package/.worktrees/2c37b1d7/src/run/complete-handlers.js +1552 -0
  140. package/.worktrees/2c37b1d7/src/run/complete.js +1259 -0
  141. package/.worktrees/2c37b1d7/src/run/concurrent-detect.js +156 -0
  142. package/.worktrees/2c37b1d7/src/run/gates.js +1111 -0
  143. package/.worktrees/2c37b1d7/src/run/multi-repo-context.js +208 -0
  144. package/.worktrees/2c37b1d7/src/run/next.js +128 -0
  145. package/.worktrees/2c37b1d7/src/run/prompt.js +843 -0
  146. package/.worktrees/2c37b1d7/src/run/quick-audit.js +186 -0
  147. package/.worktrees/2c37b1d7/src/run/scan-profile.js +269 -0
  148. package/.worktrees/2c37b1d7/src/run/shared.js +1562 -0
  149. package/.worktrees/2c37b1d7/src/run/stage.js +587 -0
  150. package/.worktrees/2c37b1d7/src/run.js +23 -0
  151. package/.worktrees/2c37b1d7/src/scan-diff.js +388 -0
  152. package/.worktrees/2c37b1d7/src/scan-postcheck.js +524 -0
  153. package/.worktrees/2c37b1d7/src/scan-staleness.js +95 -0
  154. package/.worktrees/2c37b1d7/src/setup.js +414 -0
  155. package/.worktrees/2c37b1d7/src/sillyhub-mcp/client.js +597 -0
  156. package/.worktrees/2c37b1d7/src/sillyhub-mcp/config.js +62 -0
  157. package/.worktrees/2c37b1d7/src/spec-dir-typo.js +50 -0
  158. package/.worktrees/2c37b1d7/src/spec-sync.js +358 -0
  159. package/.worktrees/2c37b1d7/src/stage-contract-engine.js +171 -0
  160. package/.worktrees/2c37b1d7/src/stage-contract-spec.js +551 -0
  161. package/.worktrees/2c37b1d7/src/stage-contract.js +948 -0
  162. package/.worktrees/2c37b1d7/src/stage-review.js +597 -0
  163. package/.worktrees/2c37b1d7/src/stages/archive.js +199 -0
  164. package/.worktrees/2c37b1d7/src/stages/brainstorm-auto.js +285 -0
  165. package/.worktrees/2c37b1d7/src/stages/brainstorm.js +624 -0
  166. package/.worktrees/2c37b1d7/src/stages/cmd-existence.js +145 -0
  167. package/.worktrees/2c37b1d7/src/stages/doctor.js +540 -0
  168. package/.worktrees/2c37b1d7/src/stages/execute.js +1277 -0
  169. package/.worktrees/2c37b1d7/src/stages/explore.js +43 -0
  170. package/.worktrees/2c37b1d7/src/stages/index.js +29 -0
  171. package/.worktrees/2c37b1d7/src/stages/knowledge.js +514 -0
  172. package/.worktrees/2c37b1d7/src/stages/plan-postcheck.js +1398 -0
  173. package/.worktrees/2c37b1d7/src/stages/plan.js +655 -0
  174. package/.worktrees/2c37b1d7/src/stages/quick.js +167 -0
  175. package/.worktrees/2c37b1d7/src/stages/scan.js +608 -0
  176. package/.worktrees/2c37b1d7/src/stages/status.js +64 -0
  177. package/.worktrees/2c37b1d7/src/stages/verify.js +246 -0
  178. package/.worktrees/2c37b1d7/src/sync.js +1470 -0
  179. package/.worktrees/2c37b1d7/src/task-review.js +1498 -0
  180. package/.worktrees/2c37b1d7/src/taskcard-placeholders.js +21 -0
  181. package/.worktrees/2c37b1d7/src/taskcard.js +250 -0
  182. package/.worktrees/2c37b1d7/src/verify-postcheck.js +1718 -0
  183. package/.worktrees/2c37b1d7/src/verify-probes.js +327 -0
  184. package/.worktrees/2c37b1d7/src/version.js +19 -0
  185. package/.worktrees/2c37b1d7/src/workflow.js +600 -0
  186. package/.worktrees/2c37b1d7/src/workspace.js +125 -0
  187. package/.worktrees/2c37b1d7/src/worktree-apply.js +1611 -0
  188. package/.worktrees/2c37b1d7/src/worktree-deps.js +668 -0
  189. package/.worktrees/2c37b1d7/src/worktree.js +1849 -0
  190. package/.worktrees/2c37b1d7/templates/claude-instruction.md +23 -0
  191. package/.worktrees/2c37b1d7/templates/prompts/taskcard-rules.md +29 -0
  192. package/.worktrees/2c37b1d7/templates/prompts/testcase-design.md +12 -0
  193. package/.worktrees/2c37b1d7/templates/prompts/verify-probes.md +32 -0
  194. package/.worktrees/2c37b1d7/templates/workflows/archive-impact.yaml +79 -0
  195. package/.worktrees/2c37b1d7/templates/workflows/scan-docs.yaml +132 -0
  196. package/.worktrees/542c4415/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  197. package/.worktrees/542c4415/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  198. package/.worktrees/542c4415/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  199. package/.worktrees/542c4415/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  200. package/.worktrees/542c4415/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  201. package/.worktrees/542c4415/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  202. package/.worktrees/542c4415/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  203. package/.worktrees/542c4415/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  204. package/.worktrees/542c4415/.claude/skills/sillyspec-export/SKILL.md +57 -0
  205. package/.worktrees/542c4415/.claude/skills/sillyspec-init/SKILL.md +177 -0
  206. package/.worktrees/542c4415/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  207. package/.worktrees/542c4415/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  208. package/.worktrees/542c4415/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  209. package/.worktrees/542c4415/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  210. package/.worktrees/542c4415/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  211. package/.worktrees/542c4415/.claude/skills/sillyspec-state/SKILL.md +64 -0
  212. package/.worktrees/542c4415/.claude/skills/sillyspec-status/SKILL.md +54 -0
  213. package/.worktrees/542c4415/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  214. package/.worktrees/542c4415/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  215. package/.worktrees/542c4415/.gitattributes +2 -0
  216. package/.worktrees/542c4415/.husky/pre-push +20 -0
  217. package/.worktrees/542c4415/README.md +203 -0
  218. package/.worktrees/542c4415/SKILL.md +91 -0
  219. package/.worktrees/542c4415/architecture-analysis.md +448 -0
  220. package/.worktrees/542c4415/bin/sillyspec.js +2 -0
  221. package/.worktrees/542c4415/eval/README.md +86 -0
  222. package/.worktrees/542c4415/eval/eval.config.json +28 -0
  223. package/.worktrees/542c4415/eval/lib/adapters/cli.mjs +63 -0
  224. package/.worktrees/542c4415/eval/lib/adapters/dryrun.mjs +27 -0
  225. package/.worktrees/542c4415/eval/lib/config.mjs +82 -0
  226. package/.worktrees/542c4415/eval/lib/db.mjs +76 -0
  227. package/.worktrees/542c4415/eval/lib/report.mjs +120 -0
  228. package/.worktrees/542c4415/eval/lib/runner.mjs +157 -0
  229. package/.worktrees/542c4415/eval/lib/tasks.mjs +73 -0
  230. package/.worktrees/542c4415/eval/lib/util.mjs +107 -0
  231. package/.worktrees/542c4415/eval/lib/workdir.mjs +30 -0
  232. package/.worktrees/542c4415/eval/run.mjs +83 -0
  233. package/.worktrees/542c4415/eval/tasks/001-slugify/files/package.json +6 -0
  234. package/.worktrees/542c4415/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  235. package/.worktrees/542c4415/eval/tasks/001-slugify/task.json +6 -0
  236. package/.worktrees/542c4415/eval/tasks/001-slugify/verify.mjs +28 -0
  237. package/.worktrees/542c4415/eval/tasks/002-each-day/files/package.json +6 -0
  238. package/.worktrees/542c4415/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  239. package/.worktrees/542c4415/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  240. package/.worktrees/542c4415/eval/tasks/002-each-day/task.json +6 -0
  241. package/.worktrees/542c4415/eval/tasks/002-each-day/verify.mjs +31 -0
  242. package/.worktrees/542c4415/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  243. package/.worktrees/542c4415/eval/tasks/003-word-report/files/package.json +6 -0
  244. package/.worktrees/542c4415/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  245. package/.worktrees/542c4415/eval/tasks/003-word-report/task.json +6 -0
  246. package/.worktrees/542c4415/eval/tasks/003-word-report/verify.mjs +38 -0
  247. package/.worktrees/542c4415/logo.jpg +0 -0
  248. package/.worktrees/542c4415/package-lock.json +977 -0
  249. package/.worktrees/542c4415/package.json +41 -0
  250. package/.worktrees/542c4415/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  251. package/.worktrees/542c4415/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  252. package/.worktrees/542c4415/packages/dashboard/dist/favicon.jpg +0 -0
  253. package/.worktrees/542c4415/packages/dashboard/dist/index.html +16 -0
  254. package/.worktrees/542c4415/packages/dashboard/dist/logo.jpg +0 -0
  255. package/.worktrees/542c4415/packages/dashboard/dist/prototype-dashboard.html +836 -0
  256. package/.worktrees/542c4415/packages/dashboard/dist/prototype-overview.html +256 -0
  257. package/.worktrees/542c4415/packages/dashboard/package.json +25 -0
  258. package/.worktrees/542c4415/packages/dashboard/server/executor.js +95 -0
  259. package/.worktrees/542c4415/packages/dashboard/server/index.js +679 -0
  260. package/.worktrees/542c4415/packages/dashboard/server/parser.js +526 -0
  261. package/.worktrees/542c4415/packages/dashboard/server/watcher.js +357 -0
  262. package/.worktrees/542c4415/src/agent-session-log.js +803 -0
  263. package/.worktrees/542c4415/src/change-list.js +290 -0
  264. package/.worktrees/542c4415/src/change-risk-profile.js +339 -0
  265. package/.worktrees/542c4415/src/check-primitives.js +65 -0
  266. package/.worktrees/542c4415/src/classify-change.js +109 -0
  267. package/.worktrees/542c4415/src/commit-suggest.js +202 -0
  268. package/.worktrees/542c4415/src/config-cat.js +88 -0
  269. package/.worktrees/542c4415/src/config-schema.js +328 -0
  270. package/.worktrees/542c4415/src/constants.js +97 -0
  271. package/.worktrees/542c4415/src/contract-matrix.js +533 -0
  272. package/.worktrees/542c4415/src/datetime.js +20 -0
  273. package/.worktrees/542c4415/src/db-engine.js +55 -0
  274. package/.worktrees/542c4415/src/db.js +381 -0
  275. package/.worktrees/542c4415/src/decision-distill.js +517 -0
  276. package/.worktrees/542c4415/src/dispatch/backends/local-agent.js +155 -0
  277. package/.worktrees/542c4415/src/dispatch/backends/sillyhub-mcp.js +245 -0
  278. package/.worktrees/542c4415/src/dispatch/probe.js +246 -0
  279. package/.worktrees/542c4415/src/dispatch/strategy.js +121 -0
  280. package/.worktrees/542c4415/src/docs-check.js +825 -0
  281. package/.worktrees/542c4415/src/docs-debt.js +393 -0
  282. package/.worktrees/542c4415/src/docs-gate.js +107 -0
  283. package/.worktrees/542c4415/src/doctor-diagnostics.js +1099 -0
  284. package/.worktrees/542c4415/src/endpoint-extractor.js +409 -0
  285. package/.worktrees/542c4415/src/foreign-declared.js +155 -0
  286. package/.worktrees/542c4415/src/fs-atomic.js +73 -0
  287. package/.worktrees/542c4415/src/git-helper.js +150 -0
  288. package/.worktrees/542c4415/src/hooks/claude-pre-tool-use.cjs +130 -0
  289. package/.worktrees/542c4415/src/hooks/worktree-guard.js +892 -0
  290. package/.worktrees/542c4415/src/index.js +2854 -0
  291. package/.worktrees/542c4415/src/init.js +626 -0
  292. package/.worktrees/542c4415/src/knowledge-match.js +231 -0
  293. package/.worktrees/542c4415/src/local-detect.js +128 -0
  294. package/.worktrees/542c4415/src/local-register.js +104 -0
  295. package/.worktrees/542c4415/src/machine-interface.js +543 -0
  296. package/.worktrees/542c4415/src/migrate.js +127 -0
  297. package/.worktrees/542c4415/src/module-impact.js +166 -0
  298. package/.worktrees/542c4415/src/module-resolve.js +222 -0
  299. package/.worktrees/542c4415/src/modules.js +580 -0
  300. package/.worktrees/542c4415/src/plan-adopt-waves.js +126 -0
  301. package/.worktrees/542c4415/src/progress/change-registry.js +336 -0
  302. package/.worktrees/542c4415/src/progress/consistency-doctor.js +355 -0
  303. package/.worktrees/542c4415/src/progress/shared.js +36 -0
  304. package/.worktrees/542c4415/src/progress/stage-machine.js +594 -0
  305. package/.worktrees/542c4415/src/progress/step-store.js +265 -0
  306. package/.worktrees/542c4415/src/progress.js +1304 -0
  307. package/.worktrees/542c4415/src/quick-recommend.js +115 -0
  308. package/.worktrees/542c4415/src/quicklog.js +883 -0
  309. package/.worktrees/542c4415/src/review-tier.js +77 -0
  310. package/.worktrees/542c4415/src/run/command.js +1641 -0
  311. package/.worktrees/542c4415/src/run/complete-handlers.js +1552 -0
  312. package/.worktrees/542c4415/src/run/complete.js +1259 -0
  313. package/.worktrees/542c4415/src/run/concurrent-detect.js +156 -0
  314. package/.worktrees/542c4415/src/run/gates.js +1111 -0
  315. package/.worktrees/542c4415/src/run/multi-repo-context.js +208 -0
  316. package/.worktrees/542c4415/src/run/next.js +128 -0
  317. package/.worktrees/542c4415/src/run/prompt.js +843 -0
  318. package/.worktrees/542c4415/src/run/quick-audit.js +186 -0
  319. package/.worktrees/542c4415/src/run/scan-profile.js +269 -0
  320. package/.worktrees/542c4415/src/run/shared.js +1562 -0
  321. package/.worktrees/542c4415/src/run/stage.js +587 -0
  322. package/.worktrees/542c4415/src/run.js +23 -0
  323. package/.worktrees/542c4415/src/scan-diff.js +388 -0
  324. package/.worktrees/542c4415/src/scan-postcheck.js +524 -0
  325. package/.worktrees/542c4415/src/scan-staleness.js +95 -0
  326. package/.worktrees/542c4415/src/setup.js +414 -0
  327. package/.worktrees/542c4415/src/sillyhub-mcp/client.js +597 -0
  328. package/.worktrees/542c4415/src/sillyhub-mcp/config.js +62 -0
  329. package/.worktrees/542c4415/src/spec-dir-typo.js +50 -0
  330. package/.worktrees/542c4415/src/spec-sync.js +358 -0
  331. package/.worktrees/542c4415/src/stage-contract-engine.js +171 -0
  332. package/.worktrees/542c4415/src/stage-contract-spec.js +551 -0
  333. package/.worktrees/542c4415/src/stage-contract.js +948 -0
  334. package/.worktrees/542c4415/src/stage-review.js +597 -0
  335. package/.worktrees/542c4415/src/stages/archive.js +199 -0
  336. package/.worktrees/542c4415/src/stages/brainstorm-auto.js +285 -0
  337. package/.worktrees/542c4415/src/stages/brainstorm.js +624 -0
  338. package/.worktrees/542c4415/src/stages/cmd-existence.js +145 -0
  339. package/.worktrees/542c4415/src/stages/doctor.js +540 -0
  340. package/.worktrees/542c4415/src/stages/execute.js +1277 -0
  341. package/.worktrees/542c4415/src/stages/explore.js +43 -0
  342. package/.worktrees/542c4415/src/stages/index.js +29 -0
  343. package/.worktrees/542c4415/src/stages/knowledge.js +514 -0
  344. package/.worktrees/542c4415/src/stages/plan-postcheck.js +1398 -0
  345. package/.worktrees/542c4415/src/stages/plan.js +655 -0
  346. package/.worktrees/542c4415/src/stages/quick.js +167 -0
  347. package/.worktrees/542c4415/src/stages/scan.js +608 -0
  348. package/.worktrees/542c4415/src/stages/status.js +64 -0
  349. package/.worktrees/542c4415/src/stages/verify.js +246 -0
  350. package/.worktrees/542c4415/src/sync.js +1470 -0
  351. package/.worktrees/542c4415/src/task-review.js +1498 -0
  352. package/.worktrees/542c4415/src/taskcard-placeholders.js +21 -0
  353. package/.worktrees/542c4415/src/taskcard.js +250 -0
  354. package/.worktrees/542c4415/src/verify-postcheck.js +1718 -0
  355. package/.worktrees/542c4415/src/verify-probes.js +327 -0
  356. package/.worktrees/542c4415/src/version.js +19 -0
  357. package/.worktrees/542c4415/src/workflow.js +600 -0
  358. package/.worktrees/542c4415/src/workspace.js +125 -0
  359. package/.worktrees/542c4415/src/worktree-apply.js +1611 -0
  360. package/.worktrees/542c4415/src/worktree-deps.js +668 -0
  361. package/.worktrees/542c4415/src/worktree.js +1849 -0
  362. package/.worktrees/542c4415/templates/claude-instruction.md +23 -0
  363. package/.worktrees/542c4415/templates/prompts/taskcard-rules.md +29 -0
  364. package/.worktrees/542c4415/templates/prompts/testcase-design.md +12 -0
  365. package/.worktrees/542c4415/templates/prompts/verify-probes.md +32 -0
  366. package/.worktrees/542c4415/templates/workflows/archive-impact.yaml +79 -0
  367. package/.worktrees/542c4415/templates/workflows/scan-docs.yaml +132 -0
  368. package/.worktrees/c1eae35e/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  369. package/.worktrees/c1eae35e/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  370. package/.worktrees/c1eae35e/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  371. package/.worktrees/c1eae35e/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  372. package/.worktrees/c1eae35e/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  373. package/.worktrees/c1eae35e/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  374. package/.worktrees/c1eae35e/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  375. package/.worktrees/c1eae35e/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  376. package/.worktrees/c1eae35e/.claude/skills/sillyspec-export/SKILL.md +57 -0
  377. package/.worktrees/c1eae35e/.claude/skills/sillyspec-init/SKILL.md +177 -0
  378. package/.worktrees/c1eae35e/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  379. package/.worktrees/c1eae35e/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  380. package/.worktrees/c1eae35e/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  381. package/.worktrees/c1eae35e/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  382. package/.worktrees/c1eae35e/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  383. package/.worktrees/c1eae35e/.claude/skills/sillyspec-state/SKILL.md +64 -0
  384. package/.worktrees/c1eae35e/.claude/skills/sillyspec-status/SKILL.md +54 -0
  385. package/.worktrees/c1eae35e/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  386. package/.worktrees/c1eae35e/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  387. package/.worktrees/c1eae35e/.gitattributes +2 -0
  388. package/.worktrees/c1eae35e/.husky/pre-push +20 -0
  389. package/.worktrees/c1eae35e/README.md +203 -0
  390. package/.worktrees/c1eae35e/SKILL.md +91 -0
  391. package/.worktrees/c1eae35e/architecture-analysis.md +448 -0
  392. package/.worktrees/c1eae35e/bin/sillyspec.js +2 -0
  393. package/.worktrees/c1eae35e/eval/README.md +86 -0
  394. package/.worktrees/c1eae35e/eval/eval.config.json +28 -0
  395. package/.worktrees/c1eae35e/eval/lib/adapters/cli.mjs +63 -0
  396. package/.worktrees/c1eae35e/eval/lib/adapters/dryrun.mjs +27 -0
  397. package/.worktrees/c1eae35e/eval/lib/config.mjs +82 -0
  398. package/.worktrees/c1eae35e/eval/lib/db.mjs +76 -0
  399. package/.worktrees/c1eae35e/eval/lib/report.mjs +120 -0
  400. package/.worktrees/c1eae35e/eval/lib/runner.mjs +157 -0
  401. package/.worktrees/c1eae35e/eval/lib/tasks.mjs +73 -0
  402. package/.worktrees/c1eae35e/eval/lib/util.mjs +107 -0
  403. package/.worktrees/c1eae35e/eval/lib/workdir.mjs +30 -0
  404. package/.worktrees/c1eae35e/eval/run.mjs +83 -0
  405. package/.worktrees/c1eae35e/eval/tasks/001-slugify/files/package.json +6 -0
  406. package/.worktrees/c1eae35e/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  407. package/.worktrees/c1eae35e/eval/tasks/001-slugify/task.json +6 -0
  408. package/.worktrees/c1eae35e/eval/tasks/001-slugify/verify.mjs +28 -0
  409. package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/package.json +6 -0
  410. package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  411. package/.worktrees/c1eae35e/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  412. package/.worktrees/c1eae35e/eval/tasks/002-each-day/task.json +6 -0
  413. package/.worktrees/c1eae35e/eval/tasks/002-each-day/verify.mjs +31 -0
  414. package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  415. package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/package.json +6 -0
  416. package/.worktrees/c1eae35e/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  417. package/.worktrees/c1eae35e/eval/tasks/003-word-report/task.json +6 -0
  418. package/.worktrees/c1eae35e/eval/tasks/003-word-report/verify.mjs +38 -0
  419. package/.worktrees/c1eae35e/logo.jpg +0 -0
  420. package/.worktrees/c1eae35e/package-lock.json +977 -0
  421. package/.worktrees/c1eae35e/package.json +41 -0
  422. package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  423. package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  424. package/.worktrees/c1eae35e/packages/dashboard/dist/favicon.jpg +0 -0
  425. package/.worktrees/c1eae35e/packages/dashboard/dist/index.html +16 -0
  426. package/.worktrees/c1eae35e/packages/dashboard/dist/logo.jpg +0 -0
  427. package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-dashboard.html +836 -0
  428. package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-overview.html +256 -0
  429. package/.worktrees/c1eae35e/packages/dashboard/package.json +25 -0
  430. package/.worktrees/c1eae35e/packages/dashboard/server/executor.js +95 -0
  431. package/.worktrees/c1eae35e/packages/dashboard/server/index.js +679 -0
  432. package/.worktrees/c1eae35e/packages/dashboard/server/parser.js +526 -0
  433. package/.worktrees/c1eae35e/packages/dashboard/server/watcher.js +357 -0
  434. package/.worktrees/c1eae35e/src/agent-session-log.js +803 -0
  435. package/.worktrees/c1eae35e/src/change-list.js +290 -0
  436. package/.worktrees/c1eae35e/src/change-risk-profile.js +339 -0
  437. package/.worktrees/c1eae35e/src/check-primitives.js +65 -0
  438. package/.worktrees/c1eae35e/src/classify-change.js +109 -0
  439. package/.worktrees/c1eae35e/src/commit-suggest.js +202 -0
  440. package/.worktrees/c1eae35e/src/config-cat.js +88 -0
  441. package/.worktrees/c1eae35e/src/config-schema.js +328 -0
  442. package/.worktrees/c1eae35e/src/constants.js +97 -0
  443. package/.worktrees/c1eae35e/src/contract-matrix.js +533 -0
  444. package/.worktrees/c1eae35e/src/datetime.js +20 -0
  445. package/.worktrees/c1eae35e/src/db-engine.js +55 -0
  446. package/.worktrees/c1eae35e/src/db.js +381 -0
  447. package/.worktrees/c1eae35e/src/decision-distill.js +517 -0
  448. package/.worktrees/c1eae35e/src/dispatch/backends/local-agent.js +155 -0
  449. package/.worktrees/c1eae35e/src/dispatch/backends/sillyhub-mcp.js +245 -0
  450. package/.worktrees/c1eae35e/src/dispatch/probe.js +246 -0
  451. package/.worktrees/c1eae35e/src/dispatch/strategy.js +121 -0
  452. package/.worktrees/c1eae35e/src/docs-check.js +825 -0
  453. package/.worktrees/c1eae35e/src/docs-debt.js +393 -0
  454. package/.worktrees/c1eae35e/src/docs-gate.js +107 -0
  455. package/.worktrees/c1eae35e/src/doctor-diagnostics.js +1099 -0
  456. package/.worktrees/c1eae35e/src/endpoint-extractor.js +409 -0
  457. package/.worktrees/c1eae35e/src/foreign-declared.js +155 -0
  458. package/.worktrees/c1eae35e/src/fs-atomic.js +73 -0
  459. package/.worktrees/c1eae35e/src/git-helper.js +150 -0
  460. package/.worktrees/c1eae35e/src/hooks/claude-pre-tool-use.cjs +130 -0
  461. package/.worktrees/c1eae35e/src/hooks/worktree-guard.js +892 -0
  462. package/.worktrees/c1eae35e/src/index.js +2854 -0
  463. package/.worktrees/c1eae35e/src/init.js +626 -0
  464. package/.worktrees/c1eae35e/src/knowledge-match.js +231 -0
  465. package/.worktrees/c1eae35e/src/local-detect.js +128 -0
  466. package/.worktrees/c1eae35e/src/local-register.js +104 -0
  467. package/.worktrees/c1eae35e/src/machine-interface.js +543 -0
  468. package/.worktrees/c1eae35e/src/migrate.js +127 -0
  469. package/.worktrees/c1eae35e/src/module-impact.js +166 -0
  470. package/.worktrees/c1eae35e/src/module-resolve.js +222 -0
  471. package/.worktrees/c1eae35e/src/modules.js +580 -0
  472. package/.worktrees/c1eae35e/src/plan-adopt-waves.js +126 -0
  473. package/.worktrees/c1eae35e/src/progress/change-registry.js +336 -0
  474. package/.worktrees/c1eae35e/src/progress/consistency-doctor.js +355 -0
  475. package/.worktrees/c1eae35e/src/progress/shared.js +36 -0
  476. package/.worktrees/c1eae35e/src/progress/stage-machine.js +594 -0
  477. package/.worktrees/c1eae35e/src/progress/step-store.js +265 -0
  478. package/.worktrees/c1eae35e/src/progress.js +1304 -0
  479. package/.worktrees/c1eae35e/src/quick-recommend.js +115 -0
  480. package/.worktrees/c1eae35e/src/quicklog.js +883 -0
  481. package/.worktrees/c1eae35e/src/review-tier.js +77 -0
  482. package/.worktrees/c1eae35e/src/run/command.js +1641 -0
  483. package/.worktrees/c1eae35e/src/run/complete-handlers.js +1552 -0
  484. package/.worktrees/c1eae35e/src/run/complete.js +1259 -0
  485. package/.worktrees/c1eae35e/src/run/concurrent-detect.js +156 -0
  486. package/.worktrees/c1eae35e/src/run/gates.js +1111 -0
  487. package/.worktrees/c1eae35e/src/run/multi-repo-context.js +208 -0
  488. package/.worktrees/c1eae35e/src/run/next.js +128 -0
  489. package/.worktrees/c1eae35e/src/run/prompt.js +843 -0
  490. package/.worktrees/c1eae35e/src/run/quick-audit.js +186 -0
  491. package/.worktrees/c1eae35e/src/run/scan-profile.js +269 -0
  492. package/.worktrees/c1eae35e/src/run/shared.js +1562 -0
  493. package/.worktrees/c1eae35e/src/run/stage.js +587 -0
  494. package/.worktrees/c1eae35e/src/run.js +23 -0
  495. package/.worktrees/c1eae35e/src/scan-diff.js +388 -0
  496. package/.worktrees/c1eae35e/src/scan-postcheck.js +524 -0
  497. package/.worktrees/c1eae35e/src/scan-staleness.js +95 -0
  498. package/.worktrees/c1eae35e/src/setup.js +414 -0
  499. package/.worktrees/c1eae35e/src/sillyhub-mcp/client.js +597 -0
  500. package/.worktrees/c1eae35e/src/sillyhub-mcp/config.js +62 -0
  501. package/.worktrees/c1eae35e/src/spec-dir-typo.js +50 -0
  502. package/.worktrees/c1eae35e/src/spec-sync.js +358 -0
  503. package/.worktrees/c1eae35e/src/stage-contract-engine.js +171 -0
  504. package/.worktrees/c1eae35e/src/stage-contract-spec.js +551 -0
  505. package/.worktrees/c1eae35e/src/stage-contract.js +948 -0
  506. package/.worktrees/c1eae35e/src/stage-review.js +597 -0
  507. package/.worktrees/c1eae35e/src/stages/archive.js +199 -0
  508. package/.worktrees/c1eae35e/src/stages/brainstorm-auto.js +285 -0
  509. package/.worktrees/c1eae35e/src/stages/brainstorm.js +624 -0
  510. package/.worktrees/c1eae35e/src/stages/cmd-existence.js +145 -0
  511. package/.worktrees/c1eae35e/src/stages/doctor.js +540 -0
  512. package/.worktrees/c1eae35e/src/stages/execute.js +1277 -0
  513. package/.worktrees/c1eae35e/src/stages/explore.js +43 -0
  514. package/.worktrees/c1eae35e/src/stages/index.js +29 -0
  515. package/.worktrees/c1eae35e/src/stages/knowledge.js +514 -0
  516. package/.worktrees/c1eae35e/src/stages/plan-postcheck.js +1398 -0
  517. package/.worktrees/c1eae35e/src/stages/plan.js +655 -0
  518. package/.worktrees/c1eae35e/src/stages/quick.js +167 -0
  519. package/.worktrees/c1eae35e/src/stages/scan.js +608 -0
  520. package/.worktrees/c1eae35e/src/stages/status.js +64 -0
  521. package/.worktrees/c1eae35e/src/stages/verify.js +246 -0
  522. package/.worktrees/c1eae35e/src/sync.js +1470 -0
  523. package/.worktrees/c1eae35e/src/task-review.js +1498 -0
  524. package/.worktrees/c1eae35e/src/taskcard-placeholders.js +21 -0
  525. package/.worktrees/c1eae35e/src/taskcard.js +250 -0
  526. package/.worktrees/c1eae35e/src/verify-postcheck.js +1718 -0
  527. package/.worktrees/c1eae35e/src/verify-probes.js +327 -0
  528. package/.worktrees/c1eae35e/src/version.js +19 -0
  529. package/.worktrees/c1eae35e/src/workflow.js +600 -0
  530. package/.worktrees/c1eae35e/src/workspace.js +125 -0
  531. package/.worktrees/c1eae35e/src/worktree-apply.js +1611 -0
  532. package/.worktrees/c1eae35e/src/worktree-deps.js +668 -0
  533. package/.worktrees/c1eae35e/src/worktree.js +1849 -0
  534. package/.worktrees/c1eae35e/templates/claude-instruction.md +23 -0
  535. package/.worktrees/c1eae35e/templates/prompts/taskcard-rules.md +29 -0
  536. package/.worktrees/c1eae35e/templates/prompts/testcase-design.md +12 -0
  537. package/.worktrees/c1eae35e/templates/prompts/verify-probes.md +32 -0
  538. package/.worktrees/c1eae35e/templates/workflows/archive-impact.yaml +79 -0
  539. package/.worktrees/c1eae35e/templates/workflows/scan-docs.yaml +132 -0
  540. package/.worktrees/dafc71ad/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  541. package/.worktrees/dafc71ad/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  542. package/.worktrees/dafc71ad/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  543. package/.worktrees/dafc71ad/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  544. package/.worktrees/dafc71ad/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  545. package/.worktrees/dafc71ad/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  546. package/.worktrees/dafc71ad/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  547. package/.worktrees/dafc71ad/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  548. package/.worktrees/dafc71ad/.claude/skills/sillyspec-export/SKILL.md +57 -0
  549. package/.worktrees/dafc71ad/.claude/skills/sillyspec-init/SKILL.md +177 -0
  550. package/.worktrees/dafc71ad/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  551. package/.worktrees/dafc71ad/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  552. package/.worktrees/dafc71ad/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  553. package/.worktrees/dafc71ad/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  554. package/.worktrees/dafc71ad/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  555. package/.worktrees/dafc71ad/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  556. package/.worktrees/dafc71ad/.claude/skills/sillyspec-state/SKILL.md +64 -0
  557. package/.worktrees/dafc71ad/.claude/skills/sillyspec-status/SKILL.md +54 -0
  558. package/.worktrees/dafc71ad/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  559. package/.worktrees/dafc71ad/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  560. package/.worktrees/dafc71ad/.gitattributes +2 -0
  561. package/.worktrees/dafc71ad/.husky/pre-push +20 -0
  562. package/.worktrees/dafc71ad/README.md +203 -0
  563. package/.worktrees/dafc71ad/SKILL.md +91 -0
  564. package/.worktrees/dafc71ad/analysis.md +366 -0
  565. package/.worktrees/dafc71ad/architecture-analysis.md +448 -0
  566. package/.worktrees/dafc71ad/bin/sillyspec.js +2 -0
  567. package/.worktrees/dafc71ad/eval/README.md +86 -0
  568. package/.worktrees/dafc71ad/eval/eval.config.json +28 -0
  569. package/.worktrees/dafc71ad/eval/lib/adapters/cli.mjs +63 -0
  570. package/.worktrees/dafc71ad/eval/lib/adapters/dryrun.mjs +27 -0
  571. package/.worktrees/dafc71ad/eval/lib/config.mjs +82 -0
  572. package/.worktrees/dafc71ad/eval/lib/db.mjs +76 -0
  573. package/.worktrees/dafc71ad/eval/lib/report.mjs +120 -0
  574. package/.worktrees/dafc71ad/eval/lib/runner.mjs +157 -0
  575. package/.worktrees/dafc71ad/eval/lib/tasks.mjs +73 -0
  576. package/.worktrees/dafc71ad/eval/lib/util.mjs +107 -0
  577. package/.worktrees/dafc71ad/eval/lib/workdir.mjs +30 -0
  578. package/.worktrees/dafc71ad/eval/run.mjs +83 -0
  579. package/.worktrees/dafc71ad/eval/tasks/001-slugify/files/package.json +6 -0
  580. package/.worktrees/dafc71ad/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  581. package/.worktrees/dafc71ad/eval/tasks/001-slugify/task.json +6 -0
  582. package/.worktrees/dafc71ad/eval/tasks/001-slugify/verify.mjs +28 -0
  583. package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/package.json +6 -0
  584. package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  585. package/.worktrees/dafc71ad/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  586. package/.worktrees/dafc71ad/eval/tasks/002-each-day/task.json +6 -0
  587. package/.worktrees/dafc71ad/eval/tasks/002-each-day/verify.mjs +31 -0
  588. package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  589. package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/package.json +6 -0
  590. package/.worktrees/dafc71ad/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  591. package/.worktrees/dafc71ad/eval/tasks/003-word-report/task.json +6 -0
  592. package/.worktrees/dafc71ad/eval/tasks/003-word-report/verify.mjs +38 -0
  593. package/.worktrees/dafc71ad/logo.jpg +0 -0
  594. package/.worktrees/dafc71ad/package-lock.json +977 -0
  595. package/.worktrees/dafc71ad/package.json +41 -0
  596. package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  597. package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  598. package/.worktrees/dafc71ad/packages/dashboard/dist/favicon.jpg +0 -0
  599. package/.worktrees/dafc71ad/packages/dashboard/dist/index.html +16 -0
  600. package/.worktrees/dafc71ad/packages/dashboard/dist/logo.jpg +0 -0
  601. package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-dashboard.html +836 -0
  602. package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-overview.html +256 -0
  603. package/.worktrees/dafc71ad/packages/dashboard/package.json +25 -0
  604. package/.worktrees/dafc71ad/packages/dashboard/server/executor.js +95 -0
  605. package/.worktrees/dafc71ad/packages/dashboard/server/index.js +679 -0
  606. package/.worktrees/dafc71ad/packages/dashboard/server/parser.js +526 -0
  607. package/.worktrees/dafc71ad/packages/dashboard/server/watcher.js +357 -0
  608. package/.worktrees/dafc71ad/src/agent-session-log.js +803 -0
  609. package/.worktrees/dafc71ad/src/change-list.js +290 -0
  610. package/.worktrees/dafc71ad/src/change-risk-profile.js +339 -0
  611. package/.worktrees/dafc71ad/src/check-primitives.js +65 -0
  612. package/.worktrees/dafc71ad/src/classify-change.js +109 -0
  613. package/.worktrees/dafc71ad/src/commit-suggest.js +202 -0
  614. package/.worktrees/dafc71ad/src/config-cat.js +88 -0
  615. package/.worktrees/dafc71ad/src/config-schema.js +328 -0
  616. package/.worktrees/dafc71ad/src/constants.js +97 -0
  617. package/.worktrees/dafc71ad/src/contract-matrix.js +533 -0
  618. package/.worktrees/dafc71ad/src/datetime.js +20 -0
  619. package/.worktrees/dafc71ad/src/db-engine.js +55 -0
  620. package/.worktrees/dafc71ad/src/db.js +381 -0
  621. package/.worktrees/dafc71ad/src/decision-distill.js +517 -0
  622. package/.worktrees/dafc71ad/src/dispatch/backends/local-agent.js +155 -0
  623. package/.worktrees/dafc71ad/src/dispatch/backends/sillyhub-mcp.js +245 -0
  624. package/.worktrees/dafc71ad/src/dispatch/probe.js +246 -0
  625. package/.worktrees/dafc71ad/src/dispatch/strategy.js +121 -0
  626. package/.worktrees/dafc71ad/src/docs-check.js +825 -0
  627. package/.worktrees/dafc71ad/src/docs-debt.js +393 -0
  628. package/.worktrees/dafc71ad/src/docs-gate.js +107 -0
  629. package/.worktrees/dafc71ad/src/doctor-diagnostics.js +1099 -0
  630. package/.worktrees/dafc71ad/src/endpoint-extractor.js +409 -0
  631. package/.worktrees/dafc71ad/src/foreign-declared.js +155 -0
  632. package/.worktrees/dafc71ad/src/fs-atomic.js +73 -0
  633. package/.worktrees/dafc71ad/src/git-helper.js +150 -0
  634. package/.worktrees/dafc71ad/src/hooks/claude-pre-tool-use.cjs +130 -0
  635. package/.worktrees/dafc71ad/src/hooks/worktree-guard.js +892 -0
  636. package/.worktrees/dafc71ad/src/index.js +2854 -0
  637. package/.worktrees/dafc71ad/src/init.js +626 -0
  638. package/.worktrees/dafc71ad/src/knowledge-match.js +231 -0
  639. package/.worktrees/dafc71ad/src/local-detect.js +128 -0
  640. package/.worktrees/dafc71ad/src/local-register.js +104 -0
  641. package/.worktrees/dafc71ad/src/machine-interface.js +543 -0
  642. package/.worktrees/dafc71ad/src/migrate.js +127 -0
  643. package/.worktrees/dafc71ad/src/module-impact.js +166 -0
  644. package/.worktrees/dafc71ad/src/module-resolve.js +222 -0
  645. package/.worktrees/dafc71ad/src/modules.js +580 -0
  646. package/.worktrees/dafc71ad/src/plan-adopt-waves.js +126 -0
  647. package/.worktrees/dafc71ad/src/progress/change-registry.js +336 -0
  648. package/.worktrees/dafc71ad/src/progress/consistency-doctor.js +355 -0
  649. package/.worktrees/dafc71ad/src/progress/shared.js +36 -0
  650. package/.worktrees/dafc71ad/src/progress/stage-machine.js +594 -0
  651. package/.worktrees/dafc71ad/src/progress/step-store.js +265 -0
  652. package/.worktrees/dafc71ad/src/progress.js +1304 -0
  653. package/.worktrees/dafc71ad/src/quick-recommend.js +115 -0
  654. package/.worktrees/dafc71ad/src/quicklog.js +883 -0
  655. package/.worktrees/dafc71ad/src/review-tier.js +77 -0
  656. package/.worktrees/dafc71ad/src/run/command.js +1641 -0
  657. package/.worktrees/dafc71ad/src/run/complete-handlers.js +1552 -0
  658. package/.worktrees/dafc71ad/src/run/complete.js +1259 -0
  659. package/.worktrees/dafc71ad/src/run/concurrent-detect.js +156 -0
  660. package/.worktrees/dafc71ad/src/run/gates.js +1111 -0
  661. package/.worktrees/dafc71ad/src/run/multi-repo-context.js +208 -0
  662. package/.worktrees/dafc71ad/src/run/next.js +128 -0
  663. package/.worktrees/dafc71ad/src/run/prompt.js +843 -0
  664. package/.worktrees/dafc71ad/src/run/quick-audit.js +186 -0
  665. package/.worktrees/dafc71ad/src/run/scan-profile.js +269 -0
  666. package/.worktrees/dafc71ad/src/run/shared.js +1562 -0
  667. package/.worktrees/dafc71ad/src/run/stage.js +587 -0
  668. package/.worktrees/dafc71ad/src/run.js +23 -0
  669. package/.worktrees/dafc71ad/src/scan-diff.js +388 -0
  670. package/.worktrees/dafc71ad/src/scan-postcheck.js +524 -0
  671. package/.worktrees/dafc71ad/src/scan-staleness.js +95 -0
  672. package/.worktrees/dafc71ad/src/setup.js +414 -0
  673. package/.worktrees/dafc71ad/src/sillyhub-mcp/client.js +597 -0
  674. package/.worktrees/dafc71ad/src/sillyhub-mcp/config.js +62 -0
  675. package/.worktrees/dafc71ad/src/spec-dir-typo.js +50 -0
  676. package/.worktrees/dafc71ad/src/spec-sync.js +358 -0
  677. package/.worktrees/dafc71ad/src/stage-contract-engine.js +171 -0
  678. package/.worktrees/dafc71ad/src/stage-contract-spec.js +551 -0
  679. package/.worktrees/dafc71ad/src/stage-contract.js +948 -0
  680. package/.worktrees/dafc71ad/src/stage-review.js +597 -0
  681. package/.worktrees/dafc71ad/src/stages/archive.js +199 -0
  682. package/.worktrees/dafc71ad/src/stages/brainstorm-auto.js +285 -0
  683. package/.worktrees/dafc71ad/src/stages/brainstorm.js +624 -0
  684. package/.worktrees/dafc71ad/src/stages/cmd-existence.js +145 -0
  685. package/.worktrees/dafc71ad/src/stages/doctor.js +540 -0
  686. package/.worktrees/dafc71ad/src/stages/execute.js +1277 -0
  687. package/.worktrees/dafc71ad/src/stages/explore.js +43 -0
  688. package/.worktrees/dafc71ad/src/stages/index.js +29 -0
  689. package/.worktrees/dafc71ad/src/stages/knowledge.js +514 -0
  690. package/.worktrees/dafc71ad/src/stages/plan-postcheck.js +1398 -0
  691. package/.worktrees/dafc71ad/src/stages/plan.js +655 -0
  692. package/.worktrees/dafc71ad/src/stages/quick.js +167 -0
  693. package/.worktrees/dafc71ad/src/stages/scan.js +608 -0
  694. package/.worktrees/dafc71ad/src/stages/status.js +64 -0
  695. package/.worktrees/dafc71ad/src/stages/verify.js +246 -0
  696. package/.worktrees/dafc71ad/src/sync.js +1470 -0
  697. package/.worktrees/dafc71ad/src/task-review.js +1498 -0
  698. package/.worktrees/dafc71ad/src/taskcard-placeholders.js +21 -0
  699. package/.worktrees/dafc71ad/src/taskcard.js +250 -0
  700. package/.worktrees/dafc71ad/src/verify-postcheck.js +1718 -0
  701. package/.worktrees/dafc71ad/src/verify-probes.js +327 -0
  702. package/.worktrees/dafc71ad/src/version.js +19 -0
  703. package/.worktrees/dafc71ad/src/workflow.js +600 -0
  704. package/.worktrees/dafc71ad/src/workspace.js +125 -0
  705. package/.worktrees/dafc71ad/src/worktree-apply.js +1611 -0
  706. package/.worktrees/dafc71ad/src/worktree-deps.js +668 -0
  707. package/.worktrees/dafc71ad/src/worktree.js +1849 -0
  708. package/.worktrees/dafc71ad/templates/claude-instruction.md +23 -0
  709. package/.worktrees/dafc71ad/templates/prompts/taskcard-rules.md +29 -0
  710. package/.worktrees/dafc71ad/templates/prompts/testcase-design.md +12 -0
  711. package/.worktrees/dafc71ad/templates/prompts/verify-probes.md +32 -0
  712. package/.worktrees/dafc71ad/templates/workflows/archive-impact.yaml +79 -0
  713. package/.worktrees/dafc71ad/templates/workflows/scan-docs.yaml +132 -0
  714. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  715. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-auto/SKILL.md +93 -0
  716. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  717. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  718. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-continue/SKILL.md +47 -0
  719. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  720. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-execute/SKILL.md +214 -0
  721. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-explore/SKILL.md +102 -0
  722. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-export/SKILL.md +57 -0
  723. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-init/SKILL.md +177 -0
  724. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
  725. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  726. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-propose/SKILL.md +87 -0
  727. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  728. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-resume/SKILL.md +70 -0
  729. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  730. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-state/SKILL.md +64 -0
  731. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-status/SKILL.md +54 -0
  732. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  733. package/.worktrees/e58fcc4c/.claude/skills/sillyspec-workspace/SKILL.md +175 -0
  734. package/.worktrees/e58fcc4c/.gitattributes +2 -0
  735. package/.worktrees/e58fcc4c/.husky/pre-push +20 -0
  736. package/.worktrees/e58fcc4c/README.md +203 -0
  737. package/.worktrees/e58fcc4c/SKILL.md +91 -0
  738. package/.worktrees/e58fcc4c/architecture-analysis.md +503 -0
  739. package/.worktrees/e58fcc4c/bin/sillyspec.js +2 -0
  740. package/.worktrees/e58fcc4c/eval/README.md +86 -0
  741. package/.worktrees/e58fcc4c/eval/eval.config.json +28 -0
  742. package/.worktrees/e58fcc4c/eval/lib/adapters/cli.mjs +63 -0
  743. package/.worktrees/e58fcc4c/eval/lib/adapters/dryrun.mjs +27 -0
  744. package/.worktrees/e58fcc4c/eval/lib/config.mjs +82 -0
  745. package/.worktrees/e58fcc4c/eval/lib/db.mjs +76 -0
  746. package/.worktrees/e58fcc4c/eval/lib/report.mjs +120 -0
  747. package/.worktrees/e58fcc4c/eval/lib/runner.mjs +157 -0
  748. package/.worktrees/e58fcc4c/eval/lib/tasks.mjs +73 -0
  749. package/.worktrees/e58fcc4c/eval/lib/util.mjs +107 -0
  750. package/.worktrees/e58fcc4c/eval/lib/workdir.mjs +30 -0
  751. package/.worktrees/e58fcc4c/eval/run.mjs +83 -0
  752. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/files/package.json +6 -0
  753. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/solution/src/slugify.mjs +26 -0
  754. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/task.json +6 -0
  755. package/.worktrees/e58fcc4c/eval/tasks/001-slugify/verify.mjs +28 -0
  756. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/package.json +6 -0
  757. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/src/dates.mjs +4 -0
  758. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/solution/src/dates.mjs +30 -0
  759. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/task.json +6 -0
  760. package/.worktrees/e58fcc4c/eval/tasks/002-each-day/verify.mjs +31 -0
  761. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/data/notes.txt +5 -0
  762. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/package.json +6 -0
  763. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/solution/bin/report.mjs +36 -0
  764. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/task.json +6 -0
  765. package/.worktrees/e58fcc4c/eval/tasks/003-word-report/verify.mjs +38 -0
  766. package/.worktrees/e58fcc4c/logo.jpg +0 -0
  767. package/.worktrees/e58fcc4c/package-lock.json +977 -0
  768. package/.worktrees/e58fcc4c/package.json +41 -0
  769. package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -0
  770. package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
  771. package/.worktrees/e58fcc4c/packages/dashboard/dist/favicon.jpg +0 -0
  772. package/.worktrees/e58fcc4c/packages/dashboard/dist/index.html +16 -0
  773. package/.worktrees/e58fcc4c/packages/dashboard/dist/logo.jpg +0 -0
  774. package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-dashboard.html +836 -0
  775. package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-overview.html +256 -0
  776. package/.worktrees/e58fcc4c/packages/dashboard/package.json +25 -0
  777. package/.worktrees/e58fcc4c/packages/dashboard/server/executor.js +95 -0
  778. package/.worktrees/e58fcc4c/packages/dashboard/server/index.js +679 -0
  779. package/.worktrees/e58fcc4c/packages/dashboard/server/parser.js +526 -0
  780. package/.worktrees/e58fcc4c/packages/dashboard/server/watcher.js +357 -0
  781. package/.worktrees/e58fcc4c/src/agent-session-log.js +803 -0
  782. package/.worktrees/e58fcc4c/src/change-list.js +290 -0
  783. package/.worktrees/e58fcc4c/src/change-risk-profile.js +339 -0
  784. package/.worktrees/e58fcc4c/src/check-primitives.js +65 -0
  785. package/.worktrees/e58fcc4c/src/classify-change.js +109 -0
  786. package/.worktrees/e58fcc4c/src/commit-suggest.js +202 -0
  787. package/.worktrees/e58fcc4c/src/config-cat.js +88 -0
  788. package/.worktrees/e58fcc4c/src/config-schema.js +328 -0
  789. package/.worktrees/e58fcc4c/src/constants.js +97 -0
  790. package/.worktrees/e58fcc4c/src/contract-matrix.js +533 -0
  791. package/.worktrees/e58fcc4c/src/datetime.js +20 -0
  792. package/.worktrees/e58fcc4c/src/db-engine.js +55 -0
  793. package/.worktrees/e58fcc4c/src/db.js +381 -0
  794. package/.worktrees/e58fcc4c/src/decision-distill.js +517 -0
  795. package/.worktrees/e58fcc4c/src/dispatch/backends/local-agent.js +155 -0
  796. package/.worktrees/e58fcc4c/src/dispatch/backends/sillyhub-mcp.js +245 -0
  797. package/.worktrees/e58fcc4c/src/dispatch/probe.js +246 -0
  798. package/.worktrees/e58fcc4c/src/dispatch/strategy.js +121 -0
  799. package/.worktrees/e58fcc4c/src/docs-check.js +825 -0
  800. package/.worktrees/e58fcc4c/src/docs-debt.js +393 -0
  801. package/.worktrees/e58fcc4c/src/docs-gate.js +107 -0
  802. package/.worktrees/e58fcc4c/src/doctor-diagnostics.js +1099 -0
  803. package/.worktrees/e58fcc4c/src/endpoint-extractor.js +409 -0
  804. package/.worktrees/e58fcc4c/src/foreign-declared.js +155 -0
  805. package/.worktrees/e58fcc4c/src/fs-atomic.js +73 -0
  806. package/.worktrees/e58fcc4c/src/git-helper.js +150 -0
  807. package/.worktrees/e58fcc4c/src/hooks/claude-pre-tool-use.cjs +130 -0
  808. package/.worktrees/e58fcc4c/src/hooks/worktree-guard.js +892 -0
  809. package/.worktrees/e58fcc4c/src/index.js +2854 -0
  810. package/.worktrees/e58fcc4c/src/init.js +626 -0
  811. package/.worktrees/e58fcc4c/src/knowledge-match.js +231 -0
  812. package/.worktrees/e58fcc4c/src/local-detect.js +128 -0
  813. package/.worktrees/e58fcc4c/src/local-register.js +104 -0
  814. package/.worktrees/e58fcc4c/src/machine-interface.js +543 -0
  815. package/.worktrees/e58fcc4c/src/migrate.js +127 -0
  816. package/.worktrees/e58fcc4c/src/module-impact.js +166 -0
  817. package/.worktrees/e58fcc4c/src/module-resolve.js +222 -0
  818. package/.worktrees/e58fcc4c/src/modules.js +580 -0
  819. package/.worktrees/e58fcc4c/src/plan-adopt-waves.js +126 -0
  820. package/.worktrees/e58fcc4c/src/progress/change-registry.js +336 -0
  821. package/.worktrees/e58fcc4c/src/progress/consistency-doctor.js +355 -0
  822. package/.worktrees/e58fcc4c/src/progress/shared.js +36 -0
  823. package/.worktrees/e58fcc4c/src/progress/stage-machine.js +594 -0
  824. package/.worktrees/e58fcc4c/src/progress/step-store.js +265 -0
  825. package/.worktrees/e58fcc4c/src/progress.js +1304 -0
  826. package/.worktrees/e58fcc4c/src/quick-recommend.js +115 -0
  827. package/.worktrees/e58fcc4c/src/quicklog.js +883 -0
  828. package/.worktrees/e58fcc4c/src/review-tier.js +77 -0
  829. package/.worktrees/e58fcc4c/src/run/command.js +1641 -0
  830. package/.worktrees/e58fcc4c/src/run/complete-handlers.js +1552 -0
  831. package/.worktrees/e58fcc4c/src/run/complete.js +1259 -0
  832. package/.worktrees/e58fcc4c/src/run/concurrent-detect.js +156 -0
  833. package/.worktrees/e58fcc4c/src/run/gates.js +1111 -0
  834. package/.worktrees/e58fcc4c/src/run/multi-repo-context.js +208 -0
  835. package/.worktrees/e58fcc4c/src/run/next.js +128 -0
  836. package/.worktrees/e58fcc4c/src/run/prompt.js +843 -0
  837. package/.worktrees/e58fcc4c/src/run/quick-audit.js +186 -0
  838. package/.worktrees/e58fcc4c/src/run/scan-profile.js +269 -0
  839. package/.worktrees/e58fcc4c/src/run/shared.js +1562 -0
  840. package/.worktrees/e58fcc4c/src/run/stage.js +587 -0
  841. package/.worktrees/e58fcc4c/src/run.js +23 -0
  842. package/.worktrees/e58fcc4c/src/scan-diff.js +388 -0
  843. package/.worktrees/e58fcc4c/src/scan-postcheck.js +524 -0
  844. package/.worktrees/e58fcc4c/src/scan-staleness.js +95 -0
  845. package/.worktrees/e58fcc4c/src/setup.js +414 -0
  846. package/.worktrees/e58fcc4c/src/sillyhub-mcp/client.js +597 -0
  847. package/.worktrees/e58fcc4c/src/sillyhub-mcp/config.js +62 -0
  848. package/.worktrees/e58fcc4c/src/spec-dir-typo.js +50 -0
  849. package/.worktrees/e58fcc4c/src/spec-sync.js +358 -0
  850. package/.worktrees/e58fcc4c/src/stage-contract-engine.js +171 -0
  851. package/.worktrees/e58fcc4c/src/stage-contract-spec.js +551 -0
  852. package/.worktrees/e58fcc4c/src/stage-contract.js +948 -0
  853. package/.worktrees/e58fcc4c/src/stage-review.js +597 -0
  854. package/.worktrees/e58fcc4c/src/stages/archive.js +199 -0
  855. package/.worktrees/e58fcc4c/src/stages/brainstorm-auto.js +285 -0
  856. package/.worktrees/e58fcc4c/src/stages/brainstorm.js +624 -0
  857. package/.worktrees/e58fcc4c/src/stages/cmd-existence.js +145 -0
  858. package/.worktrees/e58fcc4c/src/stages/doctor.js +540 -0
  859. package/.worktrees/e58fcc4c/src/stages/execute.js +1277 -0
  860. package/.worktrees/e58fcc4c/src/stages/explore.js +43 -0
  861. package/.worktrees/e58fcc4c/src/stages/index.js +29 -0
  862. package/.worktrees/e58fcc4c/src/stages/knowledge.js +514 -0
  863. package/.worktrees/e58fcc4c/src/stages/plan-postcheck.js +1398 -0
  864. package/.worktrees/e58fcc4c/src/stages/plan.js +655 -0
  865. package/.worktrees/e58fcc4c/src/stages/quick.js +167 -0
  866. package/.worktrees/e58fcc4c/src/stages/scan.js +608 -0
  867. package/.worktrees/e58fcc4c/src/stages/status.js +64 -0
  868. package/.worktrees/e58fcc4c/src/stages/verify.js +246 -0
  869. package/.worktrees/e58fcc4c/src/sync.js +1470 -0
  870. package/.worktrees/e58fcc4c/src/task-review.js +1498 -0
  871. package/.worktrees/e58fcc4c/src/taskcard-placeholders.js +21 -0
  872. package/.worktrees/e58fcc4c/src/taskcard.js +250 -0
  873. package/.worktrees/e58fcc4c/src/verify-postcheck.js +1718 -0
  874. package/.worktrees/e58fcc4c/src/verify-probes.js +327 -0
  875. package/.worktrees/e58fcc4c/src/version.js +19 -0
  876. package/.worktrees/e58fcc4c/src/workflow.js +600 -0
  877. package/.worktrees/e58fcc4c/src/workspace.js +125 -0
  878. package/.worktrees/e58fcc4c/src/worktree-apply.js +1611 -0
  879. package/.worktrees/e58fcc4c/src/worktree-deps.js +668 -0
  880. package/.worktrees/e58fcc4c/src/worktree.js +1849 -0
  881. package/.worktrees/e58fcc4c/templates/claude-instruction.md +23 -0
  882. package/.worktrees/e58fcc4c/templates/prompts/taskcard-rules.md +29 -0
  883. package/.worktrees/e58fcc4c/templates/prompts/testcase-design.md +12 -0
  884. package/.worktrees/e58fcc4c/templates/prompts/verify-probes.md +32 -0
  885. package/.worktrees/e58fcc4c/templates/workflows/archive-impact.yaml +79 -0
  886. package/.worktrees/e58fcc4c/templates/workflows/scan-docs.yaml +132 -0
  887. package/package.json +1 -1
  888. package/src/contract-matrix.js +45 -14
  889. package/src/foreign-declared.js +11 -5
  890. package/src/fs-atomic.js +20 -3
  891. package/src/hooks/worktree-guard.js +9 -3
  892. package/src/index.js +52 -12
  893. package/src/module-impact.js +1 -1
  894. package/src/modules.js +23 -21
  895. package/src/progress/stage-machine.js +26 -1
  896. package/src/progress.js +38 -2
  897. package/src/quicklog.js +7 -5
  898. package/src/run/command.js +51 -20
  899. package/src/run/complete-handlers.js +26 -2
  900. package/src/run/complete.js +43 -21
  901. package/src/run/gates.js +52 -7
  902. package/src/run/multi-repo-context.js +42 -4
  903. package/src/run/next.js +4 -3
  904. package/src/run/prompt.js +66 -6
  905. package/src/run/scan-profile.js +1 -0
  906. package/src/run/shared.js +12 -6
  907. package/src/run/stage.js +35 -9
  908. package/src/scan-diff.js +4 -2
  909. package/src/stage-contract.js +36 -15
  910. package/src/stages/brainstorm.js +22 -8
  911. package/src/stages/execute.js +69 -22
  912. package/src/stages/knowledge.js +18 -5
  913. package/src/stages/plan-postcheck.js +63 -7
  914. package/src/stages/plan.js +13 -2
  915. package/src/sync.js +27 -11
  916. package/src/task-review.js +12 -3
  917. package/src/taskcard.js +2 -0
  918. package/src/verify-postcheck.js +24 -13
  919. package/src/verify-probes.js +12 -7
  920. package/src/worktree-apply.js +234 -18
  921. package/src/worktree-cross.js +294 -0
  922. package/src/worktree-deps.js +157 -59
  923. package/src/worktree.js +7 -2
@@ -0,0 +1,290 @@
1
+ import { readFileSync, existsSync } from 'fs'
2
+
3
+ /**
4
+ * 路径项归一化:去反引号、去行内括号注释(`src/foo.js (新增)` / `src/foo.js(说明)`)、
5
+ * 统一为正斜杠、去首尾空白与尾部斜杠。
6
+ * design 清单 cell 与 task allowed_paths 共用此归一化(两处写法都可能带注释/反引号)。
7
+ * @param {string} raw
8
+ * @returns {string}
9
+ */
10
+ export function normalizePath(raw) {
11
+ if (!raw) return ''
12
+ return raw
13
+ .replace(/`/g, '')
14
+ .replace(/\s*([^)]*)\s*$/, '')
15
+ .replace(/\s*\([^)]*\)\s*$/, '')
16
+ .replace(/\\/g, '/')
17
+ .replace(/\/+$/, '')
18
+ .trim()
19
+ }
20
+
21
+ /**
22
+ * 组合路径单元格拆分(坑 design-combined-cell-mismatch,2026-08-22 实证:"router.py + service.py"
23
+ * 一行两文件整体当单路径,字面匹配对账不过)。拆分符:+ 、 / | ; ;——每 token 独立校验
24
+ * (looksLikePath 不过的丢弃,防自由文本混入);无分隔符返回单元素数组(零变化)。
25
+ * 不含空白要求("a.py+b.py" 与 "a.py + b.py" 都拆)。
26
+ * @param {string} cell 路径单元格(normalizePath 后)
27
+ * @returns {string[]}
28
+ */
29
+ function splitCombinedPaths(cell) {
30
+ const raw = String(cell || '').trim()
31
+ if (!raw) return []
32
+ const tokens = raw.split(/\s*[+|;;、]\s*|//).map(t => t.trim()).filter(Boolean)
33
+ const valid = tokens.filter(t => !isPlaceholder(t) && looksLikePath(t) && !t.startsWith('.sillyspec/'))
34
+ return valid.length > 0 ? valid : (looksLikePath(raw) ? [raw] : [])
35
+ }
36
+
37
+ /**
38
+ * glob → 正则:双星(globstar)跨零或多段目录(含零段,bash 语义)、
39
+ * 单星 → 单段([^/]*)、问号 → 单字符([^/]),其余转义。
40
+ * pattern 不含通配符时返回 false(调用方先用完全相等判断)。
41
+ * 不支持字符类(design/allowed_paths 实际不写,遇方括号按字面转义)。
42
+ * @param {string} str
43
+ * @param {string} pattern
44
+ * @returns {boolean}
45
+ */
46
+ export function globMatch(str, pattern) {
47
+ if (!/[*?]/.test(pattern)) return false
48
+ let re = '^'
49
+ for (let i = 0; i < pattern.length; i++) {
50
+ const ch = pattern[i]
51
+ if (ch === '*') {
52
+ if (pattern[i + 1] === '*') {
53
+ // ** 跨零或多段:吞掉紧随的 /,输出 (?:.*/)? 让 src/**/a.js 也能匹配 src/a.js
54
+ if (pattern[i + 2] === '/') { re += '(?:.*/)?'; i += 2 }
55
+ else { re += '.*'; i++ }
56
+ } else {
57
+ re += '[^/]*'
58
+ }
59
+ } else if (ch === '?') {
60
+ re += '[^/]'
61
+ } else {
62
+ re += ch.replace(/[.+^${}()|[\]\\]/g, '\\$&')
63
+ }
64
+ }
65
+ re += '$'
66
+ try { return new RegExp(re).test(str) } catch { return false }
67
+ }
68
+
69
+ /**
70
+ * 双向容差匹配:design 清单文件 vs task allowed_paths(或脏文件 vs 清单)。
71
+ * 命中条件(任一):完全相等 / 目录前缀包含(双向)/ glob 通配(双向)。
72
+ * @param {string} a
73
+ * @param {string} b
74
+ * @returns {boolean}
75
+ */
76
+ export function pathMatches(a, b) {
77
+ a = normalizePath(a)
78
+ b = normalizePath(b)
79
+ if (!a || !b) return false
80
+ if (a === b) return true
81
+ if (a.startsWith(b + '/') || b.startsWith(a + '/')) return true
82
+ if (globMatch(a, b) || globMatch(b, a)) return true
83
+ return false
84
+ }
85
+
86
+ /**
87
+ * 「文件变更清单」章节标题同义词(与 src/stage-contract.js 的识别集对齐,
88
+ * 避免两个校验器对「有没有清单」给出矛盾结论)。
89
+ * 容忍可选编号前缀(`## 6. 文件变更清单` / `## 6) 文件变更清单`)——
90
+ * brainstorm Step11 模板鼓励 design 章节带编号,编号前缀不应让 plan-postcheck 解析失败。
91
+ */
92
+ const FILE_LIST_SECTION_RE = /^#{2,3}\s*(?:\d+[.)]\s*)?(文件变更清单|变更文件清单|文件清单|File Changes|Files to Change)/im
93
+
94
+ /**
95
+ * exclude 子标题词集:「不修改/暂缓/保留」类 —— 其下路径从清单移除,不强制 task 覆盖。
96
+ * 用排除集而非白名单:容忍「改动/变更/涉及」等近义 include 写法。
97
+ */
98
+ const EXCLUDE_SUBSECTION_RE = /不修改|不变|保留|无变更|未变更|不改动|暂不|暂缓|暂定|待定|后续|未改|无需|不涉及/
99
+
100
+ /**
101
+ * operation 词→归一化标签。design 清单「操作」列 cell 与分类列表子标题共用。
102
+ * 用途:verify 删除探针对账——声明「新增/修改」却整文件删除 = 高风险信号。
103
+ */
104
+ const OP_KEYWORDS = [
105
+ { re: /^(新增|新建|创建|添加|add|new|create)$/i, op: '新增' },
106
+ { re: /^(修改|更新|调整|改动|变更|重写|modify|update|change)$/i, op: '修改' },
107
+ { re: /^(删除|移除|去掉|remove|delete|drop)$/i, op: '删除' },
108
+ { re: /^(重命名|改名|rename|move)$/i, op: '重命名' },
109
+ ]
110
+ function classifyOperation(raw) {
111
+ if (!raw) return null
112
+ const hit = OP_KEYWORDS.find(k => k.re.test(raw.trim()))
113
+ return hit ? hit.op : null
114
+ }
115
+
116
+ /**
117
+ * 分类列表子标题 → operation(`### 删除文件` → '删除')。不命中返回 null。
118
+ * ⚠️ 调用方必须先判 EXCLUDE_SUBSECTION_RE:「### 不修改文件」含「修改」二字,
119
+ * 会被此处误匹配为「修改」——exclude 永远优先,命中 exclude 不跑 OP 映射。
120
+ */
121
+ const OP_SUBSECTION_RE = [
122
+ { re: /新增|新建|创建/, op: '新增' },
123
+ { re: /修改|更新|改动|重写/, op: '修改' },
124
+ { re: /删除|移除|去掉/, op: '删除' },
125
+ { re: /重命名|改名/, op: '重命名' },
126
+ ]
127
+ function classifySubsectionOp(title) {
128
+ const hit = OP_SUBSECTION_RE.find(k => k.re.test(title))
129
+ return hit ? hit.op : null
130
+ }
131
+
132
+ /** 表头列定位:cell 整体匹配操作类列名(与 isPathHeaderCell 对偶,用于定位 operation 列) */
133
+ function isOperationHeaderCell(c) {
134
+ return /^(操作|类型|变更类型|改动类型|变更|operation|type|action|op)$/i.test(c)
135
+ }
136
+
137
+ function isPlaceholder(p) {
138
+ return !p || p === '—' || p === '-' || /^(n\/?a|无|none|-+)$/i.test(p)
139
+ }
140
+
141
+ /** 表头列定位:cell 整体匹配路径类词 */
142
+ function isPathHeaderCell(c) {
143
+ return /^(文件路径|文件名|文件|路径|filepath|filename|file\s*path|path)$/i.test(c)
144
+ }
145
+
146
+ /**
147
+ * 路径合理性兜底:合法路径必含目录分隔 `/` 或扩展名点;
148
+ * 两者皆无时仅保留纯 ASCII 单词 token(Dockerfile / Makefile / LICENSE 这类无扩展名文件名),
149
+ * 丢弃含空格/中文的脏描述(如 design 表格第二列误写的「frontend 组件测试」「后端逻辑」)。
150
+ * 防止把自由文本当路径计入 fileCount,虚高 review-tier 分级(误推 independent)。
151
+ */
152
+ function looksLikePath(p) {
153
+ if (!p) return false
154
+ if (p.includes('/') || p.includes('.')) return true
155
+ return /^[\w@-]+$/.test(p)
156
+ }
157
+
158
+ /**
159
+ * 「顺带修复」标记:design §6 清单里标注的、不属本次变更 task 边界但合规修的预存债文件
160
+ * (CLAUDE.md 规则20 鼓励)。assess 的 allowed_paths 校验对 incidental 文件豁免(坑
161
+ * worktree-execute-apply-friction 坑1/4)。标记载体:表格「说明」列写「顺带修复:xxx」,
162
+ * 或路径 cell / 列表项的括号注释「(顺带修复)」。
163
+ */
164
+ const INCIDENTAL_RE = /顺带修复|附带修复|顺带|drive-?by|incidental/i
165
+
166
+ /**
167
+ * 从 design.md 解析文件变更清单(含 incidental 标记)。兼容两种真实写法:
168
+ * ① 表格:`| 操作 | 文件路径 | 说明 |`(brainstorm 模板默认)
169
+ * ② 分类列表:`### 新增文件` / `### 修改文件` / `### 不修改文件` 下的 `- path`
170
+ * 表头列顺序自适应(定位「文件/路径/file/path」列,列顺序写反时不会把操作名当路径);
171
+ * 忽略 `.sillyspec/`(keepSillyspecDocs=true 时保留 `.sillyspec/docs/`)与占位符(`—`/`-`/`N/A`/`无`);「不修改/暂缓」子段下的路径会被排除;
172
+ * CRLF 容错。incidental 嗅探:表格非路径列(说明列)+ 路径 cell 原始值(剥注释前的括号内容)+ 列表项原文。
173
+ *
174
+ * 内核函数:parseFileChangeList(Set 包装,向后兼容)与 parseFileChangeListDetailed 共用,
175
+ * 单一真相源,避免两处各自重写清单解析漂移。
176
+ * @param {string} designMdPath - design.md 文件路径
177
+ * @returns {Array<{ path: string, operation: string|null, incidental: boolean }>}(顺序按首次出现,exclude 子段移除)
178
+ */
179
+ function _parseFileListDetailed(designMdPath, { keepSillyspecDocs = false } = {}) {
180
+ if (!designMdPath || !existsSync(designMdPath)) return []
181
+
182
+ const content = readFileSync(designMdPath, 'utf8').replace(/\r\n/g, '\n')
183
+
184
+ const sectionMatch = content.match(FILE_LIST_SECTION_RE)
185
+ if (!sectionMatch) return []
186
+
187
+ // 从标题后开始,截取到下一个 ## 标题或文件末尾
188
+ const afterSection = content.slice(sectionMatch.index + sectionMatch[0].length)
189
+ const nextSectionMatch = afterSection.match(/^##\s/m)
190
+ const relevantContent = nextSectionMatch
191
+ ? afterSection.slice(0, nextSectionMatch.index)
192
+ : afterSection
193
+
194
+ const lines = relevantContent.split('\n')
195
+ let headerSkipped = false
196
+ let pathColIdx = 1 // 默认第 2 列;解析表头后可重定位
197
+ let opColIdx = -1 // 操作列下标(表头扫描后定位;-1 = 无操作列 → operation=null)
198
+ let listMode = 'include' // include | exclude(分类列表子段)
199
+ let currentOp = null // 分类列表子标题推导的 operation(表格模式不用)
200
+ const entries = new Map() // path -> { path, operation, incidental }(exclude 子段 delete)
201
+
202
+ for (const line of lines) {
203
+ // 分类列表子标题:### 新增文件 / ### 修改文件 / ### 不修改文件
204
+ const subHeader = line.match(/^###\s+(.+?)\s*$/)
205
+ if (subHeader) {
206
+ // ⚠️ EXCLUDE 优先:「### 不修改文件」含「修改」二字,会被 classifySubsectionOp 误匹配。
207
+ // 先判 exclude 词集,命中则 exclude 且 currentOp=null,绝不跑 OP 映射。
208
+ if (EXCLUDE_SUBSECTION_RE.test(subHeader[1])) {
209
+ listMode = 'exclude'
210
+ currentOp = null
211
+ } else {
212
+ listMode = 'include'
213
+ currentOp = classifySubsectionOp(subHeader[1])
214
+ }
215
+ continue
216
+ }
217
+
218
+ // 表格行
219
+ if (line.startsWith('|')) {
220
+ if (/^\|[-:\s|]+\|$/.test(line)) continue // 分隔行
221
+ const cells = line.split('|').slice(1, -1).map(c => c.trim())
222
+ if (cells.length < 2) continue
223
+
224
+ if (!headerSkipped) {
225
+ headerSkipped = true
226
+ // 表头列定位:找「文件/路径/file/path」列,找不到保持默认第 2 列
227
+ const idx = cells.findIndex(isPathHeaderCell)
228
+ if (idx >= 0) pathColIdx = idx
229
+ // 操作列定位:非路径列里找操作类列名(「操作/类型/operation」),找不到 opColIdx 保持 -1
230
+ const opIdx = cells.findIndex((c, i) => i !== pathColIdx && isOperationHeaderCell(c))
231
+ if (opIdx >= 0) opColIdx = opIdx
232
+ continue
233
+ }
234
+
235
+ const filePath = normalizePath(cells[pathColIdx] || '')
236
+ // 列定位兜底:取到纯操作词(表头未命中且列顺序异常)→ 跳过,避免把「修改」当路径
237
+ if (/^(新增|修改|删除|重命名|new|modify|update|delete|create|rename)$/i.test(filePath)) continue
238
+ if (isPlaceholder(filePath) || (filePath.startsWith('.sillyspec/') && !(keepSillyspecDocs && filePath.startsWith('.sillyspec/docs/')))) continue
239
+ if (!looksLikePath(filePath)) continue // 脏描述兜底:丢弃非路径自由文本(防虚高 fileCount)
240
+ // operation:操作列 cell 分类(无操作列 → null)
241
+ const operation = opColIdx >= 0 ? classifyOperation(cells[opColIdx] || '') : null
242
+ // incidental:说明列(非路径列的所有 cell)+ 路径 cell 原始值(剥注释前的括号内容)
243
+ const incidental = cells.some((c, i) => i !== pathColIdx && INCIDENTAL_RE.test(c))
244
+ || INCIDENTAL_RE.test(cells[pathColIdx] || '')
245
+ // 组合路径单元格拆分(坑 design-combined-cell-mismatch,2026-08-22 实证:单元格写
246
+ // "router.py + service.py" 一行两文件——整体当单路径字面匹配对账不过,逼文档写法服务
247
+ // 校验器)。拆分符:+ / / / | / 、 / ; / ;——每个 token 独立过校验入表;单路径零变化。
248
+ const pathTokens = splitCombinedPaths(filePath)
249
+ if (listMode === 'exclude') { for (const t of pathTokens) entries.delete(t); continue }
250
+ for (const t of pathTokens) entries.set(t, { path: t, operation, incidental })
251
+ continue
252
+ }
253
+
254
+ // 分类列表项:`- path` / `- \`path\``
255
+ const listItem = line.match(/^\s*-\s+(.+)/)
256
+ if (listItem) {
257
+ const filePath = normalizePath(listItem[1])
258
+ if (isPlaceholder(filePath) || (filePath.startsWith('.sillyspec/') && !(keepSillyspecDocs && filePath.startsWith('.sillyspec/docs/')))) continue
259
+ if (!looksLikePath(filePath)) continue // 脏描述兜底
260
+ const incidental = INCIDENTAL_RE.test(listItem[1])
261
+ if (listMode === 'exclude') { entries.delete(filePath); continue }
262
+ entries.set(filePath, { path: filePath, operation: currentOp, incidental })
263
+ }
264
+ }
265
+
266
+ return [...entries.values()]
267
+ }
268
+
269
+ /**
270
+ * 从 design.md 解析文件变更清单(路径集合,向后兼容)。
271
+ * @param {string} designMdPath - design.md 文件路径
272
+ * @param {string} designMdPath - design.md 文件路径
273
+ * @param {{ keepSillyspecDocs?: boolean }} [opts] - keepSillyspecDocs=true 时保留 `.sillyspec/docs/`(dogfood 模块文档=交付物,apply gate 需识别;默认 false 跳过全部 .sillyspec/ 保持 fileCount 判档不变)
274
+ * @returns {Set<string>} 文件路径集合(相对路径,如 "src/worktree.js")
275
+ */
276
+ export function parseFileChangeList(designMdPath, opts) {
277
+ return new Set(_parseFileListDetailed(designMdPath, opts).map(e => e.path))
278
+ }
279
+
280
+ /**
281
+ * 从 design.md 解析文件变更清单(含 operation + incidental 标记)。
282
+ * operation 供 verify 删除探针对账(声明「新增/修改」却整文件删除 = 高风险);
283
+ * incidental 供 assess allowed_paths 豁免。
284
+ * @param {string} designMdPath - design.md 文件路径
285
+ * @param {{ keepSillyspecDocs?: boolean }} [opts] - 同 parseFileChangeList
286
+ * @returns {Array<{ path: string, operation: string|null, incidental: boolean }>}
287
+ */
288
+ export function parseFileChangeListDetailed(designMdPath, opts) {
289
+ return _parseFileListDetailed(designMdPath, opts)
290
+ }
@@ -0,0 +1,339 @@
1
+ /**
2
+ * change-risk-profile.js — 变更风险分级检测
3
+ *
4
+ * 根据变更涉及的文件类型、关键词、git diff、brainstorm 产物,
5
+ * 判定 5 级风险(doc-only / unit-sufficient / contract-required /
6
+ * integration-critical / deployment-critical),产出门控验证需求。
7
+ */
8
+
9
+ // ============ 向后兼容:旧的 INTEGRATION_CRITICAL_PATTERNS ============
10
+
11
+ const INTEGRATION_CRITICAL_PATTERNS = [
12
+ /\bdaemon\b/i,
13
+ /\bbackend\b/i,
14
+ /\bclient.*api\b/i,
15
+ /\bgrpc\b/i,
16
+ /\bwebsocket\b/i,
17
+ /\bhttp.*client\b/i,
18
+ /\bsession\b/i,
19
+ /\blease\b/i,
20
+ /\bagent.?run\b/i,
21
+ /\blifecycle\b/i,
22
+ /\bstate.?transition\b/i,
23
+ /\bclaim\b/i,
24
+ /\bheartbeat\b/i,
25
+ /\bcross.?process\b/i,
26
+ /\bipc\b/i,
27
+ /\bmessage.?queue\b/i,
28
+ /\bpub.?sub\b/i,
29
+ /\bcli\.ts\b/i,
30
+ /\bmain\.ts\b/i,
31
+ /\bentrypoint\b/i,
32
+ /\bserver\.(js|ts)\b/i,
33
+ /\bbootstrap\b/i,
34
+ /\bdockerfile\b/i,
35
+ /\bdocker.?compose\b/i,
36
+ ]
37
+
38
+ const INTEGRATION_FILE_PATTERNS = [
39
+ /daemon/i,
40
+ /session.?manager/i,
41
+ /agent.?run/i,
42
+ /lifecycle/i,
43
+ /state.?machine/i,
44
+ /lease/i,
45
+ /cli\.(js|ts)$/,
46
+ /main\.(js|ts)$/,
47
+ /server\.(js|ts)$/,
48
+ /bootstrap/i,
49
+ /startup/i,
50
+ ]
51
+
52
+ /**
53
+ * task 级「端到端/deployment-critical」文本判定(execute 批量完成 autoCheckPlanFromReviews 用)。
54
+ *
55
+ * 聚焦需要真实集成/启动验证的 task,区别于 change 级 INTEGRATION_CRITICAL_PATTERNS(含 backend/session
56
+ * 等泛词——task 级用会误伤普通后端 task)。命中端到端集成语义(端到端/真实集成/daemon↔backend/
57
+ * integration test/e2e)或部署启动入口(cli.ts/main.ts/entrypoint/server/bootstrap/startup/docker)。
58
+ * 坑 execute-batch-complete-endtoend-checkbox:这类 task 的 review cannot_verify 不算 checked,
59
+ * 阻断 execute 批量完成(必须 pass),防端到端未真验就被批量放行(verify integration-evidence 兜底外的
60
+ * execute 侧前置门)。
61
+ * @param {string} text task 描述文本(plan.md task 行 + tasks/task-XX.md 内容)
62
+ * @returns {boolean}
63
+ */
64
+ const END_TO_END_TASK_KEYWORDS = [
65
+ /端到端/, /真实集成/, /daemon.*backend/i, /integration\s*test/i, /e2e\s*test/i,
66
+ /runtime\s*evidence/i, /运行时证据/,
67
+ /\bcli\.ts\b/i, /\bmain\.ts\b/i, /\bentrypoint\b/i, /\bserver\.(js|ts)\b/i,
68
+ /\bbootstrap\b/i, /\bstartup\b/i, /启动/, /\bdockerfile\b/i, /\bdocker.?compose\b/i,
69
+ ]
70
+ export function isEndToEndTaskText(text = '') {
71
+ return END_TO_END_TASK_KEYWORDS.some(re => re.test(text))
72
+ }
73
+
74
+ // ============ 门控可执行化(A:报错说人话) ============
75
+ //
76
+ // 历史教训:integration-critical / deployment-critical 门控只报「缺少真实集成证据 / 需要真实
77
+ // 启动验证证据」,agent 看不出具体缺哪一项、要写/做什么才算过,只能靠改结论文案撞墙。
78
+ // 此处把每一项 requiredVerification 的需求(写什么 / 做什么)和判级原因显式导出,
79
+ // 供 stage-contract 拼成可执行的报错信息。
80
+
81
+ /** 每项 requiredVerification 的需求描述 + 字面期望 */
82
+ export const VERIFICATION_NEEDS = {
83
+ unit_tests: {
84
+ desc: '单元测试(verify 必做;在 verify-result.md 写明测试套件与结果)',
85
+ literals: [],
86
+ },
87
+ contract_tests: {
88
+ desc: '契约测试(前后端/跨进程 API parity 对账,写明结论)',
89
+ literals: [],
90
+ },
91
+ real_daemon_backend_integration: {
92
+ desc: '真实 daemon↔backend 集成验证(非仅 mock 单测)。写「真实集成/端到端」的证据;',
93
+ // 同义扩充(坑 verify-literal-evidence-mismatch,2026-08-22 实证:证据第一轮就齐但表述
94
+ // 不含字面词被误拦三轮)——覆盖常见自然表述 + PID 登记句式(verify prompt 要求照写)
95
+ literals: ['端到端', 'integration test', 'e2e test', 'daemon.*backend', '真实集成',
96
+ 'runtime evidence', '运行时证据', '联调', '打通', '实际请求', '真实请求', '跨进程',
97
+ 'PID 已登记', 'verify-services'],
98
+ },
99
+ runtime_log_evidence: {
100
+ desc: 'Runtime Evidence section + 指向真实日志/证据片段。',
101
+ literals: ['Runtime Evidence', '运行时证据', 'daemon log', '日志片段', '日志关键',
102
+ '日志:', '日志摘录', '日志', 'log 摘录', 'log 片段', '进程日志', 'PID 已登记', 'verify-services'],
103
+ },
104
+ real_startup_once: {
105
+ desc: '真实启动一次本变更触及的部署/启动入口(服务入口、CLI 主入口、守护进程等——须是本变更实际改动的那一类入口,不能拿无关进程的启动来凑数)。',
106
+ // 同义扩充(同坑):自然表述 + CLI 回执句式;checkIntegrationEvidence 另拼 CLI 回执文本
107
+ //(verify-services.receipt.json,服务回收器落盘)——结构化信号不依赖 agent 措辞
108
+ literals: ['启动.*一次', '实际.*启动', 'real startup', 'docker up', 'npm start', 'node server',
109
+ '真实启动', '拉起', '已启动', '进程启动', '服务启动', '启动验证',
110
+ 'PID 已登记', 'verify-services'],
111
+ },
112
+ terminal_state_assertion: {
113
+ desc: '终态断言(建议项,不阻断):AgentRun running→completed/failed、session/lease end 状态同步。',
114
+ literals: ['terminal state', '终态', 'completed failed', 'session end', 'lease end',
115
+ '生命周期终态', '状态同步'],
116
+ },
117
+ }
118
+
119
+ /** 风险分级的判定来源(命中关键词来源 = design.md / plan.md 内容,非改动文件本身) */
120
+ export const RISK_LEVEL_CAUSES = {
121
+ 'deployment-critical':
122
+ 'design.md / plan.md 命中启动入口关键词(cli.ts / main.ts / server.(js|ts) / bootstrap / entrypoint)。' +
123
+ '注意:这是按 design/plan 里的措辞判定的,不一定代表你真改了启动入口;若属误判可在 design.md frontmatter 用 risk_level 显式声明真实等级(如 unit-sufficient)覆盖——不要靠删措辞绕门控,危险链路该有真实启动证据。',
124
+ 'integration-critical':
125
+ 'design.md / plan.md 命中跨进程/状态机关键词(daemon / backend / session / lease / lifecycle / heartbeat 等)。' +
126
+ '关键词前方同句有否定提示(不/未/无/避免…)的命中已被抑制不参与判级——若本变更实际涉及跨进程/状态机改动,请在 design.md frontmatter 用 risk_level 声明真实等级。',
127
+ 'contract-required': 'design.md / plan.md 命中 API contract 关键词(api / client / contract / dto)。',
128
+ 'explicit': 'design.md frontmatter 的 risk_level 显式声明(覆盖关键词判级)。',
129
+ }
130
+
131
+ /** design.md frontmatter 可显式声明的合法 risk_level 值(与 detectChangeRisk 判级结果同集合) */
132
+ const RISK_LEVELS = ['doc-only', 'unit-sufficient', 'contract-required', 'integration-critical', 'deployment-critical']
133
+
134
+ // ============ 同句否定抑制(坑 risk-negation-blindness) ============
135
+ //
136
+ // detectChangeRisk 原为全文 blob 字面命中:design 写「本次不新增 daemon 协议」仍判
137
+ // integration-critical、强制全套集成证据,对无状态后端变更误伤(用户实证 2026-08-24)。
138
+ // 机械抑制规则(不做事语义理解,三段判定):
139
+ // ① 子句切分:按 句号/分号/逗号/换行 切子句,否定只在同子句内生效——「不改动 A。新增 B」
140
+ // 的 B 不继承否定;
141
+ // ② 直接否定:命中位置前方 NEGATION_WINDOW 字符内出现否定提示 → 抑制;
142
+ // ③ 枚举继承:「不改动 daemon / session / lifecycle」中后位关键词与前位被抑制关键词之间
143
+ // 只隔枚举连接符(空格 / 、 , 和 与 及 and or)→ 继承抑制——纯距离窗口盖不住长枚举,
144
+ // 而「不涉及 daemon 的情况下重构 session」的间隔是普通文字,不继承(session 正常命中)。
145
+ // 同一关键词的**全部**命中都被抑制才不参与判级(任一处未抑制命中仍算数)。降级不静默:
146
+ // design/verify 两道 gate 会把被抑制词打进 warning(可审计),design.md frontmatter
147
+ // risk_level 仍是双向权威覆盖通道(声明优先级最高,行为不变)。
148
+ //
149
+ // 否定提示词排除假阳:不同/不断/不久/不时/不仅(「不」的非否定合成词)、无状态/无法
150
+ // (「无状态后端」是常见肯定表述)、非常/非空/非法(「非空校验 session」是在改 session)。
151
+ const NEGATION_CUES = /不(?!同|断|久|时|仅|妨)|未|无(?!状态|法)|非(?!常|空|法)|避免|排除|无需|不再|no\s+new|not\b|don'?t|without|avoid/i
152
+ const NEGATION_WINDOW = 16
153
+ const CLAUSE_SPLIT_RE = /[。;;,,\n]/
154
+ const ENUM_GAP_RE = /^[\s/|、,,]*(?:(?:和|与|及|and|or)[\s/|、,,]*)*$/i
155
+
156
+ /**
157
+ * 单行内统计各关键词命中(同子句否定窗口 + 枚举继承)。
158
+ * @returns {Map<string, {kept: number, suppressed: number}>} trigger 原文 → 命中统计
159
+ */
160
+ function collectLineTriggerStats(line, patterns, stats = new Map()) {
161
+ for (const pattern of patterns) {
162
+ const re = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g')
163
+ let m
164
+ while ((m = re.exec(line)) !== null) {
165
+ if (m[0].length === 0) { re.lastIndex++; continue }
166
+ // 行内绝对偏移 → 子句内相对偏移(子句内可能有多命中,逐一判定)
167
+ const clauseStart = line.slice(0, m.index).split(CLAUSE_SPLIT_RE).pop().length
168
+ const clauseStartAbs = m.index - clauseStart
169
+ const clause = line.slice(clauseStartAbs).split(CLAUSE_SPLIT_RE)[0]
170
+ const relIndex = m.index - clauseStartAbs
171
+ const prefix = clause.slice(0, relIndex)
172
+ let negated = NEGATION_CUES.test(prefix.slice(-NEGATION_WINDOW))
173
+ if (!negated && prefix.length > 0) {
174
+ // 枚举继承:查同子句内更早的关键词命中,且间隔只有枚举连接符
175
+ for (const other of patterns) {
176
+ const ore = new RegExp(other.source, other.flags.includes('g') ? other.flags : other.flags + 'g')
177
+ let om
178
+ while ((om = ore.exec(clause)) !== null) {
179
+ if (om[0].length === 0) { ore.lastIndex++; continue }
180
+ if (om.index >= relIndex) break
181
+ const gap = clause.slice(om.index + om[0].length, relIndex)
182
+ const prevSuppressed = NEGATION_CUES.test(clause.slice(0, om.index).slice(-NEGATION_WINDOW))
183
+ if (prevSuppressed && ENUM_GAP_RE.test(gap)) { negated = true; break }
184
+ }
185
+ if (negated) break
186
+ }
187
+ }
188
+ const stat = stats.get(m[0]) || { kept: 0, suppressed: 0 }
189
+ if (negated) stat.suppressed++
190
+ else stat.kept++
191
+ stats.set(m[0], stat)
192
+ }
193
+ }
194
+ return stats
195
+ }
196
+
197
+ /**
198
+ * 从 design.md 顶部 frontmatter 提取显式 risk_level 声明。
199
+ * 只认文档最开头 `---\n...\n---` 块内的 `risk_level: <level>` 单行(与 plan.md 的 plan_level 同款解析),
200
+ * 不扫正文——避免正文里讨论 risk_level 措辞时被误当声明。返回合法 level 或 null。
201
+ */
202
+ export function extractExplicitRiskLevel(designContent = '') {
203
+ const fm = designContent.match(/^---\r?\n([\s\S]*?)\r?\n---/)
204
+ if (!fm) return null
205
+ const line = fm[1].split('\n').map(l => l.trim()).find(l => l.startsWith('risk_level:'))
206
+ if (!line) return null
207
+ const value = line.slice('risk_level:'.length).trim().replace(/^["']|["']$/g, '').toLowerCase()
208
+ return RISK_LEVELS.includes(value) ? value : null
209
+ }
210
+
211
+ export function detectChangeRisk({ designContent = '', planContent = '', changedFiles = [] } = {}) {
212
+ const triggers = []
213
+
214
+ // ── 显式豁免优先:design.md frontmatter 声明 risk_level → 以声明为准,跳过关键词判级 ──
215
+ // 历史教训:detectChangeRisk 是机械字面匹配——design 写「本次不改动 daemon/session」曾命中关键词
216
+ // 被误判 integration/deployment-critical,强制要全套集成证据,对无状态后端变更误伤。现给两条通道:
217
+ // ① 同句否定抑制(上方 NEGATION_CUES,机械可审计、只认「关键词前方否定窗口」不做语义理解);
218
+ // ② frontmatter 显式声明(显式、诚实、可审计,落在 design frontmatter + verify-result)——本分支。
219
+ // 声明仍走门控(结论 FAIL 仍拦),但豁免级(unit-sufficient 等)不再强制集成证据。
220
+ const explicit = extractExplicitRiskLevel(designContent)
221
+ if (explicit) {
222
+ const requiredVerification =
223
+ explicit === 'deployment-critical' ? ['unit_tests', 'contract_tests', 'real_daemon_backend_integration', 'runtime_log_evidence', 'real_startup_once'] :
224
+ explicit === 'integration-critical' ? ['unit_tests', 'contract_tests', 'real_daemon_backend_integration', 'runtime_log_evidence', 'terminal_state_assertion'] :
225
+ explicit === 'contract-required' ? ['unit_tests', 'contract_tests'] :
226
+ explicit === 'doc-only' ? ['static_check'] :
227
+ ['unit_tests']
228
+ return { level: explicit, triggers: ['risk_level (explicit)'], suppressedTriggers: [], requiredVerification, explicit: true }
229
+ }
230
+
231
+ const combined = [designContent, planContent].join('\n')
232
+
233
+ // 逐行收集命中:同句否定窗口内的命中进 suppressed(全部命中均被抑制才剔除该 trigger)
234
+ const stats = new Map()
235
+ for (const line of combined.split('\n')) {
236
+ collectLineTriggerStats(line, INTEGRATION_CRITICAL_PATTERNS, stats)
237
+ }
238
+ const suppressedTriggers = []
239
+ for (const [t, stat] of stats) {
240
+ if (stat.kept > 0) triggers.push(t)
241
+ else suppressedTriggers.push(t)
242
+ }
243
+
244
+ for (const file of changedFiles) {
245
+ for (const pattern of INTEGRATION_FILE_PATTERNS) {
246
+ if (pattern.test(file)) {
247
+ pattern.lastIndex = 0
248
+ const match = file.match(pattern)
249
+ if (match && !triggers.includes(match[0])) triggers.push(match[0])
250
+ }
251
+ }
252
+ }
253
+
254
+ if (triggers.length === 0) {
255
+ // 关键词命中全被否定语境抑制(或本就无命中)→ doc-only;抑制词随 suppressedTriggers 上报可审计
256
+ return { level: 'doc-only', triggers: [], suppressedTriggers, requiredVerification: ['static_check'] }
257
+ }
258
+
259
+ const deploymentTrigger = triggers.some(t => /cli\.ts|main\.ts|server\.(js|ts)|bootstrap|entrypoint/i.test(t))
260
+ const lifecycleTrigger = triggers.some(t => /session|lease|agent.?run|lifecycle|state.?transition|claim|heartbeat/i.test(t))
261
+ const crossProcessTrigger = triggers.some(t => /daemon|backend|client.*api|grpc|websocket|cross.?process|ipc|message.?queue/i.test(t))
262
+
263
+ let level
264
+ const requiredVerification = ['unit_tests']
265
+
266
+ if (deploymentTrigger) {
267
+ level = 'deployment-critical'
268
+ requiredVerification.push('contract_tests', 'real_daemon_backend_integration', 'runtime_log_evidence', 'real_startup_once')
269
+ } else if (lifecycleTrigger || crossProcessTrigger) {
270
+ level = 'integration-critical'
271
+ requiredVerification.push('contract_tests', 'real_daemon_backend_integration', 'runtime_log_evidence', 'terminal_state_assertion')
272
+ } else if (triggers.some(t => /api|client|contract|dto/i.test(t))) {
273
+ level = 'contract-required'
274
+ requiredVerification.push('contract_tests')
275
+ } else {
276
+ level = 'unit-sufficient'
277
+ }
278
+
279
+ return { level, triggers, suppressedTriggers, requiredVerification }
280
+ }
281
+
282
+ /**
283
+ * 检查 verify-result.md 是否包含集成验证证据
284
+ *
285
+ * opts.extraEvidenceText(坑 verify-literal-evidence-mismatch,2026-08-22):调用方可注入
286
+ * CLI 结构化回执文本(如 verify-services.receipt.json 的服务回收回执)——它随 verifyContent
287
+ * 一起参与 literals 匹配,agent 真实起过服务且 CLI 回收过(有回执)时不再依赖其自然语言
288
+ * 措辞恰好含字面词,表述差异不再误拦。
289
+ */
290
+ export function checkIntegrationEvidence(verifyContent, requiredVerification, opts = {}) {
291
+ const errors = []
292
+ const warnings = []
293
+ const lower = (String(verifyContent || '') + '\n' + String(opts.extraEvidenceText || '')).toLowerCase()
294
+
295
+ // 字面证据正则从 VERIFICATION_NEEDS[k].literals 派生——与报错描述、prompt 事前契约严格同源,
296
+ // 杜绝历史上"描述说 A、正则查 B"的分叉(checkIntegrationEvidence 正则曾比 VERIFICATION_NEEDS
297
+ // 描述多匹配 集成测试/backend.*daemon/real.*integration 等)。literals 为空的 need
298
+ // (unit_tests/contract_tests)无字面校验,视为满足。
299
+ const hasEvidence = (k) => {
300
+ const n = VERIFICATION_NEEDS[k]
301
+ if (!n || !n.literals || n.literals.length === 0) return true
302
+ return new RegExp(n.literals.join('|'), 'i').test(lower)
303
+ }
304
+
305
+ const needsIntegration = requiredVerification.includes('real_daemon_backend_integration')
306
+ const needsLogEvidence = requiredVerification.includes('runtime_log_evidence')
307
+ const needsTerminalState = requiredVerification.includes('terminal_state_assertion')
308
+ const needsRealStartup = requiredVerification.includes('real_startup_once')
309
+
310
+ if (needsIntegration) {
311
+ const hasMockOnly = /mock.*test.*passed|unit.*test.*passed/i.test(lower)
312
+ const hasIntegrationEvidence = hasEvidence('real_daemon_backend_integration')
313
+ if (!hasIntegrationEvidence && hasMockOnly) {
314
+ errors.push('integration-critical 变更只提供了 mock 单测证据,缺少真实 daemon↔backend 集成验证')
315
+ } else if (!hasIntegrationEvidence) {
316
+ errors.push('integration-critical 变更缺少集成验证证据 — 需要真实 daemon↔backend 测试结果或运行时日志')
317
+ }
318
+ }
319
+
320
+ if (needsLogEvidence) {
321
+ if (!hasEvidence('runtime_log_evidence')) {
322
+ errors.push('integration-critical 变更的 verify-result.md 缺少 Runtime Evidence section')
323
+ }
324
+ }
325
+
326
+ if (needsTerminalState) {
327
+ if (!hasEvidence('terminal_state_assertion')) {
328
+ warnings.push('建议检查终态断言:AgentRun running→completed/failed、session end 状态同步')
329
+ }
330
+ }
331
+
332
+ if (needsRealStartup) {
333
+ if (!hasEvidence('real_startup_once')) {
334
+ errors.push('deployment-critical 变更需要真实启动验证证据')
335
+ }
336
+ }
337
+
338
+ return { ok: errors.length === 0, errors, warnings }
339
+ }