@claude-flow/cli 3.32.9 → 3.32.10
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/analysis/analyze-code-quality.md +178 -178
- package/.claude/agents/analysis/code-analyzer.md +209 -209
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +178 -178
- package/.claude/agents/architecture/arch-system-design.md +156 -156
- package/.claude/agents/architecture/system-design/arch-system-design.md +154 -154
- package/.claude/agents/browser/browser-agent.yaml +182 -182
- package/.claude/agents/consensus/byzantine-coordinator.md +62 -62
- package/.claude/agents/consensus/crdt-synchronizer.md +996 -996
- package/.claude/agents/consensus/gossip-coordinator.md +62 -62
- package/.claude/agents/consensus/performance-benchmarker.md +850 -850
- package/.claude/agents/consensus/quorum-manager.md +822 -822
- package/.claude/agents/consensus/raft-manager.md +62 -62
- package/.claude/agents/consensus/security-manager.md +621 -621
- package/.claude/agents/core/planner.md +374 -374
- package/.claude/agents/custom/test-long-runner.md +44 -44
- package/.claude/agents/data/data-ml-model.md +444 -444
- package/.claude/agents/data/ml/data-ml-model.md +192 -192
- package/.claude/agents/development/backend/dev-backend-api.md +141 -141
- package/.claude/agents/development/dev-backend-api.md +344 -344
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +163 -163
- package/.claude/agents/devops/ops-cicd-github.md +164 -164
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +173 -173
- package/.claude/agents/documentation/docs-api-openapi.md +354 -354
- package/.claude/agents/flow-nexus/app-store.md +87 -87
- package/.claude/agents/flow-nexus/authentication.md +68 -68
- package/.claude/agents/flow-nexus/challenges.md +80 -80
- package/.claude/agents/flow-nexus/neural-network.md +87 -87
- package/.claude/agents/flow-nexus/payments.md +82 -82
- package/.claude/agents/flow-nexus/sandbox.md +75 -75
- package/.claude/agents/flow-nexus/swarm.md +75 -75
- package/.claude/agents/flow-nexus/user-tools.md +95 -95
- package/.claude/agents/flow-nexus/workflow.md +83 -83
- package/.claude/agents/github/code-review-swarm.md +377 -377
- package/.claude/agents/github/github-modes.md +172 -172
- package/.claude/agents/github/issue-tracker.md +575 -575
- package/.claude/agents/github/multi-repo-swarm.md +552 -552
- package/.claude/agents/github/pr-manager.md +437 -437
- package/.claude/agents/github/project-board-sync.md +508 -508
- package/.claude/agents/github/release-manager.md +604 -604
- package/.claude/agents/github/release-swarm.md +582 -582
- package/.claude/agents/github/repo-architect.md +397 -397
- package/.claude/agents/github/swarm-issue.md +572 -572
- package/.claude/agents/github/swarm-pr.md +427 -427
- package/.claude/agents/github/sync-coordinator.md +451 -451
- package/.claude/agents/github/workflow-automation.md +902 -902
- package/.claude/agents/goal/agent.md +815 -815
- package/.claude/agents/optimization/benchmark-suite.md +664 -664
- package/.claude/agents/optimization/load-balancer.md +430 -430
- package/.claude/agents/optimization/performance-monitor.md +671 -671
- package/.claude/agents/optimization/resource-allocator.md +673 -673
- package/.claude/agents/optimization/topology-optimizer.md +807 -807
- package/.claude/agents/payments/agentic-payments.md +126 -126
- package/.claude/agents/sona/sona-learning-optimizer.md +74 -74
- package/.claude/agents/sparc/architecture.md +698 -698
- package/.claude/agents/sparc/pseudocode.md +519 -519
- package/.claude/agents/sparc/refinement.md +801 -801
- package/.claude/agents/sparc/specification.md +477 -477
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +224 -224
- package/.claude/agents/specialized/spec-mobile-react-native.md +226 -226
- package/.claude/agents/sublinear/consensus-coordinator.md +337 -337
- package/.claude/agents/sublinear/matrix-optimizer.md +184 -184
- package/.claude/agents/sublinear/pagerank-analyzer.md +298 -298
- package/.claude/agents/sublinear/performance-optimizer.md +367 -367
- package/.claude/agents/sublinear/trading-predictor.md +245 -245
- package/.claude/agents/swarm/adaptive-coordinator.md +1126 -1126
- package/.claude/agents/swarm/hierarchical-coordinator.md +709 -709
- package/.claude/agents/swarm/mesh-coordinator.md +962 -962
- package/.claude/agents/templates/automation-smart-agent.md +204 -204
- package/.claude/agents/templates/base-template-generator.md +289 -289
- package/.claude/agents/templates/coordinator-swarm-init.md +89 -89
- package/.claude/agents/templates/github-pr-manager.md +176 -176
- package/.claude/agents/templates/implementer-sparc-coder.md +258 -258
- package/.claude/agents/templates/memory-coordinator.md +186 -186
- package/.claude/agents/templates/orchestrator-task.md +138 -138
- package/.claude/agents/templates/performance-analyzer.md +198 -198
- package/.claude/agents/templates/sparc-coordinator.md +513 -513
- package/.claude/agents/testing/production-validator.md +394 -394
- package/.claude/agents/testing/tdd-london-swarm.md +243 -243
- package/.claude/agents/v3/aidefence-guardian.md +282 -282
- package/.claude/agents/v3/claims-authorizer.md +208 -208
- package/.claude/agents/v3/collective-intelligence-coordinator.md +993 -993
- package/.claude/agents/v3/ddd-domain-expert.md +220 -220
- package/.claude/agents/v3/injection-analyst.md +236 -236
- package/.claude/agents/v3/performance-engineer.md +1233 -1233
- package/.claude/agents/v3/pii-detector.md +151 -151
- package/.claude/agents/v3/reasoningbank-learner.md +213 -213
- package/.claude/agents/v3/security-architect-aidefence.md +410 -410
- package/.claude/agents/v3/security-architect.md +867 -867
- package/.claude/agents/v3/swarm-memory-manager.md +157 -157
- package/.claude/agents/v3/v3-integration-architect.md +205 -205
- package/.claude/commands/agents/README.md +50 -50
- package/.claude/commands/agents/agent-capabilities.md +140 -140
- package/.claude/commands/agents/agent-coordination.md +28 -28
- package/.claude/commands/agents/agent-spawning.md +28 -28
- package/.claude/commands/agents/agent-types.md +216 -216
- package/.claude/commands/agents/health.md +139 -139
- package/.claude/commands/agents/list.md +100 -100
- package/.claude/commands/agents/logs.md +130 -130
- package/.claude/commands/agents/metrics.md +122 -122
- package/.claude/commands/agents/pool.md +127 -127
- package/.claude/commands/agents/spawn.md +140 -140
- package/.claude/commands/agents/status.md +115 -115
- package/.claude/commands/agents/stop.md +102 -102
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +53 -53
- package/.claude/commands/analysis/README.md +9 -9
- package/.claude/commands/analysis/bottleneck-detect.md +162 -162
- package/.claude/commands/analysis/performance-bottlenecks.md +58 -58
- package/.claude/commands/analysis/performance-report.md +25 -25
- package/.claude/commands/analysis/token-efficiency.md +44 -44
- package/.claude/commands/analysis/token-usage.md +25 -25
- package/.claude/commands/automation/README.md +9 -9
- package/.claude/commands/automation/auto-agent.md +122 -122
- package/.claude/commands/automation/self-healing.md +105 -105
- package/.claude/commands/automation/session-memory.md +89 -89
- package/.claude/commands/automation/smart-agents.md +72 -72
- package/.claude/commands/automation/smart-spawn.md +25 -25
- package/.claude/commands/automation/workflow-select.md +25 -25
- package/.claude/commands/claude-flow-help.md +103 -103
- package/.claude/commands/claude-flow-memory.md +107 -107
- package/.claude/commands/claude-flow-swarm.md +205 -205
- package/.claude/commands/coordination/README.md +9 -9
- package/.claude/commands/coordination/agent-spawn.md +25 -25
- package/.claude/commands/coordination/init.md +44 -44
- package/.claude/commands/coordination/orchestrate.md +43 -43
- package/.claude/commands/coordination/spawn.md +45 -45
- package/.claude/commands/coordination/swarm-init.md +85 -85
- package/.claude/commands/coordination/task-orchestrate.md +25 -25
- package/.claude/commands/github/README.md +11 -11
- package/.claude/commands/github/code-review-swarm.md +513 -513
- package/.claude/commands/github/code-review.md +25 -25
- package/.claude/commands/github/github-modes.md +146 -146
- package/.claude/commands/github/github-swarm.md +121 -121
- package/.claude/commands/github/issue-tracker.md +291 -291
- package/.claude/commands/github/issue-triage.md +25 -25
- package/.claude/commands/github/multi-repo-swarm.md +518 -518
- package/.claude/commands/github/pr-enhance.md +26 -26
- package/.claude/commands/github/pr-manager.md +169 -169
- package/.claude/commands/github/project-board-sync.md +470 -470
- package/.claude/commands/github/release-manager.md +339 -339
- package/.claude/commands/github/release-swarm.md +543 -543
- package/.claude/commands/github/repo-analyze.md +25 -25
- package/.claude/commands/github/repo-architect.md +366 -366
- package/.claude/commands/github/swarm-issue.md +484 -484
- package/.claude/commands/github/swarm-pr.md +287 -287
- package/.claude/commands/github/sync-coordinator.md +302 -302
- package/.claude/commands/github/workflow-automation.md +441 -441
- package/.claude/commands/hive-mind/README.md +17 -17
- package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-init.md +18 -18
- package/.claude/commands/hive-mind/hive-mind-memory.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-resume.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -21
- package/.claude/commands/hive-mind/hive-mind-status.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-stop.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -8
- package/.claude/commands/hive-mind/hive-mind.md +27 -27
- package/.claude/commands/hooks/README.md +11 -11
- package/.claude/commands/hooks/overview.md +57 -57
- package/.claude/commands/hooks/post-edit.md +117 -117
- package/.claude/commands/hooks/post-task.md +112 -112
- package/.claude/commands/hooks/pre-edit.md +113 -113
- package/.claude/commands/hooks/pre-task.md +111 -111
- package/.claude/commands/hooks/session-end.md +118 -118
- package/.claude/commands/hooks/setup.md +102 -102
- package/.claude/commands/memory/README.md +9 -9
- package/.claude/commands/memory/memory-persist.md +25 -25
- package/.claude/commands/memory/memory-search.md +25 -25
- package/.claude/commands/memory/memory-usage.md +25 -25
- package/.claude/commands/memory/neural.md +47 -47
- package/.claude/commands/monitoring/README.md +9 -9
- package/.claude/commands/monitoring/agent-metrics.md +25 -25
- package/.claude/commands/monitoring/agents.md +44 -44
- package/.claude/commands/monitoring/real-time-view.md +25 -25
- package/.claude/commands/monitoring/status.md +46 -46
- package/.claude/commands/monitoring/swarm-monitor.md +25 -25
- package/.claude/commands/optimization/README.md +9 -9
- package/.claude/commands/optimization/auto-topology.md +61 -61
- package/.claude/commands/optimization/cache-manage.md +25 -25
- package/.claude/commands/optimization/parallel-execute.md +25 -25
- package/.claude/commands/optimization/parallel-execution.md +49 -49
- package/.claude/commands/optimization/topology-optimize.md +25 -25
- package/.claude/commands/pair/README.md +260 -260
- package/.claude/commands/pair/commands.md +545 -545
- package/.claude/commands/pair/config.md +509 -509
- package/.claude/commands/pair/examples.md +511 -511
- package/.claude/commands/pair/modes.md +347 -347
- package/.claude/commands/pair/session.md +406 -406
- package/.claude/commands/pair/start.md +208 -208
- package/.claude/commands/sparc/analyzer.md +51 -51
- package/.claude/commands/sparc/architect.md +53 -53
- package/.claude/commands/sparc/ask.md +97 -97
- package/.claude/commands/sparc/batch-executor.md +54 -54
- package/.claude/commands/sparc/code.md +89 -89
- package/.claude/commands/sparc/coder.md +54 -54
- package/.claude/commands/sparc/debug.md +83 -83
- package/.claude/commands/sparc/debugger.md +54 -54
- package/.claude/commands/sparc/designer.md +53 -53
- package/.claude/commands/sparc/devops.md +109 -109
- package/.claude/commands/sparc/docs-writer.md +80 -80
- package/.claude/commands/sparc/documenter.md +54 -54
- package/.claude/commands/sparc/innovator.md +54 -54
- package/.claude/commands/sparc/integration.md +83 -83
- package/.claude/commands/sparc/mcp.md +117 -117
- package/.claude/commands/sparc/memory-manager.md +54 -54
- package/.claude/commands/sparc/optimizer.md +54 -54
- package/.claude/commands/sparc/orchestrator.md +131 -131
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -83
- package/.claude/commands/sparc/refinement-optimization-mode.md +83 -83
- package/.claude/commands/sparc/researcher.md +54 -54
- package/.claude/commands/sparc/reviewer.md +54 -54
- package/.claude/commands/sparc/security-review.md +80 -80
- package/.claude/commands/sparc/sparc-modes.md +174 -174
- package/.claude/commands/sparc/sparc.md +111 -111
- package/.claude/commands/sparc/spec-pseudocode.md +80 -80
- package/.claude/commands/sparc/supabase-admin.md +348 -348
- package/.claude/commands/sparc/swarm-coordinator.md +54 -54
- package/.claude/commands/sparc/tdd.md +54 -54
- package/.claude/commands/sparc/tester.md +54 -54
- package/.claude/commands/sparc/tutorial.md +79 -79
- package/.claude/commands/sparc/workflow-manager.md +54 -54
- package/.claude/commands/sparc.md +166 -166
- package/.claude/commands/stream-chain/pipeline.md +120 -120
- package/.claude/commands/stream-chain/run.md +69 -69
- package/.claude/commands/swarm/README.md +15 -15
- package/.claude/commands/swarm/analysis.md +95 -95
- package/.claude/commands/swarm/development.md +96 -96
- package/.claude/commands/swarm/examples.md +168 -168
- package/.claude/commands/swarm/maintenance.md +102 -102
- package/.claude/commands/swarm/optimization.md +117 -117
- package/.claude/commands/swarm/research.md +136 -136
- package/.claude/commands/swarm/swarm-analysis.md +8 -8
- package/.claude/commands/swarm/swarm-background.md +8 -8
- package/.claude/commands/swarm/swarm-init.md +19 -19
- package/.claude/commands/swarm/swarm-modes.md +8 -8
- package/.claude/commands/swarm/swarm-monitor.md +8 -8
- package/.claude/commands/swarm/swarm-spawn.md +19 -19
- package/.claude/commands/swarm/swarm-status.md +8 -8
- package/.claude/commands/swarm/swarm-strategies.md +8 -8
- package/.claude/commands/swarm/swarm.md +87 -87
- package/.claude/commands/swarm/testing.md +131 -131
- package/.claude/commands/training/README.md +9 -9
- package/.claude/commands/training/model-update.md +25 -25
- package/.claude/commands/training/neural-patterns.md +107 -107
- package/.claude/commands/training/neural-train.md +75 -75
- package/.claude/commands/training/pattern-learn.md +25 -25
- package/.claude/commands/training/specialization.md +62 -62
- package/.claude/commands/truth/start.md +142 -142
- package/.claude/commands/verify/check.md +49 -49
- package/.claude/commands/verify/start.md +127 -127
- package/.claude/commands/workflows/README.md +9 -9
- package/.claude/commands/workflows/development.md +77 -77
- package/.claude/commands/workflows/research.md +62 -62
- package/.claude/commands/workflows/workflow-create.md +25 -25
- package/.claude/commands/workflows/workflow-execute.md +25 -25
- package/.claude/commands/workflows/workflow-export.md +25 -25
- package/.claude/eval/human-relevance-frozen-v1.json +17 -17
- package/.claude/evolve-proof/generation-0.json +211 -211
- package/.claude/evolve-proof/real-generation-0.json +406 -406
- package/.claude/evolve-proof/real-generation-1.json +406 -406
- package/.claude/helpers/README.md +96 -96
- package/.claude/helpers/adr-compliance.sh +186 -186
- package/.claude/helpers/auto-commit.sh +178 -178
- package/.claude/helpers/auto-memory-hook.mjs +430 -430
- package/.claude/helpers/checkpoint-manager.sh +251 -251
- package/.claude/helpers/daemon-manager.sh +252 -252
- package/.claude/helpers/ddd-tracker.sh +144 -144
- package/.claude/helpers/github-safe.js +156 -156
- package/.claude/helpers/github-setup.sh +45 -45
- package/.claude/helpers/guidance-hook.sh +13 -13
- package/.claude/helpers/guidance-hooks.sh +102 -102
- package/.claude/helpers/health-monitor.sh +108 -108
- package/.claude/helpers/helpers.manifest.json +6 -6
- package/.claude/helpers/hook-handler.cjs +565 -565
- package/.claude/helpers/intelligence.cjs +1058 -1058
- package/.claude/helpers/learning-hooks.sh +329 -329
- package/.claude/helpers/learning-optimizer.sh +127 -127
- package/.claude/helpers/learning-service.mjs +1144 -1144
- package/.claude/helpers/memory.js +83 -83
- package/.claude/helpers/metrics-db.mjs +503 -503
- package/.claude/helpers/pattern-consolidator.sh +86 -86
- package/.claude/helpers/perf-worker.sh +160 -160
- package/.claude/helpers/post-commit +16 -16
- package/.claude/helpers/pre-commit +26 -26
- package/.claude/helpers/quick-start.sh +19 -19
- package/.claude/helpers/router.js +105 -105
- package/.claude/helpers/security-scanner.sh +127 -127
- package/.claude/helpers/session.js +157 -157
- package/.claude/helpers/setup-mcp.sh +18 -18
- package/.claude/helpers/standard-checkpoint-hooks.sh +189 -189
- package/.claude/helpers/statusline-hook.sh +21 -21
- package/.claude/helpers/statusline.cjs +1060 -1060
- package/.claude/helpers/statusline.js +340 -340
- package/.claude/helpers/swarm-comms.sh +353 -353
- package/.claude/helpers/swarm-hooks.sh +761 -761
- package/.claude/helpers/swarm-monitor.sh +210 -210
- package/.claude/helpers/sync-v3-metrics.sh +245 -245
- package/.claude/helpers/update-v3-progress.sh +165 -165
- package/.claude/helpers/v3-quick-status.sh +57 -57
- package/.claude/helpers/v3.sh +110 -110
- package/.claude/helpers/validate-v3-config.sh +215 -215
- package/.claude/helpers/worker-manager.sh +170 -170
- package/.claude/proven-config.manifest.json +37 -37
- package/.claude/proven-config.signed.json +41 -41
- package/.claude/settings.json +182 -182
- package/.claude/skills/agentdb-advanced/SKILL.md +550 -550
- package/.claude/skills/agentdb-learning/SKILL.md +545 -545
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -339
- package/.claude/skills/agentdb-optimization/SKILL.md +509 -509
- package/.claude/skills/agentdb-vector-search/SKILL.md +339 -339
- package/.claude/skills/browser/SKILL.md +204 -204
- package/.claude/skills/dual-mode/README.md +71 -71
- package/.claude/skills/dual-mode/dual-collect.md +103 -103
- package/.claude/skills/dual-mode/dual-coordinate.md +85 -85
- package/.claude/skills/dual-mode/dual-spawn.md +81 -81
- package/.claude/skills/flow-nexus-neural/SKILL.md +727 -727
- package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -1154
- package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -604
- package/.claude/skills/github-code-review/SKILL.md +1125 -1125
- package/.claude/skills/github-multi-repo/SKILL.md +862 -862
- package/.claude/skills/github-project-management/SKILL.md +1262 -1262
- package/.claude/skills/github-release-management/SKILL.md +1064 -1064
- package/.claude/skills/github-workflow-automation/SKILL.md +1047 -1047
- package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
- package/.claude/skills/pair-programming/SKILL.md +1202 -1202
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -446
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -201
- package/.claude/skills/skill-builder/SKILL.md +910 -910
- package/.claude/skills/sparc-methodology/SKILL.md +1106 -1106
- package/.claude/skills/stream-chain/SKILL.md +560 -560
- package/.claude/skills/swarm-advanced/SKILL.md +970 -970
- package/.claude/skills/swarm-orchestration/SKILL.md +179 -179
- package/.claude/skills/v3-cli-modernization/SKILL.md +871 -871
- package/.claude/skills/v3-core-implementation/SKILL.md +796 -796
- package/.claude/skills/v3-ddd-architecture/SKILL.md +441 -441
- package/.claude/skills/v3-integration-deep/SKILL.md +240 -240
- package/.claude/skills/v3-mcp-optimization/SKILL.md +776 -776
- package/.claude/skills/v3-memory-unification/SKILL.md +173 -173
- package/.claude/skills/v3-performance-optimization/SKILL.md +389 -389
- package/.claude/skills/v3-security-overhaul/SKILL.md +81 -81
- package/.claude/skills/v3-swarm-coordination/SKILL.md +339 -339
- package/.claude/skills/verification-quality/SKILL.md +691 -691
- package/README.md +419 -419
- package/bin/cli.js +314 -314
- package/bin/mcp-server.js +224 -224
- package/bin/preinstall.cjs +2 -2
- package/catalog-manifest.json +2 -2
- package/dist/src/autopilot-state.js +24 -7
- package/dist/src/benchmarks/gaia-critic.js +24 -24
- package/dist/src/business-pods/bbs-budget-tracker.js +53 -53
- package/dist/src/commands/completions.js +409 -409
- package/dist/src/commands/daemon.js +44 -44
- package/dist/src/commands/embeddings.js +26 -26
- package/dist/src/commands/hive-mind.js +97 -97
- package/dist/src/commands/hooks.js +31 -10
- package/dist/src/commands/init.js +202 -34
- package/dist/src/commands/memory.js +12 -1
- package/dist/src/commands/ruvector/backup.js +23 -23
- package/dist/src/commands/ruvector/benchmark.js +31 -31
- package/dist/src/commands/ruvector/import.js +14 -14
- package/dist/src/commands/ruvector/init.js +115 -115
- package/dist/src/commands/ruvector/migrate.js +99 -99
- package/dist/src/commands/ruvector/optimize.js +51 -51
- package/dist/src/commands/ruvector/setup.js +624 -624
- package/dist/src/commands/ruvector/status.js +38 -38
- package/dist/src/config/proven-config.js +2 -2
- package/dist/src/funnel/disclosure.js +13 -2
- package/dist/src/funnel/messages.d.ts +12 -10
- package/dist/src/funnel/messages.js +83 -11
- package/dist/src/init/claudemd-generator.js +231 -231
- package/dist/src/init/executor.js +453 -453
- package/dist/src/init/helper-signing.js +2 -2
- package/dist/src/init/helpers-generator.js +751 -751
- package/dist/src/init/statusline-generator.js +24 -24
- package/dist/src/mcp-tools/agentdb-tools.js +15 -15
- package/dist/src/mcp-tools/browser-intent-tools.js +19 -19
- package/dist/src/mcp-tools/browser-tools.js +8 -0
- package/dist/src/mcp-tools/hooks-tools.js +21 -0
- package/dist/src/mcp-tools/memory-tools.js +4 -3
- package/dist/src/memory/graph-edge-writer.js +22 -22
- package/dist/src/memory/memory-bridge.js +192 -123
- package/dist/src/memory/memory-initializer.js +407 -407
- package/dist/src/memory/rabitq-index.js +5 -5
- package/dist/src/parser.js +25 -9
- package/dist/src/proxy/verify.js +2 -2
- package/dist/src/runtime/headless.js +28 -28
- package/dist/src/services/distill-tuning.js +7 -7
- package/dist/src/services/headless-worker-executor.js +84 -84
- package/dist/src/services/memory-distillation.js +4 -4
- package/dist/src/services/worker-daemon.js +7 -4
- package/dist/src/transfer/deploy-seraphine.js +23 -23
- package/package.json +137 -137
- package/plugins/ruflo-metaharness/.claude-plugin/plugin.json +32 -32
- package/plugins/ruflo-metaharness/README.md +72 -72
- package/plugins/ruflo-metaharness/agents/metaharness-architect.md +58 -58
- package/plugins/ruflo-metaharness/commands/ruflo-metaharness.md +48 -48
- package/plugins/ruflo-metaharness/scripts/_darwin.mjs +210 -210
- package/plugins/ruflo-metaharness/scripts/_harness.mjs +330 -330
- package/plugins/ruflo-metaharness/scripts/_invoke.mjs +231 -231
- package/plugins/ruflo-metaharness/scripts/_redblue.mjs +143 -143
- package/plugins/ruflo-metaharness/scripts/_similarity.mjs +161 -161
- package/plugins/ruflo-metaharness/scripts/_spike-similarity.mjs +223 -223
- package/plugins/ruflo-metaharness/scripts/audit-list.mjs +158 -158
- package/plugins/ruflo-metaharness/scripts/audit-trend.mjs +272 -272
- package/plugins/ruflo-metaharness/scripts/bench-parse-mcp-scan.mjs +146 -146
- package/plugins/ruflo-metaharness/scripts/bench-recordpair-overhead.mjs +186 -186
- package/plugins/ruflo-metaharness/scripts/bench-similarity.mjs +177 -177
- package/plugins/ruflo-metaharness/scripts/bench.mjs +95 -95
- package/plugins/ruflo-metaharness/scripts/drift-from-history.mjs +363 -363
- package/plugins/ruflo-metaharness/scripts/evolve.mjs +404 -404
- package/plugins/ruflo-metaharness/scripts/genome.mjs +80 -80
- package/plugins/ruflo-metaharness/scripts/gepa.mjs +153 -153
- package/plugins/ruflo-metaharness/scripts/learn.mjs +127 -127
- package/plugins/ruflo-metaharness/scripts/mcp-scan.mjs +111 -111
- package/plugins/ruflo-metaharness/scripts/mint.mjs +126 -126
- package/plugins/ruflo-metaharness/scripts/oia-audit.mjs +228 -228
- package/plugins/ruflo-metaharness/scripts/redblue.mjs +286 -286
- package/plugins/ruflo-metaharness/scripts/router-parallel-analyze.mjs +250 -250
- package/plugins/ruflo-metaharness/scripts/score.mjs +92 -92
- package/plugins/ruflo-metaharness/scripts/security-bench.mjs +174 -174
- package/plugins/ruflo-metaharness/scripts/similarity.mjs +158 -158
- package/plugins/ruflo-metaharness/scripts/smoke.sh +2356 -2356
- package/plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs +165 -165
- package/plugins/ruflo-metaharness/scripts/test-mcp-tools.mjs +472 -472
- package/plugins/ruflo-metaharness/scripts/test-parallel-pipeline.mjs +204 -204
- package/plugins/ruflo-metaharness/scripts/test-pipeline-roundtrip.mjs +586 -586
- package/plugins/ruflo-metaharness/scripts/test-similarity.mjs +334 -334
- package/plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs +229 -229
- package/plugins/ruflo-metaharness/scripts/threat-model.mjs +59 -59
- package/plugins/ruflo-metaharness/skills/harness-bench/SKILL.md +64 -64
- package/plugins/ruflo-metaharness/skills/harness-drift-from-history/SKILL.md +65 -65
- package/plugins/ruflo-metaharness/skills/harness-evolve/SKILL.md +131 -131
- package/plugins/ruflo-metaharness/skills/harness-genome/SKILL.md +54 -54
- package/plugins/ruflo-metaharness/skills/harness-gepa/SKILL.md +65 -65
- package/plugins/ruflo-metaharness/skills/harness-learn/SKILL.md +65 -65
- package/plugins/ruflo-metaharness/skills/harness-mcp-scan/SKILL.md +49 -49
- package/plugins/ruflo-metaharness/skills/harness-mint/SKILL.md +72 -72
- package/plugins/ruflo-metaharness/skills/harness-oia-audit/SKILL.md +79 -79
- package/plugins/ruflo-metaharness/skills/harness-score/SKILL.md +66 -66
- package/plugins/ruflo-metaharness/skills/harness-security-bench/SKILL.md +101 -101
- package/plugins/ruflo-metaharness/skills/harness-similarity/SKILL.md +67 -67
- package/plugins/ruflo-metaharness/skills/harness-threat-model/SKILL.md +41 -41
- package/scripts/postinstall.cjs +153 -153
|
@@ -1,127 +1,127 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// learn.mjs — wrapper around `metaharness learn` (upstream ADR-235, metaharness@0.3.0).
|
|
3
|
-
//
|
|
4
|
-
// GEPA learning run: optimizes a harness genome against a SWE-bench-style
|
|
5
|
-
// slice manifest. $0 DRY-RUN BY DEFAULT — upstream only spends (model calls,
|
|
6
|
-
// Docker sandboxes) when --run is passed, and we forward that flag verbatim
|
|
7
|
-
// so the spend opt-in stays explicit at every layer.
|
|
8
|
-
//
|
|
9
|
-
// CHECKOUT PRECONDITION (upstream design, not a bug)
|
|
10
|
-
// ==================================================
|
|
11
|
-
// The learning harness (GEPA + SWE-bench + Docker) is too heavy to ship in
|
|
12
|
-
// the npm package, so `metaharness learn` requires a local clone of the
|
|
13
|
-
// metaharness repo, located via $METAHARNESS_REPO or by running inside the
|
|
14
|
-
// clone. When the checkout is absent we emit a structured
|
|
15
|
-
// `{status: "checkout-required"}` payload and exit 0 — the script ran as
|
|
16
|
-
// designed and told the agent what to do next. This is distinct from
|
|
17
|
-
// `degraded: true` (npm package absent). The managed-service path (gateway-
|
|
18
|
-
// side learn jobs, no checkout) is upstream's ADR-235 follow-up.
|
|
19
|
-
//
|
|
20
|
-
// USAGE
|
|
21
|
-
// node scripts/learn.mjs --host claude-code --model haiku --slice slices/lite.json
|
|
22
|
-
// node scripts/learn.mjs --repo ~/src/metaharness --host codex --model gpt-5-mini --slice s.json --run
|
|
23
|
-
//
|
|
24
|
-
// EXIT CODES
|
|
25
|
-
// 0 learn completed (or dry-run report, or degraded, or checkout-required)
|
|
26
|
-
// 1 --alert-on-fail and the learn run reported failure
|
|
27
|
-
// 2 config error (bad arg)
|
|
28
|
-
|
|
29
|
-
import { existsSync } from 'node:fs';
|
|
30
|
-
import { runMetaharnessAsync, emitDegradedJsonAndExit } from './_harness.mjs';
|
|
31
|
-
|
|
32
|
-
const ARGS = (() => {
|
|
33
|
-
const a = {
|
|
34
|
-
host: null,
|
|
35
|
-
model: null,
|
|
36
|
-
slice: null,
|
|
37
|
-
repo: null,
|
|
38
|
-
run: false,
|
|
39
|
-
alertOnFail: false,
|
|
40
|
-
format: 'json',
|
|
41
|
-
timeoutMs: null,
|
|
42
|
-
};
|
|
43
|
-
for (let i = 2; i < process.argv.length; i++) {
|
|
44
|
-
const v = process.argv[i];
|
|
45
|
-
if (v === '--host') a.host = process.argv[++i];
|
|
46
|
-
else if (v === '--model') a.model = process.argv[++i];
|
|
47
|
-
else if (v === '--slice') a.slice = process.argv[++i];
|
|
48
|
-
else if (v === '--repo') a.repo = process.argv[++i];
|
|
49
|
-
else if (v === '--run') a.run = true;
|
|
50
|
-
else if (v === '--alert-on-fail') a.alertOnFail = true;
|
|
51
|
-
else if (v === '--format') a.format = process.argv[++i];
|
|
52
|
-
else if (v === '--timeout-ms') a.timeoutMs = parseInt(process.argv[++i], 10);
|
|
53
|
-
}
|
|
54
|
-
return a;
|
|
55
|
-
})();
|
|
56
|
-
|
|
57
|
-
const CHECKOUT_RX = /requires a metaharness repo checkout/i;
|
|
58
|
-
|
|
59
|
-
function defaultTimeoutMs() {
|
|
60
|
-
// Dry-run resolves the slice manifest + prices the run without spending —
|
|
61
|
-
// bounded by repo scan, not model calls. Real runs (--run) are dominated
|
|
62
|
-
// by model calls × slice size; callers should pass --timeout-ms matched
|
|
63
|
-
// to their slice. 10 min is a floor for small slices, not a budget.
|
|
64
|
-
return ARGS.run ? 600_000 : 120_000;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function main() {
|
|
68
|
-
if (ARGS.repo && !existsSync(ARGS.repo)) {
|
|
69
|
-
console.error(`learn: --repo path does not exist: ${ARGS.repo}`);
|
|
70
|
-
process.exit(2);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const cliArgs = ['learn'];
|
|
74
|
-
if (ARGS.host) cliArgs.push('--host', ARGS.host);
|
|
75
|
-
if (ARGS.model) cliArgs.push('--model', ARGS.model);
|
|
76
|
-
if (ARGS.slice) cliArgs.push('--slice', ARGS.slice);
|
|
77
|
-
if (ARGS.run) cliArgs.push('--run');
|
|
78
|
-
|
|
79
|
-
const r = await runMetaharnessAsync(cliArgs, {
|
|
80
|
-
// learn emits a human-readable report; --json support is not guaranteed
|
|
81
|
-
// across 0.3.x, so we don't inject it and parse leniently instead.
|
|
82
|
-
json: false,
|
|
83
|
-
timeoutMs: ARGS.timeoutMs ?? defaultTimeoutMs(),
|
|
84
|
-
env: ARGS.repo ? { METAHARNESS_REPO: ARGS.repo } : {},
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
if (r.degraded) emitDegradedJsonAndExit(r.reason);
|
|
88
|
-
|
|
89
|
-
const combined = `${r.stdout}\n${r.stderr}`;
|
|
90
|
-
if (CHECKOUT_RX.test(combined)) {
|
|
91
|
-
console.log(JSON.stringify({
|
|
92
|
-
status: 'checkout-required',
|
|
93
|
-
hint: 'git clone https://github.com/ruvnet/metaharness.git, then re-run with '
|
|
94
|
-
+ '--repo /path/to/metaharness (or set METAHARNESS_REPO). The learning '
|
|
95
|
-
+ 'harness (GEPA + SWE-bench + Docker) is not shipped in the npm package.',
|
|
96
|
-
dryRun: !ARGS.run,
|
|
97
|
-
durationMs: r.durationMs,
|
|
98
|
-
}, null, 2));
|
|
99
|
-
process.exit(0);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Lenient JSON extraction — grab the last {...} block if one exists.
|
|
103
|
-
let json = null;
|
|
104
|
-
const matches = [...r.stdout.matchAll(/\{[\s\S]*?\}/g)];
|
|
105
|
-
for (let i = matches.length - 1; i >= 0; i--) {
|
|
106
|
-
try { json = JSON.parse(matches[i][0]); break; } catch { /* try previous */ }
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const out = {
|
|
110
|
-
status: r.exitCode === 0 ? 'ok' : 'failed',
|
|
111
|
-
dryRun: !ARGS.run,
|
|
112
|
-
exitCode: r.exitCode,
|
|
113
|
-
report: json,
|
|
114
|
-
// When upstream emits no JSON, the raw report is still the deliverable.
|
|
115
|
-
rawReport: json ? undefined : r.stdout.slice(0, 20_000),
|
|
116
|
-
durationMs: r.durationMs,
|
|
117
|
-
};
|
|
118
|
-
console.log(JSON.stringify(out, null, 2));
|
|
119
|
-
|
|
120
|
-
if (ARGS.alertOnFail && r.exitCode !== 0) process.exit(1);
|
|
121
|
-
process.exit(0);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
main().catch((e) => {
|
|
125
|
-
console.error(`learn: ${e?.message ?? e}`);
|
|
126
|
-
process.exit(2);
|
|
127
|
-
});
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// learn.mjs — wrapper around `metaharness learn` (upstream ADR-235, metaharness@0.3.0).
|
|
3
|
+
//
|
|
4
|
+
// GEPA learning run: optimizes a harness genome against a SWE-bench-style
|
|
5
|
+
// slice manifest. $0 DRY-RUN BY DEFAULT — upstream only spends (model calls,
|
|
6
|
+
// Docker sandboxes) when --run is passed, and we forward that flag verbatim
|
|
7
|
+
// so the spend opt-in stays explicit at every layer.
|
|
8
|
+
//
|
|
9
|
+
// CHECKOUT PRECONDITION (upstream design, not a bug)
|
|
10
|
+
// ==================================================
|
|
11
|
+
// The learning harness (GEPA + SWE-bench + Docker) is too heavy to ship in
|
|
12
|
+
// the npm package, so `metaharness learn` requires a local clone of the
|
|
13
|
+
// metaharness repo, located via $METAHARNESS_REPO or by running inside the
|
|
14
|
+
// clone. When the checkout is absent we emit a structured
|
|
15
|
+
// `{status: "checkout-required"}` payload and exit 0 — the script ran as
|
|
16
|
+
// designed and told the agent what to do next. This is distinct from
|
|
17
|
+
// `degraded: true` (npm package absent). The managed-service path (gateway-
|
|
18
|
+
// side learn jobs, no checkout) is upstream's ADR-235 follow-up.
|
|
19
|
+
//
|
|
20
|
+
// USAGE
|
|
21
|
+
// node scripts/learn.mjs --host claude-code --model haiku --slice slices/lite.json
|
|
22
|
+
// node scripts/learn.mjs --repo ~/src/metaharness --host codex --model gpt-5-mini --slice s.json --run
|
|
23
|
+
//
|
|
24
|
+
// EXIT CODES
|
|
25
|
+
// 0 learn completed (or dry-run report, or degraded, or checkout-required)
|
|
26
|
+
// 1 --alert-on-fail and the learn run reported failure
|
|
27
|
+
// 2 config error (bad arg)
|
|
28
|
+
|
|
29
|
+
import { existsSync } from 'node:fs';
|
|
30
|
+
import { runMetaharnessAsync, emitDegradedJsonAndExit } from './_harness.mjs';
|
|
31
|
+
|
|
32
|
+
const ARGS = (() => {
|
|
33
|
+
const a = {
|
|
34
|
+
host: null,
|
|
35
|
+
model: null,
|
|
36
|
+
slice: null,
|
|
37
|
+
repo: null,
|
|
38
|
+
run: false,
|
|
39
|
+
alertOnFail: false,
|
|
40
|
+
format: 'json',
|
|
41
|
+
timeoutMs: null,
|
|
42
|
+
};
|
|
43
|
+
for (let i = 2; i < process.argv.length; i++) {
|
|
44
|
+
const v = process.argv[i];
|
|
45
|
+
if (v === '--host') a.host = process.argv[++i];
|
|
46
|
+
else if (v === '--model') a.model = process.argv[++i];
|
|
47
|
+
else if (v === '--slice') a.slice = process.argv[++i];
|
|
48
|
+
else if (v === '--repo') a.repo = process.argv[++i];
|
|
49
|
+
else if (v === '--run') a.run = true;
|
|
50
|
+
else if (v === '--alert-on-fail') a.alertOnFail = true;
|
|
51
|
+
else if (v === '--format') a.format = process.argv[++i];
|
|
52
|
+
else if (v === '--timeout-ms') a.timeoutMs = parseInt(process.argv[++i], 10);
|
|
53
|
+
}
|
|
54
|
+
return a;
|
|
55
|
+
})();
|
|
56
|
+
|
|
57
|
+
const CHECKOUT_RX = /requires a metaharness repo checkout/i;
|
|
58
|
+
|
|
59
|
+
function defaultTimeoutMs() {
|
|
60
|
+
// Dry-run resolves the slice manifest + prices the run without spending —
|
|
61
|
+
// bounded by repo scan, not model calls. Real runs (--run) are dominated
|
|
62
|
+
// by model calls × slice size; callers should pass --timeout-ms matched
|
|
63
|
+
// to their slice. 10 min is a floor for small slices, not a budget.
|
|
64
|
+
return ARGS.run ? 600_000 : 120_000;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function main() {
|
|
68
|
+
if (ARGS.repo && !existsSync(ARGS.repo)) {
|
|
69
|
+
console.error(`learn: --repo path does not exist: ${ARGS.repo}`);
|
|
70
|
+
process.exit(2);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const cliArgs = ['learn'];
|
|
74
|
+
if (ARGS.host) cliArgs.push('--host', ARGS.host);
|
|
75
|
+
if (ARGS.model) cliArgs.push('--model', ARGS.model);
|
|
76
|
+
if (ARGS.slice) cliArgs.push('--slice', ARGS.slice);
|
|
77
|
+
if (ARGS.run) cliArgs.push('--run');
|
|
78
|
+
|
|
79
|
+
const r = await runMetaharnessAsync(cliArgs, {
|
|
80
|
+
// learn emits a human-readable report; --json support is not guaranteed
|
|
81
|
+
// across 0.3.x, so we don't inject it and parse leniently instead.
|
|
82
|
+
json: false,
|
|
83
|
+
timeoutMs: ARGS.timeoutMs ?? defaultTimeoutMs(),
|
|
84
|
+
env: ARGS.repo ? { METAHARNESS_REPO: ARGS.repo } : {},
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
if (r.degraded) emitDegradedJsonAndExit(r.reason);
|
|
88
|
+
|
|
89
|
+
const combined = `${r.stdout}\n${r.stderr}`;
|
|
90
|
+
if (CHECKOUT_RX.test(combined)) {
|
|
91
|
+
console.log(JSON.stringify({
|
|
92
|
+
status: 'checkout-required',
|
|
93
|
+
hint: 'git clone https://github.com/ruvnet/metaharness.git, then re-run with '
|
|
94
|
+
+ '--repo /path/to/metaharness (or set METAHARNESS_REPO). The learning '
|
|
95
|
+
+ 'harness (GEPA + SWE-bench + Docker) is not shipped in the npm package.',
|
|
96
|
+
dryRun: !ARGS.run,
|
|
97
|
+
durationMs: r.durationMs,
|
|
98
|
+
}, null, 2));
|
|
99
|
+
process.exit(0);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Lenient JSON extraction — grab the last {...} block if one exists.
|
|
103
|
+
let json = null;
|
|
104
|
+
const matches = [...r.stdout.matchAll(/\{[\s\S]*?\}/g)];
|
|
105
|
+
for (let i = matches.length - 1; i >= 0; i--) {
|
|
106
|
+
try { json = JSON.parse(matches[i][0]); break; } catch { /* try previous */ }
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const out = {
|
|
110
|
+
status: r.exitCode === 0 ? 'ok' : 'failed',
|
|
111
|
+
dryRun: !ARGS.run,
|
|
112
|
+
exitCode: r.exitCode,
|
|
113
|
+
report: json,
|
|
114
|
+
// When upstream emits no JSON, the raw report is still the deliverable.
|
|
115
|
+
rawReport: json ? undefined : r.stdout.slice(0, 20_000),
|
|
116
|
+
durationMs: r.durationMs,
|
|
117
|
+
};
|
|
118
|
+
console.log(JSON.stringify(out, null, 2));
|
|
119
|
+
|
|
120
|
+
if (ARGS.alertOnFail && r.exitCode !== 0) process.exit(1);
|
|
121
|
+
process.exit(0);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
main().catch((e) => {
|
|
125
|
+
console.error(`learn: ${e?.message ?? e}`);
|
|
126
|
+
process.exit(2);
|
|
127
|
+
});
|
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// mcp-scan.mjs — wrapper around `harness mcp-scan <path>`.
|
|
3
|
-
//
|
|
4
|
-
// Static security scan of the harness's declared MCP surface. Reads
|
|
5
|
-
// .mcp/servers.json + .harness/claims.json. Pure-read, no dispatch.
|
|
6
|
-
//
|
|
7
|
-
// USAGE
|
|
8
|
-
// node scripts/mcp-scan.mjs # current dir
|
|
9
|
-
// node scripts/mcp-scan.mjs --path <dir>
|
|
10
|
-
// node scripts/mcp-scan.mjs --fail-on high # exit 1 if any HIGH finding (default)
|
|
11
|
-
// node scripts/mcp-scan.mjs --fail-on medium # also fail on MEDIUM
|
|
12
|
-
// node scripts/mcp-scan.mjs --format json
|
|
13
|
-
//
|
|
14
|
-
// EXIT CODES
|
|
15
|
-
// 0 no findings at or above --fail-on (or degraded)
|
|
16
|
-
// 1 at least one finding ≥ --fail-on severity
|
|
17
|
-
// 2 config error or scan failure
|
|
18
|
-
|
|
19
|
-
// iter 50 — parseMcpScanText extracted to _harness.mjs so oia-audit
|
|
20
|
-
// can use the same parser without duplicating logic.
|
|
21
|
-
// iter 63 — SEVERITY_RANK also moves to _harness.mjs (single source of
|
|
22
|
-
// truth; previously this file had a literal that diverged from oia-audit's).
|
|
23
|
-
import { runHarness, emitDegradedJsonAndExit, parseMcpScanText, SEVERITY_RANK, rankSeverity } from './_harness.mjs';
|
|
24
|
-
|
|
25
|
-
const ARGS = (() => {
|
|
26
|
-
const a = { path: '.', format: 'json', failOn: 'high' };
|
|
27
|
-
for (let i = 2; i < process.argv.length; i++) {
|
|
28
|
-
const v = process.argv[i];
|
|
29
|
-
if (v === '--path') a.path = process.argv[++i];
|
|
30
|
-
else if (v === '--fail-on') a.failOn = String(process.argv[++i] || 'high').toLowerCase();
|
|
31
|
-
else if (v === '--format') a.format = process.argv[++i];
|
|
32
|
-
}
|
|
33
|
-
return a;
|
|
34
|
-
})();
|
|
35
|
-
|
|
36
|
-
function main() {
|
|
37
|
-
if (!SEVERITY_RANK[ARGS.failOn]) {
|
|
38
|
-
console.error(`mcp-scan: --fail-on must be one of low|medium|high; got ${ARGS.failOn}`);
|
|
39
|
-
process.exit(2);
|
|
40
|
-
}
|
|
41
|
-
const r = runHarness(['mcp-scan', ARGS.path]);
|
|
42
|
-
if (r.degraded) { emitDegradedJsonAndExit(r.reason); return; }
|
|
43
|
-
if (r.exitCode !== 0 && r.exitCode !== 1) {
|
|
44
|
-
// exit 1 from harness can be "findings present"; only treat other
|
|
45
|
-
// non-zero as a real failure.
|
|
46
|
-
console.error(`mcp-scan: harness exited ${r.exitCode}`);
|
|
47
|
-
if (r.stderr) console.error(r.stderr.slice(0, 400));
|
|
48
|
-
process.exit(2);
|
|
49
|
-
}
|
|
50
|
-
// The JSON output shape from `harness mcp-scan` historically didn't
|
|
51
|
-
// include structured findings — it emits text even with --json. Parse
|
|
52
|
-
// the text into findings (iter 50) so audit-trend's introduced/cleared
|
|
53
|
-
// diff actually works. If a future upstream version DOES emit
|
|
54
|
-
// findings[], the parsed-text findings are overridden.
|
|
55
|
-
const parsed = parseMcpScanText(r.stdout);
|
|
56
|
-
// iter 124 — normalize finding shape so consumers see a stable contract.
|
|
57
|
-
// Upstream metaharness@0.1.x JSON path emits {id, severity, title, detail};
|
|
58
|
-
// our parseMcpScanText emits {severity, message}. Project both into a
|
|
59
|
-
// unified {severity, message, title?, detail?} so audit-trend's fingerprint
|
|
60
|
-
// diff and test-mcp-tools' assertions don't care which path produced them.
|
|
61
|
-
const rawFindings = Array.isArray(r.json?.findings) ? r.json.findings : parsed.findings;
|
|
62
|
-
const findings = rawFindings.map((f) => ({
|
|
63
|
-
...f,
|
|
64
|
-
message: typeof f.message === 'string' && f.message
|
|
65
|
-
? f.message
|
|
66
|
-
: (f.title || f.detail || ''),
|
|
67
|
-
}));
|
|
68
|
-
const payload = {
|
|
69
|
-
...(r.json ?? {}),
|
|
70
|
-
findings,
|
|
71
|
-
summary: r.json?.summary ?? parsed.summary,
|
|
72
|
-
rawStdout: r.stdout.slice(0, 400),
|
|
73
|
-
};
|
|
74
|
-
const threshold = SEVERITY_RANK[ARGS.failOn];
|
|
75
|
-
// iter 63 — rankSeverity() safe lookup. Pre-iter-63 `undefined >= 3`
|
|
76
|
-
// was false → unknown-severity findings (e.g., warn / error) were
|
|
77
|
-
// silently excluded from the offending set, weakening --fail-on alerts.
|
|
78
|
-
const offending = findings.filter((f) => rankSeverity(f.severity) >= threshold);
|
|
79
|
-
|
|
80
|
-
const alert = {
|
|
81
|
-
threshold: ARGS.failOn,
|
|
82
|
-
triggered: offending.length > 0,
|
|
83
|
-
offendingCount: offending.length,
|
|
84
|
-
reason: offending.length > 0
|
|
85
|
-
? `${offending.length} finding(s) at or above ${ARGS.failOn} severity`
|
|
86
|
-
: `no findings at or above ${ARGS.failOn} severity — OK`,
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
if (ARGS.format === 'json') {
|
|
90
|
-
// iter 112 — generatedAt for consistency with other --format json outputs
|
|
91
|
-
console.log(JSON.stringify({
|
|
92
|
-
...payload, durationMs: r.durationMs, alert,
|
|
93
|
-
generatedAt: new Date().toISOString(),
|
|
94
|
-
}, null, 2));
|
|
95
|
-
} else {
|
|
96
|
-
console.log(`# harness mcp-scan — ${ARGS.path}`);
|
|
97
|
-
console.log('');
|
|
98
|
-
console.log(`Total findings: ${findings.length}`);
|
|
99
|
-
console.log(`| Severity | ID | Server | Tool | Message |`);
|
|
100
|
-
console.log(`|---|---|---|---|---|`);
|
|
101
|
-
for (const f of findings.slice(0, 50)) {
|
|
102
|
-
console.log(`| ${f.severity} | ${f.id ?? '—'} | ${f.server ?? '—'} | ${f.tool ?? '—'} | ${f.message ?? ''} |`);
|
|
103
|
-
}
|
|
104
|
-
console.log('');
|
|
105
|
-
console.log(alert.triggered ? `⚠ **ALERT**: ${alert.reason}` : `✓ ${alert.reason}`);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (alert.triggered) process.exit(1);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
main();
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// mcp-scan.mjs — wrapper around `harness mcp-scan <path>`.
|
|
3
|
+
//
|
|
4
|
+
// Static security scan of the harness's declared MCP surface. Reads
|
|
5
|
+
// .mcp/servers.json + .harness/claims.json. Pure-read, no dispatch.
|
|
6
|
+
//
|
|
7
|
+
// USAGE
|
|
8
|
+
// node scripts/mcp-scan.mjs # current dir
|
|
9
|
+
// node scripts/mcp-scan.mjs --path <dir>
|
|
10
|
+
// node scripts/mcp-scan.mjs --fail-on high # exit 1 if any HIGH finding (default)
|
|
11
|
+
// node scripts/mcp-scan.mjs --fail-on medium # also fail on MEDIUM
|
|
12
|
+
// node scripts/mcp-scan.mjs --format json
|
|
13
|
+
//
|
|
14
|
+
// EXIT CODES
|
|
15
|
+
// 0 no findings at or above --fail-on (or degraded)
|
|
16
|
+
// 1 at least one finding ≥ --fail-on severity
|
|
17
|
+
// 2 config error or scan failure
|
|
18
|
+
|
|
19
|
+
// iter 50 — parseMcpScanText extracted to _harness.mjs so oia-audit
|
|
20
|
+
// can use the same parser without duplicating logic.
|
|
21
|
+
// iter 63 — SEVERITY_RANK also moves to _harness.mjs (single source of
|
|
22
|
+
// truth; previously this file had a literal that diverged from oia-audit's).
|
|
23
|
+
import { runHarness, emitDegradedJsonAndExit, parseMcpScanText, SEVERITY_RANK, rankSeverity } from './_harness.mjs';
|
|
24
|
+
|
|
25
|
+
const ARGS = (() => {
|
|
26
|
+
const a = { path: '.', format: 'json', failOn: 'high' };
|
|
27
|
+
for (let i = 2; i < process.argv.length; i++) {
|
|
28
|
+
const v = process.argv[i];
|
|
29
|
+
if (v === '--path') a.path = process.argv[++i];
|
|
30
|
+
else if (v === '--fail-on') a.failOn = String(process.argv[++i] || 'high').toLowerCase();
|
|
31
|
+
else if (v === '--format') a.format = process.argv[++i];
|
|
32
|
+
}
|
|
33
|
+
return a;
|
|
34
|
+
})();
|
|
35
|
+
|
|
36
|
+
function main() {
|
|
37
|
+
if (!SEVERITY_RANK[ARGS.failOn]) {
|
|
38
|
+
console.error(`mcp-scan: --fail-on must be one of low|medium|high; got ${ARGS.failOn}`);
|
|
39
|
+
process.exit(2);
|
|
40
|
+
}
|
|
41
|
+
const r = runHarness(['mcp-scan', ARGS.path]);
|
|
42
|
+
if (r.degraded) { emitDegradedJsonAndExit(r.reason); return; }
|
|
43
|
+
if (r.exitCode !== 0 && r.exitCode !== 1) {
|
|
44
|
+
// exit 1 from harness can be "findings present"; only treat other
|
|
45
|
+
// non-zero as a real failure.
|
|
46
|
+
console.error(`mcp-scan: harness exited ${r.exitCode}`);
|
|
47
|
+
if (r.stderr) console.error(r.stderr.slice(0, 400));
|
|
48
|
+
process.exit(2);
|
|
49
|
+
}
|
|
50
|
+
// The JSON output shape from `harness mcp-scan` historically didn't
|
|
51
|
+
// include structured findings — it emits text even with --json. Parse
|
|
52
|
+
// the text into findings (iter 50) so audit-trend's introduced/cleared
|
|
53
|
+
// diff actually works. If a future upstream version DOES emit
|
|
54
|
+
// findings[], the parsed-text findings are overridden.
|
|
55
|
+
const parsed = parseMcpScanText(r.stdout);
|
|
56
|
+
// iter 124 — normalize finding shape so consumers see a stable contract.
|
|
57
|
+
// Upstream metaharness@0.1.x JSON path emits {id, severity, title, detail};
|
|
58
|
+
// our parseMcpScanText emits {severity, message}. Project both into a
|
|
59
|
+
// unified {severity, message, title?, detail?} so audit-trend's fingerprint
|
|
60
|
+
// diff and test-mcp-tools' assertions don't care which path produced them.
|
|
61
|
+
const rawFindings = Array.isArray(r.json?.findings) ? r.json.findings : parsed.findings;
|
|
62
|
+
const findings = rawFindings.map((f) => ({
|
|
63
|
+
...f,
|
|
64
|
+
message: typeof f.message === 'string' && f.message
|
|
65
|
+
? f.message
|
|
66
|
+
: (f.title || f.detail || ''),
|
|
67
|
+
}));
|
|
68
|
+
const payload = {
|
|
69
|
+
...(r.json ?? {}),
|
|
70
|
+
findings,
|
|
71
|
+
summary: r.json?.summary ?? parsed.summary,
|
|
72
|
+
rawStdout: r.stdout.slice(0, 400),
|
|
73
|
+
};
|
|
74
|
+
const threshold = SEVERITY_RANK[ARGS.failOn];
|
|
75
|
+
// iter 63 — rankSeverity() safe lookup. Pre-iter-63 `undefined >= 3`
|
|
76
|
+
// was false → unknown-severity findings (e.g., warn / error) were
|
|
77
|
+
// silently excluded from the offending set, weakening --fail-on alerts.
|
|
78
|
+
const offending = findings.filter((f) => rankSeverity(f.severity) >= threshold);
|
|
79
|
+
|
|
80
|
+
const alert = {
|
|
81
|
+
threshold: ARGS.failOn,
|
|
82
|
+
triggered: offending.length > 0,
|
|
83
|
+
offendingCount: offending.length,
|
|
84
|
+
reason: offending.length > 0
|
|
85
|
+
? `${offending.length} finding(s) at or above ${ARGS.failOn} severity`
|
|
86
|
+
: `no findings at or above ${ARGS.failOn} severity — OK`,
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
if (ARGS.format === 'json') {
|
|
90
|
+
// iter 112 — generatedAt for consistency with other --format json outputs
|
|
91
|
+
console.log(JSON.stringify({
|
|
92
|
+
...payload, durationMs: r.durationMs, alert,
|
|
93
|
+
generatedAt: new Date().toISOString(),
|
|
94
|
+
}, null, 2));
|
|
95
|
+
} else {
|
|
96
|
+
console.log(`# harness mcp-scan — ${ARGS.path}`);
|
|
97
|
+
console.log('');
|
|
98
|
+
console.log(`Total findings: ${findings.length}`);
|
|
99
|
+
console.log(`| Severity | ID | Server | Tool | Message |`);
|
|
100
|
+
console.log(`|---|---|---|---|---|`);
|
|
101
|
+
for (const f of findings.slice(0, 50)) {
|
|
102
|
+
console.log(`| ${f.severity} | ${f.id ?? '—'} | ${f.server ?? '—'} | ${f.tool ?? '—'} | ${f.message ?? ''} |`);
|
|
103
|
+
}
|
|
104
|
+
console.log('');
|
|
105
|
+
console.log(alert.triggered ? `⚠ **ALERT**: ${alert.reason}` : `✓ ${alert.reason}`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (alert.triggered) process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
main();
|