@monoes/monomindcli 1.18.15 → 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 (511) hide show
  1. package/.claude/agents/core/researcher.md +29 -24
  2. package/.claude/agents/github/code-review-swarm.md +1 -1
  3. package/.claude/agents/github/github-modes.md +1 -1
  4. package/.claude/agents/github/issue-tracker.md +1 -3
  5. package/.claude/agents/github/multi-repo-swarm.md +1 -1
  6. package/.claude/agents/github/pr-manager.md +1 -3
  7. package/.claude/agents/github/project-board-sync.md +1 -1
  8. package/.claude/agents/github/release-manager.md +1 -1
  9. package/.claude/agents/github/repo-architect.md +4 -12
  10. package/.claude/agents/github/swarm-issue.md +1 -1
  11. package/.claude/agents/github/swarm-pr.md +1 -1
  12. package/.claude/agents/github/sync-coordinator.md +1 -1
  13. package/.claude/agents/github/workflow-automation.md +1 -1
  14. package/.claude/agents/goal/goal-planner.md +1 -2
  15. package/.claude/agents/specialized/specialized-workflow-architect.md +11 -14
  16. package/.claude/agents/testing/production-validator.md +8 -7
  17. package/.claude/agents/testing/testing-evidence-collector.md +3 -1
  18. package/.claude/commands/github/issue-tracker.md +0 -2
  19. package/.claude/commands/github/pr-manager.md +0 -2
  20. package/.claude/commands/github/repo-architect.md +3 -10
  21. package/.claude/commands/mastermind/code-review.md +4 -4
  22. package/.claude/commands/mastermind/help.md +5 -5
  23. package/.claude/commands/mastermind/okf-export.md +14 -0
  24. package/.claude/commands/mastermind/okf-import.md +15 -0
  25. package/.claude/commands/workflows/README.md +0 -1
  26. package/.claude/commands/workflows/workflow-create.md +0 -1
  27. package/.claude/commands/workflows/workflow-execute.md +1 -3
  28. package/.claude/commands/workflows/workflow-export.md +0 -2
  29. package/.claude/helpers/handlers/agent-start-handler.cjs +28 -36
  30. package/.claude/helpers/handlers/capture-handler.cjs +110 -0
  31. package/.claude/helpers/handlers/edit-handler.cjs +15 -0
  32. package/.claude/helpers/handlers/gates-handler.cjs +2 -8
  33. package/.claude/helpers/handlers/route-handler.cjs +314 -245
  34. package/.claude/helpers/handlers/session-handler.cjs +182 -163
  35. package/.claude/helpers/handlers/session-restore-handler.cjs +95 -53
  36. package/.claude/helpers/handlers/task-handler.cjs +17 -160
  37. package/.claude/helpers/hook-handler.cjs +153 -16
  38. package/.claude/helpers/intelligence.cjs +255 -15
  39. package/.claude/helpers/learning-service.mjs +1 -0
  40. package/.claude/helpers/mastermind-activate.cjs +33 -51
  41. package/.claude/helpers/monolean-activate.cjs +13 -3
  42. package/.claude/helpers/monolean-propagate.cjs +7 -3
  43. package/.claude/helpers/router.cjs +122 -11
  44. package/.claude/helpers/skill-registry.json +0 -189
  45. package/.claude/skills/github-toolkit/SKILL.md +60 -0
  46. package/.claude/skills/hive-mind-advanced/SKILL.md +0 -15
  47. package/.claude/skills/hooks-automation/SKILL.md +0 -1
  48. package/.claude/skills/mastermind-skills/_protocol.md +1 -1
  49. package/.claude/skills/mastermind-skills/architect.md +5 -6
  50. package/.claude/skills/mastermind-skills/autodev.md +8 -5
  51. package/.claude/skills/mastermind-skills/build.md +1 -2
  52. package/.claude/skills/mastermind-skills/review.md +8 -5
  53. package/.claude/skills/mastermind-skills/techport.md +37 -3
  54. package/.claude/skills/memory-toolkit/SKILL.md +75 -0
  55. package/.claude/skills/monodesign/document.md +9 -6
  56. package/.claude/skills/monodesign/extract.md +1 -1
  57. package/.claude/skills/monodesign/reference/document.md +1 -1
  58. package/.claude/skills/monodesign/reference/live.md +1 -1
  59. package/.claude/skills/monolean/SKILL.md +1 -1
  60. package/.claude/skills/specialagent/SKILL.md +2 -4
  61. package/.claude/skills/swarm-advanced/SKILL.md +0 -1
  62. package/README.md +2 -5
  63. package/bin/mcp-server.js +11 -1
  64. package/dist/src/autopilot-state.d.ts.map +1 -1
  65. package/dist/src/autopilot-state.js +4 -5
  66. package/dist/src/autopilot-state.js.map +1 -1
  67. package/dist/src/browser/dashboard/server.d.ts.map +1 -1
  68. package/dist/src/browser/dashboard/server.js +69 -1
  69. package/dist/src/browser/dashboard/server.js.map +1 -1
  70. package/dist/src/browser/dashboard/ui.html +214 -1764
  71. package/dist/src/capabilities/index.d.ts +0 -2
  72. package/dist/src/capabilities/index.d.ts.map +1 -1
  73. package/dist/src/capabilities/index.js +0 -1
  74. package/dist/src/capabilities/index.js.map +1 -1
  75. package/dist/src/commands/agent-lifecycle.d.ts.map +1 -1
  76. package/dist/src/commands/agent-lifecycle.js +2 -6
  77. package/dist/src/commands/agent-lifecycle.js.map +1 -1
  78. package/dist/src/commands/agent-ops.d.ts +1 -2
  79. package/dist/src/commands/agent-ops.d.ts.map +1 -1
  80. package/dist/src/commands/agent-ops.js +1 -59
  81. package/dist/src/commands/agent-ops.js.map +1 -1
  82. package/dist/src/commands/agent.d.ts.map +1 -1
  83. package/dist/src/commands/agent.js +2 -3
  84. package/dist/src/commands/agent.js.map +1 -1
  85. package/dist/src/commands/analyze-diff.js +1 -1
  86. package/dist/src/commands/analyze-diff.js.map +1 -1
  87. package/dist/src/commands/analyze.d.ts +0 -4
  88. package/dist/src/commands/analyze.d.ts.map +1 -1
  89. package/dist/src/commands/analyze.js +1 -29
  90. package/dist/src/commands/analyze.js.map +1 -1
  91. package/dist/src/commands/browse-action.d.ts.map +1 -1
  92. package/dist/src/commands/browse-action.js +94 -2
  93. package/dist/src/commands/browse-action.js.map +1 -1
  94. package/dist/src/commands/completions.d.ts.map +1 -1
  95. package/dist/src/commands/completions.js +12 -76
  96. package/dist/src/commands/completions.js.map +1 -1
  97. package/dist/src/commands/config.d.ts.map +1 -1
  98. package/dist/src/commands/config.js +0 -6
  99. package/dist/src/commands/config.js.map +1 -1
  100. package/dist/src/commands/doctor-project-checks.d.ts +13 -3
  101. package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
  102. package/dist/src/commands/doctor-project-checks.js +131 -23
  103. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  104. package/dist/src/commands/doctor.d.ts.map +1 -1
  105. package/dist/src/commands/doctor.js +6 -5
  106. package/dist/src/commands/doctor.js.map +1 -1
  107. package/dist/src/commands/guidance.d.ts +5 -1
  108. package/dist/src/commands/guidance.d.ts.map +1 -1
  109. package/dist/src/commands/guidance.js +11 -556
  110. package/dist/src/commands/guidance.js.map +1 -1
  111. package/dist/src/commands/hive-mind-comms.d.ts.map +1 -1
  112. package/dist/src/commands/hive-mind-comms.js +11 -4
  113. package/dist/src/commands/hive-mind-comms.js.map +1 -1
  114. package/dist/src/commands/hive-mind-helpers.js +2 -2
  115. package/dist/src/commands/hive-mind-helpers.js.map +1 -1
  116. package/dist/src/commands/hive-mind-ops.d.ts +1 -3
  117. package/dist/src/commands/hive-mind-ops.d.ts.map +1 -1
  118. package/dist/src/commands/hive-mind-ops.js +2 -116
  119. package/dist/src/commands/hive-mind-ops.js.map +1 -1
  120. package/dist/src/commands/hive-mind.d.ts +4 -4
  121. package/dist/src/commands/hive-mind.d.ts.map +1 -1
  122. package/dist/src/commands/hive-mind.js +11 -11
  123. package/dist/src/commands/hive-mind.js.map +1 -1
  124. package/dist/src/commands/hooks-coverage-commands.d.ts.map +1 -1
  125. package/dist/src/commands/hooks-coverage-commands.js +8 -7
  126. package/dist/src/commands/hooks-coverage-commands.js.map +1 -1
  127. package/dist/src/commands/hooks-coverage-gaps.js +1 -1
  128. package/dist/src/commands/hooks-coverage-gaps.js.map +1 -1
  129. package/dist/src/commands/hooks-coverage-routing.js +2 -2
  130. package/dist/src/commands/hooks-coverage-routing.js.map +1 -1
  131. package/dist/src/commands/hooks-extended-commands.d.ts +0 -3
  132. package/dist/src/commands/hooks-extended-commands.d.ts.map +1 -1
  133. package/dist/src/commands/hooks-extended-commands.js +0 -307
  134. package/dist/src/commands/hooks-extended-commands.js.map +1 -1
  135. package/dist/src/commands/hooks-formatting.d.ts +1 -5
  136. package/dist/src/commands/hooks-formatting.d.ts.map +1 -1
  137. package/dist/src/commands/hooks-formatting.js +1 -18
  138. package/dist/src/commands/hooks-formatting.js.map +1 -1
  139. package/dist/src/commands/hooks-workers.d.ts +1 -1
  140. package/dist/src/commands/hooks-workers.d.ts.map +1 -1
  141. package/dist/src/commands/hooks-workers.js +82 -330
  142. package/dist/src/commands/hooks-workers.js.map +1 -1
  143. package/dist/src/commands/hooks.d.ts.map +1 -1
  144. package/dist/src/commands/hooks.js +1 -12
  145. package/dist/src/commands/hooks.js.map +1 -1
  146. package/dist/src/commands/index.d.ts +2 -55
  147. package/dist/src/commands/index.d.ts.map +1 -1
  148. package/dist/src/commands/index.js +23 -216
  149. package/dist/src/commands/index.js.map +1 -1
  150. package/dist/src/commands/init-wizard.d.ts.map +1 -1
  151. package/dist/src/commands/init-wizard.js +3 -5
  152. package/dist/src/commands/init-wizard.js.map +1 -1
  153. package/dist/src/commands/init.d.ts.map +1 -1
  154. package/dist/src/commands/init.js +4 -24
  155. package/dist/src/commands/init.js.map +1 -1
  156. package/dist/src/commands/mcp.d.ts.map +1 -1
  157. package/dist/src/commands/mcp.js +32 -4
  158. package/dist/src/commands/mcp.js.map +1 -1
  159. package/dist/src/commands/memory-admin.d.ts +1 -2
  160. package/dist/src/commands/memory-admin.d.ts.map +1 -1
  161. package/dist/src/commands/memory-admin.js +1 -118
  162. package/dist/src/commands/memory-admin.js.map +1 -1
  163. package/dist/src/commands/memory-transfer.d.ts +1 -2
  164. package/dist/src/commands/memory-transfer.d.ts.map +1 -1
  165. package/dist/src/commands/memory-transfer.js +5 -171
  166. package/dist/src/commands/memory-transfer.js.map +1 -1
  167. package/dist/src/commands/memory.d.ts.map +1 -1
  168. package/dist/src/commands/memory.js +3 -6
  169. package/dist/src/commands/memory.js.map +1 -1
  170. package/dist/src/commands/neural-core.d.ts +3 -1
  171. package/dist/src/commands/neural-core.d.ts.map +1 -1
  172. package/dist/src/commands/neural-core.js +154 -15
  173. package/dist/src/commands/neural-core.js.map +1 -1
  174. package/dist/src/commands/neural-optimize.d.ts.map +1 -1
  175. package/dist/src/commands/neural-optimize.js +13 -15
  176. package/dist/src/commands/neural-optimize.js.map +1 -1
  177. package/dist/src/commands/neural-registry.d.ts +1 -1
  178. package/dist/src/commands/neural-registry.js +14 -14
  179. package/dist/src/commands/neural-registry.js.map +1 -1
  180. package/dist/src/commands/neural.d.ts +1 -1
  181. package/dist/src/commands/neural.js +6 -6
  182. package/dist/src/commands/neural.js.map +1 -1
  183. package/dist/src/commands/performance.d.ts.map +1 -1
  184. package/dist/src/commands/performance.js +68 -58
  185. package/dist/src/commands/performance.js.map +1 -1
  186. package/dist/src/commands/providers.d.ts.map +1 -1
  187. package/dist/src/commands/providers.js +77 -117
  188. package/dist/src/commands/providers.js.map +1 -1
  189. package/dist/src/commands/search-universal.d.ts +7 -1
  190. package/dist/src/commands/search-universal.d.ts.map +1 -1
  191. package/dist/src/commands/search-universal.js +59 -5
  192. package/dist/src/commands/search-universal.js.map +1 -1
  193. package/dist/src/commands/security-cve.d.ts.map +1 -1
  194. package/dist/src/commands/security-cve.js +3 -5
  195. package/dist/src/commands/security-cve.js.map +1 -1
  196. package/dist/src/commands/security-misc.d.ts +0 -1
  197. package/dist/src/commands/security-misc.d.ts.map +1 -1
  198. package/dist/src/commands/security-misc.js +69 -45
  199. package/dist/src/commands/security-misc.js.map +1 -1
  200. package/dist/src/commands/security.d.ts.map +1 -1
  201. package/dist/src/commands/security.js +2 -4
  202. package/dist/src/commands/security.js.map +1 -1
  203. package/dist/src/commands/session.d.ts.map +1 -1
  204. package/dist/src/commands/session.js +137 -281
  205. package/dist/src/commands/session.js.map +1 -1
  206. package/dist/src/commands/start.d.ts.map +1 -1
  207. package/dist/src/commands/start.js +2 -59
  208. package/dist/src/commands/start.js.map +1 -1
  209. package/dist/src/commands/status.d.ts.map +1 -1
  210. package/dist/src/commands/status.js +18 -29
  211. package/dist/src/commands/status.js.map +1 -1
  212. package/dist/src/commands/swarm.d.ts.map +1 -1
  213. package/dist/src/commands/swarm.js +113 -66
  214. package/dist/src/commands/swarm.js.map +1 -1
  215. package/dist/src/commands/task.d.ts.map +1 -1
  216. package/dist/src/commands/task.js +2 -49
  217. package/dist/src/commands/task.js.map +1 -1
  218. package/dist/src/consensus/audit-writer.d.ts.map +1 -1
  219. package/dist/src/consensus/audit-writer.js +43 -1
  220. package/dist/src/consensus/audit-writer.js.map +1 -1
  221. package/dist/src/consensus/tally.d.ts +19 -0
  222. package/dist/src/consensus/tally.d.ts.map +1 -0
  223. package/dist/src/consensus/tally.js +34 -0
  224. package/dist/src/consensus/tally.js.map +1 -0
  225. package/dist/src/index.d.ts +3 -2
  226. package/dist/src/index.d.ts.map +1 -1
  227. package/dist/src/index.js +13 -9
  228. package/dist/src/index.js.map +1 -1
  229. package/dist/src/init/claudemd-generator.d.ts.map +1 -1
  230. package/dist/src/init/claudemd-generator.js +10 -14
  231. package/dist/src/init/claudemd-generator.js.map +1 -1
  232. package/dist/src/init/executor.d.ts.map +1 -1
  233. package/dist/src/init/executor.js +42 -100
  234. package/dist/src/init/executor.js.map +1 -1
  235. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  236. package/dist/src/init/helpers-generator.js +2 -22
  237. package/dist/src/init/helpers-generator.js.map +1 -1
  238. package/dist/src/init/settings-generator.d.ts.map +1 -1
  239. package/dist/src/init/settings-generator.js +0 -13
  240. package/dist/src/init/settings-generator.js.map +1 -1
  241. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  242. package/dist/src/init/statusline-generator.js +62 -0
  243. package/dist/src/init/statusline-generator.js.map +1 -1
  244. package/dist/src/init/types.d.ts +3 -9
  245. package/dist/src/init/types.d.ts.map +1 -1
  246. package/dist/src/init/types.js +0 -5
  247. package/dist/src/init/types.js.map +1 -1
  248. package/dist/src/knowledge/document-pipeline.d.ts.map +1 -1
  249. package/dist/src/knowledge/document-pipeline.js +18 -8
  250. package/dist/src/knowledge/document-pipeline.js.map +1 -1
  251. package/dist/src/mcp-client.d.ts.map +1 -1
  252. package/dist/src/mcp-client.js +0 -8
  253. package/dist/src/mcp-client.js.map +1 -1
  254. package/dist/src/mcp-server.d.ts.map +1 -1
  255. package/dist/src/mcp-server.js +14 -0
  256. package/dist/src/mcp-server.js.map +1 -1
  257. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
  258. package/dist/src/mcp-tools/agent-tools.js +0 -17
  259. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  260. package/dist/src/mcp-tools/coherence/causal-infer.d.ts +5 -5
  261. package/dist/src/mcp-tools/coherence/causal-infer.d.ts.map +1 -1
  262. package/dist/src/mcp-tools/coherence/causal-infer.js +32 -46
  263. package/dist/src/mcp-tools/coherence/causal-infer.js.map +1 -1
  264. package/dist/src/mcp-tools/coherence/coherence-check.d.ts.map +1 -1
  265. package/dist/src/mcp-tools/coherence/coherence-check.js +1 -19
  266. package/dist/src/mcp-tools/coherence/coherence-check.js.map +1 -1
  267. package/dist/src/mcp-tools/coherence/consensus-verify.d.ts +2 -3
  268. package/dist/src/mcp-tools/coherence/consensus-verify.d.ts.map +1 -1
  269. package/dist/src/mcp-tools/coherence/consensus-verify.js +22 -20
  270. package/dist/src/mcp-tools/coherence/consensus-verify.js.map +1 -1
  271. package/dist/src/mcp-tools/coherence/memory-gate.d.ts +3 -2
  272. package/dist/src/mcp-tools/coherence/memory-gate.d.ts.map +1 -1
  273. package/dist/src/mcp-tools/coherence/memory-gate.js +32 -19
  274. package/dist/src/mcp-tools/coherence/memory-gate.js.map +1 -1
  275. package/dist/src/mcp-tools/coherence/quantum-topology.d.ts +4 -4
  276. package/dist/src/mcp-tools/coherence/quantum-topology.d.ts.map +1 -1
  277. package/dist/src/mcp-tools/coherence/quantum-topology.js +11 -17
  278. package/dist/src/mcp-tools/coherence/quantum-topology.js.map +1 -1
  279. package/dist/src/mcp-tools/coherence/spectral-analyze.d.ts +2 -3
  280. package/dist/src/mcp-tools/coherence/spectral-analyze.d.ts.map +1 -1
  281. package/dist/src/mcp-tools/coherence/spectral-analyze.js +51 -32
  282. package/dist/src/mcp-tools/coherence/spectral-analyze.js.map +1 -1
  283. package/dist/src/mcp-tools/coherence/types.d.ts +8 -11
  284. package/dist/src/mcp-tools/coherence/types.d.ts.map +1 -1
  285. package/dist/src/mcp-tools/coherence/types.js +3 -18
  286. package/dist/src/mcp-tools/coherence/types.js.map +1 -1
  287. package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
  288. package/dist/src/mcp-tools/embeddings-tools.js +1 -7
  289. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  290. package/dist/src/mcp-tools/graphify-tools.js +2 -2
  291. package/dist/src/mcp-tools/graphify-tools.js.map +1 -1
  292. package/dist/src/mcp-tools/guidance-tools.d.ts.map +1 -1
  293. package/dist/src/mcp-tools/guidance-tools.js +9 -19
  294. package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
  295. package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -1
  296. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  297. package/dist/src/mcp-tools/hive-mind-tools.js +198 -40
  298. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  299. package/dist/src/mcp-tools/hooks-advanced.d.ts +18 -0
  300. package/dist/src/mcp-tools/hooks-advanced.d.ts.map +1 -0
  301. package/dist/src/mcp-tools/hooks-advanced.js +25 -0
  302. package/dist/src/mcp-tools/hooks-advanced.js.map +1 -0
  303. package/dist/src/mcp-tools/hooks-intelligence.d.ts +4 -8
  304. package/dist/src/mcp-tools/hooks-intelligence.d.ts.map +1 -1
  305. package/dist/src/mcp-tools/hooks-intelligence.js +33 -482
  306. package/dist/src/mcp-tools/hooks-intelligence.js.map +1 -1
  307. package/dist/src/mcp-tools/hooks-routing.d.ts +1 -3
  308. package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
  309. package/dist/src/mcp-tools/hooks-routing.js +96 -202
  310. package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
  311. package/dist/src/mcp-tools/hooks-synthesis.d.ts +31 -0
  312. package/dist/src/mcp-tools/hooks-synthesis.d.ts.map +1 -0
  313. package/dist/src/mcp-tools/hooks-synthesis.js +196 -0
  314. package/dist/src/mcp-tools/hooks-synthesis.js.map +1 -0
  315. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  316. package/dist/src/mcp-tools/hooks-tools.js +10 -11
  317. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  318. package/dist/src/mcp-tools/index.d.ts +0 -3
  319. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  320. package/dist/src/mcp-tools/index.js +0 -4
  321. package/dist/src/mcp-tools/index.js.map +1 -1
  322. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  323. package/dist/src/mcp-tools/memory-tools.js +24 -9
  324. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  325. package/dist/src/mcp-tools/monograph-tools.d.ts +6 -0
  326. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  327. package/dist/src/mcp-tools/monograph-tools.js +370 -95
  328. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  329. package/dist/src/mcp-tools/neural-tools.d.ts +8 -9
  330. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  331. package/dist/src/mcp-tools/neural-tools.js +249 -539
  332. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  333. package/dist/src/mcp-tools/performance-tools.d.ts.map +1 -1
  334. package/dist/src/mcp-tools/performance-tools.js +5 -17
  335. package/dist/src/mcp-tools/performance-tools.js.map +1 -1
  336. package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js +2 -2
  337. package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js.map +1 -1
  338. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts +4 -4
  339. package/dist/src/mcp-tools/quality-tools.d.ts +7 -2
  340. package/dist/src/mcp-tools/quality-tools.d.ts.map +1 -1
  341. package/dist/src/mcp-tools/quality-tools.js +7 -257
  342. package/dist/src/mcp-tools/quality-tools.js.map +1 -1
  343. package/dist/src/mcp-tools/security-tools.d.ts.map +1 -1
  344. package/dist/src/mcp-tools/security-tools.js +103 -0
  345. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  346. package/dist/src/memory/intelligence.d.ts +9 -9
  347. package/dist/src/memory/intelligence.d.ts.map +1 -1
  348. package/dist/src/memory/intelligence.js +71 -59
  349. package/dist/src/memory/intelligence.js.map +1 -1
  350. package/dist/src/memory/memory-bridge.d.ts +1 -0
  351. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  352. package/dist/src/memory/memory-bridge.js +47 -5
  353. package/dist/src/memory/memory-bridge.js.map +1 -1
  354. package/dist/src/memory/memory-read.d.ts.map +1 -1
  355. package/dist/src/memory/memory-read.js +1 -19
  356. package/dist/src/memory/memory-read.js.map +1 -1
  357. package/dist/src/suggest.d.ts.map +1 -1
  358. package/dist/src/suggest.js +1 -12
  359. package/dist/src/suggest.js.map +1 -1
  360. package/dist/src/transfer/store/discovery.d.ts +3 -2
  361. package/dist/src/transfer/store/discovery.d.ts.map +1 -1
  362. package/dist/src/transfer/store/discovery.js +22 -70
  363. package/dist/src/transfer/store/discovery.js.map +1 -1
  364. package/dist/src/update/checker.d.ts.map +1 -1
  365. package/dist/src/update/checker.js +0 -1
  366. package/dist/src/update/checker.js.map +1 -1
  367. package/dist/src/utils/cosine-similarity.d.ts +22 -0
  368. package/dist/src/utils/cosine-similarity.d.ts.map +1 -0
  369. package/dist/src/utils/cosine-similarity.js +38 -0
  370. package/dist/src/utils/cosine-similarity.js.map +1 -0
  371. package/dist/src/utils/input-guards.d.ts +51 -0
  372. package/dist/src/utils/input-guards.d.ts.map +1 -0
  373. package/dist/src/utils/input-guards.js +223 -0
  374. package/dist/src/utils/input-guards.js.map +1 -0
  375. package/dist/src/utils/json-file.d.ts +33 -0
  376. package/dist/src/utils/json-file.d.ts.map +1 -0
  377. package/dist/src/utils/json-file.js +57 -0
  378. package/dist/src/utils/json-file.js.map +1 -0
  379. package/dist/tsconfig.tsbuildinfo +1 -1
  380. package/package.json +9 -6
  381. package/scripts/sync-claude-assets.sh +16 -20
  382. package/.claude/agents/generated/case-analyst.md +0 -50
  383. package/.claude/agents/generated/channel-intelligence-director.md +0 -87
  384. package/.claude/agents/generated/chief-growth-officer.md +0 -88
  385. package/.claude/agents/generated/churn-analyst.md +0 -53
  386. package/.claude/agents/generated/code-reviewer.md +0 -55
  387. package/.claude/agents/generated/code-validator.md +0 -57
  388. package/.claude/agents/generated/complexity-scanner.md +0 -56
  389. package/.claude/agents/generated/content-seo-strategist.md +0 -90
  390. package/.claude/agents/generated/copy-editor.md +0 -45
  391. package/.claude/agents/generated/court-reporter.md +0 -50
  392. package/.claude/agents/generated/defender.md +0 -51
  393. package/.claude/agents/generated/devbot-orchestrator.md +0 -58
  394. package/.claude/agents/generated/devbot-planner.md +0 -63
  395. package/.claude/agents/generated/developer-community-strategist.md +0 -91
  396. package/.claude/agents/generated/editor-in-chief.md +0 -45
  397. package/.claude/agents/generated/fact-checker.md +0 -45
  398. package/.claude/agents/generated/impact-assessor.md +0 -54
  399. package/.claude/agents/generated/judge.md +0 -51
  400. package/.claude/agents/generated/outreach-partnership-strategist.md +0 -90
  401. package/.claude/agents/generated/prosecutor.md +0 -51
  402. package/.claude/agents/generated/reporter.md +0 -45
  403. package/.claude/agents/generated/social-media-strategist.md +0 -91
  404. package/.claude/agents/generated/video-visual-strategist.md +0 -90
  405. package/.claude/agents/reengineer-squad/boss.md +0 -113
  406. package/.claude/agents/reengineer-squad/critic-architect.md +0 -132
  407. package/.claude/agents/reengineer-squad/git-manager.md +0 -145
  408. package/.claude/agents/reengineer-squad/idea-generator.md +0 -95
  409. package/.claude/agents/reengineer-squad/implementer.md +0 -112
  410. package/.claude/agents/reengineer-squad/integration-planner.md +0 -112
  411. package/.claude/agents/reengineer-squad/source-analyst.md +0 -103
  412. package/.claude/agents/reengineer-squad/target-analyst.md +0 -118
  413. package/.claude/agents/reengineer-squad/tester.md +0 -105
  414. package/.claude/agents/sparc/architecture.md +0 -453
  415. package/.claude/agents/sparc/pseudocode.md +0 -299
  416. package/.claude/agents/sparc/refinement.md +0 -504
  417. package/.claude/agents/sparc/specification.md +0 -258
  418. package/.claude/agents/templates/implementer-sparc-coder.md +0 -231
  419. package/.claude/commands/sparc/analyzer.md +0 -35
  420. package/.claude/commands/sparc/architect.md +0 -36
  421. package/.claude/commands/sparc/ask.md +0 -56
  422. package/.claude/commands/sparc/batch-executor.md +0 -37
  423. package/.claude/commands/sparc/code.md +0 -48
  424. package/.claude/commands/sparc/coder.md +0 -37
  425. package/.claude/commands/sparc/debug.md +0 -42
  426. package/.claude/commands/sparc/debugger.md +0 -37
  427. package/.claude/commands/sparc/designer.md +0 -36
  428. package/.claude/commands/sparc/devops.md +0 -68
  429. package/.claude/commands/sparc/docs-writer.md +0 -39
  430. package/.claude/commands/sparc/documenter.md +0 -37
  431. package/.claude/commands/sparc/innovator.md +0 -37
  432. package/.claude/commands/sparc/integration.md +0 -42
  433. package/.claude/commands/sparc/mcp.md +0 -76
  434. package/.claude/commands/sparc/memory-manager.md +0 -57
  435. package/.claude/commands/sparc/optimizer.md +0 -37
  436. package/.claude/commands/sparc/orchestrator.md +0 -70
  437. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +0 -42
  438. package/.claude/commands/sparc/refinement-optimization-mode.md +0 -42
  439. package/.claude/commands/sparc/researcher.md +0 -37
  440. package/.claude/commands/sparc/reviewer.md +0 -37
  441. package/.claude/commands/sparc/security-review.md +0 -39
  442. package/.claude/commands/sparc/sparc-modes.md +0 -120
  443. package/.claude/commands/sparc/sparc.md +0 -71
  444. package/.claude/commands/sparc/spec-pseudocode.md +0 -39
  445. package/.claude/commands/sparc/supabase-admin.md +0 -301
  446. package/.claude/commands/sparc/swarm-coordinator.md +0 -50
  447. package/.claude/commands/sparc/tdd.md +0 -37
  448. package/.claude/commands/sparc/tester.md +0 -37
  449. package/.claude/commands/sparc/tutorial.md +0 -38
  450. package/.claude/commands/sparc/workflow-manager.md +0 -37
  451. package/.claude/commands/sparc.md +0 -112
  452. package/.claude/helpers/auto-memory-hook.mjs +0 -503
  453. package/.claude/skills/sparc-methodology/SKILL.md +0 -950
  454. package/dist/src/capabilities/enrichment.d.ts +0 -44
  455. package/dist/src/capabilities/enrichment.d.ts.map +0 -1
  456. package/dist/src/capabilities/enrichment.js +0 -141
  457. package/dist/src/capabilities/enrichment.js.map +0 -1
  458. package/dist/src/commands/analyze-boundaries.d.ts +0 -14
  459. package/dist/src/commands/analyze-boundaries.d.ts.map +0 -1
  460. package/dist/src/commands/analyze-boundaries.js +0 -295
  461. package/dist/src/commands/analyze-boundaries.js.map +0 -1
  462. package/dist/src/commands/analyze-graph.d.ts +0 -14
  463. package/dist/src/commands/analyze-graph.d.ts.map +0 -1
  464. package/dist/src/commands/analyze-graph.js +0 -304
  465. package/dist/src/commands/analyze-graph.js.map +0 -1
  466. package/dist/src/commands/claims.d.ts +0 -10
  467. package/dist/src/commands/claims.d.ts.map +0 -1
  468. package/dist/src/commands/claims.js +0 -650
  469. package/dist/src/commands/claims.js.map +0 -1
  470. package/dist/src/commands/daemon.d.ts +0 -8
  471. package/dist/src/commands/daemon.d.ts.map +0 -1
  472. package/dist/src/commands/daemon.js +0 -681
  473. package/dist/src/commands/daemon.js.map +0 -1
  474. package/dist/src/commands/deployment.d.ts +0 -10
  475. package/dist/src/commands/deployment.d.ts.map +0 -1
  476. package/dist/src/commands/deployment.js +0 -706
  477. package/dist/src/commands/deployment.js.map +0 -1
  478. package/dist/src/commands/enrich.d.ts +0 -10
  479. package/dist/src/commands/enrich.d.ts.map +0 -1
  480. package/dist/src/commands/enrich.js +0 -58
  481. package/dist/src/commands/enrich.js.map +0 -1
  482. package/dist/src/commands/issues.d.ts +0 -21
  483. package/dist/src/commands/issues.d.ts.map +0 -1
  484. package/dist/src/commands/issues.js +0 -575
  485. package/dist/src/commands/issues.js.map +0 -1
  486. package/dist/src/commands/workflow.d.ts +0 -8
  487. package/dist/src/commands/workflow.d.ts.map +0 -1
  488. package/dist/src/commands/workflow.js +0 -677
  489. package/dist/src/commands/workflow.js.map +0 -1
  490. package/dist/src/mcp-tools/workflow-tools.d.ts +0 -8
  491. package/dist/src/mcp-tools/workflow-tools.d.ts.map +0 -1
  492. package/dist/src/mcp-tools/workflow-tools.js +0 -717
  493. package/dist/src/mcp-tools/workflow-tools.js.map +0 -1
  494. package/dist/src/services/claim-service.d.ts +0 -198
  495. package/dist/src/services/claim-service.d.ts.map +0 -1
  496. package/dist/src/services/claim-service.js +0 -890
  497. package/dist/src/services/claim-service.js.map +0 -1
  498. package/dist/src/services/headless-worker-executor.d.ts +0 -311
  499. package/dist/src/services/headless-worker-executor.d.ts.map +0 -1
  500. package/dist/src/services/headless-worker-executor.js +0 -1183
  501. package/dist/src/services/headless-worker-executor.js.map +0 -1
  502. package/dist/src/services/worker-daemon.d.ts +0 -248
  503. package/dist/src/services/worker-daemon.d.ts.map +0 -1
  504. package/dist/src/services/worker-daemon.js +0 -1417
  505. package/dist/src/services/worker-daemon.js.map +0 -1
  506. package/dist/src/ui/.monomind/capture/active-run.json +0 -1
  507. package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/real-events-1782290897.convs.jsonl +0 -3
  508. package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/real-events-1782290897.jsonl +0 -11
  509. package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/rigid-qa-restart-1782288201.jsonl +0 -540
  510. package/dist/src/ui/.monomind/orgs/system-trial-qa-threads.jsonl +0 -3
  511. package/dist/src/ui/.monomind/orgs/test-event-fix/runs/rigid-qa-restart-1782288201.jsonl +0 -2
@@ -52,6 +52,24 @@ module.exports = {
52
52
 
53
53
  if (intelligence && intelligence.getContext) {
54
54
  try {
55
+ // Each hook event runs as a fresh node process, so the module-level
56
+ // _entries cache is always empty here — without init() getContext()
57
+ // returns null on every prompt and stored patterns are never recalled.
58
+ // init() reads one small JSON file (auto-memory-store.json), so the
59
+ // per-prompt cost is negligible.
60
+ if (intelligence.init) {
61
+ try { intelligence.init(); } catch (e) { /* non-fatal */ }
62
+ }
63
+ // Bootstrap intelligence from monograph on first prompt if store is sparse
64
+ if (intelligence.bootstrapFromDb) {
65
+ try {
66
+ var bDb = hCtx._openMonographDb();
67
+ if (bDb) {
68
+ var bootstrapped = intelligence.bootstrapFromDb(bDb);
69
+ if (bootstrapped > 0) console.log('[INTELLIGENCE] Bootstrapped ' + bootstrapped + ' hub nodes from knowledge graph');
70
+ }
71
+ } catch (e) { /* non-fatal */ }
72
+ }
55
73
  const ctx = intelligence.getContext(prompt);
56
74
  if (ctx) console.log(ctx);
57
75
  } catch (e) { /* non-fatal */ }
@@ -60,284 +78,170 @@ module.exports = {
60
78
  const routeFn = router.routeTaskSemantic || router.routeTask;
61
79
  var result = await Promise.resolve(routeFn(prompt));
62
80
 
63
- // Graph-fallback override: when the router picked a low-confidence
64
- // non-dev specialist (marketing slugs etc) but monograph has a strong
65
- // graph match for the prompt, derive the agent from the top file's
66
- // label instead. Stops "improve the system" China E-Commerce.
81
+ // ── Enrichment: when router.cjs falls to the broad "coder" catch-all,
82
+ // try @monomind/routing's richer keyword pre-filter (30+ specialized
83
+ // rules for Solidity, game engines, DevOps, embedded, etc.) for a
84
+ // more specific agent match. This bridges the hooks layer (router.cjs)
85
+ // with the CLI routing package without requiring ESM imports. ─────────
86
+ if (result && result.agentSlug === 'coder' && result.confidence <= 0.8) {
87
+ try {
88
+ var routingPkgPath = path.resolve(
89
+ CWD, 'packages', '@monomind', 'routing', 'dist', 'keyword-pre-filter.js'
90
+ );
91
+ // Also check CLI's node_modules (symlinked workspace)
92
+ if (!fs.existsSync(routingPkgPath)) {
93
+ routingPkgPath = path.resolve(
94
+ CWD, 'packages', '@monomind', 'cli', 'node_modules',
95
+ '@monomind', 'routing', 'dist', 'keyword-pre-filter.js'
96
+ );
97
+ }
98
+ if (fs.existsSync(routingPkgPath)) {
99
+ var routingMod = await import(routingPkgPath);
100
+ var enrichRules = routingMod.DEFAULT_KEYWORD_ROUTES;
101
+ if (enrichRules && enrichRules.length > 0) {
102
+ for (var eri = 0; eri < enrichRules.length; eri++) {
103
+ var erRule = enrichRules[eri];
104
+ if (erRule.pattern && erRule.pattern.test(prompt)) {
105
+ result.agent = erRule.routeName || erRule.agentSlug;
106
+ result.agentSlug = erRule.agentSlug;
107
+ result.confidence = 0.90;
108
+ result.reason = 'Enriched: ' + (erRule.description || erRule.routeName);
109
+ result.enrichedFrom = 'routing-keyword-pre-filter';
110
+ break;
111
+ }
112
+ }
113
+ }
114
+ }
115
+ } catch (e) { /* non-fatal — routing package may not be available */ }
116
+ }
117
+
118
+ // ── Agent success pattern lookup ──────────────────────────
67
119
  try {
68
- // Don't override when the prompt has obvious non-dev keywords —
69
- // marketing/sales/finance asks SHOULD route to those specialists.
70
- var nonDevPrompt = /\b(marketing|advertis|seo|tiktok|instagram|linkedin|sales|customer|brand|blog post|content strategy|copy(?:writ|writing)|pitch|investor|hr|recruit|legal|compliance|tax|invoice|accounting|onboarding|design syst|figma|user research|persona)\b/i.test(prompt);
120
+ var patternDb = hCtx._openMonographDb();
121
+ if (patternDb) {
122
+ var cutoff = Date.now() - 30 * 86400000;
123
+ var patterns = patternDb.prepare(
124
+ 'SELECT agent_type, COUNT(*) as total, SUM(CASE WHEN success=1 THEN 1 ELSE 0 END) as wins FROM agent_interactions WHERE timestamp > @cutoff GROUP BY agent_type HAVING total >= 3'
125
+ ).all({ cutoff: cutoff });
126
+ if (patterns.length > 0) {
127
+ var patternMap = {};
128
+ for (var pi = 0; pi < patterns.length; pi++) {
129
+ patternMap[patterns[pi].agent_type] = {
130
+ total: patterns[pi].total,
131
+ successRate: Math.round(patterns[pi].wins / patterns[pi].total * 100)
132
+ };
133
+ }
134
+ var routedAgent = result.agent || 'coder';
135
+ var routedPattern = patternMap[routedAgent];
136
+ // Find if there's a clearly better agent
137
+ if (routedPattern && routedPattern.successRate < 50) {
138
+ var best = patterns.reduce(function(a, b) { return (b.wins/b.total) > (a.wins/a.total) ? b : a; });
139
+ if (best.wins / best.total > 0.8 && best.agent_type !== routedAgent) {
140
+ console.log('[AGENT_PATTERN] Historical: ' + best.agent_type + ' (' + Math.round(best.wins/best.total*100) + '% success, n=' + best.total + ') outperforms ' + routedAgent + ' (' + routedPattern.successRate + '%)');
141
+ }
142
+ }
143
+ result.historicalPattern = patternMap;
144
+ }
145
+ }
146
+ } catch (e) { /* non-fatal — agent_interactions table may not exist */ }
71
147
 
72
- var devAgents = /^(coder|tester|reviewer|planner|researcher|system-architect|backend-dev|backend-architect|mobile-dev|ml-developer|cicd-engineer|api-docs|code-analyzer|production-validator|Technical Writer)$/i;
73
- var pickedDev = devAgents.test(String(result.agent || '').trim()) ||
74
- devAgents.test(String(result.agentSlug || '').trim());
148
+ // ── Routing feedback accuracy check ──────────────────────
149
+ try {
150
+ var rfPath = path.join(CWD, '.monomind', 'routing-feedback.jsonl');
151
+ var MAX_RF = 256 * 1024;
152
+ if (fs.existsSync(rfPath) && fs.statSync(rfPath).size <= MAX_RF) {
153
+ var rfLines = fs.readFileSync(rfPath, 'utf-8').trim().split('\n').filter(Boolean);
154
+ // Check last 50 entries for this agent's feedback
155
+ var routedAgent = result.agent || 'coder';
156
+ var recentRf = rfLines.slice(-50);
157
+ var agentFeedback = [];
158
+ for (var ri = 0; ri < recentRf.length; ri++) {
159
+ try {
160
+ var rfEntry = JSON.parse(recentRf[ri]);
161
+ if (rfEntry.suggestedAgent === routedAgent && typeof rfEntry.intelligenceFeedback === 'boolean') {
162
+ agentFeedback.push(rfEntry.intelligenceFeedback);
163
+ }
164
+ } catch (e) {}
165
+ }
166
+ if (agentFeedback.length >= 3) {
167
+ var successes = agentFeedback.filter(function(f) { return f === true; }).length;
168
+ var accuracy = Math.round(successes / agentFeedback.length * 100);
169
+ if (accuracy < 60) {
170
+ console.log('[ROUTING] Warning: ' + routedAgent + ' routing accuracy ' + accuracy + '% over last ' + agentFeedback.length + ' sessions');
171
+ }
172
+ result.routingAccuracy = accuracy;
173
+ }
174
+ }
175
+ } catch (e) { /* non-fatal */ }
75
176
 
76
- var resConf = (result.confidence != null ? result.confidence : 0);
77
- var resReason = String(result.reason || '');
78
- var fromKeywordStage = resReason.indexOf('Keyword 2-stage') !== -1;
79
- var promptIsDevish = /\b(develop(?:ment|er)?|routing|improve|refactor|fix|bug|optimi[sz]e|implement|build|debug|deploy|test|feature|system|performance|architecture|memory|hook|graph|statusline|monograph|api|cli|skill|hooks|agent|workflow|init|module|package|registry|server|client|route|handler|localhost|dashboard|sidebar|layout|component|function|class|config|port|script|parse|compile|lint|build)\b/i.test(prompt);
177
+ // monolean: graph-fallback override removed it compensated for bad agent
178
+ // recommendations that are no longer injected into context. The statusline
179
+ // just shows the keyword router's pick; no need for 50 lines of overrides.
80
180
 
81
- // Align with the 90% primary-panel threshold: any non-dev pick below
82
- // 90% confidence gets overridden via the graph, unless the prompt
83
- // explicitly uses non-dev domain language (nonDevPrompt guard).
84
- var shouldOverride = !nonDevPrompt && (
85
- (!pickedDev && resConf < 0.90) ||
86
- (fromKeywordStage && promptIsDevish)
87
- );
88
- if (shouldOverride) {
89
- var topGraph = hCtx.getMonographSuggestions(prompt, 1)[0];
90
- if (topGraph) {
91
- var agent = 'coder';
92
- var file = (topGraph.file || '').toLowerCase();
93
- // Test files
94
- if (/\.(test|spec)\./.test(file) || file.includes('__tests__')) agent = 'tester';
95
- // Architecture/system docs → architect
96
- else if (/(architect|adr-|design-doc|rfc-)/.test(file)) agent = 'system-architect';
97
- // Pure docs → tech writer
98
- else if (file.endsWith('readme.md') || file.startsWith('docs/') || /\/docs\//.test(file)) agent = 'Technical Writer';
99
- // Other .md (skills, agents, configs) → coder (they're code-adjacent)
100
- else if (file.endsWith('.md')) agent = 'coder';
101
- // Class/Interface → architect
102
- else if (topGraph.label === 'Class' || topGraph.label === 'Interface') agent = 'system-architect';
103
- // Functions, files, methods → coder
104
- else agent = 'coder';
105
- // Scale confidence by graph degree: well-connected nodes are stronger anchors.
106
- var topDeg = topGraph.deg || 0;
107
- var graphConf = topDeg > 30 ? 0.80 : (topDeg > 10 ? 0.75 : 0.70);
108
- result = Object.assign({}, result, {
109
- agent: agent,
110
- agentSlug: agent,
111
- confidence: graphConf,
112
- reason: 'Graph fallback: top file ' + (topGraph.name || '').substring(0, 30) + ' [' + topGraph.label + '] deg=' + topDeg,
113
- specificAgents: [],
114
- extrasMatches: [],
115
- });
181
+ // ── Dispatch dedup: suppress re-recommending the same agent just dispatched ──
182
+ // agent-start-handler writes last-dispatch.json on SubagentStart.
183
+ // If the router picks the same agent within 60s, it's likely the parent re-routing
184
+ // the same prompt log a note so the LLM can vary its approach.
185
+ try {
186
+ var dispatchPath = path.join(CWD, '.monomind', 'last-dispatch.json');
187
+ var MAX_DISPATCH = 4096;
188
+ if (fs.existsSync(dispatchPath) && fs.statSync(dispatchPath).size <= MAX_DISPATCH) {
189
+ var lastDispatch = JSON.parse(fs.readFileSync(dispatchPath, 'utf-8'));
190
+ var dispatchAge = Date.now() - new Date(lastDispatch.dispatchedAt || 0).getTime();
191
+ if (dispatchAge < 60000 && lastDispatch.agentType === (result.agentSlug || result.agent)) {
192
+ result.recentlyDispatched = true;
193
+ console.log('[DISPATCH_DEDUP] ' + lastDispatch.agentType + ' was dispatched ' + Math.round(dispatchAge / 1000) + 's ago — consider a different specialist or direct implementation');
116
194
  }
117
195
  }
118
- } catch (e) {}
196
+ } catch (e) { /* non-fatal */ }
119
197
 
120
198
  var output = [];
121
- // Skip the noisy "[INFO] Routing task: ..." prefix — it repeats the user's
122
- // own words back and adds token overhead without helping Claude.
123
- // Routing panel strategy:
124
- // conf >= 0.90 → show primary recommendation (router is confident, trust it)
125
- // conf < 0.90 → show category picker so Claude uses its own context to
126
- // pick the right agent category + agent from a menu.
127
- // Specific-agent panel is suppressed (category menu replaces it).
128
199
  var conf = result.confidence != null ? result.confidence : 0;
129
- var promptShort = (prompt || '').trim().length < 60;
130
- var lowConf = conf < 0.70;
131
- var suppressPanel = lowConf && promptShort;
132
-
133
- // Agent category menu — shown when conf < 0.90 so Claude picks with context.
134
- var AGENT_CATEGORIES = [
135
- { label: 'CORE', agents: 'coder · reviewer · tester · planner · researcher' },
136
- { label: 'BACKEND', agents: 'backend-dev · Backend Architect · DB Optimizer' },
137
- { label: 'FRONTEND', agents: 'Frontend Developer · mobile-dev' },
138
- { label: 'ARCH', agents: 'Software Architect · system-architect' },
139
- { label: 'SECURITY', agents: 'Security Engineer · security-architect' },
140
- { label: 'AI/ML', agents: 'AI Engineer · ml-developer · Data Engineer' },
141
- { label: 'DEVOPS', agents: 'DevOps Automator · SRE · cicd-engineer' },
142
- { label: 'DOCS', agents: 'Technical Writer · api-docs' },
143
- { divider: 'Non-Coding Agents' },
144
- { label: 'PRODUCT', agents: 'Product Manager · Launch Strategist · CRO Spec.' },
145
- { label: 'MARKETING', agents: 'Content Creator · SEO Specialist · Growth Hacker' },
146
- { label: 'SOCIAL', agents: 'TikTok · LinkedIn · Twitter · Instagram Strat.' },
147
- { label: 'SALES', agents: 'Deal Strategist · Sales Coach · Outbound Strat.' },
148
- { label: 'BUSINESS', agents: 'Finance Tracker · Legal Compliance · Analytics' },
149
- { label: 'DESIGN', agents: 'Monodesign (UI/UX · brand · CSS · animation)' },
150
- ];
151
-
152
- if (conf >= 0.90) {
153
- output.push('+------------- monomind | Primary Recommendation --------------+');
154
- output.push('| Agent: ' + (result.agent || 'unknown').substring(0, 54).padEnd(54) + '|');
155
- output.push('| Confidence: ' + ((result.confidence != null ? (result.confidence * 100).toFixed(1) : '?') + '%').padEnd(49) + '|');
156
- output.push('| Reason: ' + (result.reason || '').substring(0, 53).padEnd(53) + '|');
157
- output.push('+--------------------------------------------------------------+');
158
- } else if (!suppressPanel) {
159
- output.push('+------- monomind | Agent Category Picker ---------------------+');
160
- output.push('| ' + ('Conf: ' + (conf * 100).toFixed(0) + '% — router uncertain. YOU choose using context.').padEnd(60) + ' |');
161
- output.push('+--------------------------------------------------------------+');
162
- AGENT_CATEGORIES.forEach(function(cat) {
163
- if (cat.divider) {
164
- var d = '- ' + cat.divider + ' ';
165
- output.push('|' + d.padEnd(31, '-') + ''.padEnd(31, '-') + '|');
166
- } else {
167
- output.push('| ' + cat.label.padEnd(10) + cat.agents.substring(0, 50).padEnd(50) + ' |');
168
- }
169
- });
170
- output.push('+--------------------------------------------------------------+');
171
- output.push('| INSTRUCTION: Read your conversation context. Identify the |');
172
- output.push('| best-fit category above, then pick one agent from it and |');
173
- output.push('| spawn it via Task({ subagent_type: "name" }). If no agent |');
174
- output.push('| fits the task, skip and proceed directly. Do this now. |');
175
- output.push('+--------------------------------------------------------------+');
176
- }
177
200
 
178
201
  // ── Persist routing result for statusline display ─────────────
179
202
  try {
180
203
  var routeDir = path.join(CWD, '.monomind');
181
204
  fs.mkdirSync(routeDir, { recursive: true });
182
- // When confidence < 90% and the router picked a non-dev agent without
183
- // a graph override, don't persist the wrong specialist — show "AI" instead.
184
- var confForPersist = result.confidence != null ? result.confidence : 0;
185
- var devAgentsForPersist = /^(coder|tester|reviewer|planner|researcher|system-architect|backend-dev|backend-architect|mobile-dev|ml-developer|cicd-engineer|api-docs|code-analyzer|production-validator|Technical Writer|Software Architect|Frontend Developer|AI Engineer|Data Engineer|Security Engineer|DevOps Automator|SRE)$/i;
186
- var persistedIsNonDev = !devAgentsForPersist.test(String(result.agent || '').trim());
187
- var resolvedAgent = result.agent;
188
- var resolvedFromExtras = false;
189
- if (!resolvedAgent || resolvedAgent === 'extras') {
190
- var topExtra = result.extrasMatches && result.extrasMatches[0];
191
- resolvedAgent = topExtra ? topExtra.name : 'Specialist Agent';
192
- resolvedFromExtras = true;
193
- }
194
- // If router was uncertain (< 90%) and picked a non-dev specialist,
195
- // show "AI selecting" in statusline rather than the wrong agent.
196
- // Exception: when agent was explicitly 'extras' and we resolved from extrasMatches,
197
- // trust that resolution — the domain specialist was explicitly matched.
198
- if (!resolvedFromExtras && confForPersist < 0.90 && persistedIsNonDev && !String(result.reason || '').startsWith('Graph fallback')) {
199
- resolvedAgent = 'AI selecting';
200
- }
201
- var routePayload = {
202
- agent: resolvedAgent,
203
- agentSlug: result.agentSlug || null,
204
- confidence: result.confidence,
205
- reason: result.reason,
206
- semanticRouting: result.semanticRouting || false,
207
- llmRouting: result.llmRouting || false,
208
- updatedAt: new Date().toISOString(),
209
- };
210
- if (result.extrasMatches && result.extrasMatches.length > 0) {
211
- routePayload.extrasMatches = result.extrasMatches.map(function(e) {
212
- return { name: e.name, slug: e.slug, category: e.category };
213
- });
214
- }
215
205
  fs.writeFileSync(
216
206
  path.join(routeDir, 'last-route.json'),
217
- JSON.stringify(routePayload),
207
+ JSON.stringify({
208
+ agent: result.agent || 'coder',
209
+ agentSlug: result.agentSlug || null,
210
+ confidence: result.confidence,
211
+ reason: result.reason,
212
+ prompt: (prompt || '').slice(0, 500),
213
+ historicalPattern: result.historicalPattern || null,
214
+ updatedAt: new Date().toISOString(),
215
+ }),
218
216
  'utf-8'
219
217
  );
220
218
  } catch (e) { /* non-fatal */ }
221
219
 
222
- // ── Dev skill suggestions ──────────────────────────────────────
220
+ // ── Skill auto-activation (the one thing the hook does better than Claude) ──
223
221
  var matches = result.skillMatches || [];
224
222
  if (matches.length > 0) {
225
- // Check for high-confidence auto-invoke: if top skill scored >= 3 keyword
226
- // hits and is the dominant match, auto-invoke instead of just suggesting
227
223
  var topMatch = matches[0];
228
- var autoInvoke = false;
229
- if (topMatch && topMatch.score >= 3 && matches.length <= 2) {
230
- autoInvoke = true;
231
- } else if (topMatch && topMatch.score >= 2 && matches.length === 1 && (result.confidence ?? 0) < 0.7) {
232
- // Single strong skill match with weak agent routing = skill should take over
233
- autoInvoke = true;
234
- }
224
+ // Auto-activate when one skill clearly dominates:
225
+ // - score >= 2 with at most 2 matches (strong multi-keyword signal), or
226
+ // - single match with score >= 2 and low agent confidence (skill is better fit)
227
+ var autoInvoke = (topMatch && topMatch.score >= 2 && matches.length <= 2) ||
228
+ (topMatch && topMatch.score >= 2 && matches.length === 1 && conf < 0.7);
235
229
 
236
230
  if (autoInvoke) {
237
- output.push('');
238
- output.push('+======== SKILL AUTO-ACTIVATED (high confidence match) ========+');
239
- output.push('| ' + topMatch.invoke.substring(0, 61).padEnd(61) + '|');
240
- output.push('| INSTRUCTION: Invoke ' + topMatch.invoke.substring(0, 41).padEnd(41) + '|');
241
- output.push('| BEFORE responding. This skill matched with very high |');
242
- output.push('| confidence — do not skip it. |');
243
- output.push('+==============================================================+');
231
+ output.push('+======== SKILL AUTO-ACTIVATED ========+');
232
+ output.push('| ' + topMatch.invoke.padEnd(36) + ' |');
233
+ output.push('+======================================+');
244
234
  } else {
245
- output.push('');
246
- if ((result.confidence ?? 0) < 0.8) {
247
- output.push('+----------- Skill Suggestions (pick one if relevant) ---------+');
248
- output.push('| No strong primary match — here are the best skill candidates |');
249
- } else {
250
- output.push('+----------- Matching Skills (invoke via Skill tool) ----------+');
251
- }
235
+ output.push('+----------- Matching Skills (invoke via Skill tool) ----------+');
252
236
  matches.forEach(function(m, i) {
253
- var label = (i + 1) + '. ' + m.skill;
254
- var desc = (m.description || '').substring(0, 30);
255
- var line = '| ' + label.substring(0, 30).padEnd(30) + desc.padEnd(30) + ' |';
256
- output.push(line);
237
+ output.push('| ' + (i + 1) + '. ' + m.skill.padEnd(28) + (m.description || '').substring(0, 30).padEnd(30) + ' |');
257
238
  output.push('| invoke: ' + m.invoke.substring(0, 51).padEnd(51) + '|');
258
239
  });
259
240
  output.push('+--------------------------------------------------------------+');
260
- if ((result.confidence ?? 0) < 0.8) {
261
- output.push('| To use a skill: call Skill("skill-name") before responding. |');
262
- output.push('+--------------------------------------------------------------+');
263
- }
264
241
  }
265
242
  }
266
243
 
267
- // ── Specific agent panel ──────────────────────────────────────────────────
268
- // Skip entirely on suppressed (low-confidence + short) prompts.
269
- var specificAgents = result.specificAgents || [];
270
- if (specificAgents.length > 0 && !suppressPanel && conf >= 0.90) {
271
- output.push('');
272
- var saHdr = '------- Specific Agents (' + specificAgents.length + ' available) ';
273
- output.push('+' + saHdr + '-'.repeat(Math.max(1, 62 - saHdr.length)) + '+');
274
- specificAgents.forEach(function(a, i) {
275
- var label = (i + 1) + '. ' + a.label;
276
- var note = (a.note || '').substring(0, 26);
277
- output.push('| ' + label.substring(0, 33).padEnd(33) + note.padEnd(27) + ' |');
278
- if (a.slug) {
279
- output.push('| slug: ' + a.slug.substring(0, 52).padEnd(52) + ' |');
280
- }
281
- });
282
- output.push('+--------------------------------------------------------------+');
283
- output.push('| Use: Task({ subagent_type: "<slug>" }) or /specialagent |');
284
- output.push('+--------------------------------------------------------------+');
285
- }
286
-
287
- // ── Specialist agents (non-dev domain) — only shown when specificAgents panel wasn't shown ──
288
- var extras = result.extrasMatches || [];
289
- var specificAgentsShown = (result.specificAgents || []).length > 0 && conf >= 0.90;
290
- if (extras.length > 0 && !specificAgentsShown && !suppressPanel) {
291
- output.push('');
292
- var spHdr = '------- Specialist Agents (' + extras.length + ' matched) ';
293
- output.push('+' + spHdr + '-'.repeat(Math.max(1, 62 - spHdr.length)) + '+');
294
- extras.slice(0, 5).forEach(function(e, i) {
295
- var label = (i + 1) + '. ' + e.name;
296
- var cat = '[' + e.category + ']';
297
- output.push('| ' + label.substring(0, 44).padEnd(44) + cat.substring(0, 16).padEnd(16) + ' |');
298
- output.push('| slug: ' + e.slug.substring(0, 52).padEnd(52) + ' |');
299
- });
300
- output.push('+--------------------------------------------------------------+');
301
- output.push('| Use: Task({ subagent_type: "<slug>" }) or /specialagent |');
302
- output.push('+--------------------------------------------------------------+');
303
- }
304
-
305
- // ── MicroAgent Trigger Scan (Task 32) ──────────────────────────────
306
- try {
307
- var triggerResult = hCtx.scanMicroAgentTriggers(typeof prompt === 'string' ? prompt : '');
308
- if (triggerResult.matches.length > 0) {
309
- output.push('');
310
- if (triggerResult.takeoverAgent) {
311
- var tAgent = triggerResult.takeoverAgent;
312
- var tKw = triggerResult.matches[0].matchedText;
313
- output.push('+============= MicroAgent TAKEOVER Detected ===================+');
314
- output.push('| Specialist: ' + tAgent.substring(0, 49).padEnd(49) + '|');
315
- output.push('| Keyword: ' + ('"' + tKw + '"').substring(0, 49).padEnd(49) + '|');
316
- output.push('| Recommended: use this specialist instead of primary agent. |');
317
- output.push('+==============================================================+');
318
- } else {
319
- output.push('+------- MicroAgent Specialists Triggered ---------------------+');
320
- triggerResult.matches.forEach(function(m) {
321
- var slug = m.agentSlug.substring(0, 37).padEnd(37);
322
- var kw = ('(match: "' + m.matchedText + '")').substring(0, 21).padEnd(21);
323
- output.push('| + ' + slug + kw + ' |');
324
- });
325
- output.push('+--------------------------------------------------------------+');
326
- }
327
- // Persist trigger matches alongside route result
328
- try {
329
- var routeFile = path.join(CWD, '.monomind', 'last-route.json');
330
- var routeSt = fs.statSync(routeFile);
331
- if (routeSt.size <= 1024 * 1024) {
332
- var existing = JSON.parse(fs.readFileSync(routeFile, 'utf-8'));
333
- existing.microAgents = { injectAgents: triggerResult.injectAgents || [], takeoverAgent: triggerResult.takeoverAgent || null };
334
- fs.writeFileSync(routeFile, JSON.stringify(existing), 'utf-8');
335
- }
336
- } catch (e) {}
337
- }
338
- } catch (e) { /* non-fatal */ }
339
-
340
- console.log(output.join('\n'));
244
+ if (output.length > 0) console.log(output.join('\n'));
341
245
 
342
246
  // Record any decision markers in this prompt (auto-ADR pipeline).
343
247
  try { hCtx._recordDecisionMarkers(prompt); } catch (e) {}
@@ -357,6 +261,171 @@ module.exports = {
357
261
  }
358
262
  } catch (e) {}
359
263
 
264
+ // ── Surface daemon metrics warnings (hook latency, token spikes) ──
265
+ try {
266
+ var metricsDir = path.join(CWD, '.monomind', 'metrics');
267
+ // Hook latency warnings
268
+ var latencyFile = path.join(metricsDir, 'hook-latency.json');
269
+ if (fs.existsSync(latencyFile) && fs.statSync(latencyFile).size < 32768) {
270
+ var latencyData = JSON.parse(fs.readFileSync(latencyFile, 'utf-8'));
271
+ if (latencyData && latencyData.avgMs > 500) {
272
+ console.log('[PERF] Hook latency avg ' + Math.round(latencyData.avgMs) + 'ms (target <500ms). Slowest: ' + (latencyData.slowest || 'unknown'));
273
+ }
274
+ }
275
+ // Token usage check — surface only when spend is high
276
+ var tokenFile = path.join(metricsDir, 'token-summary.json');
277
+ if (fs.existsSync(tokenFile) && fs.statSync(tokenFile).size < 32768) {
278
+ var tokenData = JSON.parse(fs.readFileSync(tokenFile, 'utf-8'));
279
+ if (tokenData && tokenData.todayCost > 50) {
280
+ console.log('[COST] Today: $' + (tokenData.todayCost || 0).toFixed(2) + ' (' + (tokenData.todayCalls || 0) + ' calls)');
281
+ }
282
+ }
283
+ // Security audit findings
284
+ var secAuditFile = path.join(metricsDir, 'security-audit.json');
285
+ if (fs.existsSync(secAuditFile) && fs.statSync(secAuditFile).size < 32768) {
286
+ var secData = JSON.parse(fs.readFileSync(secAuditFile, 'utf-8'));
287
+ if (secData && secData.findings && secData.findings.length > 0) {
288
+ console.log('[SECURITY] ' + secData.findings.length + ' findings from background scan. Review .monomind/metrics/security-audit.json');
289
+ }
290
+ }
291
+ // Codebase map top files (high-centrality god nodes from monograph)
292
+ var mapFile = path.join(metricsDir, 'codebase-map.json');
293
+ if (fs.existsSync(mapFile) && fs.statSync(mapFile).size < 32768) {
294
+ var mapData = JSON.parse(fs.readFileSync(mapFile, 'utf-8'));
295
+ if (mapData && mapData.topFiles && mapData.topFiles.length > 0) {
296
+ console.log('[CODEBASE] ' + mapData.topFiles.length + ' high-centrality files. Top: ' + (mapData.topFiles[0].ref || 'unknown') + ' (degree ' + (mapData.topFiles[0].degree || '?') + ')');
297
+ }
298
+ if (mapData && mapData.graphStaleness && mapData.graphStaleness.commitsBehind > 10) {
299
+ console.log('[CODEBASE] Graph index ' + mapData.graphStaleness.commitsBehind + ' commits behind HEAD — run monograph build');
300
+ }
301
+ }
302
+ // Deep dive findings (god nodes, high-degree files from background analysis)
303
+ var deepdiveFile = path.join(metricsDir, 'deepdive.json');
304
+ if (fs.existsSync(deepdiveFile) && fs.statSync(deepdiveFile).size < 32768) {
305
+ var ddData = JSON.parse(fs.readFileSync(deepdiveFile, 'utf-8'));
306
+ if (ddData && ddData.findings && ddData.findings.length > 0) {
307
+ for (var di = 0; di < ddData.findings.length; di++) {
308
+ var finding = ddData.findings[di];
309
+ if (finding.category === 'god_nodes' && finding.items && finding.items.length > 0) {
310
+ var topGod = finding.items[0];
311
+ console.log('[DEEPDIVE] ' + finding.items.length + ' god nodes. Top: ' + (topGod.name || 'unknown') + ' (degree ' + (topGod.degree || '?') + ') in ' + (topGod.file || 'unknown'));
312
+ }
313
+ }
314
+ }
315
+ }
316
+ // Ultralearn insights (bridge nodes crossing community boundaries)
317
+ var ultralearnFile = path.join(metricsDir, 'ultralearn.json');
318
+ if (fs.existsSync(ultralearnFile) && fs.statSync(ultralearnFile).size < 32768) {
319
+ var ulData = JSON.parse(fs.readFileSync(ultralearnFile, 'utf-8'));
320
+ if (ulData && ulData.insightsGained && ulData.insightsGained.length > 0) {
321
+ for (var ui = 0; ui < ulData.insightsGained.length; ui++) {
322
+ var insight = ulData.insightsGained[ui];
323
+ if (insight.category === 'bridge_nodes' && insight.items && insight.items.length > 0) {
324
+ var topBridge = insight.items[0];
325
+ console.log('[ARCHITECTURE] ' + insight.items.length + ' bridge nodes crossing community boundaries. Top: ' + (topBridge.name || 'unknown') + ' (' + (topBridge.crossCommunityEdges || '?') + ' cross-edges) in ' + (topBridge.location || 'unknown'));
326
+ }
327
+ }
328
+ }
329
+ }
330
+ // Performance metrics (daemon optimize worker)
331
+ var perfFile = path.join(metricsDir, 'performance.json');
332
+ if (fs.existsSync(perfFile) && fs.statSync(perfFile).size < 32768) {
333
+ var perfData = JSON.parse(fs.readFileSync(perfFile, 'utf-8'));
334
+ if (perfData && perfData.memoryUsage) {
335
+ var rssBytes = perfData.memoryUsage.rss || 0;
336
+ var rssMB = Math.round(rssBytes / (1024 * 1024));
337
+ if (rssMB > 512) {
338
+ console.log('[PERF] Daemon RSS ' + rssMB + 'MB (>512MB threshold). Consider restarting daemon or reducing worker concurrency');
339
+ }
340
+ }
341
+ }
342
+ // Memory consolidation health
343
+ var consolFile = path.join(metricsDir, 'consolidation.json');
344
+ if (fs.existsSync(consolFile) && fs.statSync(consolFile).size < 32768) {
345
+ var consolData = JSON.parse(fs.readFileSync(consolFile, 'utf-8'));
346
+ if (consolData && consolData.patternsConsolidated > 0) {
347
+ console.log('[MEMORY] ' + consolData.patternsConsolidated + ' patterns consolidated into ' + consolData.clustersCreated + ' RAPTOR clusters');
348
+ }
349
+ }
350
+ // Benchmark worker RSS (manual-trigger `daemon trigger -w benchmark`)
351
+ var benchFile = path.join(metricsDir, 'benchmark.json');
352
+ if (fs.existsSync(benchFile) && fs.statSync(benchFile).size < 32768) {
353
+ var benchData = JSON.parse(fs.readFileSync(benchFile, 'utf-8'));
354
+ if (benchData && benchData.benchmarks && benchData.benchmarks.memoryUsage) {
355
+ var benchRssMB = Math.round((benchData.benchmarks.memoryUsage.rss || 0) / (1024 * 1024));
356
+ if (benchRssMB > 512) {
357
+ console.log('[PERF] Benchmark snapshot RSS ' + benchRssMB + 'MB (>512MB threshold) at last `daemon trigger -w benchmark` run');
358
+ }
359
+ }
360
+ }
361
+ } catch (e) { /* non-fatal */ }
362
+
363
+ // ── Memory: surface relevant past session context ──────────
364
+ try {
365
+ var epFile = path.join(CWD, '.monomind', 'episodic', 'episodes.jsonl');
366
+ var MAX_EP = 256 * 1024;
367
+ if (fs.existsSync(epFile) && fs.statSync(epFile).size <= MAX_EP) {
368
+ var epRaw = fs.readFileSync(epFile, 'utf-8').trim().split('\n').filter(Boolean);
369
+ if (epRaw.length > 0) {
370
+ // Simple keyword matching against episode summaries
371
+ var promptLower = (prompt || '').toLowerCase();
372
+ var promptTokens = promptLower.match(/[a-z][a-z0-9_-]{2,}/g) || [];
373
+ if (promptTokens.length > 0) {
374
+ var matches = [];
375
+ // Truncate at the last space before maxLen so fragments never
376
+ // end mid-word (falls back to a hard cut for space-less text).
377
+ var truncAtWord = function(s, maxLen) {
378
+ s = String(s || '');
379
+ if (s.length <= maxLen) return s;
380
+ var cut = s.slice(0, maxLen);
381
+ var sp = cut.lastIndexOf(' ');
382
+ return sp > 40 ? cut.slice(0, sp) : cut;
383
+ };
384
+ // Only search last 200 episodes
385
+ var searchEps = epRaw.slice(-200);
386
+ for (var ei = 0; ei < searchEps.length; ei++) {
387
+ try {
388
+ var ep = JSON.parse(searchEps[ei]);
389
+ var sumLower = (ep.summary || '').toLowerCase();
390
+ // Skip if from current session
391
+ var currentSessId = process.env.CLAUDE_SESSION_ID || '';
392
+ if (ep.sessionId === currentSessId) continue;
393
+ // Count keyword overlap
394
+ var hits = 0;
395
+ for (var ti = 0; ti < promptTokens.length; ti++) {
396
+ if (sumLower.includes(promptTokens[ti])) hits++;
397
+ }
398
+ var relevance = promptTokens.length > 0 ? hits / promptTokens.length : 0;
399
+ if (relevance >= 0.3 && hits >= 2) {
400
+ matches.push({ summary: truncAtWord(ep.summary || '', 120), relevance: relevance, ts: ep.endedAt || 0 });
401
+ }
402
+ } catch (e) {}
403
+ }
404
+ // Show top 2 most relevant matches — dedupe by fragment text so
405
+ // two episodes from the same conversation don't inject the same
406
+ // truncated snippet twice.
407
+ if (matches.length > 0) {
408
+ matches.sort(function(a, b) { return b.relevance - a.relevance; });
409
+ var topMatches = [];
410
+ var seenFrags = {};
411
+ for (var tmi = 0; tmi < matches.length && topMatches.length < 2; tmi++) {
412
+ var frag = matches[tmi].summary.replace(/\n/g, ' ').trim();
413
+ if (seenFrags[frag]) continue;
414
+ seenFrags[frag] = true;
415
+ topMatches.push(matches[tmi]);
416
+ }
417
+ var memLines = ['[MEMORY] Relevant past sessions:'];
418
+ for (var mi = 0; mi < topMatches.length; mi++) {
419
+ var ago = topMatches[mi].ts ? Math.round((Date.now() - topMatches[mi].ts) / 3600000) + 'h ago' : '';
420
+ memLines.push(' ' + topMatches[mi].summary.replace(/\n/g, ' ').trim() + (ago ? ' (' + ago + ')' : ''));
421
+ }
422
+ console.log(memLines.join('\n'));
423
+ }
424
+ }
425
+ }
426
+ }
427
+ } catch (e) { /* non-fatal */ }
428
+
360
429
  // Inject monograph hint for complex tasks.
361
430
  // Source of truth is .monomind/monograph.db (SQLite). Legacy stats.json
362
431
  // is no longer written by the build, so it is checked only as a fallback.