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.
- package/.claude/agents/design/design-monodesign.md +121 -0
- package/.claude/agents/github/issue-tracker.md +12 -12
- package/.claude/agents/github/pr-manager.md +10 -10
- package/.claude/agents/github/release-manager.md +49 -105
- package/.claude/agents/github/repo-architect.md +73 -92
- package/.claude/agents/github/sync-coordinator.md +55 -123
- package/.claude/agents/marketing/marketing-competitive-content.md +155 -0
- package/.claude/agents/marketing/marketing-content-creator.md +13 -0
- package/.claude/agents/marketing/marketing-cro-specialist.md +147 -0
- package/.claude/agents/marketing/marketing-email-specialist.md +90 -0
- package/.claude/agents/marketing/marketing-launch-strategist.md +129 -0
- package/.claude/agents/marketing/marketing-pricing-strategist.md +127 -0
- package/.claude/agents/specialists/integration-architect.md +94 -0
- package/.claude/commands/agents/README.md +4 -0
- package/.claude/commands/agents/agent-capabilities.md +6 -2
- package/.claude/commands/agents/agent-coordination.md +4 -0
- package/.claude/commands/agents/agent-spawning.md +4 -0
- package/.claude/commands/agents/agent-types.md +6 -2
- package/.claude/commands/analysis/README.md +14 -5
- package/.claude/commands/analysis/bottleneck-detect.md +30 -123
- package/.claude/commands/analysis/performance-bottlenecks.md +14 -14
- package/.claude/commands/analysis/performance-report.md +38 -11
- package/.claude/commands/analysis/token-efficiency.md +13 -16
- package/.claude/commands/analysis/token-usage.md +34 -12
- package/.claude/commands/automation/README.md +15 -5
- package/.claude/commands/automation/auto-agent.md +49 -85
- package/.claude/commands/automation/self-healing.md +20 -18
- package/.claude/commands/automation/session-memory.md +28 -29
- package/.claude/commands/automation/smart-agents.md +17 -9
- package/.claude/commands/automation/smart-spawn.md +52 -11
- package/.claude/commands/automation/workflow-select.md +46 -11
- package/.claude/commands/browse.md +5 -0
- package/.claude/commands/coordination/README.md +9 -5
- package/.claude/commands/coordination/agent-spawn.md +53 -9
- package/.claude/commands/coordination/swarm-init.md +39 -42
- package/.claude/commands/coordination/task-orchestrate.md +65 -11
- package/.claude/commands/github/README.md +21 -8
- package/.claude/commands/github/github-modes.md +9 -5
- package/.claude/commands/github/issue-tracker.md +34 -33
- package/.claude/commands/github/pr-manager.md +20 -17
- package/.claude/commands/github/release-manager.md +37 -49
- package/.claude/commands/github/repo-architect.md +39 -41
- package/.claude/commands/github/sync-coordinator.md +45 -49
- package/.claude/commands/hive-mind/README.md +42 -17
- package/.claude/commands/hive-mind/hive-mind-consensus.md +68 -4
- package/.claude/commands/hive-mind/hive-mind-init.md +55 -5
- package/.claude/commands/hive-mind/hive-mind-memory.md +69 -4
- package/.claude/commands/hive-mind/hive-mind-spawn.md +71 -10
- package/.claude/commands/hive-mind/hive-mind-status.md +52 -4
- package/.claude/commands/hive-mind/hive-mind-stop.md +51 -4
- package/.claude/commands/hive-mind/hive-mind.md +74 -14
- package/.claude/commands/hooks/README.md +62 -7
- package/.claude/commands/hooks/overview.md +94 -35
- package/.claude/commands/hooks/post-edit.md +48 -87
- package/.claude/commands/hooks/post-task.md +37 -87
- package/.claude/commands/hooks/pre-edit.md +52 -84
- package/.claude/commands/hooks/pre-task.md +46 -81
- package/.claude/commands/hooks/session-end.md +49 -85
- package/.claude/commands/hooks/setup.md +87 -58
- package/.claude/commands/mastermind/_repeat.md +308 -0
- package/.claude/commands/mastermind/architect.md +49 -0
- package/.claude/commands/mastermind/brain.md +98 -0
- package/.claude/commands/mastermind/build.md +22 -0
- package/.claude/commands/mastermind/content.md +22 -0
- package/.claude/commands/mastermind/createorg.md +94 -0
- package/.claude/commands/mastermind/finance.md +22 -0
- package/.claude/commands/mastermind/idea.md +22 -0
- package/.claude/commands/mastermind/marketing.md +22 -0
- package/.claude/commands/mastermind/master.md +379 -0
- package/.claude/commands/mastermind/ops.md +22 -0
- package/.claude/commands/mastermind/release.md +22 -0
- package/.claude/commands/mastermind/research.md +22 -0
- package/.claude/commands/mastermind/review.md +22 -0
- package/.claude/commands/mastermind/runorg.md +106 -0
- package/.claude/commands/mastermind/sales.md +22 -0
- package/.claude/commands/mastermind/techport.md +17 -0
- package/.claude/commands/memory/README.md +75 -5
- package/.claude/commands/memory/memory-search.md +63 -11
- package/.claude/commands/monitoring/README.md +64 -4
- package/.claude/commands/monitoring/agent-metrics.md +50 -10
- package/.claude/commands/monitoring/agents.md +59 -32
- package/.claude/commands/monitoring/status.md +96 -34
- package/.claude/commands/monograph/README.md +102 -0
- package/.claude/commands/monograph/monograph-build.md +79 -0
- package/.claude/commands/monograph/monograph-search.md +96 -0
- package/.claude/commands/monograph/monograph-stats.md +53 -0
- package/.claude/commands/monograph/monograph-watch.md +63 -0
- package/.claude/commands/monograph/monograph-wiki.md +91 -0
- package/.claude/commands/monomind/createtask.md +277 -0
- package/.claude/commands/{monomind-do.md → monomind/do.md} +21 -8
- package/.claude/commands/monomind/help.md +118 -0
- package/.claude/commands/{monomind-idea.md → monomind/idea.md} +22 -28
- package/.claude/commands/{monomind-improve.md → monomind/improve.md} +21 -27
- package/.claude/commands/monomind/memory.md +230 -0
- package/.claude/commands/monomind/repeat.md +201 -0
- package/.claude/commands/monomind/review.md +313 -0
- package/.claude/commands/monomind/specialagents.md +125 -0
- package/.claude/commands/monomind/swarm.md +161 -0
- package/.claude/commands/monomind/understand.md +148 -0
- package/.claude/commands/optimization/README.md +69 -5
- package/.claude/commands/optimization/auto-topology.md +66 -43
- package/.claude/commands/optimization/parallel-execution.md +65 -39
- package/.claude/commands/optimization/performance-optimize.md +79 -0
- package/.claude/commands/pair/README.md +48 -230
- package/.claude/commands/pair/examples.md +85 -441
- package/.claude/commands/pair/modes.md +77 -303
- package/.claude/commands/pair/session.md +76 -359
- package/.claude/commands/sparc/analyzer.md +9 -26
- package/.claude/commands/sparc/architect.md +8 -25
- package/.claude/commands/sparc/ask.md +27 -68
- package/.claude/commands/sparc/batch-executor.md +8 -25
- package/.claude/commands/sparc/code.md +12 -53
- package/.claude/commands/sparc/coder.md +8 -25
- package/.claude/commands/sparc/debug.md +12 -53
- package/.claude/commands/sparc/debugger.md +8 -25
- package/.claude/commands/sparc/designer.md +8 -25
- package/.claude/commands/sparc/devops.md +16 -57
- package/.claude/commands/sparc/docs-writer.md +12 -53
- package/.claude/commands/sparc/documenter.md +8 -25
- package/.claude/commands/sparc/innovator.md +8 -25
- package/.claude/commands/sparc/integration.md +12 -53
- package/.claude/commands/sparc/mcp.md +12 -53
- package/.claude/commands/sparc/memory-manager.md +28 -25
- package/.claude/commands/sparc/optimizer.md +8 -25
- package/.claude/commands/sparc/orchestrator.md +35 -97
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +13 -54
- package/.claude/commands/sparc/refinement-optimization-mode.md +13 -54
- package/.claude/commands/sparc/researcher.md +8 -25
- package/.claude/commands/sparc/reviewer.md +8 -25
- package/.claude/commands/sparc/security-review.md +13 -54
- package/.claude/commands/sparc/sparc-modes.md +97 -151
- package/.claude/commands/sparc/sparc.md +16 -56
- package/.claude/commands/sparc/spec-pseudocode.md +13 -54
- package/.claude/commands/sparc/supabase-admin.md +19 -66
- package/.claude/commands/sparc/swarm-coordinator.md +21 -25
- package/.claude/commands/sparc/tdd.md +8 -25
- package/.claude/commands/sparc/tester.md +8 -25
- package/.claude/commands/sparc/tutorial.md +12 -53
- package/.claude/commands/sparc/workflow-manager.md +8 -25
- package/.claude/commands/sparc.md +76 -130
- package/.claude/commands/stream-chain/pipeline.md +72 -77
- package/.claude/commands/stream-chain/run.md +133 -47
- package/.claude/commands/swarm/README.md +37 -12
- package/.claude/commands/swarm/analysis.md +47 -69
- package/.claude/commands/swarm/development.md +45 -69
- package/.claude/commands/swarm/examples.md +77 -142
- package/.claude/commands/swarm/maintenance.md +47 -74
- package/.claude/commands/swarm/optimization.md +54 -87
- package/.claude/commands/swarm/research.md +47 -107
- package/.claude/commands/swarm/swarm-analysis.md +58 -4
- package/.claude/commands/swarm/swarm-background.md +61 -4
- package/.claude/commands/swarm/swarm-modes.md +63 -4
- package/.claude/commands/swarm/swarm-monitor.md +50 -4
- package/.claude/commands/swarm/swarm-status.md +40 -4
- package/.claude/commands/swarm/swarm-strategies.md +73 -5
- package/.claude/commands/swarm/swarm.md +70 -18
- package/.claude/commands/swarm/testing.md +51 -102
- package/.claude/commands/tokens.md +6 -1
- package/.claude/commands/training/README.md +36 -6
- package/.claude/commands/training/model-update.md +68 -15
- package/.claude/commands/training/neural-patterns.md +54 -55
- package/.claude/commands/training/neural-train.md +70 -16
- package/.claude/commands/training/pattern-learn.md +60 -16
- package/.claude/commands/training/specialization.md +78 -49
- package/.claude/commands/truth/start.md +87 -109
- package/.claude/commands/ts.md +7 -2
- package/.claude/commands/verify/check.md +90 -34
- package/.claude/commands/verify/start.md +71 -94
- package/.claude/commands/workflows/README.md +62 -6
- package/.claude/commands/workflows/development.md +69 -61
- package/.claude/commands/workflows/research.md +73 -47
- package/.claude/commands/workflows/workflow-create.md +75 -16
- package/.claude/commands/workflows/workflow-execute.md +94 -16
- package/.claude/commands/workflows/workflow-export.md +81 -16
- package/.claude/helpers/control-start.cjs +91 -0
- package/.claude/helpers/extras-registry.json +4104 -1991
- package/.claude/helpers/graphify-freshen.cjs +44 -13
- package/.claude/helpers/hook-handler.cjs +256 -1
- package/.claude/helpers/learning-service.mjs +0 -0
- package/.claude/helpers/loop-tracker.cjs +107 -0
- package/.claude/helpers/metrics-db.mjs +0 -0
- package/.claude/helpers/router.cjs +48 -68
- package/.claude/helpers/skill-registry.json +89 -104
- package/.claude/helpers/statusline.cjs +33 -2
- package/.claude/helpers/swarm-hooks.sh +0 -0
- package/.claude/scheduled_tasks.lock +1 -0
- package/.claude/settings.json +15 -0
- package/.claude/skills/.monomind/data/ranked-context.json +5 -0
- package/.claude/skills/.monomind/sessions/current.json +13 -0
- package/.claude/skills/.monomind/sessions/session-1777829336455.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777831614725.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777832095857.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777839814183.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777841847131.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777843309463.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777880867159.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777881884593.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777884090471.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777884808221.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777885672155.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777886852818.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777896532690.json +15 -0
- package/.claude/skills/agentdb-advanced/SKILL.md +11 -12
- package/.claude/skills/agentdb-learning/SKILL.md +20 -21
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +28 -30
- package/.claude/skills/agentdb-optimization/SKILL.md +11 -12
- package/.claude/skills/agentdb-vector-search/SKILL.md +37 -41
- package/.claude/skills/{v3-integration-deep → agentic-integration}/SKILL.md +20 -13
- package/.claude/skills/agentic-jujutsu/SKILL.md +22 -22
- package/.claude/skills/{v3-cli-modernization → cli-modernization}/SKILL.md +17 -8
- package/.claude/skills/{v3-core-implementation → core-implementation}/SKILL.md +33 -8
- package/.claude/skills/{v3-ddd-architecture → ddd-architecture}/SKILL.md +18 -25
- package/.claude/skills/github-code-review/SKILL.md +82 -83
- package/.claude/skills/github-multi-repo/SKILL.md +42 -46
- package/.claude/skills/github-project-management/SKILL.md +83 -88
- package/.claude/skills/github-release-management/SKILL.md +12 -18
- package/.claude/skills/github-workflow-automation/SKILL.md +70 -74
- package/.claude/skills/hooks-automation/SKILL.md +9 -13
- package/.claude/skills/mastermind/_intake.md +83 -0
- package/.claude/skills/mastermind/_protocol.md +275 -0
- package/.claude/skills/mastermind/architect.md +847 -0
- package/.claude/skills/mastermind/build.md +158 -0
- package/.claude/skills/mastermind/content.md +185 -0
- package/.claude/skills/mastermind/createorg.md +318 -0
- package/.claude/skills/mastermind/finance.md +154 -0
- package/.claude/skills/mastermind/idea.md +158 -0
- package/.claude/skills/mastermind/marketing.md +216 -0
- package/.claude/skills/mastermind/monotask.md +350 -0
- package/.claude/skills/mastermind/ops.md +156 -0
- package/.claude/skills/mastermind/references/copywriting-frameworks.md +181 -0
- package/.claude/skills/mastermind/references/persuasion-psychology.md +158 -0
- package/.claude/skills/mastermind/release.md +156 -0
- package/.claude/skills/mastermind/research.md +156 -0
- package/.claude/skills/mastermind/review.md +157 -0
- package/.claude/skills/mastermind/runorg.md +308 -0
- package/.claude/skills/mastermind/sales.md +158 -0
- package/.claude/skills/mastermind/techport.md +743 -0
- package/.claude/skills/{v3-mcp-optimization → mcp-optimization}/SKILL.md +35 -14
- package/.claude/skills/{v3-memory-unification → memory-unification}/SKILL.md +20 -4
- package/.claude/skills/monodesign/SKILL.md +302 -0
- package/.claude/skills/monodesign/reference/adapt.md +190 -0
- package/.claude/skills/monodesign/reference/animate.md +175 -0
- package/.claude/skills/monodesign/reference/antipatterns-catalog.md +187 -0
- package/.claude/skills/monodesign/reference/audit.md +133 -0
- package/.claude/skills/monodesign/reference/bolder.md +113 -0
- package/.claude/skills/monodesign/reference/brand-workflow.md +180 -0
- package/.claude/skills/monodesign/reference/brand.md +114 -0
- package/.claude/skills/monodesign/reference/clarify.md +174 -0
- package/.claude/skills/monodesign/reference/cognitive-load.md +106 -0
- package/.claude/skills/monodesign/reference/color-and-contrast.md +105 -0
- package/.claude/skills/monodesign/reference/colorize.md +154 -0
- package/.claude/skills/monodesign/reference/component-specs.md +260 -0
- package/.claude/skills/monodesign/reference/component-states.md +274 -0
- package/.claude/skills/monodesign/reference/component-system.md +358 -0
- package/.claude/skills/monodesign/reference/copy-formulas.md +160 -0
- package/.claude/skills/monodesign/reference/craft.md +193 -0
- package/.claude/skills/monodesign/reference/critique.md +213 -0
- package/.claude/skills/monodesign/reference/delight.md +302 -0
- package/.claude/skills/monodesign/reference/design-principles.md +246 -0
- package/.claude/skills/monodesign/reference/distill.md +111 -0
- package/.claude/skills/monodesign/reference/document.md +427 -0
- package/.claude/skills/monodesign/reference/extract.md +69 -0
- package/.claude/skills/monodesign/reference/harden.md +347 -0
- package/.claude/skills/monodesign/reference/heuristics-scoring.md +234 -0
- package/.claude/skills/monodesign/reference/image-prompts.md +118 -0
- package/.claude/skills/monodesign/reference/interaction-design.md +195 -0
- package/.claude/skills/monodesign/reference/layout.md +141 -0
- package/.claude/skills/monodesign/reference/live.md +622 -0
- package/.claude/skills/monodesign/reference/motion-design.md +109 -0
- package/.claude/skills/monodesign/reference/onboard.md +234 -0
- package/.claude/skills/monodesign/reference/optimize.md +258 -0
- package/.claude/skills/monodesign/reference/overdrive.md +130 -0
- package/.claude/skills/monodesign/reference/personas.md +179 -0
- package/.claude/skills/monodesign/reference/polish.md +233 -0
- package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +108 -0
- package/.claude/skills/monodesign/reference/product.md +62 -0
- package/.claude/skills/monodesign/reference/quieter.md +99 -0
- package/.claude/skills/monodesign/reference/responsive-design.md +114 -0
- package/.claude/skills/monodesign/reference/shape.md +151 -0
- package/.claude/skills/monodesign/reference/spatial-design.md +100 -0
- package/.claude/skills/monodesign/reference/teach.md +156 -0
- package/.claude/skills/monodesign/reference/token-architecture.md +222 -0
- package/.claude/skills/monodesign/reference/typeset.md +124 -0
- package/.claude/skills/monodesign/reference/typography.md +159 -0
- package/.claude/skills/monodesign/reference/ux-research.md +143 -0
- package/.claude/skills/monodesign/reference/ux-rules.md +211 -0
- package/.claude/skills/monodesign/reference/ux-writing.md +107 -0
- package/.claude/skills/monomotion/SKILL.md +145 -0
- package/.claude/skills/monomotion/rules/api-control.md +139 -0
- package/.claude/skills/monomotion/rules/effects.md +109 -0
- package/.claude/skills/monomotion/rules/integration.md +140 -0
- package/.claude/skills/monomotion/rules/scroll.md +131 -0
- package/.claude/skills/monomotion/rules/sequencing.md +105 -0
- package/.claude/skills/monomotion/rules/svg.md +101 -0
- package/.claude/skills/monomotion/rules/text.md +119 -0
- package/.claude/skills/pair-programming/SKILL.md +1 -1
- package/.claude/skills/performance-analysis/SKILL.md +3 -3
- package/.claude/skills/{v3-performance-optimization → performance-optimization}/SKILL.md +16 -8
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +17 -19
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +4 -6
- package/.claude/skills/{v3-security-overhaul → security-hardening}/SKILL.md +13 -3
- package/.claude/skills/skill-builder/SKILL.md +19 -19
- package/.claude/skills/sparc-methodology/SKILL.md +55 -211
- package/.claude/skills/stop-slop/SKILL.md +67 -0
- package/.claude/skills/stop-slop/references/examples.md +61 -0
- package/.claude/skills/stop-slop/references/phrases.md +130 -0
- package/.claude/skills/stop-slop/references/structures.md +136 -0
- package/.claude/skills/swarm-advanced/SKILL.md +13 -43
- package/.claude/skills/{v3-swarm-coordination → swarm-coordination}/SKILL.md +39 -21
- package/.claude/skills/swarm-orchestration/SKILL.md +12 -12
- package/.claude/skills/verification-quality/SKILL.md +5 -5
- package/.claude/statusline-command.sh +0 -0
- package/.claude/statusline.sh +0 -0
- package/.claude-plugin/scripts/install.sh +0 -0
- package/.claude-plugin/scripts/uninstall.sh +0 -0
- package/.claude-plugin/scripts/verify.sh +0 -0
- package/README.md +5 -5
- package/package.json +17 -17
- package/packages/@monomind/cli/README.md +441 -0
- package/packages/@monomind/cli/bin/cli.js +78 -13
- package/packages/@monomind/cli/bin/mcp-server.js +0 -0
- package/packages/@monomind/cli/dist/src/agents/halt-signal.js +33 -7
- package/packages/@monomind/cli/dist/src/agents/managed-agent.js +5 -2
- package/packages/@monomind/cli/dist/src/agents/prompt-experiment.d.ts +3 -2
- package/packages/@monomind/cli/dist/src/agents/prompt-experiment.js +1 -1
- package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.d.ts +5 -2
- package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.js +26 -4
- package/packages/@monomind/cli/dist/src/agents/specialization-scorer.js +17 -9
- package/packages/@monomind/cli/dist/src/agents/trigger-scanner.d.ts +5 -3
- package/packages/@monomind/cli/dist/src/agents/trigger-scanner.js +58 -10
- package/packages/@monomind/cli/dist/src/agents/version-store.d.ts +0 -1
- package/packages/@monomind/cli/dist/src/agents/version-store.js +44 -21
- package/packages/@monomind/cli/dist/src/autopilot-state.js +79 -28
- package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.d.ts +7 -2
- package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.js +20 -8
- package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.d.ts +2 -1
- package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.js +25 -2
- package/packages/@monomind/cli/dist/src/commands/agent.js +6 -4
- package/packages/@monomind/cli/dist/src/commands/appliance-advanced.js +23 -0
- package/packages/@monomind/cli/dist/src/commands/autopilot.js +3 -3
- package/packages/@monomind/cli/dist/src/commands/benchmark.js +119 -8
- package/packages/@monomind/cli/dist/src/commands/claims.js +22 -14
- package/packages/@monomind/cli/dist/src/commands/config.js +32 -0
- package/packages/@monomind/cli/dist/src/commands/daemon.js +13 -11
- package/packages/@monomind/cli/dist/src/commands/deployment.js +21 -2
- package/packages/@monomind/cli/dist/src/commands/doctor.js +5 -4
- package/packages/@monomind/cli/dist/src/commands/embeddings.js +124 -48
- package/packages/@monomind/cli/dist/src/commands/hive-mind.js +15 -14
- package/packages/@monomind/cli/dist/src/commands/hooks.js +45 -41
- package/packages/@monomind/cli/dist/src/commands/index.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/commands/index.js +20 -7
- package/packages/@monomind/cli/dist/src/commands/init.js +53 -19
- package/packages/@monomind/cli/dist/src/commands/mcp.js +31 -44
- package/packages/@monomind/cli/dist/src/commands/memory.js +47 -15
- package/packages/@monomind/cli/dist/src/commands/migrate.js +156 -108
- package/packages/@monomind/cli/dist/src/commands/monograph.d.ts +8 -0
- package/packages/@monomind/cli/dist/src/commands/monograph.js +526 -0
- package/packages/@monomind/cli/dist/src/commands/neural.js +96 -56
- package/packages/@monomind/cli/dist/src/commands/performance.js +30 -8
- package/packages/@monomind/cli/dist/src/commands/plugins.js +13 -37
- package/packages/@monomind/cli/dist/src/commands/process.js +25 -2
- package/packages/@monomind/cli/dist/src/commands/providers.js +37 -5
- package/packages/@monomind/cli/dist/src/commands/replay.js +4 -4
- package/packages/@monomind/cli/dist/src/commands/route.js +37 -5
- package/packages/@monomind/cli/dist/src/commands/ruvector/import.js +12 -2
- package/packages/@monomind/cli/dist/src/commands/ruvector/init.js +15 -0
- package/packages/@monomind/cli/dist/src/commands/ruvector/status.js +16 -3
- package/packages/@monomind/cli/dist/src/commands/security.js +342 -193
- package/packages/@monomind/cli/dist/src/commands/session.js +51 -8
- package/packages/@monomind/cli/dist/src/commands/start.js +18 -4
- package/packages/@monomind/cli/dist/src/commands/swarm.js +47 -36
- package/packages/@monomind/cli/dist/src/commands/tokens.js +11 -11
- package/packages/@monomind/cli/dist/src/commands/transfer-store.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/workflow.js +31 -4
- package/packages/@monomind/cli/dist/src/config-adapter.d.ts +2 -1
- package/packages/@monomind/cli/dist/src/consensus/audit-writer.js +46 -13
- package/packages/@monomind/cli/dist/src/consensus/vote-signer.d.ts +0 -3
- package/packages/@monomind/cli/dist/src/consensus/vote-signer.js +9 -1
- package/packages/@monomind/cli/dist/src/dlq/dlq-reader.d.ts +4 -2
- package/packages/@monomind/cli/dist/src/dlq/dlq-reader.js +25 -8
- package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.d.ts +10 -3
- package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.js +50 -16
- package/packages/@monomind/cli/dist/src/dlq/dlq-writer.js +27 -5
- package/packages/@monomind/cli/dist/src/eval/dataset-manager.d.ts +2 -2
- package/packages/@monomind/cli/dist/src/eval/dataset-manager.js +26 -16
- package/packages/@monomind/cli/dist/src/eval/trace-collector.js +23 -3
- package/packages/@monomind/cli/dist/src/index.js +12 -10
- package/packages/@monomind/cli/dist/src/init/claudemd-generator.js +8 -8
- package/packages/@monomind/cli/dist/src/init/executor.js +153 -70
- package/packages/@monomind/cli/dist/src/init/helpers-generator.js +35 -22
- package/packages/@monomind/cli/dist/src/init/mcp-generator.js +3 -3
- package/packages/@monomind/cli/dist/src/init/settings-generator.js +10 -3
- package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +18 -3
- package/packages/@monomind/cli/dist/src/init/statusline-generator.js +3 -1
- package/packages/@monomind/cli/dist/src/init/types.d.ts +35 -11
- package/packages/@monomind/cli/dist/src/init/types.js +5 -9
- package/packages/@monomind/cli/dist/src/interactive/interrupt.js +8 -3
- package/packages/@monomind/cli/dist/src/mcp/tool-registry.js +38 -4
- package/packages/@monomind/cli/dist/src/mcp-client.js +10 -4
- package/packages/@monomind/cli/dist/src/mcp-server.d.ts +9 -2
- package/packages/@monomind/cli/dist/src/mcp-server.js +182 -35
- package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +66 -34
- package/packages/@monomind/cli/dist/src/mcp-tools/agentdb-tools.js +34 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.js +25 -16
- package/packages/@monomind/cli/dist/src/mcp-tools/auto-install.js +4 -6
- package/packages/@monomind/cli/dist/src/mcp-tools/autopilot-tools.js +12 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +199 -20
- package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.js +68 -18
- package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.js +33 -5
- package/packages/@monomind/cli/dist/src/mcp-tools/coordination-tools.js +59 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +46 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +46 -5
- package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.js +29 -16
- package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +38 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +96 -33
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +70 -37
- package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +29 -13
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +5867 -56
- package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +121 -37
- package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +21 -8
- package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +10 -8
- package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.js +4 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/ruvllm-tools.js +19 -8
- package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.js +57 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +35 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +4 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.js +53 -13
- package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.js +63 -14
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +21 -16
- package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +92 -23
- package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +41 -10
- package/packages/@monomind/cli/dist/src/memory/intelligence.d.ts +2 -2
- package/packages/@monomind/cli/dist/src/memory/intelligence.js +39 -13
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +1 -0
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +149 -56
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +107 -45
- package/packages/@monomind/cli/dist/src/memory/sona-optimizer.d.ts +8 -1
- package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +25 -8
- package/packages/@monomind/cli/dist/src/observability/replay-reader.d.ts +40 -0
- package/packages/@monomind/cli/dist/src/observability/replay-reader.js +138 -0
- package/packages/@monomind/cli/dist/src/orchestration/routing-modes.js +35 -5
- package/packages/@monomind/cli/dist/src/parser.d.ts +8 -0
- package/packages/@monomind/cli/dist/src/parser.js +48 -14
- package/packages/@monomind/cli/dist/src/plugins/manager.js +112 -19
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +80 -62
- package/packages/@monomind/cli/dist/src/production/circuit-breaker.js +8 -1
- package/packages/@monomind/cli/dist/src/production/error-handler.d.ts +4 -2
- package/packages/@monomind/cli/dist/src/production/error-handler.js +27 -5
- package/packages/@monomind/cli/dist/src/production/monitoring.js +8 -4
- package/packages/@monomind/cli/dist/src/production/rate-limiter.js +30 -22
- package/packages/@monomind/cli/dist/src/ruvector/agent-wasm.js +2 -2
- package/packages/@monomind/cli/dist/src/ruvector/coverage-router.js +19 -9
- package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.d.ts +1 -0
- package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.js +26 -6
- package/packages/@monomind/cli/dist/src/ruvector/enhanced-model-router.js +24 -2
- package/packages/@monomind/cli/dist/src/ruvector/index.d.ts +1 -2
- package/packages/@monomind/cli/dist/src/ruvector/index.js +2 -2
- package/packages/@monomind/cli/dist/src/ruvector/model-router.d.ts +4 -2
- package/packages/@monomind/cli/dist/src/ruvector/model-router.js +30 -6
- package/packages/@monomind/cli/dist/src/ruvector/moe-router.d.ts +7 -0
- package/packages/@monomind/cli/dist/src/ruvector/moe-router.js +35 -12
- package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.d.ts +7 -1
- package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.js +40 -9
- package/packages/@monomind/cli/dist/src/services/claim-service.d.ts +3 -1
- package/packages/@monomind/cli/dist/src/services/claim-service.js +33 -2
- package/packages/@monomind/cli/dist/src/services/config-file-manager.d.ts +16 -2
- package/packages/@monomind/cli/dist/src/services/config-file-manager.js +105 -17
- package/packages/@monomind/cli/dist/src/services/container-worker-pool.js +51 -11
- package/packages/@monomind/cli/dist/src/services/headless-worker-executor.d.ts +7 -0
- package/packages/@monomind/cli/dist/src/services/headless-worker-executor.js +188 -45
- package/packages/@monomind/cli/dist/src/services/registry-api.js +62 -9
- package/packages/@monomind/cli/dist/src/services/ruvector-training.js +8 -0
- package/packages/@monomind/cli/dist/src/services/worker-daemon.d.ts +4 -1
- package/packages/@monomind/cli/dist/src/services/worker-daemon.js +112 -28
- package/packages/@monomind/cli/dist/src/services/worker-queue.d.ts +9 -2
- package/packages/@monomind/cli/dist/src/services/worker-queue.js +86 -5
- package/packages/@monomind/cli/dist/src/suggest.js +9 -0
- package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.d.ts +5 -3
- package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.js +17 -5
- package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.js +30 -6
- package/packages/@monomind/cli/dist/src/transfer/anonymization/index.js +5 -3
- package/packages/@monomind/cli/dist/src/transfer/export.js +5 -3
- package/packages/@monomind/cli/dist/src/transfer/ipfs/client.js +84 -7
- package/packages/@monomind/cli/dist/src/transfer/ipfs/upload.js +13 -4
- package/packages/@monomind/cli/dist/src/transfer/storage/gcs.js +19 -10
- package/packages/@monomind/cli/dist/src/transfer/store/discovery.d.ts +9 -2
- package/packages/@monomind/cli/dist/src/transfer/store/discovery.js +68 -13
- package/packages/@monomind/cli/dist/src/transfer/store/download.d.ts +15 -6
- package/packages/@monomind/cli/dist/src/transfer/store/download.js +113 -24
- package/packages/@monomind/cli/dist/src/transfer/store/publish.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/transfer/store/publish.js +13 -14
- package/packages/@monomind/cli/dist/src/transfer/store/registry.d.ts +3 -3
- package/packages/@monomind/cli/dist/src/transfer/store/registry.js +32 -16
- package/packages/@monomind/cli/dist/src/update/checker.js +17 -4
- package/packages/@monomind/cli/dist/src/update/executor.js +25 -20
- package/packages/@monomind/cli/dist/src/update/rate-limiter.d.ts +11 -0
- package/packages/@monomind/cli/dist/src/update/rate-limiter.js +23 -3
- package/packages/@monomind/cli/dist/src/utils/parse-jsonl.d.ts +6 -0
- package/packages/@monomind/cli/dist/src/utils/parse-jsonl.js +22 -0
- package/packages/@monomind/cli/dist/src/workflow/condition-evaluator.js +37 -3
- package/packages/@monomind/cli/dist/src/workflow/dag-builder.js +27 -11
- package/packages/@monomind/cli/dist/src/workflow/dag-executor.js +51 -13
- package/packages/@monomind/cli/dist/src/workflow/dsl-schema.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/workflow/dsl-schema.js +6 -2
- package/packages/@monomind/cli/dist/src/workflow/template-engine.js +7 -0
- package/packages/@monomind/cli/dist/src/workflow/workflow-executor.js +95 -14
- package/packages/@monomind/cli/package.json +5 -3
- package/packages/@monomind/guidance/README.md +1192 -0
- package/packages/@monomind/shared/README.md +322 -0
- package/packages/@monomind/shared/dist/types/consensus-audit.d.ts +3 -1
- package/packages/README.md +513 -0
- package/.claude/agents/design/design-brand-guardian.md +0 -323
- package/.claude/agents/design/design-image-prompt-engineer.md +0 -237
- package/.claude/agents/design/design-inclusive-visuals-specialist.md +0 -72
- package/.claude/agents/design/design-ui-designer.md +0 -384
- package/.claude/agents/design/design-ux-architect.md +0 -470
- package/.claude/agents/design/design-ux-researcher.md +0 -330
- package/.claude/agents/design/design-visual-storyteller.md +0 -150
- package/.claude/agents/design/design-whimsy-injector.md +0 -439
- package/.claude/agents/v3/integration-architect.md +0 -338
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +0 -54
- package/.claude/commands/coordination/init.md +0 -44
- package/.claude/commands/coordination/orchestrate.md +0 -43
- package/.claude/commands/coordination/spawn.md +0 -45
- package/.claude/commands/github/code-review-swarm.md +0 -550
- package/.claude/commands/github/code-review.md +0 -25
- package/.claude/commands/github/github-swarm.md +0 -121
- package/.claude/commands/github/issue-triage.md +0 -25
- package/.claude/commands/github/multi-repo-swarm.md +0 -519
- package/.claude/commands/github/pr-enhance.md +0 -26
- package/.claude/commands/github/project-board-sync.md +0 -471
- package/.claude/commands/github/release-swarm.md +0 -590
- package/.claude/commands/github/repo-analyze.md +0 -25
- package/.claude/commands/github/swarm-issue.md +0 -482
- package/.claude/commands/github/swarm-pr.md +0 -310
- package/.claude/commands/github/workflow-automation.md +0 -468
- package/.claude/commands/hive-mind/hive-mind-metrics.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-resume.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-sessions.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-wizard.md +0 -8
- package/.claude/commands/list-agents.md +0 -17
- package/.claude/commands/memory/memory-persist.md +0 -25
- package/.claude/commands/memory/memory-usage.md +0 -25
- package/.claude/commands/memory/neural.md +0 -47
- package/.claude/commands/metrics.md +0 -11
- package/.claude/commands/monitoring/real-time-view.md +0 -25
- package/.claude/commands/monitoring/swarm-monitor.md +0 -25
- package/.claude/commands/monomind-createtask.md +0 -302
- package/.claude/commands/monomind-help.md +0 -103
- package/.claude/commands/monomind-memory.md +0 -107
- package/.claude/commands/monomind-repeat.md +0 -149
- package/.claude/commands/monomind-swarm.md +0 -205
- package/.claude/commands/optimization/cache-manage.md +0 -25
- package/.claude/commands/optimization/topology-optimize.md +0 -25
- package/.claude/commands/pair/commands.md +0 -546
- package/.claude/commands/pair/config.md +0 -510
- package/.claude/commands/pair/start.md +0 -209
- package/.claude/commands/use-agent.md +0 -67
- package/.claude/skills/monomind-createtask/SKILL.md +0 -269
- package/.claude/skills/monomind-task-engine/SKILL.md +0 -358
- /package/.claude/agents/{v3 → specialists}/memory-specialist.md +0 -0
- /package/.claude/agents/{v3 → specialists}/performance-engineer.md +0 -0
- /package/.claude/agents/{v3 → specialists}/queen-coordinator.md +0 -0
- /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(
|
|
103
|
+
const match = regex.test(boundedOutput);
|
|
81
104
|
return {
|
|
82
105
|
type: 'custom_regex',
|
|
83
106
|
passed: match,
|
|
84
|
-
actual: match ?
|
|
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
|
-
|
|
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('@
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
// @
|
|
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
|
-
|
|
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')}
|
|
448
|
-
output.writeln(` ${output.highlight('neural')}
|
|
449
|
-
output.writeln(` ${output.highlight('memory')}
|
|
450
|
-
output.writeln(` ${output.highlight('all')}
|
|
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(
|
|
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:
|
|
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(
|
|
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, ...
|
|
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
|
-
|
|
239
|
-
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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 ? {
|
|
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
|
-
|
|
275
|
-
|
|
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: ${
|
|
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
|
-
|
|
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()
|
|
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(
|
|
182
|
-
join(
|
|
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
|
|
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'
|
|
267
|
+
(pkg.name === '@monomind/cli' || pkg.name === 'monomind')) {
|
|
267
268
|
currentVersion = pkg.version;
|
|
268
269
|
break;
|
|
269
270
|
}
|