@monoes/monomindcli 1.19.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/.claude/agents/github/issue-tracker.md +0 -2
  2. package/.claude/agents/github/pr-manager.md +0 -2
  3. package/.claude/agents/github/repo-architect.md +3 -11
  4. package/.claude/agents/goal/goal-planner.md +0 -1
  5. package/.claude/commands/github/issue-tracker.md +0 -2
  6. package/.claude/commands/github/pr-manager.md +0 -2
  7. package/.claude/commands/github/repo-architect.md +3 -10
  8. package/.claude/commands/mastermind/help.md +3 -3
  9. package/.claude/commands/workflows/README.md +0 -1
  10. package/.claude/commands/workflows/workflow-create.md +0 -1
  11. package/.claude/commands/workflows/workflow-execute.md +1 -3
  12. package/.claude/commands/workflows/workflow-export.md +0 -2
  13. package/.claude/helpers/handlers/agent-start-handler.cjs +18 -1
  14. package/.claude/helpers/handlers/edit-handler.cjs +15 -0
  15. package/.claude/helpers/handlers/gates-handler.cjs +2 -8
  16. package/.claude/helpers/handlers/route-handler.cjs +149 -7
  17. package/.claude/helpers/handlers/session-handler.cjs +47 -25
  18. package/.claude/helpers/handlers/session-restore-handler.cjs +80 -43
  19. package/.claude/helpers/handlers/task-handler.cjs +8 -4
  20. package/.claude/helpers/hook-handler.cjs +69 -16
  21. package/.claude/helpers/intelligence.cjs +100 -9
  22. package/.claude/helpers/router.cjs +78 -5
  23. package/.claude/helpers/skill-registry.json +0 -189
  24. package/.claude/skills/github-toolkit/SKILL.md +60 -0
  25. package/.claude/skills/hive-mind-advanced/SKILL.md +0 -15
  26. package/.claude/skills/hooks-automation/SKILL.md +0 -1
  27. package/.claude/skills/mastermind-skills/_protocol.md +1 -1
  28. package/.claude/skills/mastermind-skills/build.md +1 -2
  29. package/.claude/skills/memory-toolkit/SKILL.md +75 -0
  30. package/.claude/skills/specialagent/SKILL.md +2 -4
  31. package/.claude/skills/swarm-advanced/SKILL.md +0 -1
  32. package/README.md +2 -5
  33. package/dist/src/autopilot-state.d.ts.map +1 -1
  34. package/dist/src/autopilot-state.js +4 -5
  35. package/dist/src/autopilot-state.js.map +1 -1
  36. package/dist/src/browser/dashboard/server.d.ts.map +1 -1
  37. package/dist/src/browser/dashboard/server.js +69 -1
  38. package/dist/src/browser/dashboard/server.js.map +1 -1
  39. package/dist/src/browser/dashboard/ui.html +214 -1764
  40. package/dist/src/capabilities/index.d.ts +0 -2
  41. package/dist/src/capabilities/index.d.ts.map +1 -1
  42. package/dist/src/capabilities/index.js +0 -1
  43. package/dist/src/capabilities/index.js.map +1 -1
  44. package/dist/src/commands/agent-lifecycle.d.ts.map +1 -1
  45. package/dist/src/commands/agent-lifecycle.js +2 -6
  46. package/dist/src/commands/agent-lifecycle.js.map +1 -1
  47. package/dist/src/commands/analyze.d.ts +0 -4
  48. package/dist/src/commands/analyze.d.ts.map +1 -1
  49. package/dist/src/commands/analyze.js +1 -29
  50. package/dist/src/commands/analyze.js.map +1 -1
  51. package/dist/src/commands/completions.d.ts.map +1 -1
  52. package/dist/src/commands/completions.js +3 -22
  53. package/dist/src/commands/completions.js.map +1 -1
  54. package/dist/src/commands/config.d.ts.map +1 -1
  55. package/dist/src/commands/config.js +0 -6
  56. package/dist/src/commands/config.js.map +1 -1
  57. package/dist/src/commands/doctor-project-checks.d.ts +12 -2
  58. package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
  59. package/dist/src/commands/doctor-project-checks.js +130 -22
  60. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  61. package/dist/src/commands/doctor.d.ts.map +1 -1
  62. package/dist/src/commands/doctor.js +6 -5
  63. package/dist/src/commands/doctor.js.map +1 -1
  64. package/dist/src/commands/guidance.d.ts +5 -1
  65. package/dist/src/commands/guidance.d.ts.map +1 -1
  66. package/dist/src/commands/guidance.js +11 -556
  67. package/dist/src/commands/guidance.js.map +1 -1
  68. package/dist/src/commands/hive-mind-comms.d.ts.map +1 -1
  69. package/dist/src/commands/hive-mind-comms.js +11 -4
  70. package/dist/src/commands/hive-mind-comms.js.map +1 -1
  71. package/dist/src/commands/hive-mind.d.ts +4 -4
  72. package/dist/src/commands/hive-mind.d.ts.map +1 -1
  73. package/dist/src/commands/hive-mind.js +9 -6
  74. package/dist/src/commands/hive-mind.js.map +1 -1
  75. package/dist/src/commands/hooks-formatting.d.ts +1 -5
  76. package/dist/src/commands/hooks-formatting.d.ts.map +1 -1
  77. package/dist/src/commands/hooks-formatting.js +1 -18
  78. package/dist/src/commands/hooks-formatting.js.map +1 -1
  79. package/dist/src/commands/hooks-workers.d.ts +1 -1
  80. package/dist/src/commands/hooks-workers.d.ts.map +1 -1
  81. package/dist/src/commands/hooks-workers.js +82 -330
  82. package/dist/src/commands/hooks-workers.js.map +1 -1
  83. package/dist/src/commands/index.d.ts +0 -5
  84. package/dist/src/commands/index.d.ts.map +1 -1
  85. package/dist/src/commands/index.js +0 -45
  86. package/dist/src/commands/index.js.map +1 -1
  87. package/dist/src/commands/init-wizard.js +1 -1
  88. package/dist/src/commands/init-wizard.js.map +1 -1
  89. package/dist/src/commands/init.d.ts.map +1 -1
  90. package/dist/src/commands/init.js +4 -24
  91. package/dist/src/commands/init.js.map +1 -1
  92. package/dist/src/commands/neural-core.js +11 -11
  93. package/dist/src/commands/neural-core.js.map +1 -1
  94. package/dist/src/commands/neural-optimize.d.ts.map +1 -1
  95. package/dist/src/commands/neural-optimize.js +9 -11
  96. package/dist/src/commands/neural-optimize.js.map +1 -1
  97. package/dist/src/commands/neural-registry.js +10 -10
  98. package/dist/src/commands/neural-registry.js.map +1 -1
  99. package/dist/src/commands/providers.d.ts.map +1 -1
  100. package/dist/src/commands/providers.js +90 -1
  101. package/dist/src/commands/providers.js.map +1 -1
  102. package/dist/src/commands/search-universal.d.ts +7 -1
  103. package/dist/src/commands/search-universal.d.ts.map +1 -1
  104. package/dist/src/commands/search-universal.js +59 -5
  105. package/dist/src/commands/search-universal.js.map +1 -1
  106. package/dist/src/commands/security-cve.d.ts.map +1 -1
  107. package/dist/src/commands/security-cve.js +3 -5
  108. package/dist/src/commands/security-cve.js.map +1 -1
  109. package/dist/src/commands/session.d.ts.map +1 -1
  110. package/dist/src/commands/session.js +143 -3
  111. package/dist/src/commands/session.js.map +1 -1
  112. package/dist/src/commands/start.d.ts.map +1 -1
  113. package/dist/src/commands/start.js +0 -18
  114. package/dist/src/commands/start.js.map +1 -1
  115. package/dist/src/commands/swarm.d.ts.map +1 -1
  116. package/dist/src/commands/swarm.js +112 -65
  117. package/dist/src/commands/swarm.js.map +1 -1
  118. package/dist/src/consensus/audit-writer.d.ts.map +1 -1
  119. package/dist/src/consensus/audit-writer.js +43 -1
  120. package/dist/src/consensus/audit-writer.js.map +1 -1
  121. package/dist/src/consensus/tally.d.ts +19 -0
  122. package/dist/src/consensus/tally.d.ts.map +1 -0
  123. package/dist/src/consensus/tally.js +34 -0
  124. package/dist/src/consensus/tally.js.map +1 -0
  125. package/dist/src/index.d.ts +3 -2
  126. package/dist/src/index.d.ts.map +1 -1
  127. package/dist/src/index.js +9 -12
  128. package/dist/src/index.js.map +1 -1
  129. package/dist/src/init/claudemd-generator.d.ts.map +1 -1
  130. package/dist/src/init/claudemd-generator.js +10 -14
  131. package/dist/src/init/claudemd-generator.js.map +1 -1
  132. package/dist/src/init/executor.d.ts.map +1 -1
  133. package/dist/src/init/executor.js +39 -86
  134. package/dist/src/init/executor.js.map +1 -1
  135. package/dist/src/init/settings-generator.d.ts.map +1 -1
  136. package/dist/src/init/settings-generator.js +0 -12
  137. package/dist/src/init/settings-generator.js.map +1 -1
  138. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  139. package/dist/src/init/statusline-generator.js +62 -0
  140. package/dist/src/init/statusline-generator.js.map +1 -1
  141. package/dist/src/init/types.d.ts +2 -6
  142. package/dist/src/init/types.d.ts.map +1 -1
  143. package/dist/src/init/types.js +0 -3
  144. package/dist/src/init/types.js.map +1 -1
  145. package/dist/src/knowledge/document-pipeline.d.ts.map +1 -1
  146. package/dist/src/knowledge/document-pipeline.js +18 -8
  147. package/dist/src/knowledge/document-pipeline.js.map +1 -1
  148. package/dist/src/mcp-client.d.ts.map +1 -1
  149. package/dist/src/mcp-client.js +0 -2
  150. package/dist/src/mcp-client.js.map +1 -1
  151. package/dist/src/mcp-server.d.ts.map +1 -1
  152. package/dist/src/mcp-server.js +12 -14
  153. package/dist/src/mcp-server.js.map +1 -1
  154. package/dist/src/mcp-tools/coherence/coherence-check.d.ts.map +1 -1
  155. package/dist/src/mcp-tools/coherence/coherence-check.js +1 -19
  156. package/dist/src/mcp-tools/coherence/coherence-check.js.map +1 -1
  157. package/dist/src/mcp-tools/coherence/types.d.ts +3 -2
  158. package/dist/src/mcp-tools/coherence/types.d.ts.map +1 -1
  159. package/dist/src/mcp-tools/coherence/types.js +3 -18
  160. package/dist/src/mcp-tools/coherence/types.js.map +1 -1
  161. package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
  162. package/dist/src/mcp-tools/embeddings-tools.js +1 -7
  163. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  164. package/dist/src/mcp-tools/graphify-tools.js +2 -2
  165. package/dist/src/mcp-tools/graphify-tools.js.map +1 -1
  166. package/dist/src/mcp-tools/guidance-tools.d.ts.map +1 -1
  167. package/dist/src/mcp-tools/guidance-tools.js +7 -17
  168. package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
  169. package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -1
  170. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  171. package/dist/src/mcp-tools/hive-mind-tools.js +174 -38
  172. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  173. package/dist/src/mcp-tools/hooks-advanced.d.ts +18 -0
  174. package/dist/src/mcp-tools/hooks-advanced.d.ts.map +1 -0
  175. package/dist/src/mcp-tools/hooks-advanced.js +25 -0
  176. package/dist/src/mcp-tools/hooks-advanced.js.map +1 -0
  177. package/dist/src/mcp-tools/hooks-intelligence.d.ts +4 -8
  178. package/dist/src/mcp-tools/hooks-intelligence.d.ts.map +1 -1
  179. package/dist/src/mcp-tools/hooks-intelligence.js +33 -482
  180. package/dist/src/mcp-tools/hooks-intelligence.js.map +1 -1
  181. package/dist/src/mcp-tools/hooks-routing.d.ts +1 -0
  182. package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
  183. package/dist/src/mcp-tools/hooks-routing.js +51 -43
  184. package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
  185. package/dist/src/mcp-tools/hooks-synthesis.d.ts +31 -0
  186. package/dist/src/mcp-tools/hooks-synthesis.d.ts.map +1 -0
  187. package/dist/src/mcp-tools/hooks-synthesis.js +196 -0
  188. package/dist/src/mcp-tools/hooks-synthesis.js.map +1 -0
  189. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  190. package/dist/src/mcp-tools/hooks-tools.js +10 -8
  191. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  192. package/dist/src/mcp-tools/index.d.ts +0 -1
  193. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  194. package/dist/src/mcp-tools/index.js +0 -1
  195. package/dist/src/mcp-tools/index.js.map +1 -1
  196. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  197. package/dist/src/mcp-tools/memory-tools.js +20 -29
  198. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  199. package/dist/src/mcp-tools/monograph-tools.d.ts +6 -0
  200. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  201. package/dist/src/mcp-tools/monograph-tools.js +78 -220
  202. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  203. package/dist/src/mcp-tools/neural-tools.d.ts +9 -4
  204. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  205. package/dist/src/mcp-tools/neural-tools.js +242 -506
  206. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  207. package/dist/src/mcp-tools/security-tools.d.ts.map +1 -1
  208. package/dist/src/mcp-tools/security-tools.js +103 -0
  209. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  210. package/dist/src/memory/intelligence.d.ts +2 -1
  211. package/dist/src/memory/intelligence.d.ts.map +1 -1
  212. package/dist/src/memory/intelligence.js +56 -43
  213. package/dist/src/memory/intelligence.js.map +1 -1
  214. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  215. package/dist/src/memory/memory-bridge.js +14 -9
  216. package/dist/src/memory/memory-bridge.js.map +1 -1
  217. package/dist/src/memory/memory-read.d.ts.map +1 -1
  218. package/dist/src/memory/memory-read.js +1 -19
  219. package/dist/src/memory/memory-read.js.map +1 -1
  220. package/dist/src/suggest.d.ts.map +1 -1
  221. package/dist/src/suggest.js +1 -7
  222. package/dist/src/suggest.js.map +1 -1
  223. package/dist/src/transfer/store/discovery.d.ts +3 -2
  224. package/dist/src/transfer/store/discovery.d.ts.map +1 -1
  225. package/dist/src/transfer/store/discovery.js +22 -70
  226. package/dist/src/transfer/store/discovery.js.map +1 -1
  227. package/dist/src/update/checker.d.ts.map +1 -1
  228. package/dist/src/update/checker.js +0 -1
  229. package/dist/src/update/checker.js.map +1 -1
  230. package/dist/src/utils/cosine-similarity.d.ts +22 -0
  231. package/dist/src/utils/cosine-similarity.d.ts.map +1 -0
  232. package/dist/src/utils/cosine-similarity.js +38 -0
  233. package/dist/src/utils/cosine-similarity.js.map +1 -0
  234. package/dist/src/utils/input-guards.d.ts +51 -0
  235. package/dist/src/utils/input-guards.d.ts.map +1 -0
  236. package/dist/src/utils/input-guards.js +223 -0
  237. package/dist/src/utils/input-guards.js.map +1 -0
  238. package/dist/src/utils/json-file.d.ts +33 -0
  239. package/dist/src/utils/json-file.d.ts.map +1 -0
  240. package/dist/src/utils/json-file.js +57 -0
  241. package/dist/src/utils/json-file.js.map +1 -0
  242. package/dist/tsconfig.tsbuildinfo +1 -1
  243. package/package.json +9 -6
  244. package/scripts/sync-claude-assets.sh +16 -20
  245. package/.claude/agents/generated/case-analyst.md +0 -50
  246. package/.claude/agents/generated/channel-intelligence-director.md +0 -87
  247. package/.claude/agents/generated/chief-growth-officer.md +0 -88
  248. package/.claude/agents/generated/churn-analyst.md +0 -53
  249. package/.claude/agents/generated/code-reviewer.md +0 -55
  250. package/.claude/agents/generated/code-validator.md +0 -57
  251. package/.claude/agents/generated/complexity-scanner.md +0 -56
  252. package/.claude/agents/generated/content-seo-strategist.md +0 -90
  253. package/.claude/agents/generated/copy-editor.md +0 -45
  254. package/.claude/agents/generated/court-reporter.md +0 -50
  255. package/.claude/agents/generated/defender.md +0 -51
  256. package/.claude/agents/generated/devbot-orchestrator.md +0 -58
  257. package/.claude/agents/generated/devbot-planner.md +0 -63
  258. package/.claude/agents/generated/developer-community-strategist.md +0 -91
  259. package/.claude/agents/generated/editor-in-chief.md +0 -45
  260. package/.claude/agents/generated/fact-checker.md +0 -45
  261. package/.claude/agents/generated/impact-assessor.md +0 -54
  262. package/.claude/agents/generated/judge.md +0 -51
  263. package/.claude/agents/generated/outreach-partnership-strategist.md +0 -90
  264. package/.claude/agents/generated/prosecutor.md +0 -51
  265. package/.claude/agents/generated/reporter.md +0 -45
  266. package/.claude/agents/generated/social-media-strategist.md +0 -91
  267. package/.claude/agents/generated/video-visual-strategist.md +0 -90
  268. package/.claude/agents/reengineer-squad/boss.md +0 -113
  269. package/.claude/agents/reengineer-squad/critic-architect.md +0 -132
  270. package/.claude/agents/reengineer-squad/git-manager.md +0 -145
  271. package/.claude/agents/reengineer-squad/idea-generator.md +0 -95
  272. package/.claude/agents/reengineer-squad/implementer.md +0 -112
  273. package/.claude/agents/reengineer-squad/integration-planner.md +0 -112
  274. package/.claude/agents/reengineer-squad/source-analyst.md +0 -103
  275. package/.claude/agents/reengineer-squad/target-analyst.md +0 -118
  276. package/.claude/agents/reengineer-squad/tester.md +0 -105
  277. package/.claude/agents/sparc/architecture.md +0 -453
  278. package/.claude/agents/sparc/pseudocode.md +0 -299
  279. package/.claude/agents/sparc/refinement.md +0 -504
  280. package/.claude/agents/sparc/specification.md +0 -258
  281. package/.claude/agents/templates/implementer-sparc-coder.md +0 -231
  282. package/.claude/commands/sparc/analyzer.md +0 -35
  283. package/.claude/commands/sparc/architect.md +0 -36
  284. package/.claude/commands/sparc/ask.md +0 -56
  285. package/.claude/commands/sparc/batch-executor.md +0 -37
  286. package/.claude/commands/sparc/code.md +0 -48
  287. package/.claude/commands/sparc/coder.md +0 -37
  288. package/.claude/commands/sparc/debug.md +0 -42
  289. package/.claude/commands/sparc/debugger.md +0 -37
  290. package/.claude/commands/sparc/designer.md +0 -36
  291. package/.claude/commands/sparc/devops.md +0 -68
  292. package/.claude/commands/sparc/docs-writer.md +0 -39
  293. package/.claude/commands/sparc/documenter.md +0 -37
  294. package/.claude/commands/sparc/innovator.md +0 -37
  295. package/.claude/commands/sparc/integration.md +0 -42
  296. package/.claude/commands/sparc/mcp.md +0 -76
  297. package/.claude/commands/sparc/memory-manager.md +0 -57
  298. package/.claude/commands/sparc/optimizer.md +0 -37
  299. package/.claude/commands/sparc/orchestrator.md +0 -70
  300. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +0 -42
  301. package/.claude/commands/sparc/refinement-optimization-mode.md +0 -42
  302. package/.claude/commands/sparc/researcher.md +0 -37
  303. package/.claude/commands/sparc/reviewer.md +0 -37
  304. package/.claude/commands/sparc/security-review.md +0 -39
  305. package/.claude/commands/sparc/sparc-modes.md +0 -120
  306. package/.claude/commands/sparc/sparc.md +0 -71
  307. package/.claude/commands/sparc/spec-pseudocode.md +0 -39
  308. package/.claude/commands/sparc/supabase-admin.md +0 -301
  309. package/.claude/commands/sparc/swarm-coordinator.md +0 -50
  310. package/.claude/commands/sparc/tdd.md +0 -37
  311. package/.claude/commands/sparc/tester.md +0 -37
  312. package/.claude/commands/sparc/tutorial.md +0 -38
  313. package/.claude/commands/sparc/workflow-manager.md +0 -37
  314. package/.claude/commands/sparc.md +0 -112
  315. package/.claude/skills/sparc-methodology/SKILL.md +0 -950
  316. package/dist/src/capabilities/enrichment.d.ts +0 -44
  317. package/dist/src/capabilities/enrichment.d.ts.map +0 -1
  318. package/dist/src/capabilities/enrichment.js +0 -141
  319. package/dist/src/capabilities/enrichment.js.map +0 -1
  320. package/dist/src/commands/analyze-boundaries.d.ts +0 -14
  321. package/dist/src/commands/analyze-boundaries.d.ts.map +0 -1
  322. package/dist/src/commands/analyze-boundaries.js +0 -295
  323. package/dist/src/commands/analyze-boundaries.js.map +0 -1
  324. package/dist/src/commands/analyze-graph.d.ts +0 -14
  325. package/dist/src/commands/analyze-graph.d.ts.map +0 -1
  326. package/dist/src/commands/analyze-graph.js +0 -304
  327. package/dist/src/commands/analyze-graph.js.map +0 -1
  328. package/dist/src/commands/claims.d.ts +0 -10
  329. package/dist/src/commands/claims.d.ts.map +0 -1
  330. package/dist/src/commands/claims.js +0 -650
  331. package/dist/src/commands/claims.js.map +0 -1
  332. package/dist/src/commands/daemon.d.ts +0 -8
  333. package/dist/src/commands/daemon.d.ts.map +0 -1
  334. package/dist/src/commands/daemon.js +0 -681
  335. package/dist/src/commands/daemon.js.map +0 -1
  336. package/dist/src/commands/enrich.d.ts +0 -10
  337. package/dist/src/commands/enrich.d.ts.map +0 -1
  338. package/dist/src/commands/enrich.js +0 -58
  339. package/dist/src/commands/enrich.js.map +0 -1
  340. package/dist/src/commands/issues.d.ts +0 -21
  341. package/dist/src/commands/issues.d.ts.map +0 -1
  342. package/dist/src/commands/issues.js +0 -575
  343. package/dist/src/commands/issues.js.map +0 -1
  344. package/dist/src/commands/workflow.d.ts +0 -8
  345. package/dist/src/commands/workflow.d.ts.map +0 -1
  346. package/dist/src/commands/workflow.js +0 -575
  347. package/dist/src/commands/workflow.js.map +0 -1
  348. package/dist/src/mcp-tools/workflow-tools.d.ts +0 -8
  349. package/dist/src/mcp-tools/workflow-tools.d.ts.map +0 -1
  350. package/dist/src/mcp-tools/workflow-tools.js +0 -717
  351. package/dist/src/mcp-tools/workflow-tools.js.map +0 -1
  352. package/dist/src/services/claim-service.d.ts +0 -198
  353. package/dist/src/services/claim-service.d.ts.map +0 -1
  354. package/dist/src/services/claim-service.js +0 -890
  355. package/dist/src/services/claim-service.js.map +0 -1
  356. package/dist/src/services/headless-worker-executor.d.ts +0 -311
  357. package/dist/src/services/headless-worker-executor.d.ts.map +0 -1
  358. package/dist/src/services/headless-worker-executor.js +0 -1183
  359. package/dist/src/services/headless-worker-executor.js.map +0 -1
  360. package/dist/src/services/worker-daemon.d.ts +0 -230
  361. package/dist/src/services/worker-daemon.d.ts.map +0 -1
  362. package/dist/src/services/worker-daemon.js +0 -1350
  363. package/dist/src/services/worker-daemon.js.map +0 -1
  364. package/dist/src/ui/.monomind/capture/active-run.json +0 -1
  365. package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/real-events-1782290897.convs.jsonl +0 -3
  366. package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/real-events-1782290897.jsonl +0 -11
  367. package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/rigid-qa-restart-1782288201.jsonl +0 -540
  368. package/dist/src/ui/.monomind/orgs/system-trial-qa-threads.jsonl +0 -3
  369. package/dist/src/ui/.monomind/orgs/test-event-fix/runs/rigid-qa-restart-1782288201.jsonl +0 -2
@@ -120,15 +120,92 @@ module.exports = {
120
120
  }
121
121
 
122
122
  // Bridge to @monomind/hooks compiled workers (GAP-001).
123
+ // Uses the shared hCtx._ensureHooksModule() (defined in hook-handler.cjs) so worker
124
+ // registration happens exactly once per process instead of being duplicated here —
125
+ // every other bridging handler (agent-start, pre-task, post-task, post-edit,
126
+ // session-end) calls the same lazy loader since each hook event is its own process.
123
127
  try {
124
- var hooksModule = await import('@monomind/hooks');
125
- if (hooksModule && hooksModule.initDefaultWorkers) {
126
- await runWithTimeout(function() { return hooksModule.initDefaultWorkers(); }, '@monomind/hooks.initDefaultWorkers()');
128
+ var hooksModule = hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : await import('@monomind/hooks');
129
+ if (hooksModule) {
127
130
  hCtx._hooksModule = hooksModule;
128
131
  console.log('[INFO] @monomind/hooks workers initialized');
132
+
133
+ // Gate enforcement lives entirely in gates-handler.cjs (its own regex
134
+ // table, run on every PreToolUse). The @monomind/guidance package that
135
+ // used to compile gate configs here was removed.
136
+
137
+ // Fire SessionStart event so observability bus and other SessionStart hooks activate
138
+ if (hooksModule.executeHooks && hooksModule.HookEvent) {
139
+ try {
140
+ await runWithTimeout(function() {
141
+ return hooksModule.executeHooks(hooksModule.HookEvent.SessionStart, {
142
+ session: {
143
+ id: String(hookInput.sessionId || hookInput.session_id || ''),
144
+ startedAt: new Date(),
145
+ },
146
+ }, { continueOnError: true, timeout: 1500 });
147
+ }, '@monomind/hooks.SessionStart');
148
+ } catch (e2) { /* non-fatal */ }
149
+ }
129
150
  }
130
151
  } catch (e) { /* @monomind/hooks not compiled yet — skip */ }
131
152
 
153
+ // Refresh worker metrics once per session start — the statusline
154
+ // (.claude/helpers/statusline.cjs) reads .monomind/metrics/ddd-progress.json,
155
+ // route-handler.cjs and doctor read codebase-map/security-audit/performance/
156
+ // consolidation.json; the @monomind/hooks workers are never otherwise
157
+ // scheduled on the live hook path (the worker daemon that used to produce
158
+ // these files was deleted).
159
+ //
160
+ // Staleness gating keeps session start fast: the metrics-producing workers
161
+ // only run when their output file is missing or older than 6 hours (ddd is
162
+ // refreshed every session, as before). Each run is capped by runWithTimeout
163
+ // (1.5s) — on timeout the awaiting stops but the worker keeps running and
164
+ // flushes atomically via tmp+rename, so a slow worker never blocks session
165
+ // start and never leaves a partial file.
166
+ try {
167
+ var _metricsDir = path.join(CWD, '.monomind', 'metrics');
168
+ fs.mkdirSync(_metricsDir, { recursive: true });
169
+ var STALE_MS = 6 * 60 * 60 * 1000; // 6 hours
170
+ var _isStale = function(outFile) {
171
+ try {
172
+ var st = fs.statSync(path.join(_metricsDir, outFile));
173
+ return (Date.now() - st.mtimeMs) > STALE_MS;
174
+ } catch (e) { return true; } // missing → run
175
+ };
176
+ var _hooksWorkers = [
177
+ { factory: 'createDDDWorker', file: 'worker-ddd.js', out: 'ddd-progress.json', always: true },
178
+ { factory: 'createMapWorker', file: 'worker-map.js', out: 'codebase-map.json' },
179
+ { factory: 'createAuditWorker', file: 'worker-audit.js', out: 'security-audit.json' },
180
+ { factory: 'createOptimizeWorker', file: 'worker-optimize.js', out: 'performance.json' },
181
+ { factory: 'createConsolidateWorker', file: 'worker-consolidate.js', out: 'consolidation.json' },
182
+ ];
183
+ var _hooksDistDir = path.join(CWD, 'packages', '@monomind', 'hooks', 'dist', 'workers');
184
+ for (var wi = 0; wi < _hooksWorkers.length; wi++) {
185
+ var _w = _hooksWorkers[wi];
186
+ if (!_w.always && !_isStale(_w.out)) continue;
187
+ try {
188
+ var _create = (hooksModule && typeof hooksModule[_w.factory] === 'function')
189
+ ? hooksModule[_w.factory] : null;
190
+ if (!_create) {
191
+ // Dev-repo fallback: bare '@monomind/hooks' does not resolve from .claude/helpers
192
+ // in the monorepo (pnpm workspace link lives under packages/@monomind/cli), so
193
+ // import the compiled worker directly by path.
194
+ var _wDist = path.join(_hooksDistDir, _w.file);
195
+ if (fs.existsSync(_wDist)) {
196
+ var _wMod = await import('file://' + _wDist);
197
+ if (_wMod && typeof _wMod[_w.factory] === 'function') _create = _wMod[_w.factory];
198
+ }
199
+ }
200
+ if (_create) {
201
+ var _wRun = _create(CWD);
202
+ // runWithTimeout caps each at 1.5s so a slow worker can never block session start.
203
+ await runWithTimeout(function() { return _wRun(); }, '@monomind/hooks.' + _w.factory);
204
+ }
205
+ } catch (e) { /* non-fatal — worker unavailable */ }
206
+ }
207
+ } catch (e) { /* non-fatal — hooks workers unavailable */ }
208
+
132
209
  // Context Persistence Auto-Restore
133
210
  try {
134
211
  var cpHook = await import('file://' + path.join(helpersDir, 'context-persistence-hook.mjs'));
@@ -275,46 +352,6 @@ module.exports = {
275
352
  } catch (e) {}
276
353
  } catch (e) { /* non-fatal */ }
277
354
 
278
- // Daemon Auto-Start Check.
279
- try {
280
- var daemonPid = path.join(CWD, '.monomind', 'daemon.pid');
281
- var daemonRunning = false;
282
- if (fs.existsSync(daemonPid)) {
283
- try {
284
- var MAX_PID = 32; // 32 bytes — enough for any pid
285
- if (fs.statSync(daemonPid).size <= MAX_PID) {
286
- var pid = parseInt(fs.readFileSync(daemonPid, 'utf-8').trim(), 10);
287
- if (Number.isInteger(pid) && pid > 0 && pid < 4194304) {
288
- process.kill(pid, 0);
289
- daemonRunning = true;
290
- }
291
- }
292
- } catch (e) { /* pid stale */ }
293
- }
294
- if (!daemonRunning) {
295
- var daemonCfg = {};
296
- try {
297
- var cfgPath = path.join(CWD, 'monomind.config.json');
298
- var MAX_CFG = 256 * 1024; // 256 KiB
299
- if (fs.existsSync(cfgPath) && fs.statSync(cfgPath).size <= MAX_CFG) daemonCfg = JSON.parse(fs.readFileSync(cfgPath, 'utf-8')).daemon || {};
300
- } catch (e) {}
301
- if (daemonCfg.autoStart) {
302
- var spawn = require('child_process').spawn;
303
- var daemonChild = spawn('npx', ['monomind', 'daemon', 'start'], {
304
- cwd: CWD, detached: true, stdio: 'ignore'
305
- });
306
- daemonChild.on('error', function() {});
307
- daemonChild.unref();
308
- console.log('[DAEMON_AUTOSTART] Background daemon started (pid ' + daemonChild.pid + ')');
309
- }
310
- // Daemon not running + no autoStart: emit only if this project has a config
311
- // (i.e. daemon was intentionally set up). Avoids noisy output in daemon-less projects.
312
- else if (fs.existsSync(path.join(CWD, 'monomind.config.json'))) {
313
- console.log('[DAEMON_STOPPED] Run `npx monomind daemon start` to enable background workers');
314
- }
315
- }
316
- } catch (e) { /* non-fatal */ }
317
-
318
355
  // Token Usage — inject daily/monthly cost summary.
319
356
  try {
320
357
  var tokenTracker = require(path.join(helpersDir, 'token-tracker.cjs'));
@@ -24,8 +24,10 @@ module.exports = {
24
24
  // - PromptVersioning experiments (unused feature)
25
25
  // - Monograph blast radius (already shown by post-edit hook on actual changes)
26
26
 
27
- // Bridge to @monomind/hooks registry — fires Tasks 26 (PromptAssembler) and any other PreTask hooks
28
- var _hooksModule = hCtx._hooksModule;
27
+ // Bridge to @monomind/hooks registry — fires Tasks 26 (PromptAssembler) and any other PreTask hooks.
28
+ // Each hook event runs in a fresh process, so hCtx._hooksModule set by session-restore in an
29
+ // earlier invocation is never visible here — must (re)load lazily via _ensureHooksModule().
30
+ var _hooksModule = hCtx._hooksModule || (hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : null);
29
31
  if (_hooksModule && _hooksModule.executeHooks && _hooksModule.HookEvent) {
30
32
  try {
31
33
  await _hooksModule.executeHooks(_hooksModule.HookEvent.PreTask, {
@@ -81,8 +83,10 @@ module.exports = {
81
83
  }
82
84
  } catch (e) { /* non-fatal */ }
83
85
 
84
- // Bridge to @monomind/hooks registry — fires Tasks 39 (SpecializationScorer) and any other PostTask hooks
85
- var _hooksModule = hCtx._hooksModule;
86
+ // Bridge to @monomind/hooks registry — fires Tasks 39 (SpecializationScorer) and any other PostTask hooks.
87
+ // Each hook event runs in a fresh process, so hCtx._hooksModule set by session-restore in an
88
+ // earlier invocation is never visible here — must (re)load lazily via _ensureHooksModule().
89
+ var _hooksModule = hCtx._hooksModule || (hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : null);
86
90
  if (_hooksModule && _hooksModule.executeHooks && _hooksModule.HookEvent) {
87
91
  try {
88
92
  await _hooksModule.executeHooks(_hooksModule.HookEvent.PostTask, {
@@ -15,11 +15,24 @@
15
15
  * 2. @monomind/hooks TypeScript package (packages/@monomind/hooks/)
16
16
  * A full TypeScript package with workers, learning services, and
17
17
  * a WorkerManager. It compiles to dist/ but is only loaded
18
- * optionally currently at session-restore (to bridge pre-task /
19
- * post-task into the hook registry) and at session-restore for a
20
- * non-blocking security scan. The CJS handlers in system (1) are
21
- * the authoritative dispatch path; system (2) provides optional
22
- * enrichment when the package is installed and built.
18
+ * optionally, bridged at six lifecycle events: SessionStart (restore),
19
+ * PreTask, PostTask, PostEdit, SessionEnd, and AgentSpawn (agent-start).
20
+ * The CJS handlers in system (1) are the authoritative dispatch path;
21
+ * system (2) provides optional enrichment when the package is
22
+ * installed and built.
23
+ *
24
+ * IMPORTANT: each hook event is dispatched as its OWN fresh `node`
25
+ * process (Claude Code spawns one invocation per event — this file
26
+ * does not stay resident across events). So the @monomind/hooks
27
+ * module, and anything it registers (trace collector spans, episode
28
+ * binner, etc.), cannot be set up once and reused across events —
29
+ * every bridging handler must call hCtx._ensureHooksModule() itself,
30
+ * which lazily imports the package AND calls initDefaultWorkers() in
31
+ * that process before firing executeHooks(). Cross-event state (e.g.
32
+ * correlating a PreTask span to its matching PostTask) is NOT
33
+ * possible via in-memory maps for this reason; only handlers/hooks
34
+ * that persist state to disk (like the daemon workers under
35
+ * .monomind/metrics/) can meaningfully bridge across separate events.
23
36
  */
24
37
 
25
38
  const path = require('path');
@@ -88,9 +101,43 @@ const session = safeRequire(path.join(helpersDir, 'session.cjs'));
88
101
  const memory = safeRequire(path.join(helpersDir, 'memory.cjs'));
89
102
  const intelligence = safeRequire(path.join(helpersDir, 'intelligence.cjs'));
90
103
 
91
- // Module-level reference to @monomind/hooks — populated at session-restore,
92
- // then used by pre-task / post-task to bridge into the hook registry (Tasks 26, 39).
104
+ // Module-level reference to @monomind/hooks — populated lazily via
105
+ // _ensureHooksModule(). NOTE: hook-handler.cjs runs as a fresh `node` process
106
+ // per hook event (Claude Code spawns one invocation per event, it does not
107
+ // keep the process alive across events), so a value set during one event
108
+ // (e.g. session-restore) is NOT visible to a later event's process (e.g.
109
+ // pre-task). Each handler that needs the bridge MUST call
110
+ // hCtx._ensureHooksModule() itself rather than reading hCtx._hooksModule
111
+ // directly, or the bridge silently no-ops.
93
112
  let _hooksModule = null;
113
+ let _hooksModuleLoadAttempted = false;
114
+ async function _ensureHooksModule() {
115
+ if (_hooksModule) return _hooksModule;
116
+ if (_hooksModuleLoadAttempted) return null; // already tried+failed this process
117
+ _hooksModuleLoadAttempted = true;
118
+ // 1) Bare specifier — works when @monomind/hooks is installed/linked in a
119
+ // node_modules reachable from this file (e.g. an end-user install).
120
+ try {
121
+ _hooksModule = await import('@monomind/hooks');
122
+ } catch (e) {
123
+ _hooksModule = null;
124
+ }
125
+ // 2) Dev-repo fallback — in the monorepo the pnpm workspace link lives under
126
+ // packages/@monomind/cli/node_modules, NOT at the repo root, so the bare
127
+ // specifier never resolves from .claude/helpers. Import the compiled dist
128
+ // entry directly by path (same pattern as session-restore-handler.cjs).
129
+ if (!_hooksModule) {
130
+ try {
131
+ const _distIndex = path.join(CWD, 'packages', '@monomind', 'hooks', 'dist', 'index.js');
132
+ if (fs.existsSync(_distIndex)) {
133
+ _hooksModule = await import('file://' + _distIndex);
134
+ }
135
+ } catch (e) {
136
+ _hooksModule = null; // not built — bridge stays a fail-soft no-op
137
+ }
138
+ }
139
+ return _hooksModule;
140
+ }
94
141
 
95
142
  // ── Intelligence timeout protection (fixes #1530, #1531) ───────────────────
96
143
  var INTELLIGENCE_TIMEOUT_MS = 1500;
@@ -212,9 +259,11 @@ var hCtx = {
212
259
  intelligence: intelligence,
213
260
  getLearningService: getLearningService,
214
261
  isSimpleCommand: isSimpleCommand,
215
- // Module-level singleton (populated by session-restore handler)
262
+ // Module-level singleton (populated by session-restore handler, or lazily
263
+ // via _ensureHooksModule() — required since each hook event is a fresh process).
216
264
  get _hooksModule() { return _hooksModule; },
217
265
  set _hooksModule(v) { _hooksModule = v; },
266
+ _ensureHooksModule: _ensureHooksModule,
218
267
  // Utility functions
219
268
  _recordRecentEdit: _recordRecentEdit,
220
269
  _getRecentEdits: _getRecentEdits,
@@ -292,9 +341,9 @@ const handlers = {
292
341
  await h.handle(hCtx, 'auto');
293
342
  },
294
343
 
295
- 'agent-start': () => {
344
+ 'agent-start': async () => {
296
345
  const h = require('./handlers/agent-start-handler.cjs');
297
- h.handle(hCtx);
346
+ await h.handle(hCtx);
298
347
  },
299
348
 
300
349
  'adr-draft': () => {
@@ -757,9 +806,13 @@ if (command && handlers[command]) {
757
806
  }
758
807
  }
759
808
 
760
- main().catch(function(e) {
761
- console.log('[WARN] Hook handler error: ' + e.message);
762
- }).finally(function() {
763
- // Use process.exitCode if a gate set it (exit 2 = block), otherwise clean exit
764
- process.exit(process.exitCode || 0);
765
- });
809
+ // Only run when executed directly (every real hook event spawns this file as a
810
+ // process). A require() e.g. from tests verifying it loads — must not exit.
811
+ if (require.main === module) {
812
+ main().catch(function(e) {
813
+ console.log('[WARN] Hook handler error: ' + e.message);
814
+ }).finally(function() {
815
+ // Use process.exitCode if a gate set it (exit 2 = block), otherwise clean exit
816
+ process.exit(process.exitCode || 0);
817
+ });
818
+ }
@@ -156,6 +156,36 @@ function consolidate() {
156
156
  // Clear recent-edits after consolidation (session boundary)
157
157
  try { fs.writeFileSync(RECENT_EDITS_FILE, '', 'utf-8'); } catch (_) {}
158
158
 
159
+ // Load session episodes (written by session-handler.cjs into the same
160
+ // .monomind dir) so patterns can carry real semantic content — the user's
161
+ // prompt snippet and commit subjects — instead of just file basenames.
162
+ var episodes = [];
163
+ var episodeLines = safeReadLines(path.join(CWD, '.monomind', 'episodic', 'episodes.jsonl'));
164
+ for (var epi = 0; epi < episodeLines.length; epi++) {
165
+ try { episodes.push(JSON.parse(episodeLines[epi])); } catch (_) {}
166
+ }
167
+
168
+ // Build-noise artifacts that say nothing about what the task actually was.
169
+ function isNoisePath(p) {
170
+ var base = path.basename(p);
171
+ if (base === 'tsconfig.tsbuildinfo' || base === 'coverage.json') return true;
172
+ if (/\.map$/.test(base)) return true;
173
+ if (/(^|\/)dist\//.test(p)) return true;
174
+ return false;
175
+ }
176
+
177
+ // Nearest episode whose end time is within 30 minutes of the outcome.
178
+ function findEpisodeNear(ts) {
179
+ var best = null;
180
+ var bestDelta = 30 * 60 * 1000;
181
+ for (var ki = 0; ki < episodes.length; ki++) {
182
+ var cand = episodes[ki];
183
+ var delta = Math.abs((cand.endedAt || 0) - ts);
184
+ if (delta <= bestDelta) { bestDelta = delta; best = cand; }
185
+ }
186
+ return best;
187
+ }
188
+
159
189
  // Synthesize successful patterns from outcomes into auto-memory-store.json
160
190
  var outcomeLines = safeReadLines(OUTCOMES_FILE);
161
191
  var newStoreEntries = [];
@@ -174,19 +204,69 @@ function consolidate() {
174
204
  // Use e.path if it's a non-empty string; skip objects without a valid path
175
205
  return (e && typeof e.path === 'string' && e.path.length > 0) ? e.path : null;
176
206
  }).filter(function(p) { return p !== null; });
177
- // Deduplicate paths
207
+ // Deduplicate paths, dropping build-noise artifacts (tsbuildinfo,
208
+ // sourcemaps, coverage output, dist/ bundles) so the pattern describes
209
+ // real source work.
178
210
  var uniquePaths = [];
179
211
  var pathSeen = {};
180
212
  for (var pi = 0; pi < editPaths.length; pi++) {
181
213
  var p = String(editPaths[pi]);
214
+ if (isNoisePath(p)) continue;
182
215
  if (!pathSeen[p]) { pathSeen[p] = true; uniquePaths.push(p); }
183
216
  }
217
+ if (uniquePaths.length === 0) continue;
218
+ var baseNames = uniquePaths.slice(0, 5).map(function(bp) { return path.basename(bp); });
219
+
220
+ // Prefer real semantic content for the summary: outcome.context (rare —
221
+ // only set when getContext matched in the same process), else the
222
+ // matching episode's prompt snippet + first commit subject.
223
+ var summary = outcome.context || null;
224
+ var hasCommits = false;
225
+ var ep = findEpisodeNear(outcome.ts || Date.now());
226
+ if (ep && ep.summary) {
227
+ // Episode summaries are newline-joined parts written by
228
+ // session-handler: prompt snippet, "Commits: ...", "Modified: ...",
229
+ // "Outcome: ...".
230
+ var epParts = String(ep.summary).split('\n');
231
+ var promptSnippet = '';
232
+ var commitSubject = '';
233
+ for (var si = 0; si < epParts.length; si++) {
234
+ var part = epParts[si].trim();
235
+ if (!part) continue;
236
+ if (part.indexOf('Commits: ') === 0) {
237
+ if (!commitSubject) commitSubject = part.slice(9).split(';')[0].trim();
238
+ } else if (part.indexOf('Modified: ') !== 0 && part.indexOf('Outcome: ') !== 0 && !promptSnippet) {
239
+ promptSnippet = part.slice(0, 160);
240
+ }
241
+ }
242
+ hasCommits = commitSubject.length > 0;
243
+ if (!summary) {
244
+ var bits = [];
245
+ if (promptSnippet) bits.push(promptSnippet);
246
+ if (commitSubject) bits.push('commit: ' + commitSubject);
247
+ if (bits.length > 0) summary = bits.join(' — ') + ' (files: ' + baseNames.join(', ') + ')';
248
+ }
249
+ }
250
+ if (!summary) summary = 'Successful task editing ' + uniquePaths.length + ' files: ' + baseNames.join(', ');
251
+
252
+ // Confidence from evidence rather than a hardcoded constant:
253
+ // 0.5 base for any successful outcome
254
+ // +0.2 when commits back the session (strongest success signal)
255
+ // +0.1 when test files were part of the edit set
256
+ var confidence = 0.5;
257
+ if (hasCommits) confidence += 0.2;
258
+ var touchedTests = uniquePaths.some(function(tp) {
259
+ return /(^|\/)(tests?|__tests__)\//.test(tp) || /\.(test|spec)\.[cm]?[jt]sx?$/.test(tp);
260
+ });
261
+ if (touchedTests) confidence += 0.1;
262
+ confidence = Math.round(confidence * 100) / 100; // avoid FP artifacts like 0.7999…
263
+
184
264
  newStoreEntries.push({
185
265
  id: 'auto-' + (outcome.ts || Date.now()) + '-' + i,
186
266
  type: 'pattern',
187
- content: 'Successful edit pattern: ' + uniquePaths.map(function(p) { return path.basename(p); }).join(', '),
188
- summary: outcome.context || 'Successful task editing ' + uniquePaths.length + ' files: ' + uniquePaths.slice(0, 5).map(function(p) { return path.basename(p); }).join(', '),
189
- confidence: 0.6,
267
+ content: 'Successful edit pattern: ' + uniquePaths.map(function(cp) { return path.basename(cp); }).join(', '),
268
+ summary: summary,
269
+ confidence: confidence,
190
270
  files: uniquePaths,
191
271
  ts: outcome.ts || Date.now(),
192
272
  });
@@ -198,10 +278,21 @@ function consolidate() {
198
278
  var existing = safeReadJson(STORE_FILE);
199
279
  var store = Array.isArray(existing) ? existing : [];
200
280
  var existingIds = new Set(store.map(function(e) { return e && e.id; }));
281
+ // Skip near-identical patterns: same summary text or same file set as an
282
+ // entry already in the store (or one added earlier in this batch).
283
+ var fileSetKey = function(e) { return (e.files || []).slice().sort().join('|'); };
284
+ var seenSummaries = new Set(store.map(function(e) { return e && e.summary; }));
285
+ var seenFileSets = new Set(store.filter(function(e) { return e && Array.isArray(e.files) && e.files.length > 0; }).map(fileSetKey));
286
+ var addedCount = 0;
201
287
  for (var j = 0; j < newStoreEntries.length; j++) {
202
- if (!existingIds.has(newStoreEntries[j].id)) {
203
- store.push(newStoreEntries[j]);
204
- }
288
+ var ne = newStoreEntries[j];
289
+ if (existingIds.has(ne.id)) continue;
290
+ if (seenSummaries.has(ne.summary)) continue;
291
+ if (ne.files && ne.files.length > 0 && seenFileSets.has(fileSetKey(ne))) continue;
292
+ store.push(ne);
293
+ seenSummaries.add(ne.summary);
294
+ if (ne.files && ne.files.length > 0) seenFileSets.add(fileSetKey(ne));
295
+ addedCount++;
205
296
  }
206
297
  // Cap store at 200 entries to prevent unbounded growth
207
298
  if (store.length > 200) {
@@ -211,7 +302,7 @@ function consolidate() {
211
302
  try {
212
303
  fs.writeFileSync(STORE_FILE, JSON.stringify(store, null, 2), 'utf-8');
213
304
  } catch (_) {}
214
- count += newStoreEntries.length;
305
+ count += addedCount;
215
306
  }
216
307
 
217
308
  // Rotate outcomes: keep last 500 lines to prevent unbounded growth
@@ -221,7 +312,7 @@ function consolidate() {
221
312
  } catch (_) {}
222
313
  }
223
314
 
224
- return { entries: count, edges: 0, newEntries: newStoreEntries.length };
315
+ return { entries: count, edges: 0, newEntries: addedCount || 0 };
225
316
  }
226
317
 
227
318
  // ── feedback ──────────────────────────────────────────────────────────────────
@@ -171,9 +171,6 @@ var SKILLS = [
171
171
  { skill: 'graphify', invoke: '/graphify', description: 'Input to knowledge graph',
172
172
  keywords: /\b(graph|knowledge|monograph|node|edge|visualize)\b/ig,
173
173
  _terms: ['graph','knowledge','monograph','node','edge','visualize'] },
174
- { skill: 'sparc', invoke: '/sparc', description: 'SPARC methodology',
175
- keywords: /\b(sparc|specification|pseudocode|refinement|methodology)\b/ig,
176
- _terms: ['sparc','specification','pseudocode','refinement','methodology'] },
177
174
  { skill: 'monobrowse', invoke: '/monobrowse', description: 'Browser automation via CDP',
178
175
  keywords: /\b(browse|browser|webpage|screenshot|navigate|selenium|puppeteer|cdp)\b/ig,
179
176
  _terms: ['browse','browser','webpage','screenshot','navigate','selenium','puppeteer','cdp'] },
@@ -182,6 +179,82 @@ var SKILLS = [
182
179
  _terms: ['tokens','token-usage','cost','spending','budget'] },
183
180
  ];
184
181
 
182
+ // ── Feedback weight system ────────────────────────────────────────────────────
183
+ // Reads routing-feedback.jsonl (written by session-handler at session-end) and
184
+ // computes per-agent success rates. Adjusts routing confidence by up to +/-0.10
185
+ // so agents with proven track records get a slight boost and poor performers get
186
+ // dampened. Cached with a 60-second TTL to avoid repeated disk reads.
187
+
188
+ var _feedbackWeightsCache = null;
189
+ var _feedbackWeightsCacheTs = 0;
190
+ var FEEDBACK_TTL_MS = 60000;
191
+
192
+ function loadFeedbackWeights() {
193
+ var now = Date.now();
194
+ if (_feedbackWeightsCache && (now - _feedbackWeightsCacheTs) < FEEDBACK_TTL_MS) {
195
+ return _feedbackWeightsCache;
196
+ }
197
+ var weights = {};
198
+ try {
199
+ var fs = require('fs');
200
+ var path = require('path');
201
+ var cwd = process.env.CLAUDE_PROJECT_DIR || process.cwd();
202
+ var feedbackPath = path.join(cwd, '.monomind', 'routing-feedback.jsonl');
203
+ var MAX_SIZE = 512 * 1024;
204
+ if (!fs.existsSync(feedbackPath)) {
205
+ _feedbackWeightsCache = weights;
206
+ _feedbackWeightsCacheTs = now;
207
+ return weights;
208
+ }
209
+ var stat = fs.statSync(feedbackPath);
210
+ if (stat.size > MAX_SIZE) {
211
+ _feedbackWeightsCache = weights;
212
+ _feedbackWeightsCacheTs = now;
213
+ return weights;
214
+ }
215
+ var lines = fs.readFileSync(feedbackPath, 'utf-8').trim().split('\n').filter(Boolean);
216
+ // Use last 200 entries for weight calculation
217
+ var recent = lines.slice(-200);
218
+ var agentStats = {};
219
+ for (var i = 0; i < recent.length; i++) {
220
+ try {
221
+ var entry = JSON.parse(recent[i]);
222
+ var agent = entry.suggestedAgent;
223
+ if (!agent) continue;
224
+ // Skip no-evidence records (sessionSuccess null/missing) — they carry no signal
225
+ if (typeof entry.intelligenceFeedback !== 'boolean') continue;
226
+ if (!agentStats[agent]) agentStats[agent] = { total: 0, successes: 0 };
227
+ agentStats[agent].total++;
228
+ if (entry.intelligenceFeedback === true) agentStats[agent].successes++;
229
+ } catch (e) {}
230
+ }
231
+ // Compute weight adjustments: agents with >= 5 data points get a weight
232
+ // successRate > 0.7 → positive boost (up to +0.10)
233
+ // successRate < 0.4 → negative dampen (down to -0.10)
234
+ // In between → neutral (0)
235
+ for (var ag in agentStats) {
236
+ var s = agentStats[ag];
237
+ if (s.total < 5) continue;
238
+ var rate = s.successes / s.total;
239
+ if (rate > 0.7) {
240
+ weights[ag] = Math.min(0.10, (rate - 0.7) * 0.33);
241
+ } else if (rate < 0.4) {
242
+ weights[ag] = Math.max(-0.10, (rate - 0.4) * 0.25);
243
+ }
244
+ }
245
+ } catch (e) { /* non-fatal */ }
246
+ _feedbackWeightsCache = weights;
247
+ _feedbackWeightsCacheTs = now;
248
+ return weights;
249
+ }
250
+
251
+ function applyFeedbackWeight(agentSlug, baseConfidence) {
252
+ var weights = loadFeedbackWeights();
253
+ var adj = weights[agentSlug] || weights[TASK_AGENTS[agentSlug]] || 0;
254
+ if (adj === 0) return baseConfidence;
255
+ return Math.max(0, Math.min(1.0, baseConfidence + adj));
256
+ }
257
+
185
258
  // ── Utilities ─────────────────────────────────────────────────────────────────
186
259
 
187
260
  var MAX_PROMPT = 2000;
@@ -215,7 +288,7 @@ function routeTask(prompt) {
215
288
  return {
216
289
  agent: topExtra.name,
217
290
  agentSlug: topExtra.slug,
218
- confidence: 0.80,
291
+ confidence: applyFeedbackWeight(topExtra.slug, 0.80),
219
292
  reason: 'Domain: ' + topExtra.category,
220
293
  semanticRouting: false,
221
294
  specificAgents: extras,
@@ -237,7 +310,7 @@ function routeTask(prompt) {
237
310
  if (slug === 'coder' && hasStrongSkill) continue;
238
311
  var pattern = _ROUTING_PATTERNS[slug];
239
312
  if (pattern && pattern.test(safePrompt)) {
240
- var confidence = TASK_CONFIDENCES[slug] || 0.75;
313
+ var confidence = applyFeedbackWeight(slug, TASK_CONFIDENCES[slug] || 0.75);
241
314
  return {
242
315
  agent: TASK_AGENTS[slug],
243
316
  agentSlug: slug,