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,448 @@
1
+ # SillySpec 项目架构分析报告
2
+
3
+ > 分析时间:2026-08-25
4
+ > 项目版本:3.27.5
5
+ > 分析范围:全量代码库
6
+
7
+ ---
8
+
9
+ ## 1. 项目定位与概述
10
+
11
+ SillySpec 是一个**给 AI Agent 调用的 CLI 流程状态机**,让 AI 严格按步骤来执行文档驱动开发。它不是给人类直接使用的产品,而是 Agent(如 Claude Code、Cursor)的流程控制器——Agent 通过 CLI 告诉它"我在哪",它告诉 Agent"下一步做什么";Agent 执行步骤,它校验产出、推进状态,人类只在关键决策点介入审批。
12
+
13
+ 核心理念:**Spec-Driven Development(规范驱动开发)**——先有文档(brainstorm → design → plan),再写代码(execute),再验证(verify),最后归档(archive)。
14
+
15
+ ---
16
+
17
+ ## 2. 整体架构设计
18
+
19
+ ```
20
+ ┌─────────────────────────────────────────────────────────────────┐
21
+ │ CLI Entry (bin/sillyspec.js) │
22
+ │ → src/index.js (主路由) │
23
+ └──────────────┬──────────────────────────────┬───────────────────┘
24
+ │ │
25
+ ┌──────────▼──────────┐ ┌───────────▼──────────┐
26
+ │ 阶段执行引擎 │ │ 子命令路由 │
27
+ │ src/run/ │ │ progress / worktree │
28
+ │ command→stage→ │ │ gate / derive / │
29
+ │ prompt→complete │ │ docs / knowledge / │
30
+ └──────────┬───────────┘ │ workspace / dashboard │
31
+ │ └───────────┬───────────┘
32
+ ┌──────────▼───────────┐ ┌───────────▼───────────┐
33
+ │ 阶段定义层 │ │ 状态管理层 │
34
+ │ src/stages/*.js │ │ src/progress.js │
35
+ │ (10 个阶段) │ │ src/progress/*.js │
36
+ └──────────┬───────────┘ │ (facade + 4 submod) │
37
+ │ └───────────┬───────────┘
38
+ │ │
39
+ ┌──────────▼───────────────────────────────▼───────────┐
40
+ │ 数据层 │
41
+ │ src/db.js (node:sqlite) → sillyspec.db │
42
+ │ src/db-engine.js (引擎抽象) │
43
+ │ .sillyspec/.runtime/sillyspec.db (SQLite WAL) │
44
+ └──────────────────────────────────────────────────────┘
45
+ ```
46
+
47
+ ### 2.1 架构分层(自顶向下)
48
+
49
+ | 层级 | 职责 | 关键文件 |
50
+ |------|------|---------|
51
+ | **CLI 入口层** | 参数解析、路由分发、全局 flag 处理 | `bin/sillyspec.js`, `src/index.js` |
52
+ | **命令分发层** | runCommand 主入口、auto 模式、stage 路由 | `src/run/command.js` |
53
+ | **阶段执行层** | step prompt 渲染、complete 校验、wait/continue | `src/run/stage.js`, `src/run/prompt.js`, `src/run/complete.js` |
54
+ | **阶段定义层** | 10 个阶段的 steps/prompt/校验器 | `src/stages/*.js` |
55
+ | **协议校验层** | StageContract 状态机、gate/derive 机器接口 | `src/stage-contract.js`, `src/machine-interface.js` |
56
+ | **状态管理层** | ProgressManager facade + 4 个子模块 | `src/progress.js`, `src/progress/*.js` |
57
+ | **数据持久化层** | SQLite WAL 数据库、原子写、备份恢复 | `src/db.js`, `src/db-engine.js`, `src/fs-atomic.js` |
58
+ | **辅助基础设施** | git 操作、平台同步、worktree 隔离、dashboard | `src/git-helper.js`, `src/sync.js`, `src/worktree*.js` |
59
+
60
+ ---
61
+
62
+ ## 3. 技术栈选择
63
+
64
+ ### 3.1 运行时
65
+
66
+ | 技术 | 版本要求 | 选型理由 |
67
+ |------|---------|---------|
68
+ | **Node.js** | ≥ 22.13.0 | 使用 `node:sqlite` 内置模块(22.5+ stable),无需 WASM/sql.js;原生 SQLite 性能 + 真 WAL |
69
+ | **ES Modules** | `"type": "module"` | 全量 ESM,动态 import 实现懒加载优化(E22 启动性能) |
70
+
71
+ ### 3.2 数据库
72
+
73
+ | 技术 | 选型理由 |
74
+ |------|---------|
75
+ | **node:sqlite (DatabaseSync)** | Node 22 内置原生 SQLite 绑定,同步 API 简化状态管理;真 WAL 支持并发读写;.bak 损坏自动回退 |
76
+ | **WAL 模式** | `journal_mode=WAL` + `busy_timeout=5000` + `synchronous=NORMAL`,兼顾性能与安全 |
77
+ | **Schema 版本管理** | `DB_SCHEMA_VERSION=5` + `.schema-version` 戳,避免每次启动重建表 |
78
+
79
+ 历史:v1/v2 使用 `progress.json` 文件,v3 全量迁移至 SQLite。
80
+
81
+ ### 3.3 外部依赖(7 个,极度精简)
82
+
83
+ | 依赖 | 用途 | 选型理由 |
84
+ |------|------|---------|
85
+ | `@inquirer/prompts` | 交互式用户输入 | 标准 Node 交互 prompt 库 |
86
+ | `chalk` | 终端彩色输出 | CLI 美化 |
87
+ | `chokidar` | 文件系统监控 | dashboard 实时更新 |
88
+ | `js-yaml` | YAML 解析/序列化 | local.yaml / 项目配置 / module-map |
89
+ | `open` | 打开浏览器 | dashboard 自动打开 |
90
+ | `ora` | 终端 spinner | 长操作进度提示 |
91
+ | `ws` | WebSocket | dashboard 实时通信 |
92
+
93
+ ### 3.4 测试/构建
94
+
95
+ | 技术 | 说明 |
96
+ |------|------|
97
+ | 自研测试运行器 | `test/run-tests.mjs`(无 jest/vitest 依赖,自研轻量 runner) |
98
+ | 自研 lint | `test/check-syntax.mjs`(自研语法检查,非 eslint) |
99
+ | 零构建步骤 | 纯 ESM 直接运行,无 tsc/webpack/rollup |
100
+
101
+ ---
102
+
103
+ ## 4. 核心功能模块划分
104
+
105
+ ### 4.1 阶段系统(Stage System)— 核心流程引擎
106
+
107
+ 10 个阶段注册在 `src/stages/index.js`,分为两类:
108
+
109
+ #### 主流程阶段(必须按序)
110
+ | 阶段 | 文件 | 职责 |
111
+ |------|------|------|
112
+ | **brainstorm** | `brainstorm.js` | 需求澄清 → 产出 proposal/design/tasks |
113
+ | **plan** | `plan.js` | 任务拆解 → 产出 plan.md + tasks.md(Wave 分组) |
114
+ | **execute** | `execute.js` | 按 plan 执行代码 → 产出 per-task review.json |
115
+ | **verify** | `verify.js` | 验证实现符合 design → 产出 verify-result.md |
116
+ | **brainstorm-auto** | `brainstorm-auto.js` | brainstorm 自动模式变体 |
117
+
118
+ #### 辅助阶段(可在无活跃变更时执行)
119
+ | 阶段 | 文件 | 职责 |
120
+ |------|------|------|
121
+ | **quick** | `quick.js` | 快速任务(≤3 文件),跳过完整流程 |
122
+ | **scan** | `scan.js` | 代码库扫描 → 产出架构/约定/结构文档 |
123
+ | **explore** | `explore.js` | 自由讨论/调研,不修改文件 |
124
+ | **archive** | `archive.js` | 归档已完成变更 → archive 目录 |
125
+ | **status** | `status.js` | 查看当前进度 |
126
+ | **doctor** | `doctor.js` | 进度库健康检查 + 修复 |
127
+
128
+ ### 4.2 状态管理子系统
129
+
130
+ **ProgressManager**(`src/progress.js`)是 facade,委托 4 个子模块:
131
+
132
+ | 子模块 | 文件 | 职责 |
133
+ |--------|------|------|
134
+ | `ChangeRegistry` | `progress/change-registry.js` | 变更注册/查询/归档(active/archived 状态管理) |
135
+ | `StageMachine` | `progress/stage-machine.js` | 阶段状态机(pending→in_progress→completed 转换规则) |
136
+ | `StepStore` | `progress/step-store.js` | 步骤级 CRUD(每个阶段的 steps 状态) |
137
+ | `ConsistencyDoctor` | `progress/consistency-doctor.js` | 一致性检查与修复 |
138
+
139
+ ### 4.3 运行时子系统(src/run/)
140
+
141
+ | 模块 | 文件 | 职责 |
142
+ |------|------|------|
143
+ | **command** | `command.js` | runCommand 主入口、flag 解析、stage 路由、auto 模式 |
144
+ | **prompt** | `prompt.js` | prompt 渲染引擎(persona/铁律/占位符替换/完成后命令模板) |
145
+ | **stage** | `stage.js` | 单阶段执行器(遍历 steps → outputStep) |
146
+ | **complete** | `complete.js` | 步骤完成处理(--done/--skip/--wait/--continue) |
147
+ | **complete-handlers** | `complete-handlers.js` | 各阶段特化的完成处理器 |
148
+ | **gates** | `gates.js` | 门控引擎(Stage Review Gate / Task Review Gate / symbol-impact) |
149
+ | **shared** | `shared.js` | 共享工具(resolveSpecDir / git / worktree drift 检测等) |
150
+ | **quick-audit** | `quick-audit.js` | quick 完成审计(边界文件检测/归属) |
151
+ | **scan-profile** | `scan-profile.js` | scan 规模判定(quick/standard/deep 三档) |
152
+ | **concurrent-detect** | `concurrent-detect.js` | 并发变更检测 |
153
+ | **multi-repo-context** | `multi-repo-context.js` | 跨仓上下文构造 |
154
+ | **next** | `next.js` | 项目状态探测(下一步命令建议) |
155
+
156
+ ### 4.4 协议与门控子系统
157
+
158
+ | 模块 | 文件 | 职责 |
159
+ |------|------|------|
160
+ | **StageContract** | `stage-contract.js` | 阶段合约(前置条件/产出校验/状态转换) |
161
+ | **stage-contract-engine** | `stage-contract-engine.js` | 合约规则引擎 |
162
+ | **stage-contract-spec** | `stage-contract-spec.js` | 合约规则定义 |
163
+ | **MachineInterface** | `machine-interface.js` | 机器接口 v1(gate/derive JSON envelope) |
164
+ | **task-review** | `task-review.js` | per-task review.json 生成/校验/adopt |
165
+ | **stage-review** | `stage-review.js` | stage 级 review.json 注册/刷新 |
166
+
167
+ ### 4.5 Worktree 隔离子系统
168
+
169
+ | 模块 | 文件 | 职责 |
170
+ |------|------|------|
171
+ | **WorktreeManager** | `worktree.js` | worktree 创建/清理/doctor |
172
+ | **worktree-apply** | `worktree-apply.js` | 校验 + 应用变更到主工作区(含 merge fallback) |
173
+ | **worktree-guard** | `hooks/worktree-guard.js` | pre-push hook 拦截未合并 worktree |
174
+
175
+ ### 4.6 平台集成(SillyHub)
176
+
177
+ | 模块 | 文件 | 职责 |
178
+ |------|------|------|
179
+ | **sync** | `sync.js` | 进度库 ↔ 平台双向同步 |
180
+ | **dispatch** | `dispatch/` | SillyHub MCP 派发(probe + strategy) |
181
+ | **sillyhub-mcp** | `sillyhub-mcp/` | MCP client/config |
182
+ | **platform-pointer** | (in progress.js) | 平台指针管理(fail-closed 设计) |
183
+
184
+ ### 4.7 辅助工具集
185
+
186
+ | 模块 | 文件 | 职责 |
187
+ |------|------|------|
188
+ | **docs-check** | `docs-check.js` | 文档 file:line 引用校验 + 自动重锚 |
189
+ | **docs-gate** | `docs-gate.js` | 文档质量门控(pre-push 第三道关) |
190
+ | **knowledge** | `stages/knowledge.js` + `knowledge-match.js` | 知识库搜索/校验/提议 |
191
+ | **commit-suggest** | `commit-suggest.js` | 智能提交建议(conventional commit) |
192
+ | **module-impact** | `module-impact.js` | 模块影响矩阵骨架生成 |
193
+ | **endpoint-extractor** | `endpoint-extractor.js` | 后端路由静态扫描(FastAPI/Express/Spring) |
194
+ | **quicklog** | `quicklog.js` | QUICKLOG 管理 |
195
+ | **workspace** | `workspace.js` | 多项目工作区管理 |
196
+ | **dashboard** | `packages/dashboard/` | Web Dashboard(Vite + WebSocket 实时) |
197
+
198
+ ---
199
+
200
+ ## 5. 代码组织结构
201
+
202
+ ```
203
+ sillyspec/
204
+ ├── bin/sillyspec.js # CLI 入口(2 行,import src/index.js)
205
+ ├── src/
206
+ │ ├── index.js # 主路由(~1800 行,CLI arg 解析 + 子命令分发)
207
+ │ ├── run.js # barrel(重导出 run/* 子模块)
208
+ │ ├── run/ # 运行时子系统(12 个文件)
209
+ │ │ ├── command.js # runCommand 主入口
210
+ │ │ ├── prompt.js # prompt 渲染引擎
211
+ │ │ ├── stage.js # 阶段执行器
212
+ │ │ ├── complete.js # 步骤完成处理
213
+ │ │ ├── complete-handlers.js # 阶段特化完成器
214
+ │ │ ├── gates.js # 门控引擎
215
+ │ │ ├── shared.js # 共享工具(最大文件)
216
+ │ │ ├── quick-audit.js # quick 审计
217
+ │ │ ├── scan-profile.js # scan 规模判定
218
+ │ │ ├── concurrent-detect.js # 并发检测
219
+ │ │ ├── multi-repo-context.js # 跨仓上下文
220
+ │ │ └── next.js # 状态探测
221
+ │ ├── stages/ # 阶段定义(10 个)
222
+ │ │ ├── index.js # 阶段注册表
223
+ │ │ ├── brainstorm.js # brainstorm 定义
224
+ │ │ ├── plan.js # plan 定义
225
+ │ │ ├── execute.js # execute 定义
226
+ │ │ ├── verify.js # verify 定义
227
+ │ │ ├── quick.js # quick 定义(最大阶段文件)
228
+ │ │ ├── scan.js # scan 定义
229
+ │ │ ├── explore.js # explore 定义
230
+ │ │ ├── archive.js # archive 定义
231
+ │ │ ├── status.js # status 定义
232
+ │ │ ├── doctor.js # doctor 定义
233
+ │ │ ├── knowledge.js # knowledge 命令
234
+ │ │ ├── plan-postcheck.js # plan 后置校验
235
+ │ │ ├── brainstorm-auto.js # 自动 brainstorm
236
+ │ │ └── cmd-existence.js # 命令存在性校验
237
+ │ ├── progress.js # ProgressManager facade
238
+ │ ├── progress/ # 进度子模块
239
+ │ │ ├── change-registry.js # 变更注册
240
+ │ │ ├── stage-machine.js # 阶段状态机
241
+ │ │ ├── step-store.js # 步骤存储
242
+ │ │ ├── consistency-doctor.js # 一致性修复
243
+ │ │ └── shared.js # 共享常量/类型
244
+ │ ├── db.js # SQLite 数据库管理
245
+ │ ├── db-engine.js # 数据库引擎抽象
246
+ │ ├── stage-contract.js # 阶段合约
247
+ │ ├── stage-contract-engine.js # 合约规则引擎
248
+ │ ├── stage-contract-spec.js # 合约规则定义
249
+ │ ├── machine-interface.js # 机器接口(gate/derive)
250
+ │ ├── worktree.js # worktree 管理
251
+ │ ├── worktree-apply.js # worktree 应用
252
+ │ ├── sync.js # 平台同步
253
+ │ ├── dispatch/ # SillyHub 派发
254
+ │ │ ├── probe.js
255
+ │ │ ├── strategy.js
256
+ │ │ └── backends/
257
+ │ │ ├── local-agent.js
258
+ │ │ └── sillyhub-mcp.js
259
+ │ ├── sillyhub-mcp/ # MCP 集成
260
+ │ ├── hooks/
261
+ │ │ └── worktree-guard.js # pre-push hook
262
+ │ ├── fs-atomic.js # 原子写工具
263
+ │ ├── git-helper.js # git 操作封装
264
+ │ ├── init.js # init 命令
265
+ │ ├── setup.js # setup 命令
266
+ │ ├── quicklog.js # QUICKLOG 管理
267
+ │ ├── commit-suggest.js # 提交建议
268
+ │ ├── docs-check.js # 文档引用校验
269
+ │ ├── docs-gate.js # 文档门控
270
+ │ ├── docs-debt.js # 文档债管理
271
+ │ ├── knowledge-match.js # 知识库匹配
272
+ │ ├── module-impact.js # 模块影响分析
273
+ │ ├── module-resolve.js # 模块解析
274
+ │ ├── modules.js # 模块管理
275
+ │ ├── endpoint-extractor.js # 端点提取
276
+ │ ├── config-cat.js # 配置查看
277
+ │ ├── config-schema.js # 配置 schema
278
+ │ ├── local-detect.js # 本地配置检测
279
+ │ ├── local-register.js # 本地注册
280
+ │ ├── doctor-diagnostics.js # 诊断工具
281
+ │ ├── classify-change.js # 变更分类
282
+ │ ├── change-risk-profile.js # 变更风险分析
283
+ │ ├── change-list.js # 变更文件列表
284
+ │ ├── verify-postcheck.js # verify 后置校验
285
+ │ ├── scan-postcheck.js # scan 后置校验
286
+ │ ├── scan-diff.js # scan 漂移检测
287
+ │ ├── scan-staleness.js # scan 过期检测
288
+ │ ├── plan-adopt-waves.js # plan Wave 重排
289
+ │ ├── task-review.js # task review 管理
290
+ │ ├── stage-review.js # stage review 管理
291
+ │ ├── verify-probes.js # verify 机械探针
292
+ │ ├── machine-interface.js # 机器接口
293
+ │ └── ...
294
+ ├── packages/
295
+ │ └── dashboard/ # Web Dashboard
296
+ │ ├── server/ # Node.js 后端(Express + WebSocket)
297
+ │ ├── src/ # Vue.js 前端
298
+ │ └── dist/ # 构建产物
299
+ ├── test/ # 测试(~250 个 .test.mjs 文件)
300
+ ├── docs/ # 文档
301
+ │ ├── prompt/ # 阶段提示词原文
302
+ │ └── sillyspec/ # 项目文档
303
+ ├── templates/ # 模板文件
304
+ ├── eval/ # 评估工具
305
+ └── .claude/
306
+ └── skills/ # Claude Code SKILL 定义
307
+ ```
308
+
309
+ ---
310
+
311
+ ## 6. 关键设计模式与架构决策
312
+
313
+ ### 6.1 状态机模式(Stage Machine)
314
+
315
+ 核心设计:阶段转换由 `StageContract` 严格控制,不允许跳跃。
316
+
317
+ ```
318
+ brainstorm → plan → execute → verify → archive
319
+ ↑
320
+ quick (辅助,可随时) ─────────────────┘
321
+ scan (辅助,独立)
322
+ explore (辅助,独立)
323
+ ```
324
+
325
+ 每个阶段有:
326
+ - `allowedFrom`: 允许的前置阶段
327
+ - `validators`: 校验器数组(产出文件存在性、内容完整性等)
328
+ - `steps[]`: 步骤定义(每个 step 有 prompt + outputHint + optional 标记)
329
+
330
+ ### 6.2 门控模式(Gate Pattern)
331
+
332
+ **Stage Review Gate**: 每个主流程阶段完成后,检查 stage 级 review.json
333
+ **Task Review Gate**: execute 阶段每个 task 完成后,检查 per-task review.json
334
+ **Docs Gate**: pre-push 时检查文档引用有效性
335
+
336
+ 所有 gate 遵循:**fail-closed**(无法判断时拒绝通过)+ **只读语义**(不修改状态)
337
+
338
+ ### 6.3 Machine Interface(机器接口)
339
+
340
+ 把人类可读的校验输出抽象为机器可消费的 JSON envelope:
341
+ - `runGate(stage, change)` → 判断阶段能否标记完成
342
+ - `runDerive(facet, change)` → 查询特定事实的真实状态
343
+ - 退出码三段:0=通过 / 1=阻断 / 2=无法核验
344
+
345
+ ### 6.4 Worktree 隔离(execute 阶段)
346
+
347
+ execute 阶段在独立 git worktree 中运行,避免并行变更冲突:
348
+ - `worktree create` → 创建隔离工作区
349
+ - `worktree apply` → 校验 + 合并回主工作区
350
+ - `worktree cleanup` → 清理
351
+
352
+ 支持三种模式:`worktree`(标准 git worktree)/ `native-worktree`(原生)/ `in-place-fallback`(降级就地执行)
353
+
354
+ ### 6.5 平台指针(Platform Pointer)
355
+
356
+ fail-closed 设计:平台声明接管时,指针缺失则拒绝回退到本地模式
357
+ - `.sillyspec-platform.json` 平台指针
358
+ - `*-managed` 接管声明文件
359
+ - 成对存在,成对删除
360
+
361
+ ### 6.6 懒加载优化(E22)
362
+
363
+ `src/index.js` 对轻路径(--version/help)不做重 import,progress.js 和 run/shared.js 链在 main() 早退后才动态加载,省 ~78ms 启动税。
364
+
365
+ ### 6.7 原子写 + 并发安全
366
+
367
+ - `fs-atomic.js`: 写临时文件 → renameSync 覆盖(Windows EPERM 重试机制)
368
+ - `db.js`: WAL 模式 + `busy_timeout=5000` + 应用层 `MAX_BUSY_RETRIES=3` 退避
369
+ - 主仓 apply 互斥锁(`withMainRepoLock`)
370
+
371
+ ---
372
+
373
+ ## 7. 数据存储结构
374
+
375
+ ```
376
+ .sillyspec/
377
+ ├── .runtime/
378
+ │ └── sillyspec.db # SQLite 数据库(权威状态源)
379
+ ├── changes/
380
+ │ └── <change-name>/
381
+ │ ├── design.md # 设计文档
382
+ │ ├── plan.md # 实现计划
383
+ │ ├── tasks.md # 任务注册表
384
+ │ ├── verify-result.md # 验证报告
385
+ │ ├── symbol-impact.md # 符号影响分析
386
+ │ ├── module-impact.md # 模块影响矩阵
387
+ │ └── tasks/
388
+ │ └── task-01.md # per-task 卡片
389
+ ├── docs/
390
+ │ └── <project>/
391
+ │ ├── scan/ # scan 产出文档
392
+ │ │ ├── ARCHITECTURE.md
393
+ │ │ ├── CONVENTIONS.md
394
+ │ │ ├── STRUCTURE.md
395
+ │ │ ├── INTEGRATIONS.md
396
+ │ │ ├── TESTING.md
397
+ │ │ ├── CONCERNS.md
398
+ │ │ └── PROJECT.md
399
+ │ └── modules/ # 模块文档
400
+ │ ├── _module-map.yaml
401
+ │ └── <module>.md
402
+ ├── knowledge/ # 知识库
403
+ ├── projects/ # 多项目工作区配置
404
+ ├── archive/ # 已归档变更
405
+ ├── quicklog/ # QUICKLOG
406
+ ├── local.yaml # 本地配置
407
+ └── docs-check-baseline # 文档检查基线
408
+ ```
409
+
410
+ ---
411
+
412
+ ## 8. 测试架构
413
+
414
+ - **~250 个测试文件**(`.test.mjs`),自研测试运行器 `test/run-tests.mjs`
415
+ - 覆盖面:CLI 端到端(子进程模式)、单元测试、集成测试
416
+ - 测试模式:`seed-real-steps`(CLI 子进程 seed 真实步骤)+ 直接 import 测试
417
+ - 特殊测试:flaky 测试隔离(`--spec-dir` 隔离防文件锁竞争)、跨仓测试、平台同步测试
418
+
419
+ ---
420
+
421
+ ## 9. 关键配置文件
422
+
423
+ | 文件 | 用途 |
424
+ |------|------|
425
+ | `package.json` | 项目元数据、依赖、脚本 |
426
+ | `.sillyspec/local.yaml` | 本地配置(构建命令、测试命令、docs-check 路径等) |
427
+ | `.sillyspec/.runtime/sillyspec.db` | 权威状态数据库 |
428
+ | `.sillyspec-platform.json` | 平台指针 |
429
+ | `.claude/skills/` | Claude Code SKILL 定义 |
430
+ | `.husky/pre-push` | Git pre-push hook(worktree guard + docs gate) |
431
+
432
+ ---
433
+
434
+ ## 10. 风险与观察
435
+
436
+ 1. **src/index.js 过大**:~1800 行的主路由文件,承载了所有子命令的 flag 解析和分发逻辑。虽然已有 W6 重构将 run.js 抽为 barrel,但 index.js 本身仍是单体。
437
+
438
+ 2. **自研测试/ lint 工具**:未使用社区标准工具(jest/vitest/eslint),维护成本自担,但换来了零依赖的轻量启动。
439
+
440
+ 3. **平台集成复杂度**:SillyHub 集成(sync/dispatch/mcp/pointer)引入了大量 fail-closed 守卫和并发安全逻辑,是 bug 高发区(从 MEMORY.md 的大量 worktree/sync 相关经验可见)。
441
+
442
+ 4. **Windows 兼容性**:多个 MEMORY 条目记录了 Windows 特有问题(rename EPERM、CRLF、路径分隔符),代码中已有针对性处理但仍需持续关注。
443
+
444
+ 5. **测试覆盖广度**:~250 个测试文件覆盖了极广的功能面,但部分测试有 flaky 问题(worktree/git 操作的时序敏感性)。
445
+
446
+ ---
447
+
448
+ *报告产出路径:`architecture-analysis.md`(工作区根目录)*
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../src/index.js';
@@ -0,0 +1,86 @@
1
+ # SillySpec A/B 评测
2
+
3
+ 客观量化回答一个问题:**同一个 agent,走 SillySpec 流程(B 臂)比裸跑(A 臂)到底好多少?**
4
+
5
+ - 同任务、同模型、同判分脚本(每任务一个 `verify.mjs`,退出码 0 = 通过),唯一变量是「有没有 SillySpec」。
6
+ - 产出:分臂通过率 + Wilson 95% 置信区间、Δ(B−A) 区间、flaky 剔除、token/费用/耗时、基线回归对比。
7
+ - 所有结果落 SQLite(`eval/results/eval.db`),可审计、可复跑。
8
+
9
+ ## 快速开始
10
+
11
+ ```bash
12
+ node eval/run.mjs --dry-run # ① 零 token:假 agent 验证整条管道(先跑这个)
13
+ node eval/run.mjs --preflight # ② 零 token:检查 Node 版本与 agent CLI 可用
14
+ node eval/run.mjs --pilot # ③ 真跑:前 20 个任务 × 双臂(从这里开始烧 token)
15
+ node eval/run.mjs --report # 查看报告
16
+ node eval/run.mjs --set-baseline # 成绩满意后固化为回归基线(发版前对比)
17
+ ```
18
+
19
+ npm 快捷方式:`npm run eval:dry`、`npm run eval:pilot`。
20
+
21
+ ## 认证与 apikey(重要)
22
+
23
+ **不需要把 apikey 配置在本评测的任何脚本或配置文件里。**
24
+
25
+ CLI 适配器只是以子进程方式调起你本机的 headless agent CLI(默认 `claude -p`,可换 zcode / codex 等),认证完全沿用该 CLI 自己的登录态或它读取的环境变量——你之前怎么用它,评测就怎么用。评测脚本不接管、不存储、不转发任何密钥,`eval.config.json` 可以安全提交。
26
+
27
+ 前置条件只有一条:目标 agent CLI 已安装、已登录、终端里能跑通。拿不准就先 `node eval/run.mjs --preflight`。
28
+
29
+ 未来若要接裸 API(如 GLM 的 OpenAI 兼容端点)跑自研 agent 循环,那才需要环境变量方式的 key(同样是环境变量,不进脚本)——届时新增一个 adapter 即可。
30
+
31
+ ## 命令一览
32
+
33
+ | 命令 | 用途 | token 消耗 |
34
+ |---|---|---|
35
+ | `--dry-run[=mixed\|pass\|fail]` | 假 agent 跑管道(mixed 会确定性制造两臂差异) | 0 |
36
+ | `--preflight` | Node 版本 + agent CLI 探活 | 0 |
37
+ | `--pilot` | 前 20 任务双臂真跑 | 真实消耗 |
38
+ | `--task <id>` / `--arm A\|B` / `--sample N` | 收窄范围 | 按范围 |
39
+ | `--rerun-failed` | 只重跑上轮 fail/timeout/error | 定向,省钱 |
40
+ | `--force` | 忽略缓存强制重跑 | 按范围 |
41
+ | `--report [--dry-run]` | 报告(CI / Δ / flaky / 基线) | 0 |
42
+ | `--set-baseline` | 固化当前成绩为回归基线 | 0 |
43
+
44
+ ## 省 token 机制(内建)
45
+
46
+ 1. **缓存**:同 `(config_hash, task, arm)` 已有 pass/fail 终态自动跳过;改了提示词/流程/任务内容会换 hash,只重跑受影响部分。
47
+ 2. **定向重跑**:`--rerun-failed` 不碰已通过的任务。
48
+ 3. **双重熔断**:单任务 agent 超时(`adapter.timeoutMs`)+ 判分超时(`verifyTimeoutMs`),死循环烧不穿。
49
+ 4. **dry-run / preflight 全零 token**,烧钱的大跑之前管道一定先验通。
50
+
51
+ ## 任务格式
52
+
53
+ 每个任务一个目录,四件套:
54
+
55
+ ```
56
+ eval/tasks/001-slugify/
57
+ ├── task.json # id / instruction(两臂收到同一份需求文本)
58
+ ├── verify.mjs # 判分:以被测工作目录为 cwd 执行,退出码 0 = 通过
59
+ ├── files/ # 工作副本脚手架(复制后交给 agent;棕地任务在这里放待改代码)
60
+ └── solution/ # 参考解(仅 dry-run 假 agent 使用,不参与指纹)
61
+ ```
62
+
63
+ 写任务的要点:instruction 必须无歧义(判分才有唯一正确解);verify 只看行为不看出身。当前 3 个种子任务偏小(用于验管道),正式 pilot 前应扩充到 20+,并逐步引入更贴近 SillySpec 甜区的中等规模功能任务。后续如需对接 Terminal-Bench 2.0 等外部任务源,写一个「外部任务 → 本格式」的导入器即可,编排与报告层不用动。
64
+
65
+ ## 配置(eval.config.json)
66
+
67
+ - `arms.A / arms.B`:两臂的 `setup`(agent 进场前执行的命令,B 臂默认 `npx sillyspec init`;dry-run 跳过)与 `promptTemplate`(`{instruction}` 占位)。
68
+ - `adapter`:`command` 数组 + `stdin: "prompt"`(prompt 走 stdin,规避跨平台引号问题;也可在 command 里用 `{prompt}` 占位改为参数注入);`{workdir}` / `{maxTurns}` 占位可用;`parseStdoutJson: true` 时尽力从 stdout JSON 提取 token/费用(提不到记 null,不瞎填)。
69
+ - 换被测 agent:改 `adapter.tool` + `adapter.command`(如 zcode / codex 的 headless 形式),两臂 prompt 模板不用动。
70
+
71
+ ## 目录
72
+
73
+ ```
74
+ eval/
75
+ ├── run.mjs # 入口
76
+ ├── eval.config.json # 配置(无密钥,可提交)
77
+ ├── lib/ # 编排/报告/适配器/DB
78
+ ├── tasks/ # 任务集
79
+ └── results/ # 运行产物(eval.db / 工作副本 / 日志 / baseline.json)——已 gitignore
80
+ ```
81
+
82
+ ## 已知边界
83
+
84
+ - 通过率只统计 pass/fail;timeout / error(agent 崩溃、臂 setup 失败)单列不计入分母,避免把管道故障算成 agent 失败。
85
+ - 同任务同臂多次运行结果摇摆会被标记 flaky 并从通过率剔除——放量前建议每任务跑 2 次,flaky 高说明任务本身不稳定,先修任务。
86
+ - 单臂 n < 30 时报告会提示区间仅供方向参考。
@@ -0,0 +1,28 @@
1
+ {
2
+ "tasksDir": "./tasks",
3
+ "resultsDir": "./results",
4
+ "defaultSample": 20,
5
+ "verifyTimeoutMs": 120000,
6
+ "regressionThresholdPp": 5,
7
+ "arms": {
8
+ "A": {
9
+ "label": "裸agent",
10
+ "setup": [],
11
+ "promptTemplate": "你在当前目录工作,直接完成以下需求(不要提问,直接实现,确保代码可运行):\n\n{instruction}"
12
+ },
13
+ "B": {
14
+ "label": "SillySpec",
15
+ "setup": ["npx sillyspec init --dir {workdir} --tool {tool}"],
16
+ "promptTemplate": "当前项目已安装 SillySpec 工作流。请按 SillySpec 流程完成以下需求(小任务走 quick 模式),完成后确保代码可运行:\n\n{instruction}"
17
+ }
18
+ },
19
+ "adapter": {
20
+ "type": "cli",
21
+ "tool": "claude",
22
+ "command": ["claude", "-p", "--output-format", "json", "--max-turns", "{maxTurns}"],
23
+ "stdin": "prompt",
24
+ "timeoutMs": 900000,
25
+ "maxTurns": 60,
26
+ "parseStdoutJson": true
27
+ }
28
+ }
@@ -0,0 +1,63 @@
1
+ // CLI 适配器:以子进程调起本机 headless agent CLI(claude -p / zcode / codex 等,见 eval.config.json)。
2
+ // 认证沿用该 CLI 自身的登录态或其读取的环境变量——本评测不接管、不存储任何密钥。
3
+ // prompt 默认经 stdin 注入({prompt} 占位符是备选),规避跨平台引号转义。
4
+ import { mkdirSync, writeFileSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import { spawnCapture } from '../util.mjs';
7
+
8
+ export async function run({ adapter, prompt, workdir, logDir }) {
9
+ const timeoutMs = adapter.timeoutMs ?? 900_000;
10
+ const replacements = {
11
+ '{workdir}': workdir,
12
+ '{maxTurns}': String(adapter.maxTurns ?? 0),
13
+ '{tool}': adapter.tool ?? '',
14
+ };
15
+ let args = adapter.command.map((a) => {
16
+ let s = String(a);
17
+ for (const [k, v] of Object.entries(replacements)) s = s.replaceAll(k, v);
18
+ return s;
19
+ });
20
+ const viaStdin = (adapter.stdin ?? 'prompt') === 'prompt' && !args.some((a) => a.includes('{prompt}'));
21
+ args = args.map((a) => a.replaceAll('{prompt}', prompt));
22
+
23
+ mkdirSync(logDir, { recursive: true });
24
+ writeFileSync(join(logDir, 'prompt.txt'), prompt, 'utf8');
25
+ const res = await spawnCapture({ args, cwd: workdir, timeoutMs, input: viaStdin ? prompt : null });
26
+ try {
27
+ writeFileSync(join(logDir, 'stdout.txt'), res.stdout, 'utf8');
28
+ writeFileSync(join(logDir, 'stderr.txt'), res.stderr, 'utf8');
29
+ } catch { /* 日志落盘失败不影响评测本身 */ }
30
+
31
+ const usage = adapter.parseStdoutJson ? extractUsage(res.stdout) : {};
32
+ return {
33
+ code: res.code,
34
+ timedOut: res.timedOut,
35
+ stdout: res.stdout,
36
+ stderr: res.stderr,
37
+ tokensIn: usage.tokensIn ?? null,
38
+ tokensOut: usage.tokensOut ?? null,
39
+ costUsd: usage.costUsd ?? null,
40
+ logDir,
41
+ };
42
+ }
43
+
44
+ // 宽松提取 token/费用字段:兼容 claude -p --output-format json 等常见 stdout 形状,
45
+ // 提不到就留空(null),报告里显示为缺测而非 0。
46
+ function extractUsage(stdout) {
47
+ const trimmed = (stdout ?? '').trim();
48
+ if (!trimmed.startsWith('{')) return {};
49
+ let obj = null;
50
+ for (const candidate of [trimmed, trimmed.split('\n').pop()]) {
51
+ try { obj = JSON.parse(candidate); break; } catch { /* 试下一候选 */ }
52
+ }
53
+ if (!obj || typeof obj !== 'object') return {};
54
+ const out = {};
55
+ const scan = (o) => {
56
+ if (!o || typeof o !== 'object') return;
57
+ if (typeof o.input_tokens === 'number') out.tokensIn ??= o.input_tokens;
58
+ if (typeof o.output_tokens === 'number') out.tokensOut ??= o.output_tokens;
59
+ if (typeof o.total_cost_usd === 'number') out.costUsd ??= o.total_cost_usd;
60
+ };
61
+ scan(obj); scan(obj.usage); scan(obj.cost); scan(obj.message?.usage);
62
+ return out;
63
+ }
@@ -0,0 +1,27 @@
1
+ // dry-run 假 agent:零 token 验证管道(工作副本、verify、落库、报告整条链路)。
2
+ // mixed 模式确定性制造两臂差异:A 臂全过,B 臂按任务号奇偶过——报告能展示通过率/Δ/置信区间的完整形态。
3
+ import { writeFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { copyInto } from '../workdir.mjs';
6
+
7
+ export function run({ task, arm, workdir, solutionDir, mode = 'mixed' }) {
8
+ const numeric = Number.parseInt(String(task.id).split('-')[0], 10);
9
+ let pass;
10
+ if (mode === 'pass') pass = true;
11
+ else if (mode === 'fail') pass = false;
12
+ else pass = arm === 'A' ? true : Number.isInteger(numeric) && numeric % 2 === 1;
13
+
14
+ if (pass) copyInto(workdir, solutionDir);
15
+ else writeFileSync(join(workdir, 'DRY_RUN_WRONG_ANSWER.mjs'), '// dry-run 失败路径占位产物\n');
16
+
17
+ return {
18
+ code: 0,
19
+ timedOut: false,
20
+ stdout: `[dry-run mode=${mode}] pass=${pass}`,
21
+ stderr: '',
22
+ tokensIn: 0,
23
+ tokensOut: 0,
24
+ costUsd: 0,
25
+ logDir: null,
26
+ };
27
+ }