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
@@ -13,13 +13,38 @@
13
13
  * - Health check: <10ms
14
14
  * - Graceful shutdown: <5s
15
15
  *
16
- * @module @monoes/cli/mcp-server
16
+ * @module @monomind/cli/mcp-server
17
17
  * @version 3.0.0
18
18
  */
19
19
  import { EventEmitter } from 'events';
20
+ import { execSync } from 'child_process';
21
+ import * as http from 'http';
20
22
  import { randomUUID } from 'crypto';
21
23
  import * as path from 'path';
22
24
  import * as fs from 'fs';
25
+ /**
26
+ * Recursively strip prototype-pollution keys from a JSON-RPC message before
27
+ * downstream tool handlers consume it. Tool handlers commonly do shallow
28
+ * merges like `{ ...defaults, ...input }`, which would propagate
29
+ * `__proto__`/`constructor`/`prototype` payloads onto config objects.
30
+ */
31
+ const FORBIDDEN_PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
32
+ function sanitizeJsonRpcMessage(value, depth = 0) {
33
+ if (depth > 16)
34
+ return null;
35
+ if (Array.isArray(value))
36
+ return value.map(v => sanitizeJsonRpcMessage(v, depth + 1));
37
+ if (value !== null && typeof value === 'object') {
38
+ const out = {};
39
+ for (const [k, v] of Object.entries(value)) {
40
+ if (FORBIDDEN_PROTO_KEYS.has(k))
41
+ continue;
42
+ out[k] = sanitizeJsonRpcMessage(v, depth + 1);
43
+ }
44
+ return out;
45
+ }
46
+ return value;
47
+ }
23
48
  import * as os from 'os';
24
49
  import { fileURLToPath } from 'url';
25
50
  import { dirname } from 'path';
@@ -30,12 +55,22 @@ const __dirname = dirname(__filename);
30
55
  /**
31
56
  * Default configuration
32
57
  */
58
+ /**
59
+ * Resolve a per-user state directory under $HOME/.monomind. /tmp is shared and
60
+ * world-traversable; placing the PID/log files there made them symlink-
61
+ * attackable (a local attacker pre-creates /tmp/monomind-mcp.pid as a symlink
62
+ * to e.g. ~/.ssh/authorized_keys, then a writeFile clobbers the target).
63
+ */
64
+ function getDefaultStateDir() {
65
+ const home = os.homedir();
66
+ return path.join(home, '.monomind');
67
+ }
33
68
  const DEFAULT_OPTIONS = {
34
69
  transport: 'stdio',
35
70
  host: 'localhost',
36
71
  port: 3000,
37
- pidFile: path.join(os.tmpdir(), 'monomind-mcp.pid'),
38
- logFile: path.join(os.tmpdir(), 'monomind-mcp.log'),
72
+ pidFile: path.join(getDefaultStateDir(), 'mcp.pid'),
73
+ logFile: path.join(getDefaultStateDir(), 'mcp.log'),
39
74
  tools: 'all',
40
75
  daemonize: false,
41
76
  timeout: 30000,
@@ -50,6 +85,7 @@ export class MCPServerManager extends EventEmitter {
50
85
  process;
51
86
  server;
52
87
  startTime;
88
+ _stdioServerStarted = false;
53
89
  healthCheckInterval;
54
90
  constructor(options = {}) {
55
91
  super();
@@ -128,6 +164,13 @@ export class MCPServerManager extends EventEmitter {
128
164
  });
129
165
  this.server = undefined;
130
166
  }
167
+ if (this._mcpServer) {
168
+ try {
169
+ await this._mcpServer.close();
170
+ }
171
+ catch { /* ignore */ }
172
+ this._mcpServer = undefined;
173
+ }
131
174
  // Remove PID file
132
175
  await this.removePidFile();
133
176
  this.startTime = undefined;
@@ -149,7 +192,7 @@ export class MCPServerManager extends EventEmitter {
149
192
  // (e.g., launched by Claude Code via `claude mcp add`).
150
193
  const isStdio = !process.stdin.isTTY;
151
194
  const envTransport = process.env.MONOMIND_MCP_TRANSPORT;
152
- if (isStdio || envTransport === 'stdio' || this.options.transport === 'stdio') {
195
+ if (isStdio || envTransport === 'stdio' || this._stdioServerStarted) {
153
196
  return {
154
197
  running: true,
155
198
  pid: process.pid,
@@ -233,6 +276,7 @@ export class MCPServerManager extends EventEmitter {
233
276
  * Handles stdin/stdout directly like V2 implementation
234
277
  */
235
278
  async startStdioServer() {
279
+ this._stdioServerStarted = true;
236
280
  // Import the tool registry
237
281
  const { listMCPTools, callMCPTool, hasTool } = await import('./mcp-client.js');
238
282
  const VERSION = '3.0.0';
@@ -309,31 +353,52 @@ export class MCPServerManager extends EventEmitter {
309
353
  for (const line of lines) {
310
354
  if (line.trim()) {
311
355
  try {
312
- const message = JSON.parse(line);
356
+ // Sanitize against prototype pollution. JSON.parse on its own does
357
+ // not pollute, but downstream tool handlers that shallow-merge
358
+ // input into option defaults would propagate `__proto__`,
359
+ // `constructor`, or `prototype` keys. Strip them at the boundary.
360
+ const message = sanitizeJsonRpcMessage(JSON.parse(line));
313
361
  const response = await this.handleMCPMessage(message, sessionId);
314
362
  if (response) {
315
363
  console.log(JSON.stringify(response));
316
364
  }
317
365
  }
318
366
  catch (error) {
319
- console.error(`[${new Date().toISOString()}] ERROR [monomind-mcp] Failed to parse message:`, error instanceof Error ? error.message : String(error));
367
+ // Log-injection defense: stringify message fragment instead of
368
+ // letting raw line content land in the log unescaped.
369
+ const safeMsg = (error instanceof Error ? error.message : String(error))
370
+ .replace(/[\r\n\x00-\x1f\x7f]/g, '?').slice(0, 500);
371
+ console.error(`[${new Date().toISOString()}] ERROR [monomind-mcp] Failed to parse message: ${safeMsg}`);
320
372
  }
321
373
  }
322
374
  }
323
375
  });
324
- process.stdin.on('end', () => {
325
- console.error(`[${new Date().toISOString()}] INFO [monomind-mcp] (${sessionId}) stdin closed, shutting down...`);
326
- process.exit(0);
327
- });
328
- // Handle process termination
329
- process.on('SIGINT', () => {
330
- console.error(`[${new Date().toISOString()}] INFO [monomind-mcp] (${sessionId}) Received SIGINT, shutting down...`);
331
- process.exit(0);
332
- });
333
- process.on('SIGTERM', () => {
334
- console.error(`[${new Date().toISOString()}] INFO [monomind-mcp] (${sessionId}) Received SIGTERM, shutting down...`);
376
+ // Centralized graceful shutdown — clears the health-check interval and
377
+ // removes the PID file before exiting. Without this an abrupt
378
+ // `process.exit(0)` leaves a stale PID file plus a dangling interval and
379
+ // unflushed in-flight tool calls.
380
+ let shuttingDown = false;
381
+ const shutdown = async (reason) => {
382
+ if (shuttingDown)
383
+ return;
384
+ shuttingDown = true;
385
+ console.error(`[${new Date().toISOString()}] INFO [monomind-mcp] (${sessionId}) ${reason}, shutting down...`);
386
+ try {
387
+ if (this.healthCheckInterval) {
388
+ clearInterval(this.healthCheckInterval);
389
+ this.healthCheckInterval = undefined;
390
+ }
391
+ }
392
+ catch { /* best-effort */ }
393
+ try {
394
+ await this.removePidFile();
395
+ }
396
+ catch { /* best-effort */ }
335
397
  process.exit(0);
336
- });
398
+ };
399
+ process.stdin.on('end', () => { void shutdown('stdin closed'); });
400
+ process.on('SIGINT', () => { void shutdown('Received SIGINT'); });
401
+ process.on('SIGTERM', () => { void shutdown('Received SIGTERM'); });
337
402
  // Mark as ready immediately for stdio
338
403
  this.emit('ready');
339
404
  }
@@ -378,9 +443,27 @@ export class MCPServerManager extends EventEmitter {
378
443
  })),
379
444
  },
380
445
  };
381
- case 'tools/call':
446
+ case 'tools/call': {
447
+ // Strict boundary validation. Without this, `params.name` could be
448
+ // an array/object (silently coerced) and `params.arguments` could be
449
+ // an array (downstream `Object.keys` returns numeric indices).
450
+ if (typeof params.name !== 'string') {
451
+ return {
452
+ jsonrpc: '2.0',
453
+ id: message.id,
454
+ error: { code: -32602, message: 'Invalid params.name: must be a string' },
455
+ };
456
+ }
457
+ const rawArgs = params.arguments;
458
+ if (rawArgs !== undefined && (typeof rawArgs !== 'object' || rawArgs === null || Array.isArray(rawArgs))) {
459
+ return {
460
+ jsonrpc: '2.0',
461
+ id: message.id,
462
+ error: { code: -32602, message: 'Invalid params.arguments: must be an object' },
463
+ };
464
+ }
382
465
  const toolName = params.name;
383
- const toolParams = (params.arguments || {});
466
+ const toolParams = (rawArgs || {});
384
467
  if (!hasTool(toolName)) {
385
468
  return {
386
469
  jsonrpc: '2.0',
@@ -399,15 +482,19 @@ export class MCPServerManager extends EventEmitter {
399
482
  }
400
483
  catch (error) {
401
484
  trackRequest(toolName, false);
485
+ const errMsg = process.env.NODE_ENV === 'production'
486
+ ? 'Tool execution failed'
487
+ : (error instanceof Error ? error.message : 'Tool execution failed');
402
488
  return {
403
489
  jsonrpc: '2.0',
404
490
  id: message.id,
405
491
  error: {
406
492
  code: -32603,
407
- message: error instanceof Error ? error.message : 'Tool execution failed',
493
+ message: errMsg,
408
494
  },
409
495
  };
410
496
  }
497
+ }
411
498
  case 'notifications/initialized':
412
499
  // Client notification - no response needed
413
500
  console.error(`[${new Date().toISOString()}] INFO [monomind-mcp] (${sessionId}) Client initialized`);
@@ -427,30 +514,66 @@ export class MCPServerManager extends EventEmitter {
427
514
  }
428
515
  }
429
516
  catch (error) {
430
- console.error(`[${new Date().toISOString()}] ERROR [monomind-mcp] Error handling ${message.method}:`, error);
517
+ // Log-injection defense: caller-controlled `message.method` may contain
518
+ // newlines, ANSI escapes, or other control bytes that forge log lines.
519
+ // JSON.stringify quotes the string and escapes control chars.
520
+ const safeMethod = JSON.stringify(message.method);
521
+ const errMsg = error instanceof Error ? error.message : String(error);
522
+ console.error(`[${new Date().toISOString()}] ERROR [monomind-mcp] Error handling ${safeMethod}: ${errMsg.replace(/[\r\n]/g, ' ')}`);
523
+ // Sanitize outgoing error messages — internal Error.message often
524
+ // contains absolute paths or partial secrets. In production return a
525
+ // generic message; in dev/debug return the full message for triage.
526
+ const isProd = process.env.NODE_ENV === 'production';
527
+ const outMessage = error instanceof Error
528
+ ? (isProd ? 'Internal error' : error.message)
529
+ : 'Internal error';
431
530
  return {
432
531
  jsonrpc: '2.0',
433
532
  id: message.id,
434
- error: {
435
- code: -32603,
436
- message: error instanceof Error ? error.message : 'Internal error',
437
- },
533
+ error: { code: -32603, message: outMessage },
438
534
  };
439
535
  }
440
536
  }
441
537
  /**
442
- * Start HTTP server in-process
538
+ * Start HTTP server in-process.
539
+ *
540
+ * SECURITY: refuses to bind to non-loopback hosts unless the operator opts
541
+ * in via MONOMIND_MCP_ALLOW_REMOTE=1 AND provides a bearer token via
542
+ * MONOMIND_MCP_TOKEN. Without this gate, `--host 0.0.0.0` exposed every
543
+ * registered tool (including agent_spawn, terminal-tools, system tools) to
544
+ * any LAN attacker as unauthenticated RCE.
443
545
  */
444
546
  async startHttpServer() {
547
+ // Loopback gate
548
+ const host = this.options.host;
549
+ const isLoopback = host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '::ffff:127.0.0.1';
550
+ const allowRemote = process.env.MONOMIND_MCP_ALLOW_REMOTE === '1';
551
+ const token = process.env.MONOMIND_MCP_TOKEN;
552
+ if (!isLoopback && !allowRemote) {
553
+ throw new Error(`Refusing to bind MCP HTTP transport to non-loopback host "${host}". ` +
554
+ `Set MONOMIND_MCP_ALLOW_REMOTE=1 and MONOMIND_MCP_TOKEN=<secret> to enable remote access.`);
555
+ }
556
+ if (!isLoopback && allowRemote && (!token || token.length < 32)) {
557
+ throw new Error('Remote MCP transport requires MONOMIND_MCP_TOKEN to be set to a strong secret (>= 32 chars).');
558
+ }
445
559
  // Dynamically import the MCP server package
446
560
  // FIX for issue #942: Use proper package import instead of broken relative path
447
- const { createMCPServer } = await import('@monoes/mcp');
561
+ const { createMCPServer } = await import('@monomind/mcp');
448
562
  const logger = {
449
563
  debug: (msg, data) => this.emit('log', { level: 'debug', msg, data }),
450
564
  info: (msg, data) => this.emit('log', { level: 'info', msg, data }),
451
565
  warn: (msg, data) => this.emit('log', { level: 'warn', msg, data }),
452
566
  error: (msg, data) => this.emit('log', { level: 'error', msg, data }),
453
567
  };
568
+ // SECURITY: actually wire the token into the underlying server's auth
569
+ // config. The startup gate above only *validates* that a token was set —
570
+ // without passing it through here, the token was never enforced on
571
+ // requests. Operators believed their server was protected when it wasn't.
572
+ // For loopback we still configure auth when a token is set, so users who
573
+ // explicitly opt-in to bind 0.0.0.0 with a token get end-to-end protection.
574
+ const authConfig = token && token.length >= 32
575
+ ? { enabled: true, method: 'token', tokens: [token] }
576
+ : (isLoopback ? undefined : { enabled: true, method: 'token', tokens: [] });
454
577
  const mcpServer = createMCPServer({
455
578
  name: 'Monomind MCP Server V1',
456
579
  version: '3.0.0',
@@ -459,6 +582,7 @@ export class MCPServerManager extends EventEmitter {
459
582
  port: this.options.port,
460
583
  enableMetrics: true,
461
584
  enableCaching: true,
585
+ ...(authConfig ? { auth: authConfig } : {}),
462
586
  }, logger);
463
587
  await mcpServer.start();
464
588
  // Store reference for stopping
@@ -521,7 +645,29 @@ export class MCPServerManager extends EventEmitter {
521
645
  */
522
646
  async writePidFile() {
523
647
  const pid = this.process?.pid || process.pid;
524
- await fs.promises.writeFile(this.options.pidFile, String(pid), 'utf8');
648
+ // Ensure the state dir exists (user-private, not /tmp)
649
+ const dir = path.dirname(this.options.pidFile);
650
+ await fs.promises.mkdir(dir, { recursive: true, mode: 0o700 });
651
+ // wx flag = O_CREAT | O_EXCL: fails fast on a pre-existing path including
652
+ // a symlinked one, so we never follow an attacker-staged link to write
653
+ // PIDs into ~/.ssh/authorized_keys or similar.
654
+ try {
655
+ await fs.promises.writeFile(this.options.pidFile, String(pid), { flag: 'wx', mode: 0o600 });
656
+ }
657
+ catch (e) {
658
+ const code = e.code;
659
+ if (code === 'EEXIST') {
660
+ // Stale PID file (the existence-check + isProcessRunning gate above
661
+ // already passed, so the file belongs to a dead daemon). Replace it
662
+ // by unlinking-then-creating with O_EXCL again — never write through
663
+ // an existing path that might be a symlink.
664
+ await fs.promises.unlink(this.options.pidFile);
665
+ await fs.promises.writeFile(this.options.pidFile, String(pid), { flag: 'wx', mode: 0o600 });
666
+ }
667
+ else {
668
+ throw e;
669
+ }
670
+ }
525
671
  }
526
672
  /**
527
673
  * Read PID file
@@ -569,15 +715,17 @@ export class MCPServerManager extends EventEmitter {
569
715
  catch {
570
716
  return false;
571
717
  }
572
- // Verify it's actually a node process (guards against PID reuse)
718
+ // Verify it's actually our MCP server process (guards against PID reuse by
719
+ // an unrelated Node.js program that happened to get the same PID).
720
+ // We require the command line to mention both "node"/"npx" AND "monomind"/"mcp".
573
721
  try {
574
- const { execSync } = require('child_process');
575
- const cmdline = execSync(`cat /proc/${pid}/cmdline 2>/dev/null || ps -p ${pid} -o comm= 2>/dev/null`, {
722
+ const cmdline = execSync(`cat /proc/${pid}/cmdline 2>/dev/null || ps -p ${pid} -o args= 2>/dev/null`, {
576
723
  encoding: 'utf8',
577
724
  timeout: 1000,
578
725
  }).trim();
579
- // Must be a node process to be our MCP server
580
- return cmdline.includes('node') || cmdline.includes('monomind') || cmdline.includes('npx');
726
+ const isMonomindMcp = (cmdline.includes('node') || cmdline.includes('npx')) &&
727
+ (cmdline.includes('monomind') || cmdline.includes('mcp'));
728
+ return isMonomindMcp;
581
729
  }
582
730
  catch {
583
731
  // If we can't inspect the process (macOS, Windows, permissions), fall back to kill check
@@ -590,7 +738,6 @@ export class MCPServerManager extends EventEmitter {
590
738
  async httpRequest(url, method, timeout) {
591
739
  return new Promise((resolve, reject) => {
592
740
  const urlObj = new URL(url);
593
- const http = require('http');
594
741
  const req = http.request({
595
742
  hostname: urlObj.hostname,
596
743
  port: urlObj.port,
@@ -4,17 +4,10 @@
4
4
  * Tool definitions for agent lifecycle management with file persistence.
5
5
  * Includes model routing integration for intelligent model selection.
6
6
  */
7
- import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'node:fs';
7
+ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, statSync } from 'node:fs';
8
8
  import { join } from 'node:path';
9
+ import { randomBytes } from 'node:crypto';
9
10
  import { getProjectCwd } from './types.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
11
  // Storage paths
19
12
  const STORAGE_DIR = '.monomind';
20
13
  const AGENT_DIR = 'agents';
@@ -31,12 +24,18 @@ function ensureAgentDir() {
31
24
  mkdirSync(dir, { recursive: true });
32
25
  }
33
26
  }
27
+ const MAX_AGENT_STORE_BYTES = 50 * 1024 * 1024;
34
28
  function loadAgentStore() {
35
29
  try {
36
30
  const path = getAgentPath();
37
31
  if (existsSync(path)) {
32
+ if (statSync(path).size > MAX_AGENT_STORE_BYTES)
33
+ return { agents: {}, version: '3.0.0' };
38
34
  const data = readFileSync(path, 'utf-8');
39
- return JSON.parse(data);
35
+ const parsed = JSON.parse(data);
36
+ if (parsed && typeof parsed === 'object' && Object.prototype.hasOwnProperty.call(parsed, '__proto__'))
37
+ return { agents: {}, version: '3.0.0' };
38
+ return parsed;
40
39
  }
41
40
  }
42
41
  catch {
@@ -45,8 +44,21 @@ function loadAgentStore() {
45
44
  return { agents: {}, version: '3.0.0' };
46
45
  }
47
46
  function saveAgentStore(store) {
47
+ // Cap terminated agents to prevent unbounded growth
48
+ const MAX_TERMINATED = 500;
49
+ const terminated = Object.entries(store.agents)
50
+ .filter(([, a]) => a.status === 'terminated')
51
+ .sort(([, a], [, b]) => (a.createdAt ?? '').localeCompare(b.createdAt ?? ''));
52
+ if (terminated.length > MAX_TERMINATED) {
53
+ for (const [id] of terminated.slice(0, terminated.length - MAX_TERMINATED)) {
54
+ delete store.agents[id];
55
+ }
56
+ }
48
57
  ensureAgentDir();
49
- writeFileSync(getAgentPath(), JSON.stringify(store, null, 2), 'utf-8');
58
+ const dest = getAgentPath();
59
+ const tmp = `${dest}.${process.pid}.${Date.now()}.tmp`;
60
+ writeFileSync(tmp, JSON.stringify(store, null, 2), 'utf-8');
61
+ renameSync(tmp, dest);
50
62
  }
51
63
  // Default model mappings for agent types (can be overridden)
52
64
  const AGENT_TYPE_MODEL_DEFAULTS = {
@@ -111,7 +123,7 @@ async function determineAgentModel(agentType, config, task) {
111
123
  };
112
124
  }
113
125
  return {
114
- model: routeResult.model,
126
+ model: (routeResult.model ?? 'sonnet'),
115
127
  routedBy: 'router',
116
128
  tier: routeResult.tier,
117
129
  };
@@ -161,8 +173,18 @@ export const agentTools = [
161
173
  },
162
174
  handler: async (input) => {
163
175
  const store = loadAgentStore();
164
- const agentId = input.agentId || `agent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
176
+ const agentId = input.agentId || `agent-${Date.now()}-${randomBytes(4).toString('hex')}`;
165
177
  const agentType = input.agentType;
178
+ if (['__proto__', 'constructor', 'prototype'].includes(agentId)) {
179
+ return { success: false, agentId, error: 'Forbidden agent ID' };
180
+ }
181
+ if (input.agentId && store.agents[agentId]) {
182
+ return {
183
+ success: false,
184
+ agentId,
185
+ error: `Agent ${agentId} already exists. Terminate it first or omit agentId to auto-generate.`,
186
+ };
187
+ }
166
188
  const config = input.config || {};
167
189
  // Add explicit model to config if provided
168
190
  if (input.model) {
@@ -188,7 +210,7 @@ export const agentTools = [
188
210
  saveAgentStore(store);
189
211
  // Task 46: AgentSandboxing — register sandbox for isolated agent execution
190
212
  try {
191
- const { WasmSandbox, DockerSandbox, register } = await import('@monoes/security');
213
+ const { WasmSandbox, DockerSandbox, register } = await import('@monomind/security');
192
214
  const sandboxType = config.sandbox?.type ?? 'wasm';
193
215
  const sandboxConfig = config.sandbox ?? {};
194
216
  const sandbox = sandboxType === 'docker'
@@ -196,8 +218,7 @@ export const agentTools = [
196
218
  : WasmSandbox.create(agentId, sandboxConfig);
197
219
  register(agentId, sandbox);
198
220
  }
199
- catch { /* optional — @monoes/security may not be installed */ }
200
- logEvent('agent.spawn', { agentId, agentType, model: routingResult.model, routedBy: routingResult.routedBy, domain: input.domain, task });
221
+ catch { /* optional — @monomind/security may not be installed */ }
201
222
  // Include Agent Booster routing info if applicable
202
223
  const response = {
203
224
  success: true,
@@ -234,16 +255,17 @@ export const agentTools = [
234
255
  required: ['agentId'],
235
256
  },
236
257
  handler: async (input) => {
237
- const store = loadAgentStore();
238
258
  const agentId = input.agentId;
239
- if (store.agents[agentId]) {
240
- const agentType = store.agents[agentId].agentType;
259
+ if (!agentId || typeof agentId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
260
+ return { success: false, agentId, error: 'Invalid agent ID' };
261
+ }
262
+ const store = loadAgentStore();
263
+ if (Object.hasOwn(store.agents, agentId)) {
241
264
  store.agents[agentId].status = 'terminated';
242
265
  saveAgentStore(store);
243
- logEvent('agent.terminate', { agentId, agentType });
244
266
  // Task 46: AgentSandboxing — clean up sandbox on termination
245
267
  try {
246
- const { cleanup } = await import('@monoes/security');
268
+ const { cleanup } = await import('@monomind/security');
247
269
  cleanup(agentId);
248
270
  }
249
271
  catch { /* optional */ }
@@ -273,9 +295,12 @@ export const agentTools = [
273
295
  required: ['agentId'],
274
296
  },
275
297
  handler: async (input) => {
276
- const store = loadAgentStore();
277
298
  const agentId = input.agentId;
278
- const agent = store.agents[agentId];
299
+ if (!agentId || typeof agentId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
300
+ return { agentId, error: 'Invalid agent ID' };
301
+ }
302
+ const store = loadAgentStore();
303
+ const agent = Object.hasOwn(store.agents, agentId) ? store.agents[agentId] : undefined;
279
304
  if (agent) {
280
305
  return {
281
306
  agentId: agent.agentId,
@@ -347,7 +372,7 @@ export const agentTools = [
347
372
  inputSchema: {
348
373
  type: 'object',
349
374
  properties: {
350
- action: { type: 'string', enum: ['status', 'scale', 'drain', 'fill'], description: 'Pool action' },
375
+ action: { type: 'string', enum: ['status', 'scale', 'drain'], description: 'Pool action' },
351
376
  targetSize: { type: 'number', description: 'Target pool size (for scale action)' },
352
377
  agentType: { type: 'string', description: 'Agent type filter' },
353
378
  },
@@ -372,9 +397,6 @@ export const agentTools = [
372
397
  // CLI expected fields
373
398
  poolId: 'agent-pool-default',
374
399
  currentSize: agents.length,
375
- minSize: input.min || 0,
376
- maxSize: input.max || 100,
377
- autoScale: input.autoScale ?? false,
378
400
  utilization,
379
401
  agents: agents.map(a => ({
380
402
  id: a.agentId,
@@ -391,7 +413,7 @@ export const agentTools = [
391
413
  };
392
414
  }
393
415
  if (action === 'scale') {
394
- const targetSize = input.targetSize || 5;
416
+ const targetSize = Math.min(Math.max(input.targetSize || 5, 1), 50);
395
417
  const agentType = input.agentType || 'worker';
396
418
  const currentSize = agents.filter(a => a.agentType === agentType).length;
397
419
  const delta = targetSize - currentSize;
@@ -399,7 +421,7 @@ export const agentTools = [
399
421
  const removed = [];
400
422
  if (delta > 0) {
401
423
  for (let i = 0; i < delta; i++) {
402
- const agentId = `agent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
424
+ const agentId = `agent-${Date.now()}-${randomBytes(4).toString('hex')}`;
403
425
  store.agents[agentId] = {
404
426
  agentId,
405
427
  agentType,
@@ -467,8 +489,15 @@ export const agentTools = [
467
489
  const store = loadAgentStore();
468
490
  const agents = Object.values(store.agents).filter(a => a.status !== 'terminated');
469
491
  const threshold = input.threshold || 0.5;
470
- if (input.agentId) {
471
- const agent = store.agents[input.agentId];
492
+ if (input.agentId !== undefined) {
493
+ const agentId = input.agentId;
494
+ if (typeof agentId !== 'string' ||
495
+ ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
496
+ return { agentId, error: 'Invalid agent ID' };
497
+ }
498
+ const agent = Object.hasOwn(store.agents, agentId)
499
+ ? store.agents[agentId]
500
+ : undefined;
472
501
  if (agent) {
473
502
  return {
474
503
  agentId: agent.agentId,
@@ -479,7 +508,7 @@ export const agentTools = [
479
508
  uptime: Date.now() - new Date(agent.createdAt).getTime(),
480
509
  };
481
510
  }
482
- return { agentId: input.agentId, error: 'Agent not found' };
511
+ return { agentId, error: 'Agent not found' };
483
512
  }
484
513
  const healthyAgents = agents.filter(a => a.health >= threshold);
485
514
  const degradedAgents = agents.filter(a => a.health >= 0.3 && a.health < threshold);
@@ -538,9 +567,12 @@ export const agentTools = [
538
567
  required: ['agentId'],
539
568
  },
540
569
  handler: async (input) => {
541
- const store = loadAgentStore();
542
570
  const agentId = input.agentId;
543
- const agent = store.agents[agentId];
571
+ if (!agentId || typeof agentId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
572
+ return { success: false, agentId, error: 'Invalid agent ID' };
573
+ }
574
+ const store = loadAgentStore();
575
+ const agent = Object.hasOwn(store.agents, agentId) ? store.agents[agentId] : undefined;
544
576
  if (agent) {
545
577
  if (input.status)
546
578
  agent.status = input.status;