monomind 1.7.0 → 1.9.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 (562) hide show
  1. package/.claude/agents/design/design-monodesign.md +121 -0
  2. package/.claude/agents/github/issue-tracker.md +12 -12
  3. package/.claude/agents/github/pr-manager.md +10 -10
  4. package/.claude/agents/github/release-manager.md +49 -105
  5. package/.claude/agents/github/repo-architect.md +73 -92
  6. package/.claude/agents/github/sync-coordinator.md +55 -123
  7. package/.claude/agents/marketing/marketing-competitive-content.md +155 -0
  8. package/.claude/agents/marketing/marketing-content-creator.md +13 -0
  9. package/.claude/agents/marketing/marketing-cro-specialist.md +147 -0
  10. package/.claude/agents/marketing/marketing-email-specialist.md +90 -0
  11. package/.claude/agents/marketing/marketing-launch-strategist.md +129 -0
  12. package/.claude/agents/marketing/marketing-pricing-strategist.md +127 -0
  13. package/.claude/agents/specialists/integration-architect.md +94 -0
  14. package/.claude/commands/agents/README.md +4 -0
  15. package/.claude/commands/agents/agent-capabilities.md +6 -2
  16. package/.claude/commands/agents/agent-coordination.md +4 -0
  17. package/.claude/commands/agents/agent-spawning.md +4 -0
  18. package/.claude/commands/agents/agent-types.md +6 -2
  19. package/.claude/commands/analysis/README.md +14 -5
  20. package/.claude/commands/analysis/bottleneck-detect.md +30 -123
  21. package/.claude/commands/analysis/performance-bottlenecks.md +14 -14
  22. package/.claude/commands/analysis/performance-report.md +38 -11
  23. package/.claude/commands/analysis/token-efficiency.md +13 -16
  24. package/.claude/commands/analysis/token-usage.md +34 -12
  25. package/.claude/commands/automation/README.md +15 -5
  26. package/.claude/commands/automation/auto-agent.md +49 -85
  27. package/.claude/commands/automation/self-healing.md +20 -18
  28. package/.claude/commands/automation/session-memory.md +28 -29
  29. package/.claude/commands/automation/smart-agents.md +17 -9
  30. package/.claude/commands/automation/smart-spawn.md +52 -11
  31. package/.claude/commands/automation/workflow-select.md +46 -11
  32. package/.claude/commands/browse.md +5 -0
  33. package/.claude/commands/coordination/README.md +9 -5
  34. package/.claude/commands/coordination/agent-spawn.md +53 -9
  35. package/.claude/commands/coordination/swarm-init.md +39 -42
  36. package/.claude/commands/coordination/task-orchestrate.md +65 -11
  37. package/.claude/commands/github/README.md +21 -8
  38. package/.claude/commands/github/github-modes.md +9 -5
  39. package/.claude/commands/github/issue-tracker.md +34 -33
  40. package/.claude/commands/github/pr-manager.md +20 -17
  41. package/.claude/commands/github/release-manager.md +37 -49
  42. package/.claude/commands/github/repo-architect.md +39 -41
  43. package/.claude/commands/github/sync-coordinator.md +45 -49
  44. package/.claude/commands/hive-mind/README.md +42 -17
  45. package/.claude/commands/hive-mind/hive-mind-consensus.md +68 -4
  46. package/.claude/commands/hive-mind/hive-mind-init.md +55 -5
  47. package/.claude/commands/hive-mind/hive-mind-memory.md +69 -4
  48. package/.claude/commands/hive-mind/hive-mind-spawn.md +71 -10
  49. package/.claude/commands/hive-mind/hive-mind-status.md +52 -4
  50. package/.claude/commands/hive-mind/hive-mind-stop.md +51 -4
  51. package/.claude/commands/hive-mind/hive-mind.md +74 -14
  52. package/.claude/commands/hooks/README.md +62 -7
  53. package/.claude/commands/hooks/overview.md +94 -35
  54. package/.claude/commands/hooks/post-edit.md +48 -87
  55. package/.claude/commands/hooks/post-task.md +37 -87
  56. package/.claude/commands/hooks/pre-edit.md +52 -84
  57. package/.claude/commands/hooks/pre-task.md +46 -81
  58. package/.claude/commands/hooks/session-end.md +49 -85
  59. package/.claude/commands/hooks/setup.md +87 -58
  60. package/.claude/commands/mastermind/_repeat.md +308 -0
  61. package/.claude/commands/mastermind/architect.md +49 -0
  62. package/.claude/commands/mastermind/brain.md +98 -0
  63. package/.claude/commands/mastermind/build.md +22 -0
  64. package/.claude/commands/mastermind/content.md +22 -0
  65. package/.claude/commands/mastermind/createorg.md +94 -0
  66. package/.claude/commands/mastermind/finance.md +22 -0
  67. package/.claude/commands/mastermind/idea.md +22 -0
  68. package/.claude/commands/mastermind/marketing.md +22 -0
  69. package/.claude/commands/mastermind/master.md +379 -0
  70. package/.claude/commands/mastermind/ops.md +22 -0
  71. package/.claude/commands/mastermind/release.md +22 -0
  72. package/.claude/commands/mastermind/research.md +22 -0
  73. package/.claude/commands/mastermind/review.md +22 -0
  74. package/.claude/commands/mastermind/runorg.md +106 -0
  75. package/.claude/commands/mastermind/sales.md +22 -0
  76. package/.claude/commands/mastermind/techport.md +17 -0
  77. package/.claude/commands/memory/README.md +75 -5
  78. package/.claude/commands/memory/memory-search.md +63 -11
  79. package/.claude/commands/monitoring/README.md +64 -4
  80. package/.claude/commands/monitoring/agent-metrics.md +50 -10
  81. package/.claude/commands/monitoring/agents.md +59 -32
  82. package/.claude/commands/monitoring/status.md +96 -34
  83. package/.claude/commands/monograph/README.md +102 -0
  84. package/.claude/commands/monograph/monograph-build.md +79 -0
  85. package/.claude/commands/monograph/monograph-search.md +96 -0
  86. package/.claude/commands/monograph/monograph-stats.md +53 -0
  87. package/.claude/commands/monograph/monograph-watch.md +63 -0
  88. package/.claude/commands/monograph/monograph-wiki.md +91 -0
  89. package/.claude/commands/monomind/createtask.md +277 -0
  90. package/.claude/commands/{monomind-do.md → monomind/do.md} +22 -9
  91. package/.claude/commands/monomind/help.md +118 -0
  92. package/.claude/commands/{monomind-idea.md → monomind/idea.md} +23 -29
  93. package/.claude/commands/{monomind-improve.md → monomind/improve.md} +24 -30
  94. package/.claude/commands/monomind/memory.md +230 -0
  95. package/.claude/commands/monomind/repeat.md +201 -0
  96. package/.claude/commands/monomind/review.md +313 -0
  97. package/.claude/commands/monomind/specialagents.md +125 -0
  98. package/.claude/commands/monomind/swarm.md +161 -0
  99. package/.claude/commands/monomind/understand.md +148 -0
  100. package/.claude/commands/optimization/README.md +69 -5
  101. package/.claude/commands/optimization/auto-topology.md +66 -43
  102. package/.claude/commands/optimization/parallel-execution.md +65 -39
  103. package/.claude/commands/optimization/performance-optimize.md +79 -0
  104. package/.claude/commands/pair/README.md +48 -230
  105. package/.claude/commands/pair/examples.md +85 -441
  106. package/.claude/commands/pair/modes.md +77 -303
  107. package/.claude/commands/pair/session.md +76 -359
  108. package/.claude/commands/sparc/analyzer.md +9 -26
  109. package/.claude/commands/sparc/architect.md +8 -25
  110. package/.claude/commands/sparc/ask.md +27 -68
  111. package/.claude/commands/sparc/batch-executor.md +8 -25
  112. package/.claude/commands/sparc/code.md +12 -53
  113. package/.claude/commands/sparc/coder.md +8 -25
  114. package/.claude/commands/sparc/debug.md +12 -53
  115. package/.claude/commands/sparc/debugger.md +8 -25
  116. package/.claude/commands/sparc/designer.md +8 -25
  117. package/.claude/commands/sparc/devops.md +16 -57
  118. package/.claude/commands/sparc/docs-writer.md +12 -53
  119. package/.claude/commands/sparc/documenter.md +8 -25
  120. package/.claude/commands/sparc/innovator.md +8 -25
  121. package/.claude/commands/sparc/integration.md +12 -53
  122. package/.claude/commands/sparc/mcp.md +12 -53
  123. package/.claude/commands/sparc/memory-manager.md +28 -25
  124. package/.claude/commands/sparc/optimizer.md +8 -25
  125. package/.claude/commands/sparc/orchestrator.md +35 -97
  126. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +13 -54
  127. package/.claude/commands/sparc/refinement-optimization-mode.md +13 -54
  128. package/.claude/commands/sparc/researcher.md +8 -25
  129. package/.claude/commands/sparc/reviewer.md +8 -25
  130. package/.claude/commands/sparc/security-review.md +13 -54
  131. package/.claude/commands/sparc/sparc-modes.md +97 -151
  132. package/.claude/commands/sparc/sparc.md +16 -56
  133. package/.claude/commands/sparc/spec-pseudocode.md +13 -54
  134. package/.claude/commands/sparc/supabase-admin.md +19 -66
  135. package/.claude/commands/sparc/swarm-coordinator.md +21 -25
  136. package/.claude/commands/sparc/tdd.md +8 -25
  137. package/.claude/commands/sparc/tester.md +8 -25
  138. package/.claude/commands/sparc/tutorial.md +12 -53
  139. package/.claude/commands/sparc/workflow-manager.md +8 -25
  140. package/.claude/commands/sparc.md +76 -130
  141. package/.claude/commands/stream-chain/pipeline.md +72 -77
  142. package/.claude/commands/stream-chain/run.md +133 -47
  143. package/.claude/commands/swarm/README.md +37 -12
  144. package/.claude/commands/swarm/analysis.md +47 -69
  145. package/.claude/commands/swarm/development.md +45 -69
  146. package/.claude/commands/swarm/examples.md +77 -142
  147. package/.claude/commands/swarm/maintenance.md +47 -74
  148. package/.claude/commands/swarm/optimization.md +54 -87
  149. package/.claude/commands/swarm/research.md +47 -107
  150. package/.claude/commands/swarm/swarm-analysis.md +58 -4
  151. package/.claude/commands/swarm/swarm-background.md +61 -4
  152. package/.claude/commands/swarm/swarm-modes.md +63 -4
  153. package/.claude/commands/swarm/swarm-monitor.md +50 -4
  154. package/.claude/commands/swarm/swarm-status.md +40 -4
  155. package/.claude/commands/swarm/swarm-strategies.md +73 -5
  156. package/.claude/commands/swarm/swarm.md +70 -18
  157. package/.claude/commands/swarm/testing.md +51 -102
  158. package/.claude/commands/tokens.md +6 -1
  159. package/.claude/commands/training/README.md +36 -6
  160. package/.claude/commands/training/model-update.md +68 -15
  161. package/.claude/commands/training/neural-patterns.md +54 -55
  162. package/.claude/commands/training/neural-train.md +70 -16
  163. package/.claude/commands/training/pattern-learn.md +60 -16
  164. package/.claude/commands/training/specialization.md +78 -49
  165. package/.claude/commands/truth/start.md +87 -109
  166. package/.claude/commands/ts.md +7 -2
  167. package/.claude/commands/verify/check.md +90 -34
  168. package/.claude/commands/verify/start.md +71 -94
  169. package/.claude/commands/workflows/README.md +62 -6
  170. package/.claude/commands/workflows/development.md +69 -61
  171. package/.claude/commands/workflows/research.md +73 -47
  172. package/.claude/commands/workflows/workflow-create.md +75 -16
  173. package/.claude/commands/workflows/workflow-execute.md +94 -16
  174. package/.claude/commands/workflows/workflow-export.md +81 -16
  175. package/.claude/helpers/control-start.cjs +91 -0
  176. package/.claude/helpers/extras-registry.json +4104 -1991
  177. package/.claude/helpers/graphify-freshen.cjs +44 -13
  178. package/.claude/helpers/hook-handler.cjs +256 -1
  179. package/.claude/helpers/loop-tracker.cjs +107 -0
  180. package/.claude/helpers/router.cjs +48 -68
  181. package/.claude/helpers/skill-registry.json +89 -104
  182. package/.claude/helpers/statusline.cjs +33 -2
  183. package/.claude/scheduled_tasks.lock +1 -0
  184. package/.claude/settings.json +15 -0
  185. package/.claude/skills/.monomind/data/ranked-context.json +5 -0
  186. package/.claude/skills/.monomind/sessions/current.json +13 -0
  187. package/.claude/skills/.monomind/sessions/session-1777829336455.json +15 -0
  188. package/.claude/skills/.monomind/sessions/session-1777831614725.json +15 -0
  189. package/.claude/skills/.monomind/sessions/session-1777832095857.json +15 -0
  190. package/.claude/skills/.monomind/sessions/session-1777839814183.json +15 -0
  191. package/.claude/skills/.monomind/sessions/session-1777841847131.json +15 -0
  192. package/.claude/skills/.monomind/sessions/session-1777843309463.json +15 -0
  193. package/.claude/skills/.monomind/sessions/session-1777880867159.json +15 -0
  194. package/.claude/skills/.monomind/sessions/session-1777881884593.json +15 -0
  195. package/.claude/skills/.monomind/sessions/session-1777884090471.json +15 -0
  196. package/.claude/skills/.monomind/sessions/session-1777884808221.json +15 -0
  197. package/.claude/skills/.monomind/sessions/session-1777885672155.json +15 -0
  198. package/.claude/skills/.monomind/sessions/session-1777886852818.json +15 -0
  199. package/.claude/skills/.monomind/sessions/session-1777896532690.json +15 -0
  200. package/.claude/skills/agentdb-advanced/SKILL.md +11 -12
  201. package/.claude/skills/agentdb-learning/SKILL.md +20 -21
  202. package/.claude/skills/agentdb-memory-patterns/SKILL.md +28 -30
  203. package/.claude/skills/agentdb-optimization/SKILL.md +11 -12
  204. package/.claude/skills/agentdb-vector-search/SKILL.md +37 -41
  205. package/.claude/skills/{v3-integration-deep → agentic-integration}/SKILL.md +20 -13
  206. package/.claude/skills/agentic-jujutsu/SKILL.md +22 -22
  207. package/.claude/skills/{v3-cli-modernization → cli-modernization}/SKILL.md +17 -8
  208. package/.claude/skills/{v3-core-implementation → core-implementation}/SKILL.md +33 -8
  209. package/.claude/skills/{v3-ddd-architecture → ddd-architecture}/SKILL.md +18 -25
  210. package/.claude/skills/github-code-review/SKILL.md +82 -83
  211. package/.claude/skills/github-multi-repo/SKILL.md +42 -46
  212. package/.claude/skills/github-project-management/SKILL.md +83 -88
  213. package/.claude/skills/github-release-management/SKILL.md +12 -18
  214. package/.claude/skills/github-workflow-automation/SKILL.md +70 -74
  215. package/.claude/skills/hooks-automation/SKILL.md +9 -13
  216. package/.claude/skills/mastermind/_intake.md +83 -0
  217. package/.claude/skills/mastermind/_protocol.md +275 -0
  218. package/.claude/skills/mastermind/architect.md +847 -0
  219. package/.claude/skills/mastermind/build.md +158 -0
  220. package/.claude/skills/mastermind/content.md +185 -0
  221. package/.claude/skills/mastermind/createorg.md +318 -0
  222. package/.claude/skills/mastermind/finance.md +154 -0
  223. package/.claude/skills/mastermind/idea.md +158 -0
  224. package/.claude/skills/mastermind/marketing.md +216 -0
  225. package/.claude/skills/mastermind/monotask.md +350 -0
  226. package/.claude/skills/mastermind/ops.md +156 -0
  227. package/.claude/skills/mastermind/references/copywriting-frameworks.md +181 -0
  228. package/.claude/skills/mastermind/references/persuasion-psychology.md +158 -0
  229. package/.claude/skills/mastermind/release.md +156 -0
  230. package/.claude/skills/mastermind/research.md +156 -0
  231. package/.claude/skills/mastermind/review.md +157 -0
  232. package/.claude/skills/mastermind/runorg.md +308 -0
  233. package/.claude/skills/mastermind/sales.md +158 -0
  234. package/.claude/skills/mastermind/techport.md +743 -0
  235. package/.claude/skills/{v3-mcp-optimization → mcp-optimization}/SKILL.md +35 -14
  236. package/.claude/skills/{v3-memory-unification → memory-unification}/SKILL.md +20 -4
  237. package/.claude/skills/monodesign/SKILL.md +302 -0
  238. package/.claude/skills/monodesign/reference/adapt.md +190 -0
  239. package/.claude/skills/monodesign/reference/animate.md +175 -0
  240. package/.claude/skills/monodesign/reference/antipatterns-catalog.md +187 -0
  241. package/.claude/skills/monodesign/reference/audit.md +133 -0
  242. package/.claude/skills/monodesign/reference/bolder.md +113 -0
  243. package/.claude/skills/monodesign/reference/brand-workflow.md +180 -0
  244. package/.claude/skills/monodesign/reference/brand.md +114 -0
  245. package/.claude/skills/monodesign/reference/clarify.md +174 -0
  246. package/.claude/skills/monodesign/reference/cognitive-load.md +106 -0
  247. package/.claude/skills/monodesign/reference/color-and-contrast.md +105 -0
  248. package/.claude/skills/monodesign/reference/colorize.md +154 -0
  249. package/.claude/skills/monodesign/reference/component-specs.md +260 -0
  250. package/.claude/skills/monodesign/reference/component-states.md +274 -0
  251. package/.claude/skills/monodesign/reference/component-system.md +358 -0
  252. package/.claude/skills/monodesign/reference/copy-formulas.md +160 -0
  253. package/.claude/skills/monodesign/reference/craft.md +193 -0
  254. package/.claude/skills/monodesign/reference/critique.md +213 -0
  255. package/.claude/skills/monodesign/reference/delight.md +302 -0
  256. package/.claude/skills/monodesign/reference/design-principles.md +246 -0
  257. package/.claude/skills/monodesign/reference/distill.md +111 -0
  258. package/.claude/skills/monodesign/reference/document.md +427 -0
  259. package/.claude/skills/monodesign/reference/extract.md +69 -0
  260. package/.claude/skills/monodesign/reference/harden.md +347 -0
  261. package/.claude/skills/monodesign/reference/heuristics-scoring.md +234 -0
  262. package/.claude/skills/monodesign/reference/image-prompts.md +118 -0
  263. package/.claude/skills/monodesign/reference/interaction-design.md +195 -0
  264. package/.claude/skills/monodesign/reference/layout.md +141 -0
  265. package/.claude/skills/monodesign/reference/live.md +622 -0
  266. package/.claude/skills/monodesign/reference/motion-design.md +109 -0
  267. package/.claude/skills/monodesign/reference/onboard.md +234 -0
  268. package/.claude/skills/monodesign/reference/optimize.md +258 -0
  269. package/.claude/skills/monodesign/reference/overdrive.md +130 -0
  270. package/.claude/skills/monodesign/reference/personas.md +179 -0
  271. package/.claude/skills/monodesign/reference/polish.md +233 -0
  272. package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +108 -0
  273. package/.claude/skills/monodesign/reference/product.md +62 -0
  274. package/.claude/skills/monodesign/reference/quieter.md +99 -0
  275. package/.claude/skills/monodesign/reference/responsive-design.md +114 -0
  276. package/.claude/skills/monodesign/reference/shape.md +151 -0
  277. package/.claude/skills/monodesign/reference/spatial-design.md +100 -0
  278. package/.claude/skills/monodesign/reference/teach.md +156 -0
  279. package/.claude/skills/monodesign/reference/token-architecture.md +222 -0
  280. package/.claude/skills/monodesign/reference/typeset.md +124 -0
  281. package/.claude/skills/monodesign/reference/typography.md +159 -0
  282. package/.claude/skills/monodesign/reference/ux-research.md +143 -0
  283. package/.claude/skills/monodesign/reference/ux-rules.md +211 -0
  284. package/.claude/skills/monodesign/reference/ux-writing.md +107 -0
  285. package/.claude/skills/monomotion/SKILL.md +145 -0
  286. package/.claude/skills/monomotion/rules/api-control.md +139 -0
  287. package/.claude/skills/monomotion/rules/effects.md +109 -0
  288. package/.claude/skills/monomotion/rules/integration.md +140 -0
  289. package/.claude/skills/monomotion/rules/scroll.md +131 -0
  290. package/.claude/skills/monomotion/rules/sequencing.md +105 -0
  291. package/.claude/skills/monomotion/rules/svg.md +101 -0
  292. package/.claude/skills/monomotion/rules/text.md +119 -0
  293. package/.claude/skills/pair-programming/SKILL.md +1 -1
  294. package/.claude/skills/performance-analysis/SKILL.md +3 -3
  295. package/.claude/skills/{v3-performance-optimization → performance-optimization}/SKILL.md +16 -8
  296. package/.claude/skills/reasoningbank-agentdb/SKILL.md +17 -19
  297. package/.claude/skills/reasoningbank-intelligence/SKILL.md +4 -6
  298. package/.claude/skills/{v3-security-overhaul → security-hardening}/SKILL.md +13 -3
  299. package/.claude/skills/skill-builder/SKILL.md +19 -19
  300. package/.claude/skills/sparc-methodology/SKILL.md +55 -211
  301. package/.claude/skills/stop-slop/SKILL.md +67 -0
  302. package/.claude/skills/stop-slop/references/examples.md +61 -0
  303. package/.claude/skills/stop-slop/references/phrases.md +130 -0
  304. package/.claude/skills/stop-slop/references/structures.md +136 -0
  305. package/.claude/skills/swarm-advanced/SKILL.md +13 -43
  306. package/.claude/skills/{v3-swarm-coordination → swarm-coordination}/SKILL.md +39 -21
  307. package/.claude/skills/swarm-orchestration/SKILL.md +12 -12
  308. package/.claude/skills/verification-quality/SKILL.md +5 -5
  309. package/README.md +5 -5
  310. package/package.json +1 -1
  311. package/packages/@monomind/cli/README.md +5 -5
  312. package/packages/@monomind/cli/bin/cli.js +78 -13
  313. package/packages/@monomind/cli/dist/src/agents/halt-signal.js +33 -7
  314. package/packages/@monomind/cli/dist/src/agents/managed-agent.js +5 -2
  315. package/packages/@monomind/cli/dist/src/agents/prompt-experiment.d.ts +3 -2
  316. package/packages/@monomind/cli/dist/src/agents/prompt-experiment.js +1 -1
  317. package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.d.ts +5 -2
  318. package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.js +26 -4
  319. package/packages/@monomind/cli/dist/src/agents/specialization-scorer.js +17 -9
  320. package/packages/@monomind/cli/dist/src/agents/trigger-scanner.d.ts +5 -3
  321. package/packages/@monomind/cli/dist/src/agents/trigger-scanner.js +58 -10
  322. package/packages/@monomind/cli/dist/src/agents/version-store.d.ts +0 -1
  323. package/packages/@monomind/cli/dist/src/agents/version-store.js +44 -21
  324. package/packages/@monomind/cli/dist/src/autopilot-state.js +79 -28
  325. package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.d.ts +7 -2
  326. package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.js +20 -8
  327. package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.d.ts +2 -1
  328. package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.js +25 -2
  329. package/packages/@monomind/cli/dist/src/commands/agent.js +6 -4
  330. package/packages/@monomind/cli/dist/src/commands/appliance-advanced.js +23 -0
  331. package/packages/@monomind/cli/dist/src/commands/autopilot.js +3 -3
  332. package/packages/@monomind/cli/dist/src/commands/benchmark.js +119 -8
  333. package/packages/@monomind/cli/dist/src/commands/claims.js +22 -14
  334. package/packages/@monomind/cli/dist/src/commands/config.js +32 -0
  335. package/packages/@monomind/cli/dist/src/commands/daemon.js +13 -11
  336. package/packages/@monomind/cli/dist/src/commands/deployment.js +21 -2
  337. package/packages/@monomind/cli/dist/src/commands/doctor.js +28 -62
  338. package/packages/@monomind/cli/dist/src/commands/embeddings.js +124 -48
  339. package/packages/@monomind/cli/dist/src/commands/hive-mind.js +15 -14
  340. package/packages/@monomind/cli/dist/src/commands/hooks.js +45 -41
  341. package/packages/@monomind/cli/dist/src/commands/index.d.ts +2 -0
  342. package/packages/@monomind/cli/dist/src/commands/index.js +20 -7
  343. package/packages/@monomind/cli/dist/src/commands/init.js +53 -19
  344. package/packages/@monomind/cli/dist/src/commands/mcp.js +31 -44
  345. package/packages/@monomind/cli/dist/src/commands/memory.js +47 -15
  346. package/packages/@monomind/cli/dist/src/commands/migrate.js +156 -108
  347. package/packages/@monomind/cli/dist/src/commands/monograph.d.ts +8 -0
  348. package/packages/@monomind/cli/dist/src/commands/monograph.js +526 -0
  349. package/packages/@monomind/cli/dist/src/commands/neural.js +96 -56
  350. package/packages/@monomind/cli/dist/src/commands/performance.js +30 -8
  351. package/packages/@monomind/cli/dist/src/commands/plugins.js +13 -37
  352. package/packages/@monomind/cli/dist/src/commands/process.js +25 -2
  353. package/packages/@monomind/cli/dist/src/commands/providers.js +37 -5
  354. package/packages/@monomind/cli/dist/src/commands/replay.js +4 -4
  355. package/packages/@monomind/cli/dist/src/commands/route.js +37 -5
  356. package/packages/@monomind/cli/dist/src/commands/ruvector/import.js +12 -2
  357. package/packages/@monomind/cli/dist/src/commands/ruvector/init.js +15 -0
  358. package/packages/@monomind/cli/dist/src/commands/ruvector/status.js +16 -3
  359. package/packages/@monomind/cli/dist/src/commands/security.js +342 -193
  360. package/packages/@monomind/cli/dist/src/commands/session.js +51 -8
  361. package/packages/@monomind/cli/dist/src/commands/start.js +18 -4
  362. package/packages/@monomind/cli/dist/src/commands/swarm.js +47 -36
  363. package/packages/@monomind/cli/dist/src/commands/tokens.js +11 -11
  364. package/packages/@monomind/cli/dist/src/commands/transfer-store.js +1 -1
  365. package/packages/@monomind/cli/dist/src/commands/workflow.js +31 -4
  366. package/packages/@monomind/cli/dist/src/config-adapter.d.ts +2 -1
  367. package/packages/@monomind/cli/dist/src/consensus/audit-writer.js +46 -13
  368. package/packages/@monomind/cli/dist/src/consensus/vote-signer.d.ts +0 -3
  369. package/packages/@monomind/cli/dist/src/consensus/vote-signer.js +9 -1
  370. package/packages/@monomind/cli/dist/src/dlq/dlq-reader.d.ts +4 -2
  371. package/packages/@monomind/cli/dist/src/dlq/dlq-reader.js +25 -8
  372. package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.d.ts +10 -3
  373. package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.js +50 -16
  374. package/packages/@monomind/cli/dist/src/dlq/dlq-writer.js +27 -5
  375. package/packages/@monomind/cli/dist/src/eval/dataset-manager.d.ts +2 -2
  376. package/packages/@monomind/cli/dist/src/eval/dataset-manager.js +26 -16
  377. package/packages/@monomind/cli/dist/src/eval/trace-collector.js +23 -3
  378. package/packages/@monomind/cli/dist/src/index.js +12 -10
  379. package/packages/@monomind/cli/dist/src/init/claudemd-generator.js +8 -8
  380. package/packages/@monomind/cli/dist/src/init/executor.js +163 -137
  381. package/packages/@monomind/cli/dist/src/init/helpers-generator.js +49 -36
  382. package/packages/@monomind/cli/dist/src/init/mcp-generator.js +3 -3
  383. package/packages/@monomind/cli/dist/src/init/settings-generator.js +10 -3
  384. package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +18 -3
  385. package/packages/@monomind/cli/dist/src/init/statusline-generator.js +3 -1
  386. package/packages/@monomind/cli/dist/src/init/types.d.ts +35 -11
  387. package/packages/@monomind/cli/dist/src/init/types.js +5 -9
  388. package/packages/@monomind/cli/dist/src/interactive/interrupt.js +8 -3
  389. package/packages/@monomind/cli/dist/src/mcp/tool-registry.js +38 -4
  390. package/packages/@monomind/cli/dist/src/mcp-client.js +15 -6
  391. package/packages/@monomind/cli/dist/src/mcp-server.d.ts +9 -2
  392. package/packages/@monomind/cli/dist/src/mcp-server.js +182 -35
  393. package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +66 -34
  394. package/packages/@monomind/cli/dist/src/mcp-tools/agentdb-tools.js +34 -7
  395. package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.js +25 -16
  396. package/packages/@monomind/cli/dist/src/mcp-tools/auto-install.js +4 -6
  397. package/packages/@monomind/cli/dist/src/mcp-tools/autopilot-tools.js +12 -2
  398. package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +199 -20
  399. package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.js +68 -18
  400. package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.js +33 -5
  401. package/packages/@monomind/cli/dist/src/mcp-tools/coordination-tools.js +59 -4
  402. package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +46 -10
  403. package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +46 -5
  404. package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.js +29 -16
  405. package/packages/@monomind/cli/dist/src/mcp-tools/graphify-tools.d.ts +4 -67
  406. package/packages/@monomind/cli/dist/src/mcp-tools/graphify-tools.js +40 -1250
  407. package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +38 -10
  408. package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +96 -33
  409. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +70 -37
  410. package/packages/@monomind/cli/dist/src/mcp-tools/index.d.ts +1 -0
  411. package/packages/@monomind/cli/dist/src/mcp-tools/index.js +1 -0
  412. package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +29 -13
  413. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.d.ts +9 -0
  414. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +6306 -0
  415. package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +121 -37
  416. package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +21 -8
  417. package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +10 -8
  418. package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.js +4 -1
  419. package/packages/@monomind/cli/dist/src/mcp-tools/ruvllm-tools.js +19 -8
  420. package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.js +57 -17
  421. package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +35 -17
  422. package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +4 -3
  423. package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.js +53 -13
  424. package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.js +63 -14
  425. package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +21 -16
  426. package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +92 -23
  427. package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +41 -10
  428. package/packages/@monomind/cli/dist/src/memory/intelligence.d.ts +2 -2
  429. package/packages/@monomind/cli/dist/src/memory/intelligence.js +39 -13
  430. package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +1 -0
  431. package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +149 -56
  432. package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +107 -45
  433. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.d.ts +8 -1
  434. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +25 -8
  435. package/packages/@monomind/cli/dist/src/observability/replay-reader.d.ts +40 -0
  436. package/packages/@monomind/cli/dist/src/observability/replay-reader.js +138 -0
  437. package/packages/@monomind/cli/dist/src/orchestration/routing-modes.js +35 -5
  438. package/packages/@monomind/cli/dist/src/parser.d.ts +8 -0
  439. package/packages/@monomind/cli/dist/src/parser.js +48 -14
  440. package/packages/@monomind/cli/dist/src/plugins/manager.js +112 -19
  441. package/packages/@monomind/cli/dist/src/plugins/store/discovery.d.ts +1 -1
  442. package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +80 -62
  443. package/packages/@monomind/cli/dist/src/production/circuit-breaker.js +8 -1
  444. package/packages/@monomind/cli/dist/src/production/error-handler.d.ts +4 -2
  445. package/packages/@monomind/cli/dist/src/production/error-handler.js +27 -5
  446. package/packages/@monomind/cli/dist/src/production/monitoring.js +8 -4
  447. package/packages/@monomind/cli/dist/src/production/rate-limiter.js +30 -22
  448. package/packages/@monomind/cli/dist/src/ruvector/agent-wasm.js +2 -2
  449. package/packages/@monomind/cli/dist/src/ruvector/coverage-router.js +19 -9
  450. package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.d.ts +1 -0
  451. package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.js +26 -6
  452. package/packages/@monomind/cli/dist/src/ruvector/enhanced-model-router.js +24 -2
  453. package/packages/@monomind/cli/dist/src/ruvector/index.d.ts +1 -2
  454. package/packages/@monomind/cli/dist/src/ruvector/index.js +2 -2
  455. package/packages/@monomind/cli/dist/src/ruvector/model-router.d.ts +4 -2
  456. package/packages/@monomind/cli/dist/src/ruvector/model-router.js +30 -6
  457. package/packages/@monomind/cli/dist/src/ruvector/moe-router.d.ts +7 -0
  458. package/packages/@monomind/cli/dist/src/ruvector/moe-router.js +35 -12
  459. package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.d.ts +7 -1
  460. package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.js +40 -9
  461. package/packages/@monomind/cli/dist/src/services/claim-service.d.ts +3 -1
  462. package/packages/@monomind/cli/dist/src/services/claim-service.js +33 -2
  463. package/packages/@monomind/cli/dist/src/services/config-file-manager.d.ts +16 -2
  464. package/packages/@monomind/cli/dist/src/services/config-file-manager.js +105 -17
  465. package/packages/@monomind/cli/dist/src/services/container-worker-pool.js +51 -11
  466. package/packages/@monomind/cli/dist/src/services/headless-worker-executor.d.ts +7 -0
  467. package/packages/@monomind/cli/dist/src/services/headless-worker-executor.js +188 -45
  468. package/packages/@monomind/cli/dist/src/services/registry-api.js +62 -9
  469. package/packages/@monomind/cli/dist/src/services/ruvector-training.js +8 -0
  470. package/packages/@monomind/cli/dist/src/services/worker-daemon.d.ts +4 -1
  471. package/packages/@monomind/cli/dist/src/services/worker-daemon.js +112 -28
  472. package/packages/@monomind/cli/dist/src/services/worker-queue.d.ts +9 -2
  473. package/packages/@monomind/cli/dist/src/services/worker-queue.js +86 -5
  474. package/packages/@monomind/cli/dist/src/suggest.js +9 -0
  475. package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.d.ts +5 -3
  476. package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.js +17 -5
  477. package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.d.ts +3 -0
  478. package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.js +30 -6
  479. package/packages/@monomind/cli/dist/src/transfer/anonymization/index.js +5 -3
  480. package/packages/@monomind/cli/dist/src/transfer/export.js +5 -3
  481. package/packages/@monomind/cli/dist/src/transfer/ipfs/client.js +84 -7
  482. package/packages/@monomind/cli/dist/src/transfer/ipfs/upload.js +13 -4
  483. package/packages/@monomind/cli/dist/src/transfer/storage/gcs.js +19 -10
  484. package/packages/@monomind/cli/dist/src/transfer/store/discovery.d.ts +9 -2
  485. package/packages/@monomind/cli/dist/src/transfer/store/discovery.js +68 -13
  486. package/packages/@monomind/cli/dist/src/transfer/store/download.d.ts +15 -6
  487. package/packages/@monomind/cli/dist/src/transfer/store/download.js +113 -24
  488. package/packages/@monomind/cli/dist/src/transfer/store/publish.d.ts +1 -1
  489. package/packages/@monomind/cli/dist/src/transfer/store/publish.js +13 -14
  490. package/packages/@monomind/cli/dist/src/transfer/store/registry.d.ts +3 -3
  491. package/packages/@monomind/cli/dist/src/transfer/store/registry.js +32 -16
  492. package/packages/@monomind/cli/dist/src/update/checker.js +17 -4
  493. package/packages/@monomind/cli/dist/src/update/executor.js +25 -20
  494. package/packages/@monomind/cli/dist/src/update/rate-limiter.d.ts +11 -0
  495. package/packages/@monomind/cli/dist/src/update/rate-limiter.js +23 -3
  496. package/packages/@monomind/cli/dist/src/utils/parse-jsonl.d.ts +6 -0
  497. package/packages/@monomind/cli/dist/src/utils/parse-jsonl.js +22 -0
  498. package/packages/@monomind/cli/dist/src/workflow/condition-evaluator.js +37 -3
  499. package/packages/@monomind/cli/dist/src/workflow/dag-builder.js +27 -11
  500. package/packages/@monomind/cli/dist/src/workflow/dag-executor.js +51 -13
  501. package/packages/@monomind/cli/dist/src/workflow/dsl-schema.d.ts +3 -0
  502. package/packages/@monomind/cli/dist/src/workflow/dsl-schema.js +6 -2
  503. package/packages/@monomind/cli/dist/src/workflow/template-engine.js +7 -0
  504. package/packages/@monomind/cli/dist/src/workflow/workflow-executor.js +95 -14
  505. package/packages/@monomind/cli/package.json +5 -2
  506. package/packages/@monomind/guidance/README.md +0 -3
  507. package/packages/@monomind/shared/README.md +0 -1
  508. package/packages/@monomind/shared/dist/types/consensus-audit.d.ts +3 -1
  509. package/packages/README.md +15 -16
  510. package/.claude/agents/design/design-brand-guardian.md +0 -323
  511. package/.claude/agents/design/design-image-prompt-engineer.md +0 -237
  512. package/.claude/agents/design/design-inclusive-visuals-specialist.md +0 -72
  513. package/.claude/agents/design/design-ui-designer.md +0 -384
  514. package/.claude/agents/design/design-ux-architect.md +0 -470
  515. package/.claude/agents/design/design-ux-researcher.md +0 -330
  516. package/.claude/agents/design/design-visual-storyteller.md +0 -150
  517. package/.claude/agents/design/design-whimsy-injector.md +0 -439
  518. package/.claude/agents/v3/integration-architect.md +0 -338
  519. package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +0 -54
  520. package/.claude/commands/coordination/init.md +0 -44
  521. package/.claude/commands/coordination/orchestrate.md +0 -43
  522. package/.claude/commands/coordination/spawn.md +0 -45
  523. package/.claude/commands/github/code-review-swarm.md +0 -550
  524. package/.claude/commands/github/code-review.md +0 -25
  525. package/.claude/commands/github/github-swarm.md +0 -121
  526. package/.claude/commands/github/issue-triage.md +0 -25
  527. package/.claude/commands/github/multi-repo-swarm.md +0 -519
  528. package/.claude/commands/github/pr-enhance.md +0 -26
  529. package/.claude/commands/github/project-board-sync.md +0 -471
  530. package/.claude/commands/github/release-swarm.md +0 -590
  531. package/.claude/commands/github/repo-analyze.md +0 -25
  532. package/.claude/commands/github/swarm-issue.md +0 -482
  533. package/.claude/commands/github/swarm-pr.md +0 -310
  534. package/.claude/commands/github/workflow-automation.md +0 -468
  535. package/.claude/commands/hive-mind/hive-mind-metrics.md +0 -8
  536. package/.claude/commands/hive-mind/hive-mind-resume.md +0 -8
  537. package/.claude/commands/hive-mind/hive-mind-sessions.md +0 -8
  538. package/.claude/commands/hive-mind/hive-mind-wizard.md +0 -8
  539. package/.claude/commands/list-agents.md +0 -17
  540. package/.claude/commands/memory/memory-persist.md +0 -25
  541. package/.claude/commands/memory/memory-usage.md +0 -25
  542. package/.claude/commands/memory/neural.md +0 -47
  543. package/.claude/commands/metrics.md +0 -11
  544. package/.claude/commands/monitoring/real-time-view.md +0 -25
  545. package/.claude/commands/monitoring/swarm-monitor.md +0 -25
  546. package/.claude/commands/monomind-createtask.md +0 -302
  547. package/.claude/commands/monomind-help.md +0 -103
  548. package/.claude/commands/monomind-memory.md +0 -107
  549. package/.claude/commands/monomind-repeat.md +0 -149
  550. package/.claude/commands/monomind-swarm.md +0 -205
  551. package/.claude/commands/optimization/cache-manage.md +0 -25
  552. package/.claude/commands/optimization/topology-optimize.md +0 -25
  553. package/.claude/commands/pair/commands.md +0 -546
  554. package/.claude/commands/pair/config.md +0 -510
  555. package/.claude/commands/pair/start.md +0 -209
  556. package/.claude/commands/use-agent.md +0 -67
  557. package/.claude/skills/monomind-createtask/SKILL.md +0 -269
  558. package/.claude/skills/monomind-task-engine/SKILL.md +0 -358
  559. /package/.claude/agents/{v3 → specialists}/memory-specialist.md +0 -0
  560. /package/.claude/agents/{v3 → specialists}/performance-engineer.md +0 -0
  561. /package/.claude/agents/{v3 → specialists}/queen-coordinator.md +0 -0
  562. /package/.claude/agents/{v3 → specialists}/security-architect.md +0 -0
@@ -4,7 +4,7 @@
4
4
  * Helps the system navigate Monomind's capabilities by providing structured
5
5
  * discovery of tools, commands, agents, skills, and recommended workflows.
6
6
  *
7
- * @module @monoes/cli/mcp-tools/guidance
7
+ * @module @monomind/cli/mcp-tools/guidance
8
8
  */
9
9
  import { getProjectCwd } from './types.js';
10
10
  import { existsSync, readFileSync, readdirSync } from 'node:fs';
@@ -18,21 +18,34 @@ const CLI_ROOT = join(__dirname, '../../..');
18
18
  * Tries CWD first (most common), then walks up from the CLI package location.
19
19
  */
20
20
  function findProjectRoot() {
21
+ // Allow operator override; trusted when set.
22
+ const envRoot = process.env.MONOMIND_PROJECT_ROOT;
23
+ if (envRoot && existsSync(join(envRoot, '.claude'))) {
24
+ return envRoot;
25
+ }
21
26
  // Strategy 1: CWD (most reliable when invoked by user)
22
27
  if (existsSync(join(getProjectCwd(), '.claude'))) {
23
28
  return getProjectCwd();
24
29
  }
25
- // Strategy 2: Walk up from CLI package location
26
- // CLI is at packages/@monoes/cli/ — project root is 4 levels up
30
+ // Strategy 2: Walk up from CLI package location.
31
+ // CLI is at packages/@monomind/cli/ — project root is 4 levels up.
27
32
  const fromPackage = join(CLI_ROOT, '../../../..');
28
33
  if (existsSync(join(fromPackage, '.claude'))) {
29
34
  return fromPackage;
30
35
  }
31
- // Strategy 3: Walk up from CWD
36
+ // Strategy 3: Walk up from CWD, but stop at the first ancestor that ALSO
37
+ // contains a project-marker the user owns (`.git` or `package.json`). This
38
+ // closes a confused-deputy: previously, dropping `.claude/agents/x.md` in
39
+ // any of 10 ancestor directories (e.g., `/tmp`) would have been consumed
40
+ // as authoritative agent data. Requiring a marker means an attacker also
41
+ // needs control over a `.git` repo or `package.json` at the same level —
42
+ // which means they already control the project.
32
43
  let dir = getProjectCwd();
33
44
  for (let i = 0; i < 10; i++) {
34
- if (existsSync(join(dir, '.claude')))
45
+ if (existsSync(join(dir, '.claude')) &&
46
+ (existsSync(join(dir, '.git')) || existsSync(join(dir, 'package.json')))) {
35
47
  return dir;
48
+ }
36
49
  const parent = dirname(dir);
37
50
  if (parent === dir)
38
51
  break;
@@ -288,15 +301,28 @@ function discoverAgents() {
288
301
  if (!existsSync(agentsDir))
289
302
  return [];
290
303
  const agents = [];
291
- function walk(dir) {
304
+ const visited = new Set();
305
+ // Symlink-aware walk with depth cap. `entry.isDirectory()` returns true for
306
+ // symlinks pointing at directories, so a careless `agents/loop -> ..`
307
+ // symlink would otherwise traverse outside the agents tree (or loop
308
+ // forever). Using lstat + skipping symlinks closes both vectors.
309
+ function walk(dir, depth) {
310
+ if (depth > 8)
311
+ return;
312
+ if (visited.has(dir))
313
+ return;
314
+ visited.add(dir);
292
315
  try {
293
316
  const entries = readdirSync(dir, { withFileTypes: true });
294
317
  for (const entry of entries) {
318
+ if (entry.isSymbolicLink())
319
+ continue;
320
+ const full = join(dir, entry.name);
295
321
  if (entry.isDirectory()) {
296
- walk(join(dir, entry.name));
322
+ walk(full, depth + 1);
297
323
  }
298
- else if (entry.name.endsWith('.md') && entry.name !== 'MIGRATION_SUMMARY.md') {
299
- const content = readFileSync(join(dir, entry.name), 'utf-8');
324
+ else if (entry.isFile() && entry.name.endsWith('.md') && entry.name !== 'MIGRATION_SUMMARY.md') {
325
+ const content = readFileSync(full, 'utf-8');
300
326
  const nameMatch = content.match(/^name:\s*(.+)$/m);
301
327
  if (nameMatch)
302
328
  agents.push(nameMatch[1].trim().replace(/^["']|["']$/g, ''));
@@ -305,7 +331,7 @@ function discoverAgents() {
305
331
  }
306
332
  catch { /* ignore */ }
307
333
  }
308
- walk(agentsDir);
334
+ walk(agentsDir, 0);
309
335
  return [...new Set(agents)].sort();
310
336
  }
311
337
  function discoverSkills() {
@@ -316,6 +342,8 @@ function discoverSkills() {
316
342
  try {
317
343
  const entries = readdirSync(skillsDir, { withFileTypes: true });
318
344
  for (const entry of entries) {
345
+ if (entry.isSymbolicLink())
346
+ continue;
319
347
  if (entry.isDirectory()) {
320
348
  const skillFile = join(skillsDir, entry.name, 'SKILL.md');
321
349
  if (existsSync(skillFile)) {
@@ -3,18 +3,10 @@
3
3
  *
4
4
  * Tool definitions for collective intelligence and swarm coordination.
5
5
  */
6
- import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'node:fs';
6
+ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
7
7
  import { join } from 'node:path';
8
8
  import { getProjectCwd } from './types.js';
9
9
  import { weightedTally } from '../consensus/vote-signer.js';
10
- function logEvent(kind, data) {
11
- try {
12
- const dir = join(getProjectCwd(), '.monomind', 'swarm');
13
- if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
14
- const event = { ts: new Date().toISOString(), source: 'mcp', kind, ...data };
15
- appendFileSync(join(dir, 'events.jsonl'), JSON.stringify(event) + '\n');
16
- } catch { }
17
- }
18
10
  // Storage paths
19
11
  const STORAGE_DIR = '.monomind';
20
12
  const HIVE_DIR = 'hive-mind';
@@ -127,12 +119,16 @@ function loadHiveState() {
127
119
  function saveHiveState(state) {
128
120
  ensureHiveDir();
129
121
  state.updatedAt = new Date().toISOString();
130
- writeFileSync(getHivePath(), JSON.stringify(state, null, 2), 'utf-8');
122
+ const dest = getHivePath();
123
+ const tmp = `${dest}.${process.pid}.${Date.now()}.tmp`;
124
+ writeFileSync(tmp, JSON.stringify(state, null, 2), 'utf-8');
125
+ renameSync(tmp, dest);
131
126
  }
132
127
  // Import agent store helpers for spawn functionality
133
128
  import { existsSync as agentStoreExists, readFileSync as readAgentStore, writeFileSync as writeAgentStore, mkdirSync as mkdirAgentStore } from 'node:fs';
129
+ // Canonical agent store path matches agent-tools.ts: .monomind/agents/store.json
134
130
  function loadAgentStore() {
135
- const storePath = join(getProjectCwd(), '.monomind', 'agents.json');
131
+ const storePath = join(getProjectCwd(), '.monomind', 'agents', 'store.json');
136
132
  try {
137
133
  if (agentStoreExists(storePath)) {
138
134
  return JSON.parse(readAgentStore(storePath, 'utf-8'));
@@ -141,12 +137,16 @@ function loadAgentStore() {
141
137
  catch { /* ignore */ }
142
138
  return { agents: {} };
143
139
  }
140
+ const HIVE_RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
144
141
  function saveAgentStore(store) {
145
- const storeDir = join(getProjectCwd(), '.monomind');
142
+ const storeDir = join(getProjectCwd(), '.monomind', 'agents');
146
143
  if (!agentStoreExists(storeDir)) {
147
144
  mkdirAgentStore(storeDir, { recursive: true });
148
145
  }
149
- writeAgentStore(join(storeDir, 'agents.json'), JSON.stringify(store, null, 2), 'utf-8');
146
+ const dest = join(storeDir, 'store.json');
147
+ const tmp = `${dest}.${process.pid}.${Date.now()}.tmp`;
148
+ writeAgentStore(tmp, JSON.stringify(store, null, 2), 'utf-8');
149
+ renameSync(tmp, dest);
150
150
  }
151
151
  export const hiveMindTools = [
152
152
  {
@@ -175,6 +175,8 @@ export const hiveMindTools = [
175
175
  const spawnedWorkers = [];
176
176
  for (let i = 0; i < count; i++) {
177
177
  const agentId = `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
178
+ if (HIVE_RESERVED_KEYS.has(agentId))
179
+ continue;
178
180
  // Create agent record (like agent/spawn)
179
181
  agentStore.agents[agentId] = {
180
182
  agentId,
@@ -187,7 +189,11 @@ export const hiveMindTools = [
187
189
  domain: 'hive-mind',
188
190
  };
189
191
  // Join to hive-mind (like hive-mind/join)
192
+ const MAX_HIVE_AGENTS = 100;
190
193
  if (!state.workers.includes(agentId)) {
194
+ if (state.workers.length >= MAX_HIVE_AGENTS) {
195
+ return { success: false, error: `Hive has reached max agent capacity (${MAX_HIVE_AGENTS})` };
196
+ }
191
197
  state.workers.push(agentId);
192
198
  }
193
199
  spawnedWorkers.push({
@@ -198,9 +204,6 @@ export const hiveMindTools = [
198
204
  }
199
205
  saveAgentStore(agentStore);
200
206
  saveHiveState(state);
201
- for (const w of spawnedWorkers) {
202
- logEvent('hive.spawn', { agentId: w.agentId, role: w.role, agentType });
203
- }
204
207
  return {
205
208
  success: true,
206
209
  spawned: count,
@@ -223,19 +226,21 @@ export const hiveMindTools = [
223
226
  },
224
227
  },
225
228
  handler: async (input) => {
226
- const state = loadHiveState();
227
229
  const hiveId = `hive-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
228
230
  const queenId = input.queenId || `queen-${Date.now()}`;
229
- state.initialized = true;
230
- state.topology = input.topology || 'mesh';
231
- state.createdAt = new Date().toISOString();
232
- state.queen = {
233
- agentId: queenId,
234
- electedAt: new Date().toISOString(),
235
- term: 1,
231
+ const now = new Date().toISOString();
232
+ const state = {
233
+ initialized: true,
234
+ hiveId,
235
+ topology: input.topology || 'mesh',
236
+ queen: { agentId: queenId, electedAt: now, term: 1 },
237
+ workers: [],
238
+ consensus: { pending: [], history: [] },
239
+ sharedMemory: {},
240
+ createdAt: now,
241
+ updatedAt: now,
236
242
  };
237
243
  saveHiveState(state);
238
- logEvent('hive.init', { hiveId, topology: state.topology, consensus: input.consensus || 'byzantine', queenId });
239
244
  return {
240
245
  success: true,
241
246
  hiveId,
@@ -292,7 +297,7 @@ export const hiveMindTools = [
292
297
  const realLoad = activeTaskCount / workerCount;
293
298
  const status = {
294
299
  // CLI expected fields
295
- hiveId: `hive-${state.createdAt ? new Date(state.createdAt).getTime() : Date.now()}`,
300
+ hiveId: state.hiveId ?? `hive-${state.createdAt ? new Date(state.createdAt).getTime() : Date.now()}`,
296
301
  status: state.initialized ? 'active' : 'offline',
297
302
  topology: state.topology,
298
303
  consensus: 'byzantine', // Default consensus type
@@ -332,7 +337,7 @@ export const hiveMindTools = [
332
337
  memory: 'healthy',
333
338
  },
334
339
  // Additional fields
335
- id: `hive-${state.createdAt ? new Date(state.createdAt).getTime() : Date.now()}`,
340
+ id: state.hiveId ?? `hive-${state.createdAt ? new Date(state.createdAt).getTime() : Date.now()}`,
336
341
  initialized: state.initialized,
337
342
  workerCount: state.workers.length,
338
343
  pendingConsensus: state.consensus.pending.length,
@@ -367,10 +372,20 @@ export const hiveMindTools = [
367
372
  handler: async (input) => {
368
373
  const state = loadHiveState();
369
374
  const agentId = input.agentId;
375
+ // Reject IDs that would mutate Object.prototype when used as a key on the
376
+ // JSON-loaded plain object `agentStore.agents` (read in hive-mind_status).
377
+ if (typeof agentId !== 'string' || agentId.length === 0 || agentId.length > 128 ||
378
+ HIVE_RESERVED_KEYS.has(agentId) || !/^[a-zA-Z0-9_-]+$/.test(agentId)) {
379
+ return { success: false, error: 'Invalid agentId' };
380
+ }
370
381
  if (!state.initialized) {
371
382
  return { success: false, error: 'Hive-mind not initialized' };
372
383
  }
384
+ const MAX_HIVE_AGENTS = 100;
373
385
  if (!state.workers.includes(agentId)) {
386
+ if (state.workers.length >= MAX_HIVE_AGENTS) {
387
+ return { success: false, error: `Hive has reached max agent capacity (${MAX_HIVE_AGENTS})` };
388
+ }
374
389
  state.workers.push(agentId);
375
390
  saveHiveState(state);
376
391
  }
@@ -397,6 +412,10 @@ export const hiveMindTools = [
397
412
  handler: async (input) => {
398
413
  const state = loadHiveState();
399
414
  const agentId = input.agentId;
415
+ if (typeof agentId !== 'string' || agentId.length === 0 || agentId.length > 128 ||
416
+ HIVE_RESERVED_KEYS.has(agentId) || !/^[a-zA-Z0-9_-]+$/.test(agentId)) {
417
+ return { success: false, error: 'Invalid agentId' };
418
+ }
400
419
  const index = state.workers.indexOf(agentId);
401
420
  if (index > -1) {
402
421
  state.workers.splice(index, 1);
@@ -436,7 +455,7 @@ export const hiveMindTools = [
436
455
  const state = loadHiveState();
437
456
  const action = input.action;
438
457
  const strategy = input.strategy || 'raft';
439
- const totalNodes = state.workers.length || 1;
458
+ const totalNodes = state.workers.length;
440
459
  if (action === 'propose') {
441
460
  const proposalId = `proposal-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
442
461
  const quorumPreset = input.quorumPreset || 'majority';
@@ -476,7 +495,6 @@ export const hiveMindTools = [
476
495
  };
477
496
  state.consensus.pending.push(proposal);
478
497
  saveHiveState(state);
479
- logEvent('hive.consensus.propose', { proposalId, type: proposal.type, strategy, proposedBy: proposal.proposedBy, totalNodes });
480
498
  return {
481
499
  action,
482
500
  proposalId,
@@ -500,6 +518,12 @@ export const hiveMindTools = [
500
518
  if (!voterId) {
501
519
  return { action, error: 'voterId is required for voting' };
502
520
  }
521
+ if (totalNodes === 0) {
522
+ return { action, error: 'No workers in hive — cannot vote' };
523
+ }
524
+ if (!state.workers.includes(voterId)) {
525
+ return { action, error: `Voter ${voterId} is not a member of this hive` };
526
+ }
503
527
  const voteValue = input.vote;
504
528
  const proposalStrategy = proposal.strategy || 'raft';
505
529
  const required = calculateRequiredVotes(proposalStrategy, totalNodes, proposal.quorumPreset);
@@ -598,11 +622,9 @@ export const hiveMindTools = [
598
622
  // Try to resolve
599
623
  const resolution = divergenceGateOpen ? tryResolveProposal(proposal, totalNodes) : null;
600
624
  let resolved = false;
601
- logEvent('hive.consensus.vote', { proposalId: proposal.proposalId, voterId, vote: voteValue, strategy: proposalStrategy, votesFor, votesAgainst });
602
625
  if (resolution !== null) {
603
626
  resolved = true;
604
627
  proposal.status = resolution;
605
- logEvent('hive.consensus.resolved', { proposalId: proposal.proposalId, result: resolution, strategy: proposalStrategy, votesFor, votesAgainst });
606
628
  state.consensus.history.push({
607
629
  proposalId: proposal.proposalId,
608
630
  type: proposal.type,
@@ -613,6 +635,9 @@ export const hiveMindTools = [
613
635
  term: proposal.term,
614
636
  byzantineDetected: proposal.byzantineVoters?.length ? proposal.byzantineVoters : undefined,
615
637
  });
638
+ if (state.consensus.history.length > 1000) {
639
+ state.consensus.history = state.consensus.history.slice(-1000);
640
+ }
616
641
  state.consensus.pending = state.consensus.pending.filter(p => p.proposalId !== proposal.proposalId);
617
642
  }
618
643
  saveHiveState(state);
@@ -635,6 +660,44 @@ export const hiveMindTools = [
635
660
  });
636
661
  }
637
662
  catch { /* AgentDB not available — JSON store is primary */ }
663
+ // Persist consensus audit record
664
+ const sessionSecret = process.env.MONOMIND_SESSION_SECRET;
665
+ if (!sessionSecret) {
666
+ process.stderr.write('[hive-consensus] Audit write skipped: MONOMIND_SESSION_SECRET not set\n');
667
+ }
668
+ else {
669
+ try {
670
+ const { AuditWriter } = await import('../consensus/audit-writer.js');
671
+ const auditDir = join(getProjectCwd(), STORAGE_DIR, 'consensus');
672
+ const writer = new AuditWriter(auditDir);
673
+ const now = new Date().toISOString();
674
+ const voteEntries = Object.entries(proposal.votes).map(([agentId, vote]) => ({
675
+ agentId,
676
+ agentSlug: agentId,
677
+ vote,
678
+ votedAt: now,
679
+ }));
680
+ writer.record({
681
+ decisionId: proposal.proposalId,
682
+ swarmId: `hive-${state.createdAt ? new Date(state.createdAt).getTime() : Date.now()}`,
683
+ protocol: (proposalStrategy === 'bft' ? 'byzantine' : proposalStrategy === 'raft' ? 'raft' : 'quorum'),
684
+ topic: proposal.type,
685
+ decision: resolution,
686
+ votes: voteEntries,
687
+ quorumRequired: required,
688
+ quorumThreshold: required / Math.max(totalNodes, 1),
689
+ round: (proposal.divergenceRoundsSeen ?? 0) + 1,
690
+ startedAt: proposal.proposedAt,
691
+ completedAt: now,
692
+ sessionSecret,
693
+ });
694
+ }
695
+ catch (e) {
696
+ if (process.env.MONOMIND_LOG_LEVEL === 'debug') {
697
+ process.stderr.write(`[hive-consensus] Audit write failed: ${e.message}\n`);
698
+ }
699
+ }
700
+ }
638
701
  }
639
702
  return {
640
703
  action,
@@ -750,7 +813,6 @@ export const hiveMindTools = [
750
813
  // Keep only last 100 broadcasts
751
814
  state.sharedMemory.broadcasts = messages.slice(-100);
752
815
  saveHiveState(state);
753
- logEvent('hive.broadcast', { messageId, fromId: input.fromId || 'system', message: input.message, priority: input.priority || 'normal', recipients: state.workers.length });
754
816
  return {
755
817
  success: true,
756
818
  messageId,
@@ -800,7 +862,6 @@ export const hiveMindTools = [
800
862
  // Reset hive state
801
863
  const shutdownTime = new Date().toISOString();
802
864
  const previousQueen = state.queen?.agentId;
803
- logEvent('hive.shutdown', { workersTerminated: workerCount, previousQueen, graceful, pendingConsensus, topology: state.topology });
804
865
  state.initialized = false;
805
866
  state.queen = undefined;
806
867
  state.workers = [];
@@ -849,6 +910,8 @@ export const hiveMindTools = [
849
910
  if (action === 'set') {
850
911
  if (!key)
851
912
  return { action, error: 'Key required' };
913
+ if (HIVE_RESERVED_KEYS.has(key))
914
+ return { action, error: 'Forbidden key' };
852
915
  state.sharedMemory[key] = input.value;
853
916
  saveHiveState(state);
854
917
  // Also store in AgentDB for searchable hive memory
@@ -2,17 +2,9 @@
2
2
  * Hooks MCP Tools
3
3
  * Provides intelligent hooks functionality via MCP protocol
4
4
  */
5
- import { mkdirSync, writeFileSync, existsSync, readFileSync, statSync, unlinkSync, readdirSync, appendFileSync } from 'fs';
6
- import { dirname, join, resolve } from 'path';
5
+ import { mkdirSync, writeFileSync, renameSync, existsSync, readFileSync, statSync, unlinkSync, readdirSync } from 'fs';
6
+ import { dirname, join, resolve, sep } from 'path';
7
7
  import { getProjectCwd } from './types.js';
8
- function logEvent(kind, data) {
9
- try {
10
- const dir = join(getProjectCwd(), '.monomind', 'swarm');
11
- if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
12
- const event = { ts: new Date().toISOString(), source: 'hook', kind, ...data };
13
- appendFileSync(join(dir, 'events.jsonl'), JSON.stringify(event) + '\n');
14
- } catch { }
15
- }
16
8
  // Real vector search functions - lazy loaded to avoid circular imports
17
9
  let searchEntriesFn = null;
18
10
  async function getRealSearchFunction() {
@@ -92,7 +84,8 @@ let semanticRouter = null;
92
84
  let nativeVectorDb = null;
93
85
  let semanticRouterInitialized = false;
94
86
  let routerBackend = 'none';
95
- // Pre-computed embeddings for common task patterns (cached)
87
+ // Pre-computed embeddings for common task patterns (cached, capped to prevent unbounded growth)
88
+ const MAX_PATTERN_EMBEDDINGS = 2000;
96
89
  const TASK_PATTERN_EMBEDDINGS = new Map();
97
90
  function generateSimpleEmbedding(text, dimension = 384) {
98
91
  // Simple deterministic embedding based on character codes
@@ -168,7 +161,9 @@ function saveRoutingOutcomes(outcomes) {
168
161
  mkdirSync(dir, { recursive: true });
169
162
  // Cap at 500 entries to bound file size
170
163
  const capped = outcomes.slice(-500);
171
- writeFileSync(ROUTING_OUTCOMES_PATH, JSON.stringify({ outcomes: capped }, null, 2));
164
+ const tmp = ROUTING_OUTCOMES_PATH + '.tmp';
165
+ writeFileSync(tmp, JSON.stringify({ outcomes: capped }, null, 2));
166
+ renameSync(tmp, ROUTING_OUTCOMES_PATH);
172
167
  }
173
168
  catch { /* non-critical */ }
174
169
  }
@@ -293,7 +288,9 @@ async function getSemanticRouter() {
293
288
  for (const keyword of keywords) {
294
289
  const embedding = generateSimpleEmbedding(keyword);
295
290
  db.insert(`${patternName}:${keyword}`, embedding);
296
- TASK_PATTERN_EMBEDDINGS.set(`${patternName}:${keyword}`, embedding);
291
+ if (TASK_PATTERN_EMBEDDINGS.size < MAX_PATTERN_EMBEDDINGS) {
292
+ TASK_PATTERN_EMBEDDINGS.set(`${patternName}:${keyword}`, embedding);
293
+ }
297
294
  }
298
295
  }
299
296
  nativeVectorDb = db;
@@ -313,9 +310,11 @@ async function getSemanticRouter() {
313
310
  for (const [patternName, { keywords, agents }] of Object.entries(getMergedTaskPatterns())) {
314
311
  const embeddings = keywords.map(kw => generateSimpleEmbedding(kw));
315
312
  semanticRouter.addIntentWithEmbeddings(patternName, embeddings, { agents, keywords });
316
- // Cache embeddings for keywords
313
+ // Cache embeddings for keywords (capped)
317
314
  keywords.forEach((kw, i) => {
318
- TASK_PATTERN_EMBEDDINGS.set(kw, embeddings[i]);
315
+ if (TASK_PATTERN_EMBEDDINGS.size < MAX_PATTERN_EMBEDDINGS) {
316
+ TASK_PATTERN_EMBEDDINGS.set(kw, embeddings[i]);
317
+ }
319
318
  });
320
319
  }
321
320
  routerBackend = 'pure-js';
@@ -353,18 +352,10 @@ async function getFlashAttention() {
353
352
  }
354
353
  return flashAttention;
355
354
  }
356
- // LoRA Adapter - lazy loaded
355
+ // LoRA Adapter removed superseded by SONA instant adaptation
356
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
357
357
  let loraAdapter = null;
358
358
  async function getLoRAAdapter() {
359
- if (!loraAdapter) {
360
- try {
361
- const { getLoRAAdapter: getLora } = await import('../ruvector/lora-adapter.js');
362
- loraAdapter = await getLora();
363
- }
364
- catch {
365
- loraAdapter = null;
366
- }
367
- }
368
359
  return loraAdapter;
369
360
  }
370
361
  // In-memory trajectory tracking (persisted on end)
@@ -372,7 +363,7 @@ const activeTrajectories = new Map();
372
363
  const MEMORY_DIR = '.monomind/memory';
373
364
  const MEMORY_FILE = 'store.json';
374
365
  function getMemoryPath() {
375
- return resolve(join(MEMORY_DIR, MEMORY_FILE));
366
+ return join(getProjectCwd(), MEMORY_DIR, MEMORY_FILE);
376
367
  }
377
368
  function loadMemoryStore() {
378
369
  try {
@@ -718,10 +709,13 @@ export const hooksPostCommand = {
718
709
  const store = loadMemoryStore();
719
710
  const key = `cmd-${Date.now()}`;
720
711
  store.entries[key] = { key, value: JSON.stringify({ command, exitCode, success }), namespace: 'commands', createdAt: new Date().toISOString() };
721
- const memDir = resolve(MEMORY_DIR);
712
+ const memDir = join(getProjectCwd(), MEMORY_DIR);
722
713
  if (!existsSync(memDir))
723
714
  mkdirSync(memDir, { recursive: true });
724
- writeFileSync(getMemoryPath(), JSON.stringify(store, null, 2), 'utf-8');
715
+ const _mp = getMemoryPath();
716
+ const _mptmp = _mp + '.tmp';
717
+ writeFileSync(_mptmp, JSON.stringify(store, null, 2), 'utf-8');
718
+ renameSync(_mptmp, _mp);
725
719
  _storedIn = 'json-store';
726
720
  }
727
721
  catch { /* non-critical */ }
@@ -1078,7 +1072,7 @@ export const hooksPreTask = {
1078
1072
  });
1079
1073
  for (const r of (heuristicResults?.results ?? [])) {
1080
1074
  try {
1081
- const h = JSON.parse(r.content ?? r.value ?? '{}');
1075
+ const h = JSON.parse(r.content ?? '{}');
1082
1076
  if (h.action && h.confidence !== undefined && h.confidence >= 0.6) {
1083
1077
  erlHints.push(`ERL hint (conf=${h.confidence.toFixed(2)}): use "${h.action}" for tasks involving "${h.condition ?? 'similar context'}"`);
1084
1078
  }
@@ -1094,7 +1088,7 @@ export const hooksPreTask = {
1094
1088
  threshold: 0.55,
1095
1089
  });
1096
1090
  for (const r of (gradientResults?.results ?? [])) {
1097
- const critique = r.content ?? r.value ?? '';
1091
+ const critique = r.content ?? '';
1098
1092
  if (critique && critique.length > 10) {
1099
1093
  erlHints.push(`TextGrad warning: ${critique.slice(0, 120)}`);
1100
1094
  }
@@ -1102,7 +1096,6 @@ export const hooksPreTask = {
1102
1096
  }
1103
1097
  }
1104
1098
  catch { /* non-critical */ }
1105
- logEvent('task.start', { taskId, description: description?.slice(0, 200), complexity, suggestedAgent: suggestion.agents[0], modelTier: modelRouting?.tier });
1106
1099
  return {
1107
1100
  taskId,
1108
1101
  description,
@@ -1246,7 +1239,7 @@ export const hooksPostTask = {
1246
1239
  key: `textual_gradient:${taskId}`,
1247
1240
  value: critique,
1248
1241
  namespace: 'gradients',
1249
- tags: ['textual_gradient', agent, 'failure'],
1242
+ tags: ['textual_gradient', agent ?? 'unknown', 'failure'],
1250
1243
  });
1251
1244
  }
1252
1245
  }
@@ -1265,7 +1258,6 @@ export const hooksPostTask = {
1265
1258
  storeAs: 'heuristics',
1266
1259
  note: 'Spawn agents sequentially: Diagnoser → Critics in parallel → Aggregator',
1267
1260
  } : { needed: false };
1268
- logEvent('task.end', { taskId, success, duration, agent, quality, task: taskText?.slice(0, 200) });
1269
1261
  return {
1270
1262
  taskId,
1271
1263
  success,
@@ -1375,6 +1367,10 @@ export const hooksPretrain = {
1375
1367
  },
1376
1368
  handler: async (params) => {
1377
1369
  const repoPath = resolve(params.path || '.');
1370
+ const projectRoot = getProjectCwd();
1371
+ if (repoPath !== projectRoot && !repoPath.startsWith(projectRoot + sep)) {
1372
+ return { error: 'Invalid path: must be within the project directory.' };
1373
+ }
1378
1374
  const depth = params.depth || 'medium';
1379
1375
  const startTime = performance.now();
1380
1376
  // Real file scanning — count files by extension, extract patterns
@@ -1472,9 +1468,20 @@ export const hooksBuildAgents = {
1472
1468
  },
1473
1469
  },
1474
1470
  handler: async (params) => {
1475
- const outputDir = resolve(params.outputDir || './agents');
1471
+ const rawOutputDir = resolve(params.outputDir || './agents');
1472
+ const outputDir = rawOutputDir;
1473
+ if (!outputDir.startsWith(getProjectCwd() + sep) && outputDir !== getProjectCwd()) {
1474
+ return { error: 'Invalid outputDir: must be within the project directory.' };
1475
+ }
1476
1476
  const focus = params.focus || 'all';
1477
- const format = params.format || 'yaml';
1477
+ // Strict allowlist on `format` without this, `format = "yaml/../../../etc/cron.d/x"`
1478
+ // collapses through `join` and lets writes escape the validated outputDir.
1479
+ const ALLOWED_FORMATS = new Set(['yaml', 'json']);
1480
+ const formatRaw = params.format || 'yaml';
1481
+ if (!ALLOWED_FORMATS.has(formatRaw)) {
1482
+ return { error: 'Invalid format: must be yaml or json' };
1483
+ }
1484
+ const format = formatRaw;
1478
1485
  const persist = params.persist !== false; // Default to true
1479
1486
  const agents = [
1480
1487
  { type: 'coder', configFile: join(outputDir, `coder.${format}`), capabilities: ['code-generation', 'refactoring', 'debugging'], optimizations: ['flash-attention', 'token-reduction'] },
@@ -1505,7 +1512,9 @@ export const hooksBuildAgents = {
1505
1512
  const content = format === 'json'
1506
1513
  ? JSON.stringify(config, null, 2)
1507
1514
  : `# ${agent.type} agent configuration\ntype: ${agent.type}\nversion: "3.0.0"\ncapabilities:\n${agent.capabilities.map(c => ` - ${c}`).join('\n')}\noptimizations:\n${agent.optimizations.map(o => ` - ${o}`).join('\n')}\ncreatedAt: "${config.createdAt}"\n`;
1508
- writeFileSync(agent.configFile, content, 'utf-8');
1515
+ const _cftmp = agent.configFile + '.tmp';
1516
+ writeFileSync(_cftmp, content, 'utf-8');
1517
+ renameSync(_cftmp, agent.configFile);
1509
1518
  }
1510
1519
  }
1511
1520
  return {
@@ -1538,8 +1547,25 @@ export const hooksTransfer = {
1538
1547
  const sourcePath = params.sourcePath;
1539
1548
  const minConfidence = params.minConfidence || 0.7;
1540
1549
  const filter = params.filter;
1550
+ // Validate sourcePath is an existing directory before reading from it
1551
+ const resolvedSource = resolve(sourcePath);
1552
+ const { statSync } = await import('fs');
1553
+ const { homedir } = await import('os');
1554
+ const home = homedir();
1555
+ if (resolvedSource !== home && !resolvedSource.startsWith(home + sep)) {
1556
+ return { error: 'sourcePath must be within the home directory.' };
1557
+ }
1558
+ try {
1559
+ const st = statSync(resolvedSource);
1560
+ if (!st.isDirectory()) {
1561
+ return { error: 'sourcePath must be a directory' };
1562
+ }
1563
+ }
1564
+ catch {
1565
+ return { error: 'sourcePath does not exist' };
1566
+ }
1541
1567
  // Try to load patterns from source project's memory store
1542
- const sourceMemoryPath = join(resolve(sourcePath), MEMORY_DIR, MEMORY_FILE);
1568
+ const sourceMemoryPath = join(resolvedSource, MEMORY_DIR, MEMORY_FILE);
1543
1569
  let sourceStore = { entries: {}, version: '3.0.0' };
1544
1570
  try {
1545
1571
  if (existsSync(sourceMemoryPath)) {
@@ -2051,6 +2077,13 @@ export const hooksTrajectoryStart = {
2051
2077
  steps: [],
2052
2078
  startedAt,
2053
2079
  };
2080
+ const MAX_TRAJECTORIES = 10000;
2081
+ if (activeTrajectories.size >= MAX_TRAJECTORIES) {
2082
+ // Evict the oldest trajectory
2083
+ const oldest = activeTrajectories.keys().next().value;
2084
+ if (oldest)
2085
+ activeTrajectories.delete(oldest);
2086
+ }
2054
2087
  activeTrajectories.set(trajectoryId, trajectory);
2055
2088
  return {
2056
2089
  trajectoryId,
@@ -34,5 +34,6 @@ export { ruvllmWasmTools } from './ruvllm-tools.js';
34
34
  export { guidanceTools } from './guidance-tools.js';
35
35
  export { autopilotTools } from './autopilot-tools.js';
36
36
  export { graphifyTools } from './graphify-tools.js';
37
+ export { monographTools } from './monograph-tools.js';
37
38
  export { a2aTools } from './a2a-tools.js';
38
39
  //# sourceMappingURL=index.d.ts.map
@@ -35,6 +35,7 @@ export { ruvllmWasmTools } from './ruvllm-tools.js';
35
35
  export { guidanceTools } from './guidance-tools.js';
36
36
  export { autopilotTools } from './autopilot-tools.js';
37
37
  export { graphifyTools } from './graphify-tools.js';
38
+ export { monographTools } from './monograph-tools.js';
38
39
  // A2A Agent Card protocol (source: https://a2a-protocol.org)
39
40
  export { a2aTools } from './a2a-tools.js';
40
41
  //# sourceMappingURL=index.js.map