monomind 1.8.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 (566) 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} +21 -8
  91. package/.claude/commands/monomind/help.md +118 -0
  92. package/.claude/commands/{monomind-idea.md → monomind/idea.md} +22 -28
  93. package/.claude/commands/{monomind-improve.md → monomind/improve.md} +21 -27
  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/learning-service.mjs +0 -0
  180. package/.claude/helpers/loop-tracker.cjs +107 -0
  181. package/.claude/helpers/metrics-db.mjs +0 -0
  182. package/.claude/helpers/router.cjs +48 -68
  183. package/.claude/helpers/skill-registry.json +89 -104
  184. package/.claude/helpers/statusline.cjs +33 -2
  185. package/.claude/helpers/swarm-hooks.sh +0 -0
  186. package/.claude/scheduled_tasks.lock +1 -0
  187. package/.claude/settings.json +15 -0
  188. package/.claude/skills/.monomind/data/ranked-context.json +5 -0
  189. package/.claude/skills/.monomind/sessions/current.json +13 -0
  190. package/.claude/skills/.monomind/sessions/session-1777829336455.json +15 -0
  191. package/.claude/skills/.monomind/sessions/session-1777831614725.json +15 -0
  192. package/.claude/skills/.monomind/sessions/session-1777832095857.json +15 -0
  193. package/.claude/skills/.monomind/sessions/session-1777839814183.json +15 -0
  194. package/.claude/skills/.monomind/sessions/session-1777841847131.json +15 -0
  195. package/.claude/skills/.monomind/sessions/session-1777843309463.json +15 -0
  196. package/.claude/skills/.monomind/sessions/session-1777880867159.json +15 -0
  197. package/.claude/skills/.monomind/sessions/session-1777881884593.json +15 -0
  198. package/.claude/skills/.monomind/sessions/session-1777884090471.json +15 -0
  199. package/.claude/skills/.monomind/sessions/session-1777884808221.json +15 -0
  200. package/.claude/skills/.monomind/sessions/session-1777885672155.json +15 -0
  201. package/.claude/skills/.monomind/sessions/session-1777886852818.json +15 -0
  202. package/.claude/skills/.monomind/sessions/session-1777896532690.json +15 -0
  203. package/.claude/skills/agentdb-advanced/SKILL.md +11 -12
  204. package/.claude/skills/agentdb-learning/SKILL.md +20 -21
  205. package/.claude/skills/agentdb-memory-patterns/SKILL.md +28 -30
  206. package/.claude/skills/agentdb-optimization/SKILL.md +11 -12
  207. package/.claude/skills/agentdb-vector-search/SKILL.md +37 -41
  208. package/.claude/skills/{v3-integration-deep → agentic-integration}/SKILL.md +20 -13
  209. package/.claude/skills/agentic-jujutsu/SKILL.md +22 -22
  210. package/.claude/skills/{v3-cli-modernization → cli-modernization}/SKILL.md +17 -8
  211. package/.claude/skills/{v3-core-implementation → core-implementation}/SKILL.md +33 -8
  212. package/.claude/skills/{v3-ddd-architecture → ddd-architecture}/SKILL.md +18 -25
  213. package/.claude/skills/github-code-review/SKILL.md +82 -83
  214. package/.claude/skills/github-multi-repo/SKILL.md +42 -46
  215. package/.claude/skills/github-project-management/SKILL.md +83 -88
  216. package/.claude/skills/github-release-management/SKILL.md +12 -18
  217. package/.claude/skills/github-workflow-automation/SKILL.md +70 -74
  218. package/.claude/skills/hooks-automation/SKILL.md +9 -13
  219. package/.claude/skills/mastermind/_intake.md +83 -0
  220. package/.claude/skills/mastermind/_protocol.md +275 -0
  221. package/.claude/skills/mastermind/architect.md +847 -0
  222. package/.claude/skills/mastermind/build.md +158 -0
  223. package/.claude/skills/mastermind/content.md +185 -0
  224. package/.claude/skills/mastermind/createorg.md +318 -0
  225. package/.claude/skills/mastermind/finance.md +154 -0
  226. package/.claude/skills/mastermind/idea.md +158 -0
  227. package/.claude/skills/mastermind/marketing.md +216 -0
  228. package/.claude/skills/mastermind/monotask.md +350 -0
  229. package/.claude/skills/mastermind/ops.md +156 -0
  230. package/.claude/skills/mastermind/references/copywriting-frameworks.md +181 -0
  231. package/.claude/skills/mastermind/references/persuasion-psychology.md +158 -0
  232. package/.claude/skills/mastermind/release.md +156 -0
  233. package/.claude/skills/mastermind/research.md +156 -0
  234. package/.claude/skills/mastermind/review.md +157 -0
  235. package/.claude/skills/mastermind/runorg.md +308 -0
  236. package/.claude/skills/mastermind/sales.md +158 -0
  237. package/.claude/skills/mastermind/techport.md +743 -0
  238. package/.claude/skills/{v3-mcp-optimization → mcp-optimization}/SKILL.md +35 -14
  239. package/.claude/skills/{v3-memory-unification → memory-unification}/SKILL.md +20 -4
  240. package/.claude/skills/monodesign/SKILL.md +302 -0
  241. package/.claude/skills/monodesign/reference/adapt.md +190 -0
  242. package/.claude/skills/monodesign/reference/animate.md +175 -0
  243. package/.claude/skills/monodesign/reference/antipatterns-catalog.md +187 -0
  244. package/.claude/skills/monodesign/reference/audit.md +133 -0
  245. package/.claude/skills/monodesign/reference/bolder.md +113 -0
  246. package/.claude/skills/monodesign/reference/brand-workflow.md +180 -0
  247. package/.claude/skills/monodesign/reference/brand.md +114 -0
  248. package/.claude/skills/monodesign/reference/clarify.md +174 -0
  249. package/.claude/skills/monodesign/reference/cognitive-load.md +106 -0
  250. package/.claude/skills/monodesign/reference/color-and-contrast.md +105 -0
  251. package/.claude/skills/monodesign/reference/colorize.md +154 -0
  252. package/.claude/skills/monodesign/reference/component-specs.md +260 -0
  253. package/.claude/skills/monodesign/reference/component-states.md +274 -0
  254. package/.claude/skills/monodesign/reference/component-system.md +358 -0
  255. package/.claude/skills/monodesign/reference/copy-formulas.md +160 -0
  256. package/.claude/skills/monodesign/reference/craft.md +193 -0
  257. package/.claude/skills/monodesign/reference/critique.md +213 -0
  258. package/.claude/skills/monodesign/reference/delight.md +302 -0
  259. package/.claude/skills/monodesign/reference/design-principles.md +246 -0
  260. package/.claude/skills/monodesign/reference/distill.md +111 -0
  261. package/.claude/skills/monodesign/reference/document.md +427 -0
  262. package/.claude/skills/monodesign/reference/extract.md +69 -0
  263. package/.claude/skills/monodesign/reference/harden.md +347 -0
  264. package/.claude/skills/monodesign/reference/heuristics-scoring.md +234 -0
  265. package/.claude/skills/monodesign/reference/image-prompts.md +118 -0
  266. package/.claude/skills/monodesign/reference/interaction-design.md +195 -0
  267. package/.claude/skills/monodesign/reference/layout.md +141 -0
  268. package/.claude/skills/monodesign/reference/live.md +622 -0
  269. package/.claude/skills/monodesign/reference/motion-design.md +109 -0
  270. package/.claude/skills/monodesign/reference/onboard.md +234 -0
  271. package/.claude/skills/monodesign/reference/optimize.md +258 -0
  272. package/.claude/skills/monodesign/reference/overdrive.md +130 -0
  273. package/.claude/skills/monodesign/reference/personas.md +179 -0
  274. package/.claude/skills/monodesign/reference/polish.md +233 -0
  275. package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +108 -0
  276. package/.claude/skills/monodesign/reference/product.md +62 -0
  277. package/.claude/skills/monodesign/reference/quieter.md +99 -0
  278. package/.claude/skills/monodesign/reference/responsive-design.md +114 -0
  279. package/.claude/skills/monodesign/reference/shape.md +151 -0
  280. package/.claude/skills/monodesign/reference/spatial-design.md +100 -0
  281. package/.claude/skills/monodesign/reference/teach.md +156 -0
  282. package/.claude/skills/monodesign/reference/token-architecture.md +222 -0
  283. package/.claude/skills/monodesign/reference/typeset.md +124 -0
  284. package/.claude/skills/monodesign/reference/typography.md +159 -0
  285. package/.claude/skills/monodesign/reference/ux-research.md +143 -0
  286. package/.claude/skills/monodesign/reference/ux-rules.md +211 -0
  287. package/.claude/skills/monodesign/reference/ux-writing.md +107 -0
  288. package/.claude/skills/monomotion/SKILL.md +145 -0
  289. package/.claude/skills/monomotion/rules/api-control.md +139 -0
  290. package/.claude/skills/monomotion/rules/effects.md +109 -0
  291. package/.claude/skills/monomotion/rules/integration.md +140 -0
  292. package/.claude/skills/monomotion/rules/scroll.md +131 -0
  293. package/.claude/skills/monomotion/rules/sequencing.md +105 -0
  294. package/.claude/skills/monomotion/rules/svg.md +101 -0
  295. package/.claude/skills/monomotion/rules/text.md +119 -0
  296. package/.claude/skills/pair-programming/SKILL.md +1 -1
  297. package/.claude/skills/performance-analysis/SKILL.md +3 -3
  298. package/.claude/skills/{v3-performance-optimization → performance-optimization}/SKILL.md +16 -8
  299. package/.claude/skills/reasoningbank-agentdb/SKILL.md +17 -19
  300. package/.claude/skills/reasoningbank-intelligence/SKILL.md +4 -6
  301. package/.claude/skills/{v3-security-overhaul → security-hardening}/SKILL.md +13 -3
  302. package/.claude/skills/skill-builder/SKILL.md +19 -19
  303. package/.claude/skills/sparc-methodology/SKILL.md +55 -211
  304. package/.claude/skills/stop-slop/SKILL.md +67 -0
  305. package/.claude/skills/stop-slop/references/examples.md +61 -0
  306. package/.claude/skills/stop-slop/references/phrases.md +130 -0
  307. package/.claude/skills/stop-slop/references/structures.md +136 -0
  308. package/.claude/skills/swarm-advanced/SKILL.md +13 -43
  309. package/.claude/skills/{v3-swarm-coordination → swarm-coordination}/SKILL.md +39 -21
  310. package/.claude/skills/swarm-orchestration/SKILL.md +12 -12
  311. package/.claude/skills/verification-quality/SKILL.md +5 -5
  312. package/.claude/statusline-command.sh +0 -0
  313. package/.claude/statusline.sh +0 -0
  314. package/.claude-plugin/scripts/install.sh +0 -0
  315. package/.claude-plugin/scripts/uninstall.sh +0 -0
  316. package/.claude-plugin/scripts/verify.sh +0 -0
  317. package/README.md +5 -5
  318. package/package.json +17 -17
  319. package/packages/@monomind/cli/README.md +441 -0
  320. package/packages/@monomind/cli/bin/cli.js +78 -13
  321. package/packages/@monomind/cli/bin/mcp-server.js +0 -0
  322. package/packages/@monomind/cli/dist/src/agents/halt-signal.js +33 -7
  323. package/packages/@monomind/cli/dist/src/agents/managed-agent.js +5 -2
  324. package/packages/@monomind/cli/dist/src/agents/prompt-experiment.d.ts +3 -2
  325. package/packages/@monomind/cli/dist/src/agents/prompt-experiment.js +1 -1
  326. package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.d.ts +5 -2
  327. package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.js +26 -4
  328. package/packages/@monomind/cli/dist/src/agents/specialization-scorer.js +17 -9
  329. package/packages/@monomind/cli/dist/src/agents/trigger-scanner.d.ts +5 -3
  330. package/packages/@monomind/cli/dist/src/agents/trigger-scanner.js +58 -10
  331. package/packages/@monomind/cli/dist/src/agents/version-store.d.ts +0 -1
  332. package/packages/@monomind/cli/dist/src/agents/version-store.js +44 -21
  333. package/packages/@monomind/cli/dist/src/autopilot-state.js +79 -28
  334. package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.d.ts +7 -2
  335. package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.js +20 -8
  336. package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.d.ts +2 -1
  337. package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.js +25 -2
  338. package/packages/@monomind/cli/dist/src/commands/agent.js +6 -4
  339. package/packages/@monomind/cli/dist/src/commands/appliance-advanced.js +23 -0
  340. package/packages/@monomind/cli/dist/src/commands/autopilot.js +3 -3
  341. package/packages/@monomind/cli/dist/src/commands/benchmark.js +119 -8
  342. package/packages/@monomind/cli/dist/src/commands/claims.js +22 -14
  343. package/packages/@monomind/cli/dist/src/commands/config.js +32 -0
  344. package/packages/@monomind/cli/dist/src/commands/daemon.js +13 -11
  345. package/packages/@monomind/cli/dist/src/commands/deployment.js +21 -2
  346. package/packages/@monomind/cli/dist/src/commands/doctor.js +5 -4
  347. package/packages/@monomind/cli/dist/src/commands/embeddings.js +124 -48
  348. package/packages/@monomind/cli/dist/src/commands/hive-mind.js +15 -14
  349. package/packages/@monomind/cli/dist/src/commands/hooks.js +45 -41
  350. package/packages/@monomind/cli/dist/src/commands/index.d.ts +2 -0
  351. package/packages/@monomind/cli/dist/src/commands/index.js +20 -7
  352. package/packages/@monomind/cli/dist/src/commands/init.js +53 -19
  353. package/packages/@monomind/cli/dist/src/commands/mcp.js +31 -44
  354. package/packages/@monomind/cli/dist/src/commands/memory.js +47 -15
  355. package/packages/@monomind/cli/dist/src/commands/migrate.js +156 -108
  356. package/packages/@monomind/cli/dist/src/commands/monograph.d.ts +8 -0
  357. package/packages/@monomind/cli/dist/src/commands/monograph.js +526 -0
  358. package/packages/@monomind/cli/dist/src/commands/neural.js +96 -56
  359. package/packages/@monomind/cli/dist/src/commands/performance.js +30 -8
  360. package/packages/@monomind/cli/dist/src/commands/plugins.js +13 -37
  361. package/packages/@monomind/cli/dist/src/commands/process.js +25 -2
  362. package/packages/@monomind/cli/dist/src/commands/providers.js +37 -5
  363. package/packages/@monomind/cli/dist/src/commands/replay.js +4 -4
  364. package/packages/@monomind/cli/dist/src/commands/route.js +37 -5
  365. package/packages/@monomind/cli/dist/src/commands/ruvector/import.js +12 -2
  366. package/packages/@monomind/cli/dist/src/commands/ruvector/init.js +15 -0
  367. package/packages/@monomind/cli/dist/src/commands/ruvector/status.js +16 -3
  368. package/packages/@monomind/cli/dist/src/commands/security.js +342 -193
  369. package/packages/@monomind/cli/dist/src/commands/session.js +51 -8
  370. package/packages/@monomind/cli/dist/src/commands/start.js +18 -4
  371. package/packages/@monomind/cli/dist/src/commands/swarm.js +47 -36
  372. package/packages/@monomind/cli/dist/src/commands/tokens.js +11 -11
  373. package/packages/@monomind/cli/dist/src/commands/transfer-store.js +1 -1
  374. package/packages/@monomind/cli/dist/src/commands/workflow.js +31 -4
  375. package/packages/@monomind/cli/dist/src/config-adapter.d.ts +2 -1
  376. package/packages/@monomind/cli/dist/src/consensus/audit-writer.js +46 -13
  377. package/packages/@monomind/cli/dist/src/consensus/vote-signer.d.ts +0 -3
  378. package/packages/@monomind/cli/dist/src/consensus/vote-signer.js +9 -1
  379. package/packages/@monomind/cli/dist/src/dlq/dlq-reader.d.ts +4 -2
  380. package/packages/@monomind/cli/dist/src/dlq/dlq-reader.js +25 -8
  381. package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.d.ts +10 -3
  382. package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.js +50 -16
  383. package/packages/@monomind/cli/dist/src/dlq/dlq-writer.js +27 -5
  384. package/packages/@monomind/cli/dist/src/eval/dataset-manager.d.ts +2 -2
  385. package/packages/@monomind/cli/dist/src/eval/dataset-manager.js +26 -16
  386. package/packages/@monomind/cli/dist/src/eval/trace-collector.js +23 -3
  387. package/packages/@monomind/cli/dist/src/index.js +12 -10
  388. package/packages/@monomind/cli/dist/src/init/claudemd-generator.js +8 -8
  389. package/packages/@monomind/cli/dist/src/init/executor.js +153 -70
  390. package/packages/@monomind/cli/dist/src/init/helpers-generator.js +35 -22
  391. package/packages/@monomind/cli/dist/src/init/mcp-generator.js +3 -3
  392. package/packages/@monomind/cli/dist/src/init/settings-generator.js +10 -3
  393. package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +18 -3
  394. package/packages/@monomind/cli/dist/src/init/statusline-generator.js +3 -1
  395. package/packages/@monomind/cli/dist/src/init/types.d.ts +35 -11
  396. package/packages/@monomind/cli/dist/src/init/types.js +5 -9
  397. package/packages/@monomind/cli/dist/src/interactive/interrupt.js +8 -3
  398. package/packages/@monomind/cli/dist/src/mcp/tool-registry.js +38 -4
  399. package/packages/@monomind/cli/dist/src/mcp-client.js +10 -4
  400. package/packages/@monomind/cli/dist/src/mcp-server.d.ts +9 -2
  401. package/packages/@monomind/cli/dist/src/mcp-server.js +182 -35
  402. package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +66 -34
  403. package/packages/@monomind/cli/dist/src/mcp-tools/agentdb-tools.js +34 -7
  404. package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.js +25 -16
  405. package/packages/@monomind/cli/dist/src/mcp-tools/auto-install.js +4 -6
  406. package/packages/@monomind/cli/dist/src/mcp-tools/autopilot-tools.js +12 -2
  407. package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +199 -20
  408. package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.js +68 -18
  409. package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.js +33 -5
  410. package/packages/@monomind/cli/dist/src/mcp-tools/coordination-tools.js +59 -4
  411. package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +46 -10
  412. package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +46 -5
  413. package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.js +29 -16
  414. package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +38 -10
  415. package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +96 -33
  416. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +70 -37
  417. package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +29 -13
  418. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +5867 -56
  419. package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +121 -37
  420. package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +21 -8
  421. package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +10 -8
  422. package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.js +4 -1
  423. package/packages/@monomind/cli/dist/src/mcp-tools/ruvllm-tools.js +19 -8
  424. package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.js +57 -17
  425. package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +35 -17
  426. package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +4 -3
  427. package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.js +53 -13
  428. package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.js +63 -14
  429. package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +21 -16
  430. package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +92 -23
  431. package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +41 -10
  432. package/packages/@monomind/cli/dist/src/memory/intelligence.d.ts +2 -2
  433. package/packages/@monomind/cli/dist/src/memory/intelligence.js +39 -13
  434. package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +1 -0
  435. package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +149 -56
  436. package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +107 -45
  437. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.d.ts +8 -1
  438. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +25 -8
  439. package/packages/@monomind/cli/dist/src/observability/replay-reader.d.ts +40 -0
  440. package/packages/@monomind/cli/dist/src/observability/replay-reader.js +138 -0
  441. package/packages/@monomind/cli/dist/src/orchestration/routing-modes.js +35 -5
  442. package/packages/@monomind/cli/dist/src/parser.d.ts +8 -0
  443. package/packages/@monomind/cli/dist/src/parser.js +48 -14
  444. package/packages/@monomind/cli/dist/src/plugins/manager.js +112 -19
  445. package/packages/@monomind/cli/dist/src/plugins/store/discovery.d.ts +1 -1
  446. package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +80 -62
  447. package/packages/@monomind/cli/dist/src/production/circuit-breaker.js +8 -1
  448. package/packages/@monomind/cli/dist/src/production/error-handler.d.ts +4 -2
  449. package/packages/@monomind/cli/dist/src/production/error-handler.js +27 -5
  450. package/packages/@monomind/cli/dist/src/production/monitoring.js +8 -4
  451. package/packages/@monomind/cli/dist/src/production/rate-limiter.js +30 -22
  452. package/packages/@monomind/cli/dist/src/ruvector/agent-wasm.js +2 -2
  453. package/packages/@monomind/cli/dist/src/ruvector/coverage-router.js +19 -9
  454. package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.d.ts +1 -0
  455. package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.js +26 -6
  456. package/packages/@monomind/cli/dist/src/ruvector/enhanced-model-router.js +24 -2
  457. package/packages/@monomind/cli/dist/src/ruvector/index.d.ts +1 -2
  458. package/packages/@monomind/cli/dist/src/ruvector/index.js +2 -2
  459. package/packages/@monomind/cli/dist/src/ruvector/model-router.d.ts +4 -2
  460. package/packages/@monomind/cli/dist/src/ruvector/model-router.js +30 -6
  461. package/packages/@monomind/cli/dist/src/ruvector/moe-router.d.ts +7 -0
  462. package/packages/@monomind/cli/dist/src/ruvector/moe-router.js +35 -12
  463. package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.d.ts +7 -1
  464. package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.js +40 -9
  465. package/packages/@monomind/cli/dist/src/services/claim-service.d.ts +3 -1
  466. package/packages/@monomind/cli/dist/src/services/claim-service.js +33 -2
  467. package/packages/@monomind/cli/dist/src/services/config-file-manager.d.ts +16 -2
  468. package/packages/@monomind/cli/dist/src/services/config-file-manager.js +105 -17
  469. package/packages/@monomind/cli/dist/src/services/container-worker-pool.js +51 -11
  470. package/packages/@monomind/cli/dist/src/services/headless-worker-executor.d.ts +7 -0
  471. package/packages/@monomind/cli/dist/src/services/headless-worker-executor.js +188 -45
  472. package/packages/@monomind/cli/dist/src/services/registry-api.js +62 -9
  473. package/packages/@monomind/cli/dist/src/services/ruvector-training.js +8 -0
  474. package/packages/@monomind/cli/dist/src/services/worker-daemon.d.ts +4 -1
  475. package/packages/@monomind/cli/dist/src/services/worker-daemon.js +112 -28
  476. package/packages/@monomind/cli/dist/src/services/worker-queue.d.ts +9 -2
  477. package/packages/@monomind/cli/dist/src/services/worker-queue.js +86 -5
  478. package/packages/@monomind/cli/dist/src/suggest.js +9 -0
  479. package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.d.ts +5 -3
  480. package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.js +17 -5
  481. package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.d.ts +3 -0
  482. package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.js +30 -6
  483. package/packages/@monomind/cli/dist/src/transfer/anonymization/index.js +5 -3
  484. package/packages/@monomind/cli/dist/src/transfer/export.js +5 -3
  485. package/packages/@monomind/cli/dist/src/transfer/ipfs/client.js +84 -7
  486. package/packages/@monomind/cli/dist/src/transfer/ipfs/upload.js +13 -4
  487. package/packages/@monomind/cli/dist/src/transfer/storage/gcs.js +19 -10
  488. package/packages/@monomind/cli/dist/src/transfer/store/discovery.d.ts +9 -2
  489. package/packages/@monomind/cli/dist/src/transfer/store/discovery.js +68 -13
  490. package/packages/@monomind/cli/dist/src/transfer/store/download.d.ts +15 -6
  491. package/packages/@monomind/cli/dist/src/transfer/store/download.js +113 -24
  492. package/packages/@monomind/cli/dist/src/transfer/store/publish.d.ts +1 -1
  493. package/packages/@monomind/cli/dist/src/transfer/store/publish.js +13 -14
  494. package/packages/@monomind/cli/dist/src/transfer/store/registry.d.ts +3 -3
  495. package/packages/@monomind/cli/dist/src/transfer/store/registry.js +32 -16
  496. package/packages/@monomind/cli/dist/src/update/checker.js +17 -4
  497. package/packages/@monomind/cli/dist/src/update/executor.js +25 -20
  498. package/packages/@monomind/cli/dist/src/update/rate-limiter.d.ts +11 -0
  499. package/packages/@monomind/cli/dist/src/update/rate-limiter.js +23 -3
  500. package/packages/@monomind/cli/dist/src/utils/parse-jsonl.d.ts +6 -0
  501. package/packages/@monomind/cli/dist/src/utils/parse-jsonl.js +22 -0
  502. package/packages/@monomind/cli/dist/src/workflow/condition-evaluator.js +37 -3
  503. package/packages/@monomind/cli/dist/src/workflow/dag-builder.js +27 -11
  504. package/packages/@monomind/cli/dist/src/workflow/dag-executor.js +51 -13
  505. package/packages/@monomind/cli/dist/src/workflow/dsl-schema.d.ts +3 -0
  506. package/packages/@monomind/cli/dist/src/workflow/dsl-schema.js +6 -2
  507. package/packages/@monomind/cli/dist/src/workflow/template-engine.js +7 -0
  508. package/packages/@monomind/cli/dist/src/workflow/workflow-executor.js +95 -14
  509. package/packages/@monomind/cli/package.json +5 -3
  510. package/packages/@monomind/guidance/README.md +1192 -0
  511. package/packages/@monomind/shared/README.md +322 -0
  512. package/packages/@monomind/shared/dist/types/consensus-audit.d.ts +3 -1
  513. package/packages/README.md +513 -0
  514. package/.claude/agents/design/design-brand-guardian.md +0 -323
  515. package/.claude/agents/design/design-image-prompt-engineer.md +0 -237
  516. package/.claude/agents/design/design-inclusive-visuals-specialist.md +0 -72
  517. package/.claude/agents/design/design-ui-designer.md +0 -384
  518. package/.claude/agents/design/design-ux-architect.md +0 -470
  519. package/.claude/agents/design/design-ux-researcher.md +0 -330
  520. package/.claude/agents/design/design-visual-storyteller.md +0 -150
  521. package/.claude/agents/design/design-whimsy-injector.md +0 -439
  522. package/.claude/agents/v3/integration-architect.md +0 -338
  523. package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +0 -54
  524. package/.claude/commands/coordination/init.md +0 -44
  525. package/.claude/commands/coordination/orchestrate.md +0 -43
  526. package/.claude/commands/coordination/spawn.md +0 -45
  527. package/.claude/commands/github/code-review-swarm.md +0 -550
  528. package/.claude/commands/github/code-review.md +0 -25
  529. package/.claude/commands/github/github-swarm.md +0 -121
  530. package/.claude/commands/github/issue-triage.md +0 -25
  531. package/.claude/commands/github/multi-repo-swarm.md +0 -519
  532. package/.claude/commands/github/pr-enhance.md +0 -26
  533. package/.claude/commands/github/project-board-sync.md +0 -471
  534. package/.claude/commands/github/release-swarm.md +0 -590
  535. package/.claude/commands/github/repo-analyze.md +0 -25
  536. package/.claude/commands/github/swarm-issue.md +0 -482
  537. package/.claude/commands/github/swarm-pr.md +0 -310
  538. package/.claude/commands/github/workflow-automation.md +0 -468
  539. package/.claude/commands/hive-mind/hive-mind-metrics.md +0 -8
  540. package/.claude/commands/hive-mind/hive-mind-resume.md +0 -8
  541. package/.claude/commands/hive-mind/hive-mind-sessions.md +0 -8
  542. package/.claude/commands/hive-mind/hive-mind-wizard.md +0 -8
  543. package/.claude/commands/list-agents.md +0 -17
  544. package/.claude/commands/memory/memory-persist.md +0 -25
  545. package/.claude/commands/memory/memory-usage.md +0 -25
  546. package/.claude/commands/memory/neural.md +0 -47
  547. package/.claude/commands/metrics.md +0 -11
  548. package/.claude/commands/monitoring/real-time-view.md +0 -25
  549. package/.claude/commands/monitoring/swarm-monitor.md +0 -25
  550. package/.claude/commands/monomind-createtask.md +0 -302
  551. package/.claude/commands/monomind-help.md +0 -103
  552. package/.claude/commands/monomind-memory.md +0 -107
  553. package/.claude/commands/monomind-repeat.md +0 -149
  554. package/.claude/commands/monomind-swarm.md +0 -205
  555. package/.claude/commands/optimization/cache-manage.md +0 -25
  556. package/.claude/commands/optimization/topology-optimize.md +0 -25
  557. package/.claude/commands/pair/commands.md +0 -546
  558. package/.claude/commands/pair/config.md +0 -510
  559. package/.claude/commands/pair/start.md +0 -209
  560. package/.claude/commands/use-agent.md +0 -67
  561. package/.claude/skills/monomind-createtask/SKILL.md +0 -269
  562. package/.claude/skills/monomind-task-engine/SKILL.md +0 -358
  563. /package/.claude/agents/{v3 → specialists}/memory-specialist.md +0 -0
  564. /package/.claude/agents/{v3 → specialists}/performance-engineer.md +0 -0
  565. /package/.claude/agents/{v3 → specialists}/queen-coordinator.md +0 -0
  566. /package/.claude/agents/{v3 → specialists}/security-architect.md +0 -0
@@ -76,12 +76,35 @@ export function jsonValid(output) {
76
76
  * Checks whether the output matches a custom regex pattern.
77
77
  */
78
78
  export function customRegex(output, config) {
79
+ // Reject overly long patterns and those with nested/repeated quantifiers
80
+ // (catastrophic backtracking — a malicious benchmark definition could
81
+ // pin CI runners with `^(a+)+$` against a long output string).
82
+ if (typeof config.pattern !== 'string' || config.pattern.length > 200) {
83
+ return {
84
+ type: 'custom_regex',
85
+ passed: false,
86
+ actual: null,
87
+ expected: config.pattern,
88
+ message: 'Pattern rejected: too long or invalid',
89
+ };
90
+ }
91
+ if (/(\(.*[+*?].*\)|[+*?]){2,}|\{[0-9,]+\}.*[+*?]|\([^)]*\|[^)]*\)[+*?{]/.test(config.pattern)) {
92
+ return {
93
+ type: 'custom_regex',
94
+ passed: false,
95
+ actual: null,
96
+ expected: config.pattern,
97
+ message: 'Pattern rejected: nested quantifiers risk catastrophic backtracking',
98
+ };
99
+ }
100
+ // Cap output length so even slow patterns can't burn unlimited CPU
101
+ const boundedOutput = output.length > 1024 * 1024 ? output.slice(0, 1024 * 1024) : output;
79
102
  const regex = new RegExp(config.pattern);
80
- const match = regex.test(output);
103
+ const match = regex.test(boundedOutput);
81
104
  return {
82
105
  type: 'custom_regex',
83
106
  passed: match,
84
- actual: match ? output.match(regex)?.[0] ?? null : null,
107
+ actual: match ? boundedOutput.match(regex)?.[0] ?? null : null,
85
108
  expected: config.pattern,
86
109
  message: match
87
110
  ? `Output matches pattern /${config.pattern}/`
@@ -34,7 +34,9 @@ function updateSwarmActivityMetrics(agentCountDelta) {
34
34
  swarm.coordination_active = newCount > 0;
35
35
  data.swarm = swarm;
36
36
  data.timestamp = new Date().toISOString();
37
- fs.writeFileSync(activityPath, JSON.stringify(data, null, 2));
37
+ const tmpPath = activityPath + '.tmp';
38
+ fs.writeFileSync(tmpPath, JSON.stringify(data, null, 2));
39
+ fs.renameSync(tmpPath, activityPath);
38
40
  }
39
41
  catch {
40
42
  // Non-critical — don't fail the command if metrics update fails
@@ -125,7 +127,7 @@ const spawnCommand = {
125
127
  const taskDescription = ctx.flags.task;
126
128
  if (!agentType && taskDescription) {
127
129
  try {
128
- const { RouteLayer, ALL_ROUTES } = await import('@monoes/routing');
130
+ const { RouteLayer, ALL_ROUTES } = await import('@monomind/routing');
129
131
  const layer = new RouteLayer({ routes: ALL_ROUTES });
130
132
  const routeResult = await layer.route(taskDescription);
131
133
  agentType = routeResult.agentSlug;
@@ -154,7 +156,7 @@ const spawnCommand = {
154
156
  model: ctx.flags.model,
155
157
  task: ctx.flags.task,
156
158
  timeout: ctx.flags.timeout,
157
- autoTools: ctx.flags.autoTools,
159
+ autoTools: ctx.flags['auto-tools'],
158
160
  },
159
161
  priority: 'normal',
160
162
  metadata: {
@@ -602,7 +604,7 @@ const poolCommand = {
602
604
  size: ctx.flags.size,
603
605
  min: ctx.flags.min,
604
606
  max: ctx.flags.max,
605
- autoScale: ctx.flags.autoScale ?? true,
607
+ autoScale: ctx.flags['auto-scale'] ?? true,
606
608
  });
607
609
  if (ctx.flags.format === 'json') {
608
610
  output.printJson(result);
@@ -3,6 +3,7 @@
3
3
  * Sign, publish, and hot-patch RVFA appliances.
4
4
  */
5
5
  import { output } from '../output.js';
6
+ import * as path from 'node:path';
6
7
  function fmtSize(bytes) {
7
8
  if (bytes < 1024)
8
9
  return `${bytes} B`;
@@ -15,6 +16,16 @@ function fmtSize(bytes) {
15
16
  function errMsg(err) {
16
17
  return err instanceof Error ? err.message : String(err);
17
18
  }
19
+ function checkRelativePath(userPath) {
20
+ if (!path.isAbsolute(userPath)) {
21
+ const resolved = path.resolve(userPath);
22
+ const rel = path.relative(process.cwd(), resolved);
23
+ if (rel.startsWith('..')) {
24
+ return `Relative path '${userPath}' escapes the working directory.`;
25
+ }
26
+ }
27
+ return null;
28
+ }
18
29
  const fail = (msg, detail) => {
19
30
  output.printError(msg, detail);
20
31
  return { success: false, exitCode: 1 };
@@ -69,6 +80,9 @@ export const signCommand = {
69
80
  hdr('Signing RVFA Appliance');
70
81
  let privateKey;
71
82
  if (keyPath) {
83
+ const pathErr = checkRelativePath(keyPath);
84
+ if (pathErr)
85
+ return fail(pathErr);
72
86
  const fs = await import('fs');
73
87
  privateKey = fs.readFileSync(keyPath);
74
88
  }
@@ -162,12 +176,18 @@ export const updateAppCommand = {
162
176
  output.writeln();
163
177
  let patchBuf;
164
178
  if (patchPath) {
179
+ const patchPathErr = checkRelativePath(patchPath);
180
+ if (patchPathErr)
181
+ return fail(patchPathErr);
165
182
  if (!(await requireFile(patchPath)))
166
183
  return { success: false, exitCode: 1 };
167
184
  patchBuf = fs.readFileSync(patchPath);
168
185
  output.printInfo(`Patch file: ${patchPath} (${fmtSize(patchBuf.length)})`);
169
186
  }
170
187
  else {
188
+ const dataPathErr = checkRelativePath(dataPath);
189
+ if (dataPathErr)
190
+ return fail(dataPathErr);
171
191
  if (!(await requireFile(dataPath)))
172
192
  return { success: false, exitCode: 1 };
173
193
  const newData = fs.readFileSync(dataPath);
@@ -186,6 +206,9 @@ export const updateAppCommand = {
186
206
  let pubKey;
187
207
  if (ctx.flags['public-key']) {
188
208
  const pkPath = ctx.flags['public-key'];
209
+ const pkPathErr = checkRelativePath(pkPath);
210
+ if (pkPathErr)
211
+ return fail(pkPathErr);
189
212
  if (!(await requireFile(pkPath)))
190
213
  return { success: false, exitCode: 1 };
191
214
  pubKey = fs.readFileSync(pkPath);
@@ -6,6 +6,8 @@
6
6
  */
7
7
  import { output } from '../output.js';
8
8
  import { loadState, saveState, appendLog, loadLog, discoverTasks, getProgress, calculateReward, tryLoadLearning, validateNumber, validateTaskSources, LOG_FILE, } from '../autopilot-state.js';
9
+ import { writeFileSync } from 'node:fs';
10
+ import { resolve } from 'node:path';
9
11
  // ── Check Handler (for Stop hook) ─────────────────────────────
10
12
  export async function autopilotCheck() {
11
13
  const state = loadState();
@@ -182,10 +184,8 @@ const logCommand = {
182
184
  ],
183
185
  action: async (ctx) => {
184
186
  if (ctx.flags?.clear) {
185
- const fs = require('fs');
186
- const path = require('path');
187
187
  try {
188
- fs.writeFileSync(path.resolve(LOG_FILE), '[]');
188
+ writeFileSync(resolve(LOG_FILE), '[]');
189
189
  }
190
190
  catch { /* ignore */ }
191
191
  output.writeln('Autopilot log cleared');
@@ -5,8 +5,9 @@
5
5
  * @module v1/cli/commands/benchmark
6
6
  */
7
7
  import { output } from '../output.js';
8
- import { writeFileSync, existsSync, mkdirSync } from 'node:fs';
8
+ import { writeFileSync, renameSync, readFileSync, existsSync, mkdirSync } from 'node:fs';
9
9
  import { join } from 'node:path';
10
+ import { BenchmarkRunner } from '../benchmarks/benchmark-runner.js';
10
11
  // ============================================================================
11
12
  // Pretrain Benchmark Subcommand
12
13
  // ============================================================================
@@ -50,7 +51,9 @@ const pretrainCommand = {
50
51
  mkdirSync(resultsDir, { recursive: true });
51
52
  }
52
53
  const savePath = saveFile.startsWith('/') ? saveFile : join(resultsDir, saveFile);
53
- writeFileSync(savePath, JSON.stringify(results, null, 2));
54
+ const saveTmp = savePath + '.tmp';
55
+ writeFileSync(saveTmp, JSON.stringify(results, null, 2));
56
+ renameSync(saveTmp, savePath);
54
57
  output.writeln(output.success(`Results saved to ${savePath}`));
55
58
  }
56
59
  const allPassed = results.results.every(r => r.targetMet);
@@ -276,7 +279,7 @@ const memoryCommand = {
276
279
  searchEntries = memory.searchEntries;
277
280
  }
278
281
  catch {
279
- // @monoes/memory not available — return null metrics instead of fake numbers
282
+ // @monomind/memory not available — return null metrics instead of fake numbers
280
283
  storeEntry = async () => ({ success: true });
281
284
  searchEntries = async () => ({ results: [], searchTime: 0 }); // 0 = no-op fallback, not a real benchmark
282
285
  }
@@ -410,17 +413,121 @@ const allCommand = {
410
413
  mkdirSync(resultsDir, { recursive: true });
411
414
  }
412
415
  const savePath = saveFile.startsWith('/') ? saveFile : join(resultsDir, saveFile);
413
- writeFileSync(savePath, JSON.stringify({
416
+ const saveTmp2 = savePath + '.tmp';
417
+ writeFileSync(saveTmp2, JSON.stringify({
414
418
  timestamp: new Date().toISOString(),
415
419
  duration: totalDuration,
416
420
  results: allResults,
417
421
  }, null, 2));
422
+ renameSync(saveTmp2, savePath);
418
423
  output.writeln(output.success(`Results saved to ${savePath}`));
419
424
  }
420
425
  return { success: true, message: 'All benchmarks complete' };
421
426
  },
422
427
  };
423
428
  // ============================================================================
429
+ // Regression Benchmark Subcommand
430
+ // ============================================================================
431
+ const regressionCommand = {
432
+ name: 'regression',
433
+ description: 'Quality regression testing using benchmark definitions and baselines',
434
+ options: [
435
+ { name: 'suite', short: 's', type: 'string', description: 'Path to benchmark definitions directory', default: '.monomind/benchmarks/definitions' },
436
+ { name: 'benchmark-id', short: 'b', type: 'string', description: 'Run a specific benchmark by ID' },
437
+ { name: 'agent-output', short: 'a', type: 'string', description: 'Path to file containing agent output to evaluate' },
438
+ { name: 'pin-baseline', type: 'boolean', description: 'Save current results as the new baseline', default: 'false' },
439
+ { name: 'output', short: 'o', type: 'string', description: 'Output format: text, json', default: 'text' },
440
+ ],
441
+ examples: [
442
+ { command: 'monomind benchmark regression', description: 'List all benchmark definitions' },
443
+ { command: 'monomind benchmark regression -b agent-spawn -a output.txt', description: 'Evaluate agent output against a benchmark' },
444
+ { command: 'monomind benchmark regression -b agent-spawn -a output.txt --pin-baseline', description: 'Evaluate and pin results as new baseline' },
445
+ ],
446
+ action: async (ctx) => {
447
+ const suiteDir = ctx.flags.suite || '.monomind/benchmarks/definitions';
448
+ const benchmarkId = ctx.flags['benchmark-id'];
449
+ const agentOutputFile = ctx.flags['agent-output'];
450
+ const pinBaseline = ctx.flags['pin-baseline'] === true;
451
+ const outputFormat = ctx.flags.output || 'text';
452
+ const runner = new BenchmarkRunner();
453
+ const baselinesDir = join(process.cwd(), '.monomind', 'benchmarks', 'baselines');
454
+ const definitions = runner.loadBenchmarks(join(process.cwd(), suiteDir));
455
+ if (definitions.length === 0) {
456
+ output.writeln(output.dim(`No benchmark definitions found in ${suiteDir}`));
457
+ output.writeln(output.dim('Create JSON files there to define quality benchmarks.'));
458
+ return { success: true, message: 'No benchmarks defined' };
459
+ }
460
+ // List mode — no agent output provided
461
+ if (!agentOutputFile) {
462
+ output.writeln();
463
+ output.writeln(output.bold('Benchmark Definitions'));
464
+ output.writeln(output.dim('─'.repeat(50)));
465
+ for (const def of definitions) {
466
+ output.writeln(` ${output.highlight(def.benchmarkId)} ${output.dim(def.agentSlug)} — ${def.qualityMetrics?.length ?? 0} metrics`);
467
+ }
468
+ output.writeln();
469
+ output.writeln(output.dim('Use --agent-output <file> to evaluate against a benchmark.'));
470
+ return { success: true, message: `${definitions.length} benchmarks loaded` };
471
+ }
472
+ // Evaluation mode
473
+ if (!existsSync(agentOutputFile)) {
474
+ output.writeln(output.error(`Agent output file not found: ${agentOutputFile}`));
475
+ return { success: false, message: 'Agent output file not found' };
476
+ }
477
+ const agentOutput = readFileSync(agentOutputFile, 'utf-8');
478
+ const targetDefs = benchmarkId
479
+ ? definitions.filter((d) => d.benchmarkId === benchmarkId)
480
+ : definitions;
481
+ if (targetDefs.length === 0) {
482
+ output.writeln(output.error(`No benchmark found with id: ${benchmarkId}`));
483
+ return { success: false, message: 'Benchmark not found' };
484
+ }
485
+ const results = targetDefs.map((def) => runner.runBenchmark(def, agentOutput));
486
+ if (outputFormat === 'json') {
487
+ output.writeln(JSON.stringify(results, null, 2));
488
+ }
489
+ else {
490
+ output.writeln();
491
+ output.writeln(output.bold('Regression Results'));
492
+ output.writeln(output.dim('─'.repeat(50)));
493
+ for (const result of results) {
494
+ const status = result.passed ? output.success('PASS') : output.error('FAIL');
495
+ output.writeln(` ${status} ${result.benchmarkId} ${output.dim(`${result.durationMs}ms`)}`);
496
+ for (const m of result.metricResults) {
497
+ const mStatus = m.passed ? ' ✓' : ' ✗';
498
+ output.writeln(` ${mStatus} ${m.type}`);
499
+ }
500
+ }
501
+ output.writeln();
502
+ }
503
+ // Baseline comparison
504
+ const baselinePath = join(baselinesDir, `${benchmarkId ?? 'all'}.json`);
505
+ if (existsSync(baselinePath)) {
506
+ const baseline = JSON.parse(readFileSync(baselinePath, 'utf-8'));
507
+ const hasRegression = runner.detectRegression(results, baseline);
508
+ if (hasRegression) {
509
+ output.writeln(output.error(`Regression detected — pass rate dropped below baseline (${(baseline.passRate * 100).toFixed(0)}%)`));
510
+ }
511
+ else {
512
+ output.writeln(output.success('No regression detected vs baseline'));
513
+ }
514
+ }
515
+ // Pin baseline
516
+ if (pinBaseline) {
517
+ if (!existsSync(baselinesDir))
518
+ mkdirSync(baselinesDir, { recursive: true });
519
+ const id = benchmarkId ?? 'all';
520
+ const baseline = runner.pinBaseline(id, results);
521
+ const baselineTmp = baselinePath + '.tmp';
522
+ writeFileSync(baselineTmp, JSON.stringify(baseline, null, 2));
523
+ renameSync(baselineTmp, baselinePath);
524
+ output.writeln(output.success(`Baseline pinned: ${(baseline.passRate * 100).toFixed(0)}% pass rate`));
525
+ }
526
+ const allPassed = results.every((r) => r.passed);
527
+ return { success: allPassed, message: allPassed ? 'All metrics passed' : 'Some metrics failed' };
528
+ },
529
+ };
530
+ // ============================================================================
424
531
  // Main Benchmark Command
425
532
  // ============================================================================
426
533
  export const benchmarkCommand = {
@@ -431,12 +538,15 @@ export const benchmarkCommand = {
431
538
  neuralCommand,
432
539
  memoryCommand,
433
540
  allCommand,
541
+ regressionCommand,
434
542
  ],
435
543
  examples: [
436
544
  { command: 'monomind benchmark pretrain', description: 'Benchmark pre-training system' },
437
545
  { command: 'monomind benchmark neural', description: 'Benchmark neural operations' },
438
546
  { command: 'monomind benchmark memory', description: 'Benchmark memory operations' },
439
547
  { command: 'monomind benchmark all', description: 'Run all benchmarks' },
548
+ { command: 'monomind benchmark regression', description: 'List quality regression benchmarks' },
549
+ { command: 'monomind benchmark regression -b my-bench -a output.txt', description: 'Evaluate agent output against a benchmark' },
440
550
  ],
441
551
  action: async (_ctx) => {
442
552
  output.writeln();
@@ -444,10 +554,11 @@ export const benchmarkCommand = {
444
554
  output.writeln(output.dim('─'.repeat(50)));
445
555
  output.writeln();
446
556
  output.writeln('Available subcommands:');
447
- output.writeln(` ${output.highlight('pretrain')} - Benchmark self-learning pre-training (SONA, EWC++, MoE)`);
448
- output.writeln(` ${output.highlight('neural')} - Benchmark neural operations (embeddings, WASM)`);
449
- output.writeln(` ${output.highlight('memory')} - Benchmark memory operations (HNSW, store, search)`);
450
- output.writeln(` ${output.highlight('all')} - Run all benchmark suites`);
557
+ output.writeln(` ${output.highlight('pretrain')} - Benchmark self-learning pre-training (SONA, EWC++, MoE)`);
558
+ output.writeln(` ${output.highlight('neural')} - Benchmark neural operations (embeddings, WASM)`);
559
+ output.writeln(` ${output.highlight('memory')} - Benchmark memory operations (HNSW, store, search)`);
560
+ output.writeln(` ${output.highlight('all')} - Run all benchmark suites`);
561
+ output.writeln(` ${output.highlight('regression')} - Quality regression testing with baselines`);
451
562
  output.writeln();
452
563
  output.writeln('Examples:');
453
564
  output.writeln(' monomind benchmark pretrain -i 200');
@@ -5,27 +5,39 @@
5
5
  * github.com/nokhodian/monomind
6
6
  */
7
7
  import { output } from '../output.js';
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import { homedir } from 'os';
8
11
  const CLAIMS_CONFIG_PATHS = [
9
12
  '.monomind/claims.json',
10
13
  'monomind.claims.json',
11
14
  ];
12
15
  function getClaimsConfigPaths() {
13
- // Lazy import to keep top-level synchronous
14
- // eslint-disable-next-line @typescript-eslint/no-var-requires
15
- const path = require('path');
16
16
  return [
17
17
  path.resolve(CLAIMS_CONFIG_PATHS[0]),
18
18
  path.resolve(CLAIMS_CONFIG_PATHS[1]),
19
- path.resolve(process.env.HOME || '~', '.config/monomind/claims.json'),
19
+ path.resolve(homedir(), '.config/monomind/claims.json'),
20
20
  ];
21
21
  }
22
+ function safeParseJson(content) {
23
+ const parsed = JSON.parse(content);
24
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
25
+ throw new Error('Claims config must be a JSON object');
26
+ }
27
+ const safe = Object.create(null);
28
+ for (const key of Object.keys(parsed)) {
29
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype')
30
+ continue;
31
+ safe[key] = parsed[key];
32
+ }
33
+ return safe;
34
+ }
22
35
  function loadClaimsConfig() {
23
- const fs = require('fs');
24
36
  const configPaths = getClaimsConfigPaths();
25
37
  for (const configPath of configPaths) {
26
38
  if (fs.existsSync(configPath)) {
27
39
  const content = fs.readFileSync(configPath, 'utf-8');
28
- return { config: JSON.parse(content), path: configPath };
40
+ return { config: safeParseJson(content), path: configPath };
29
41
  }
30
42
  }
31
43
  // Return default config with the first path as the default write location
@@ -41,8 +53,6 @@ function loadClaimsConfig() {
41
53
  return { config: defaultConfig, path: configPaths[0] };
42
54
  }
43
55
  function saveClaimsConfig(config, configPath) {
44
- const fs = require('fs');
45
- const path = require('path');
46
56
  const dir = path.dirname(configPath);
47
57
  if (!fs.existsSync(dir)) {
48
58
  fs.mkdirSync(dir, { recursive: true });
@@ -166,7 +176,7 @@ const checkCommand = {
166
176
  const claimsConfigPaths = [
167
177
  path.resolve('.monomind/claims.json'),
168
178
  path.resolve('monomind.claims.json'),
169
- path.resolve(process.env.HOME || '~', '.config/monomind/claims.json'),
179
+ path.resolve(homedir(), '.config/monomind/claims.json'),
170
180
  ];
171
181
  let claimsConfig = {
172
182
  // Default policy - allows basic operations
@@ -181,7 +191,7 @@ const checkCommand = {
181
191
  for (const configPath of claimsConfigPaths) {
182
192
  if (fs.existsSync(configPath)) {
183
193
  const content = fs.readFileSync(configPath, 'utf-8');
184
- claimsConfig = { ...claimsConfig, ...JSON.parse(content) };
194
+ claimsConfig = { ...claimsConfig, ...safeParseJson(content) };
185
195
  policySource = configPath;
186
196
  break;
187
197
  }
@@ -235,10 +245,8 @@ const checkCommand = {
235
245
  }
236
246
  catch (error) {
237
247
  spinner.stop();
238
- // On error, fall back to permissive default
239
- isGranted = !claim.startsWith('admin:');
240
- reason = isGranted ? 'Granted (default permissive policy)' : 'Admin claims require explicit grant';
241
- policySource = 'fallback';
248
+ output.printError(`Failed to evaluate claim: ${error instanceof Error ? error.message : String(error)}`);
249
+ return { success: false, exitCode: 1 };
242
250
  }
243
251
  if (isGranted) {
244
252
  output.writeln(output.success('✓ Claim granted'));
@@ -3,6 +3,7 @@
3
3
  * Configuration management
4
4
  */
5
5
  import { output } from '../output.js';
6
+ import { confirm } from '../prompt.js';
6
7
  import { configManager, parseConfigValue } from '../services/config-file-manager.js';
7
8
  import * as path from 'path';
8
9
  // Init configuration
@@ -146,6 +147,13 @@ const setCommand = {
146
147
  output.printError('Both key and value are required');
147
148
  return { success: false, exitCode: 1 };
148
149
  }
150
+ const FORBIDDEN_KEY_SEGMENTS = new Set(['__proto__', 'constructor', 'prototype']);
151
+ for (const seg of key.split('.')) {
152
+ if (FORBIDDEN_KEY_SEGMENTS.has(seg)) {
153
+ output.printError(`Forbidden config key segment: "${seg}"`);
154
+ return { success: false, exitCode: 1 };
155
+ }
156
+ }
149
157
  try {
150
158
  const parsedValue = parseConfigValue(value);
151
159
  configManager.set(ctx.cwd, key, parsedValue);
@@ -311,6 +319,25 @@ const resetCommand = {
311
319
  ],
312
320
  action: async (ctx) => {
313
321
  try {
322
+ if (!ctx.flags.force && ctx.interactive) {
323
+ const confirmed = await confirm({ message: 'This will reset all configuration to defaults. Continue?', default: false });
324
+ if (!confirmed)
325
+ return { success: true, message: 'Reset cancelled' };
326
+ }
327
+ const section = ctx.flags.section;
328
+ if (section && section !== 'all') {
329
+ // Scoped reset: remove only the specified section key from the config.
330
+ // Setting to undefined causes JSON serialization to omit the key, effectively removing it.
331
+ const current = configManager.getConfig(ctx.cwd);
332
+ if (section in current) {
333
+ configManager.set(ctx.cwd, section, configManager.getDefaults()[section]);
334
+ output.writeln(`Section "${section}" reset to defaults`);
335
+ }
336
+ else {
337
+ output.printWarning(`Section "${section}" not found in configuration`);
338
+ }
339
+ return { success: true };
340
+ }
314
341
  const configPath = configManager.reset(ctx.cwd);
315
342
  output.writeln(`Configuration reset to defaults: ${configPath}`);
316
343
  return { success: true };
@@ -344,6 +371,11 @@ const exportCommand = {
344
371
  ],
345
372
  action: async (ctx) => {
346
373
  try {
374
+ const format = ctx.flags.format || 'json';
375
+ if (format === 'yaml') {
376
+ // configManager.exportTo does not support YAML serialization; export as JSON instead
377
+ output.printWarning('YAML export is not supported. Exporting as JSON.');
378
+ }
347
379
  const exportPath = ctx.flags.output || ctx.args[0] || 'monomind.config.export.json';
348
380
  configManager.exportTo(ctx.cwd, exportPath);
349
381
  const resolved = path.resolve(ctx.cwd, exportPath);
@@ -6,7 +6,7 @@ import { output } from '../output.js';
6
6
  import { getDaemon, startDaemon, stopDaemon } from '../services/worker-daemon.js';
7
7
  import { spawn } from 'child_process';
8
8
  import { fileURLToPath } from 'url';
9
- import { dirname, join, resolve } from 'path';
9
+ import { dirname, join, resolve, sep } from 'path';
10
10
  import * as fs from 'fs';
11
11
  // Start daemon subcommand
12
12
  const startCommand = {
@@ -185,12 +185,9 @@ function validatePath(path, label) {
185
185
  throw new Error(`${label} contains shell metacharacters`);
186
186
  }
187
187
  // Prevent path traversal outside expected directories
188
- if (!resolved.includes('.monomind') && !resolved.includes('bin')) {
189
- // Allow only paths within project structure
190
- const cwd = process.cwd();
191
- if (!resolved.startsWith(cwd)) {
192
- throw new Error(`${label} escapes project directory`);
193
- }
188
+ const cwd = process.cwd();
189
+ if (!resolved.startsWith(cwd + sep) && !resolved.startsWith(cwd + '/') && resolved !== cwd) {
190
+ throw new Error(`${label} escapes project directory`);
194
191
  }
195
192
  }
196
193
  /**
@@ -237,7 +234,7 @@ async function startBackgroundDaemon(projectRoot, quiet, maxCpuLoad, minFreeMemo
237
234
  // Prevent macOS SIGHUP kill when terminal closes
238
235
  ...(process.platform === 'darwin' ? { NOHUP: '1' } : {}),
239
236
  },
240
- ...(isWin ? { shell: true, windowsHide: true } : {}),
237
+ ...(isWin ? { windowsHide: true } : {}),
241
238
  };
242
239
  // Use spawn with explicit arguments instead of shell string interpolation
243
240
  // This prevents command injection via paths
@@ -271,12 +268,17 @@ async function startBackgroundDaemon(projectRoot, quiet, maxCpuLoad, minFreeMemo
271
268
  // Write PID file only if the child hasn't already written its own.
272
269
  // The foreground child calls writePidFile() internally, but on some platforms
273
270
  // it may not have started yet, so we write as a fallback.
274
- if (!fs.existsSync(pidFile)) {
275
- fs.writeFileSync(pidFile, String(pid));
271
+ // Use 'wx' flag for atomic exclusive create — avoids TOCTOU race.
272
+ try {
273
+ fs.writeFileSync(pidFile, String(pid), { flag: 'wx' });
274
+ }
275
+ catch {
276
+ // File already exists (child wrote it first) — that's expected, ignore
276
277
  }
277
278
  if (!quiet) {
279
+ const actualLogPath = join(resolvedRoot, '.monomind', 'logs', 'daemon.log');
278
280
  output.printSuccess(`Daemon started in background (PID: ${pid})`);
279
- output.printInfo(`Logs: ${logFile}`);
281
+ output.printInfo(`Logs: ${actualLogPath}`);
280
282
  output.printInfo(`Stop with: monomind daemon stop`);
281
283
  }
282
284
  return { success: true };
@@ -26,13 +26,27 @@ function loadDeploymentState(cwd) {
26
26
  }
27
27
  try {
28
28
  const raw = fs.readFileSync(filePath, 'utf-8');
29
- return JSON.parse(raw);
29
+ const parsed = JSON.parse(raw);
30
+ // Strip proto-pollution keys before casting
31
+ const DANGEROUS = new Set(['__proto__', 'constructor', 'prototype']);
32
+ if (parsed !== null && typeof parsed === 'object') {
33
+ for (const k of DANGEROUS) {
34
+ if (Object.prototype.hasOwnProperty.call(parsed, k))
35
+ delete parsed[k];
36
+ }
37
+ }
38
+ return parsed;
30
39
  }
31
40
  catch {
32
41
  return emptyState();
33
42
  }
34
43
  }
44
+ const MAX_DEPLOYMENT_HISTORY = 1000;
35
45
  function saveDeploymentState(cwd, state) {
46
+ // Cap history to prevent unbounded file growth
47
+ if (state.history.length > MAX_DEPLOYMENT_HISTORY) {
48
+ state.history = state.history.slice(-MAX_DEPLOYMENT_HISTORY);
49
+ }
36
50
  const dir = getStateDir(cwd);
37
51
  if (!fs.existsSync(dir)) {
38
52
  fs.mkdirSync(dir, { recursive: true });
@@ -218,10 +232,11 @@ const statusCommand = {
218
232
  output.writeln(output.dim('No environments configured'));
219
233
  }
220
234
  // Recent history (last 5)
221
- let recent = [...state.history].reverse().slice(0, 5);
235
+ let recent = [...state.history].reverse();
222
236
  if (filterEnv) {
223
237
  recent = recent.filter(r => r.environment === filterEnv);
224
238
  }
239
+ recent = recent.slice(0, 5);
225
240
  if (recent.length > 0) {
226
241
  output.writeln();
227
242
  output.writeln(output.bold('Recent Deployments'));
@@ -268,6 +283,10 @@ const rollbackCommand = {
268
283
  return { success: false, exitCode: 1 };
269
284
  }
270
285
  const targetVersion = ctx.flags['version'] ? String(ctx.flags['version']) : null;
286
+ const steps = parseInt(ctx.flags.steps || '1', 10);
287
+ if (steps > 1) {
288
+ output.printWarning(`Multi-step rollback (--steps ${steps}) is not yet implemented. Rolling back 1 step only.`);
289
+ }
271
290
  const state = loadDeploymentState(ctx.cwd);
272
291
  // Find deployments for this environment in reverse chronological order
273
292
  const envHistory = state.history
@@ -9,6 +9,7 @@ import { existsSync, readFileSync, statSync } from 'fs';
9
9
  import { join, dirname } from 'path';
10
10
  import { fileURLToPath } from 'url';
11
11
  import { execSync, exec } from 'child_process';
12
+ import { homedir } from 'os';
12
13
  import { promisify } from 'util';
13
14
  // Promisified exec with proper shell and env inheritance for cross-platform support
14
15
  const execAsync = promisify(exec);
@@ -178,8 +179,8 @@ async function checkGitRepo() {
178
179
  // Check MCP servers
179
180
  async function checkMcpServers() {
180
181
  const mcpConfigPaths = [
181
- join(process.env.HOME || '', '.claude/claude_desktop_config.json'),
182
- join(process.env.HOME || '', '.config/claude/mcp.json'),
182
+ join(homedir(), '.claude/claude_desktop_config.json'),
183
+ join(homedir(), '.config/claude/mcp.json'),
183
184
  '.mcp.json'
184
185
  ];
185
186
  for (const configPath of mcpConfigPaths) {
@@ -188,7 +189,7 @@ async function checkMcpServers() {
188
189
  const content = JSON.parse(readFileSync(configPath, 'utf8'));
189
190
  const servers = content.mcpServers || content.servers || {};
190
191
  const count = Object.keys(servers).length;
191
- const hasMonomind = 'monomind' in servers || 'monomind_alpha' in servers || 'monomind' in servers || 'monomind_alpha' in servers;
192
+ const hasMonomind = 'monomind' in servers || 'monomind_alpha' in servers;
192
193
  if (hasMonomind) {
193
194
  return { name: 'MCP Servers', status: 'pass', message: `${count} servers (monomind configured)` };
194
195
  }
@@ -263,7 +264,7 @@ async function checkVersionFreshness() {
263
264
  const pkg = JSON.parse(readFileSync(candidate, 'utf8'));
264
265
  if (pkg.version &&
265
266
  typeof pkg.name === 'string' &&
266
- (pkg.name === '@monomind/cli' || pkg.name === 'monomind' || pkg.name === 'monomind')) {
267
+ (pkg.name === '@monomind/cli' || pkg.name === 'monomind')) {
267
268
  currentVersion = pkg.version;
268
269
  break;
269
270
  }