@claude-flow/cli 3.32.8 → 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 -1006
- 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/doctor.js +267 -20
- package/dist/src/commands/embeddings.js +26 -26
- package/dist/src/commands/hive-mind.js +97 -97
- package/dist/src/commands/hooks.js +74 -11
- 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/message-transport.d.ts +11 -4
- package/dist/src/funnel/message-transport.js +11 -4
- 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.d.ts +9 -0
- package/dist/src/memory/graph-edge-writer.js +35 -22
- package/dist/src/memory/memory-bridge.js +189 -93
- package/dist/src/memory/memory-initializer.js +479 -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 -135
- 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,286 +1,286 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// redblue.mjs — wrapper around `@metaharness/redblue` for LLM red/blue testing.
|
|
3
|
-
//
|
|
4
|
-
// ADR-150 sibling-package integration: `@metaharness/redblue` runs an
|
|
5
|
-
// adversarial red-team → judge → blue-team patch loop against an LLM
|
|
6
|
-
// target you own. Upstream README: packages/redblue#readme on
|
|
7
|
-
// github.com/ruvnet/agent-harness-generator.
|
|
8
|
-
//
|
|
9
|
-
// SAFETY (enforced by upstream `src/config/safety.ts`, NOT this wrapper):
|
|
10
|
-
// - no real credentials (`allow_real_credentials:true` = load-time error)
|
|
11
|
-
// - no live external targets (validateTarget() rejects non-loopback)
|
|
12
|
-
// - no shell, no arbitrary network, no eval
|
|
13
|
-
// - sensitive outputs redacted before storage
|
|
14
|
-
// - `max_cost_usd` / `max_runtime_minutes` / `max_tests` cap every run
|
|
15
|
-
//
|
|
16
|
-
// USAGE
|
|
17
|
-
// node scripts/redblue.mjs init # write redblue.yaml
|
|
18
|
-
// node scripts/redblue.mjs run --mock-judge --tests 10 # $0 marker-fixture path
|
|
19
|
-
// node scripts/redblue.mjs run --tests 50 --patch # real judge (needs OPENROUTER_API_KEY)
|
|
20
|
-
// node scripts/redblue.mjs attack prompt --count 5 # preview attacks
|
|
21
|
-
// node scripts/redblue.mjs patch --mock-judge # baseline → patch → retest delta
|
|
22
|
-
// node scripts/redblue.mjs report --in report.json # render summary
|
|
23
|
-
//
|
|
24
|
-
// EXIT CODES
|
|
25
|
-
// 0 ran OK (or degraded — redblue not available)
|
|
26
|
-
// 1 --alert-on-fail and overall verdict was FAIL (after patch retest)
|
|
27
|
-
// 2 config / argv error
|
|
28
|
-
//
|
|
29
|
-
// REPORT FORMAT
|
|
30
|
-
// `run` / `patch` write a JSON report to --out (default: ./redblue-report.json).
|
|
31
|
-
// We re-emit it on stdout when --format json so MCP tools can parse it
|
|
32
|
-
// without round-tripping through disk. Markdown rendering is delegated
|
|
33
|
-
// to `redblue report` upstream.
|
|
34
|
-
|
|
35
|
-
import { runRedblue, emitRedblueDegradedJsonAndExit } from './_redblue.mjs';
|
|
36
|
-
import { existsSync, readFileSync, mkdtempSync, unlinkSync } from 'node:fs';
|
|
37
|
-
import { join, resolve } from 'node:path';
|
|
38
|
-
import { tmpdir } from 'node:os';
|
|
39
|
-
|
|
40
|
-
const VALID_SUBCOMMANDS = new Set(['init', 'run', 'patch', 'attack', 'report']);
|
|
41
|
-
const VALID_ATTACK_FAMILIES = new Set(['prompt', 'tools', 'data', 'all']);
|
|
42
|
-
|
|
43
|
-
const ARGS = (() => {
|
|
44
|
-
const a = {
|
|
45
|
-
sub: null,
|
|
46
|
-
// shared
|
|
47
|
-
config: null,
|
|
48
|
-
out: null,
|
|
49
|
-
inPath: null,
|
|
50
|
-
format: 'json',
|
|
51
|
-
// run/patch
|
|
52
|
-
tests: null,
|
|
53
|
-
patch: false,
|
|
54
|
-
mockJudge: false,
|
|
55
|
-
alertOnFail: false,
|
|
56
|
-
// attack
|
|
57
|
-
family: null,
|
|
58
|
-
count: null,
|
|
59
|
-
// budget overrides (forwarded only when set)
|
|
60
|
-
maxCostUsd: null,
|
|
61
|
-
maxRuntimeMinutes: null,
|
|
62
|
-
timeoutMs: null,
|
|
63
|
-
};
|
|
64
|
-
const argv = process.argv.slice(2);
|
|
65
|
-
if (argv.length === 0) return a;
|
|
66
|
-
a.sub = argv[0];
|
|
67
|
-
for (let i = 1; i < argv.length; i++) {
|
|
68
|
-
const v = argv[i];
|
|
69
|
-
if (v === '--config') a.config = argv[++i];
|
|
70
|
-
else if (v === '--out') a.out = argv[++i];
|
|
71
|
-
else if (v === '--in') a.inPath = argv[++i];
|
|
72
|
-
else if (v === '--format') a.format = argv[++i];
|
|
73
|
-
else if (v === '--tests') a.tests = parseInt(argv[++i], 10);
|
|
74
|
-
else if (v === '--patch') a.patch = true;
|
|
75
|
-
else if (v === '--mock-judge') a.mockJudge = true;
|
|
76
|
-
else if (v === '--alert-on-fail') a.alertOnFail = true;
|
|
77
|
-
else if (v === '--count') a.count = parseInt(argv[++i], 10);
|
|
78
|
-
else if (v === '--max-cost-usd') a.maxCostUsd = parseFloat(argv[++i]);
|
|
79
|
-
else if (v === '--max-runtime-minutes') a.maxRuntimeMinutes = parseFloat(argv[++i]);
|
|
80
|
-
else if (v === '--timeout-ms') a.timeoutMs = parseInt(argv[++i], 10);
|
|
81
|
-
else if (v === '--help' || v === '-h') a.sub = 'help';
|
|
82
|
-
else if (!v.startsWith('-') && a.sub === 'attack' && !a.family) a.family = v;
|
|
83
|
-
// any other unknown flag — pass through to upstream redblue
|
|
84
|
-
else if (v.startsWith('--')) {
|
|
85
|
-
// forward unknown flags verbatim so we don't bottleneck new redblue features
|
|
86
|
-
a._passthrough = a._passthrough || [];
|
|
87
|
-
a._passthrough.push(v);
|
|
88
|
-
// peek for next-token value (only consume if it's not another flag)
|
|
89
|
-
const next = argv[i + 1];
|
|
90
|
-
if (next !== undefined && !next.startsWith('-')) {
|
|
91
|
-
a._passthrough.push(next);
|
|
92
|
-
i++;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return a;
|
|
97
|
-
})();
|
|
98
|
-
|
|
99
|
-
function printHelp() {
|
|
100
|
-
console.log('npx ruflo metaharness redblue <subcommand> [options]');
|
|
101
|
-
console.log('');
|
|
102
|
-
console.log('Subcommands:');
|
|
103
|
-
console.log(' init Write a sample redblue.yaml config');
|
|
104
|
-
console.log(' run Run red-team → judge → (optional --patch → retest) → report');
|
|
105
|
-
console.log(' patch Baseline → blue-team patch → retest delta');
|
|
106
|
-
console.log(' attack <prompt|tools|data|all> Preview generated attack test cases (no target call)');
|
|
107
|
-
console.log(' report Render an existing report.json as markdown');
|
|
108
|
-
console.log('');
|
|
109
|
-
console.log('Common options:');
|
|
110
|
-
console.log(' --config <path> Config YAML (default: redblue.yaml in cwd)');
|
|
111
|
-
console.log(' --out <path> Output path for run/patch (default: ./redblue-report.json)');
|
|
112
|
-
console.log(' --in <path> Input report path (for `report` subcommand)');
|
|
113
|
-
console.log(' --tests N How many test cases (run/patch)');
|
|
114
|
-
console.log(' --patch After baseline run, apply blue-team patches and retest');
|
|
115
|
-
console.log(' --mock-judge $0 TEST-ONLY marker fixture — for CI / offline');
|
|
116
|
-
console.log(' --alert-on-fail Exit 1 when overall post-patch verdict is FAIL');
|
|
117
|
-
console.log(' --format json|markdown Output format (default: json)');
|
|
118
|
-
console.log(' --max-cost-usd N Override config max_cost_usd');
|
|
119
|
-
console.log(' --max-runtime-minutes N Override config max_runtime_minutes');
|
|
120
|
-
console.log(' --timeout-ms N Subprocess hard timeout (default: 120000)');
|
|
121
|
-
console.log('');
|
|
122
|
-
console.log('Examples:');
|
|
123
|
-
console.log(' node scripts/redblue.mjs init');
|
|
124
|
-
console.log(' node scripts/redblue.mjs run --mock-judge --tests 10');
|
|
125
|
-
console.log(' node scripts/redblue.mjs run --tests 50 --patch # needs OPENROUTER_API_KEY');
|
|
126
|
-
console.log(' node scripts/redblue.mjs attack prompt --count 3');
|
|
127
|
-
console.log('');
|
|
128
|
-
console.log('SAFETY: upstream redblue enforces no-creds, no-live-targets, no-shell,');
|
|
129
|
-
console.log('no-eval at load time (src/config/safety.ts). This wrapper does not relax');
|
|
130
|
-
console.log('those — it only forwards argv with shell:false.');
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function buildUpstreamArgs() {
|
|
134
|
-
switch (ARGS.sub) {
|
|
135
|
-
case 'init': {
|
|
136
|
-
const out = ARGS.out ?? null;
|
|
137
|
-
return ['init', ...(out ? ['--out', out] : [])];
|
|
138
|
-
}
|
|
139
|
-
case 'run': {
|
|
140
|
-
const a = ['run'];
|
|
141
|
-
if (ARGS.config) a.push('--config', ARGS.config);
|
|
142
|
-
if (ARGS.tests !== null && Number.isFinite(ARGS.tests)) a.push('--tests', String(ARGS.tests));
|
|
143
|
-
if (ARGS.patch) a.push('--patch');
|
|
144
|
-
if (ARGS.mockJudge) a.push('--mock-judge');
|
|
145
|
-
if (ARGS.out) a.push('--out', ARGS.out);
|
|
146
|
-
return a;
|
|
147
|
-
}
|
|
148
|
-
case 'patch': {
|
|
149
|
-
const a = ['patch'];
|
|
150
|
-
if (ARGS.config) a.push('--config', ARGS.config);
|
|
151
|
-
if (ARGS.mockJudge) a.push('--mock-judge');
|
|
152
|
-
if (ARGS.out) a.push('--out', ARGS.out);
|
|
153
|
-
return a;
|
|
154
|
-
}
|
|
155
|
-
case 'attack': {
|
|
156
|
-
if (!ARGS.family || !VALID_ATTACK_FAMILIES.has(ARGS.family)) {
|
|
157
|
-
console.error(`redblue: --attack family must be one of ${[...VALID_ATTACK_FAMILIES].join('|')} (got: ${ARGS.family ?? 'none'})`);
|
|
158
|
-
process.exit(2);
|
|
159
|
-
}
|
|
160
|
-
const a = ['attack', ARGS.family];
|
|
161
|
-
if (ARGS.count !== null && Number.isFinite(ARGS.count)) a.push('--count', String(ARGS.count));
|
|
162
|
-
return a;
|
|
163
|
-
}
|
|
164
|
-
case 'report': {
|
|
165
|
-
if (!ARGS.inPath) {
|
|
166
|
-
console.error('redblue: report requires --in <path>');
|
|
167
|
-
process.exit(2);
|
|
168
|
-
}
|
|
169
|
-
return ['report', '--in', ARGS.inPath];
|
|
170
|
-
}
|
|
171
|
-
default:
|
|
172
|
-
console.error(`redblue: unknown subcommand "${ARGS.sub}". Valid: ${[...VALID_SUBCOMMANDS].join(', ')}`);
|
|
173
|
-
process.exit(2);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function main() {
|
|
178
|
-
if (!ARGS.sub || ARGS.sub === 'help' || ARGS.sub === '--help' || ARGS.sub === '-h') {
|
|
179
|
-
printHelp();
|
|
180
|
-
process.exit(0);
|
|
181
|
-
}
|
|
182
|
-
if (!VALID_SUBCOMMANDS.has(ARGS.sub)) {
|
|
183
|
-
console.error(`redblue: unknown subcommand "${ARGS.sub}". Valid: ${[...VALID_SUBCOMMANDS].join(', ')}`);
|
|
184
|
-
process.exit(2);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// For `run` and `patch` we want the report JSON in our hands even when
|
|
188
|
-
// the caller didn't pass --out (so MCP tools can read it back from stdout).
|
|
189
|
-
let synthOut = null;
|
|
190
|
-
if ((ARGS.sub === 'run' || ARGS.sub === 'patch') && !ARGS.out) {
|
|
191
|
-
const dir = mkdtempSync(join(tmpdir(), 'ruflo-redblue-'));
|
|
192
|
-
synthOut = join(dir, 'report.json');
|
|
193
|
-
ARGS.out = synthOut;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const upstreamArgs = buildUpstreamArgs();
|
|
197
|
-
if (ARGS._passthrough?.length) upstreamArgs.push(...ARGS._passthrough);
|
|
198
|
-
|
|
199
|
-
const r = runRedblue(upstreamArgs, { timeoutMs: ARGS.timeoutMs ?? undefined });
|
|
200
|
-
|
|
201
|
-
if (r.degraded) {
|
|
202
|
-
if (synthOut && existsSync(synthOut)) {
|
|
203
|
-
try { unlinkSync(synthOut); } catch { /* ignore */ }
|
|
204
|
-
}
|
|
205
|
-
emitRedblueDegradedJsonAndExit(r.reason);
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Pass through stderr (progress) when format=markdown so users see it live
|
|
210
|
-
if (ARGS.format === 'markdown' && r.stderr) {
|
|
211
|
-
process.stderr.write(r.stderr);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// For run/patch: read the report we asked redblue to write.
|
|
215
|
-
let payload = null;
|
|
216
|
-
if (ARGS.sub === 'run' || ARGS.sub === 'patch') {
|
|
217
|
-
const reportPath = resolve(ARGS.out);
|
|
218
|
-
if (existsSync(reportPath)) {
|
|
219
|
-
try {
|
|
220
|
-
payload = JSON.parse(readFileSync(reportPath, 'utf-8'));
|
|
221
|
-
} catch (e) {
|
|
222
|
-
console.error(`redblue: failed to parse report at ${reportPath}: ${e instanceof Error ? e.message : String(e)}`);
|
|
223
|
-
if (synthOut) { try { unlinkSync(synthOut); } catch { /* ignore */ } }
|
|
224
|
-
process.exit(2);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Decorate every payload with our own metadata + the safety boundary
|
|
230
|
-
// reminder so consumers always see "this was capability-contained".
|
|
231
|
-
const enriched = payload && typeof payload === 'object' ? {
|
|
232
|
-
...payload,
|
|
233
|
-
_ruflo: {
|
|
234
|
-
subcommand: ARGS.sub,
|
|
235
|
-
mockJudge: ARGS.mockJudge,
|
|
236
|
-
durationMs: r.durationMs,
|
|
237
|
-
safetyBoundary: 'enforced-by-upstream-redblue (no creds, no live targets, no shell, no eval)',
|
|
238
|
-
},
|
|
239
|
-
} : payload;
|
|
240
|
-
|
|
241
|
-
// Determine overall verdict for --alert-on-fail (post-patch run only).
|
|
242
|
-
// redblue reports include a `verdict` or `gate` field; we treat absence
|
|
243
|
-
// as "no data → no alert" rather than erroring.
|
|
244
|
-
let alertTriggered = false;
|
|
245
|
-
if (ARGS.alertOnFail && enriched && typeof enriched === 'object') {
|
|
246
|
-
const v = (enriched.verdict || enriched.gate || enriched.status || '').toString().toUpperCase();
|
|
247
|
-
if (v.includes('FAIL')) alertTriggered = true;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (ARGS.format === 'json') {
|
|
251
|
-
if (enriched !== null) {
|
|
252
|
-
console.log(JSON.stringify(enriched, null, 2));
|
|
253
|
-
} else {
|
|
254
|
-
// init / attack / report subcommands — forward upstream stdout verbatim
|
|
255
|
-
// (it's already markdown/yaml). Wrap in a tiny JSON envelope.
|
|
256
|
-
console.log(JSON.stringify({
|
|
257
|
-
subcommand: ARGS.sub,
|
|
258
|
-
ok: r.exitCode === 0,
|
|
259
|
-
durationMs: r.durationMs,
|
|
260
|
-
stdout: r.stdout,
|
|
261
|
-
_ruflo: { safetyBoundary: 'enforced-by-upstream-redblue' },
|
|
262
|
-
}, null, 2));
|
|
263
|
-
}
|
|
264
|
-
} else {
|
|
265
|
-
// markdown / passthrough
|
|
266
|
-
if (r.stdout) process.stdout.write(r.stdout);
|
|
267
|
-
if (enriched && typeof enriched === 'object') {
|
|
268
|
-
console.log('');
|
|
269
|
-
console.log('---');
|
|
270
|
-
console.log('## redblue report (parsed)');
|
|
271
|
-
console.log('```json');
|
|
272
|
-
console.log(JSON.stringify(enriched, null, 2));
|
|
273
|
-
console.log('```');
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Clean up synthetic temp file
|
|
278
|
-
if (synthOut && existsSync(synthOut)) {
|
|
279
|
-
try { unlinkSync(synthOut); } catch { /* ignore */ }
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
if (alertTriggered) process.exit(1);
|
|
283
|
-
if (r.exitCode !== 0) process.exit(r.exitCode);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
main();
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// redblue.mjs — wrapper around `@metaharness/redblue` for LLM red/blue testing.
|
|
3
|
+
//
|
|
4
|
+
// ADR-150 sibling-package integration: `@metaharness/redblue` runs an
|
|
5
|
+
// adversarial red-team → judge → blue-team patch loop against an LLM
|
|
6
|
+
// target you own. Upstream README: packages/redblue#readme on
|
|
7
|
+
// github.com/ruvnet/agent-harness-generator.
|
|
8
|
+
//
|
|
9
|
+
// SAFETY (enforced by upstream `src/config/safety.ts`, NOT this wrapper):
|
|
10
|
+
// - no real credentials (`allow_real_credentials:true` = load-time error)
|
|
11
|
+
// - no live external targets (validateTarget() rejects non-loopback)
|
|
12
|
+
// - no shell, no arbitrary network, no eval
|
|
13
|
+
// - sensitive outputs redacted before storage
|
|
14
|
+
// - `max_cost_usd` / `max_runtime_minutes` / `max_tests` cap every run
|
|
15
|
+
//
|
|
16
|
+
// USAGE
|
|
17
|
+
// node scripts/redblue.mjs init # write redblue.yaml
|
|
18
|
+
// node scripts/redblue.mjs run --mock-judge --tests 10 # $0 marker-fixture path
|
|
19
|
+
// node scripts/redblue.mjs run --tests 50 --patch # real judge (needs OPENROUTER_API_KEY)
|
|
20
|
+
// node scripts/redblue.mjs attack prompt --count 5 # preview attacks
|
|
21
|
+
// node scripts/redblue.mjs patch --mock-judge # baseline → patch → retest delta
|
|
22
|
+
// node scripts/redblue.mjs report --in report.json # render summary
|
|
23
|
+
//
|
|
24
|
+
// EXIT CODES
|
|
25
|
+
// 0 ran OK (or degraded — redblue not available)
|
|
26
|
+
// 1 --alert-on-fail and overall verdict was FAIL (after patch retest)
|
|
27
|
+
// 2 config / argv error
|
|
28
|
+
//
|
|
29
|
+
// REPORT FORMAT
|
|
30
|
+
// `run` / `patch` write a JSON report to --out (default: ./redblue-report.json).
|
|
31
|
+
// We re-emit it on stdout when --format json so MCP tools can parse it
|
|
32
|
+
// without round-tripping through disk. Markdown rendering is delegated
|
|
33
|
+
// to `redblue report` upstream.
|
|
34
|
+
|
|
35
|
+
import { runRedblue, emitRedblueDegradedJsonAndExit } from './_redblue.mjs';
|
|
36
|
+
import { existsSync, readFileSync, mkdtempSync, unlinkSync } from 'node:fs';
|
|
37
|
+
import { join, resolve } from 'node:path';
|
|
38
|
+
import { tmpdir } from 'node:os';
|
|
39
|
+
|
|
40
|
+
const VALID_SUBCOMMANDS = new Set(['init', 'run', 'patch', 'attack', 'report']);
|
|
41
|
+
const VALID_ATTACK_FAMILIES = new Set(['prompt', 'tools', 'data', 'all']);
|
|
42
|
+
|
|
43
|
+
const ARGS = (() => {
|
|
44
|
+
const a = {
|
|
45
|
+
sub: null,
|
|
46
|
+
// shared
|
|
47
|
+
config: null,
|
|
48
|
+
out: null,
|
|
49
|
+
inPath: null,
|
|
50
|
+
format: 'json',
|
|
51
|
+
// run/patch
|
|
52
|
+
tests: null,
|
|
53
|
+
patch: false,
|
|
54
|
+
mockJudge: false,
|
|
55
|
+
alertOnFail: false,
|
|
56
|
+
// attack
|
|
57
|
+
family: null,
|
|
58
|
+
count: null,
|
|
59
|
+
// budget overrides (forwarded only when set)
|
|
60
|
+
maxCostUsd: null,
|
|
61
|
+
maxRuntimeMinutes: null,
|
|
62
|
+
timeoutMs: null,
|
|
63
|
+
};
|
|
64
|
+
const argv = process.argv.slice(2);
|
|
65
|
+
if (argv.length === 0) return a;
|
|
66
|
+
a.sub = argv[0];
|
|
67
|
+
for (let i = 1; i < argv.length; i++) {
|
|
68
|
+
const v = argv[i];
|
|
69
|
+
if (v === '--config') a.config = argv[++i];
|
|
70
|
+
else if (v === '--out') a.out = argv[++i];
|
|
71
|
+
else if (v === '--in') a.inPath = argv[++i];
|
|
72
|
+
else if (v === '--format') a.format = argv[++i];
|
|
73
|
+
else if (v === '--tests') a.tests = parseInt(argv[++i], 10);
|
|
74
|
+
else if (v === '--patch') a.patch = true;
|
|
75
|
+
else if (v === '--mock-judge') a.mockJudge = true;
|
|
76
|
+
else if (v === '--alert-on-fail') a.alertOnFail = true;
|
|
77
|
+
else if (v === '--count') a.count = parseInt(argv[++i], 10);
|
|
78
|
+
else if (v === '--max-cost-usd') a.maxCostUsd = parseFloat(argv[++i]);
|
|
79
|
+
else if (v === '--max-runtime-minutes') a.maxRuntimeMinutes = parseFloat(argv[++i]);
|
|
80
|
+
else if (v === '--timeout-ms') a.timeoutMs = parseInt(argv[++i], 10);
|
|
81
|
+
else if (v === '--help' || v === '-h') a.sub = 'help';
|
|
82
|
+
else if (!v.startsWith('-') && a.sub === 'attack' && !a.family) a.family = v;
|
|
83
|
+
// any other unknown flag — pass through to upstream redblue
|
|
84
|
+
else if (v.startsWith('--')) {
|
|
85
|
+
// forward unknown flags verbatim so we don't bottleneck new redblue features
|
|
86
|
+
a._passthrough = a._passthrough || [];
|
|
87
|
+
a._passthrough.push(v);
|
|
88
|
+
// peek for next-token value (only consume if it's not another flag)
|
|
89
|
+
const next = argv[i + 1];
|
|
90
|
+
if (next !== undefined && !next.startsWith('-')) {
|
|
91
|
+
a._passthrough.push(next);
|
|
92
|
+
i++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return a;
|
|
97
|
+
})();
|
|
98
|
+
|
|
99
|
+
function printHelp() {
|
|
100
|
+
console.log('npx ruflo metaharness redblue <subcommand> [options]');
|
|
101
|
+
console.log('');
|
|
102
|
+
console.log('Subcommands:');
|
|
103
|
+
console.log(' init Write a sample redblue.yaml config');
|
|
104
|
+
console.log(' run Run red-team → judge → (optional --patch → retest) → report');
|
|
105
|
+
console.log(' patch Baseline → blue-team patch → retest delta');
|
|
106
|
+
console.log(' attack <prompt|tools|data|all> Preview generated attack test cases (no target call)');
|
|
107
|
+
console.log(' report Render an existing report.json as markdown');
|
|
108
|
+
console.log('');
|
|
109
|
+
console.log('Common options:');
|
|
110
|
+
console.log(' --config <path> Config YAML (default: redblue.yaml in cwd)');
|
|
111
|
+
console.log(' --out <path> Output path for run/patch (default: ./redblue-report.json)');
|
|
112
|
+
console.log(' --in <path> Input report path (for `report` subcommand)');
|
|
113
|
+
console.log(' --tests N How many test cases (run/patch)');
|
|
114
|
+
console.log(' --patch After baseline run, apply blue-team patches and retest');
|
|
115
|
+
console.log(' --mock-judge $0 TEST-ONLY marker fixture — for CI / offline');
|
|
116
|
+
console.log(' --alert-on-fail Exit 1 when overall post-patch verdict is FAIL');
|
|
117
|
+
console.log(' --format json|markdown Output format (default: json)');
|
|
118
|
+
console.log(' --max-cost-usd N Override config max_cost_usd');
|
|
119
|
+
console.log(' --max-runtime-minutes N Override config max_runtime_minutes');
|
|
120
|
+
console.log(' --timeout-ms N Subprocess hard timeout (default: 120000)');
|
|
121
|
+
console.log('');
|
|
122
|
+
console.log('Examples:');
|
|
123
|
+
console.log(' node scripts/redblue.mjs init');
|
|
124
|
+
console.log(' node scripts/redblue.mjs run --mock-judge --tests 10');
|
|
125
|
+
console.log(' node scripts/redblue.mjs run --tests 50 --patch # needs OPENROUTER_API_KEY');
|
|
126
|
+
console.log(' node scripts/redblue.mjs attack prompt --count 3');
|
|
127
|
+
console.log('');
|
|
128
|
+
console.log('SAFETY: upstream redblue enforces no-creds, no-live-targets, no-shell,');
|
|
129
|
+
console.log('no-eval at load time (src/config/safety.ts). This wrapper does not relax');
|
|
130
|
+
console.log('those — it only forwards argv with shell:false.');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function buildUpstreamArgs() {
|
|
134
|
+
switch (ARGS.sub) {
|
|
135
|
+
case 'init': {
|
|
136
|
+
const out = ARGS.out ?? null;
|
|
137
|
+
return ['init', ...(out ? ['--out', out] : [])];
|
|
138
|
+
}
|
|
139
|
+
case 'run': {
|
|
140
|
+
const a = ['run'];
|
|
141
|
+
if (ARGS.config) a.push('--config', ARGS.config);
|
|
142
|
+
if (ARGS.tests !== null && Number.isFinite(ARGS.tests)) a.push('--tests', String(ARGS.tests));
|
|
143
|
+
if (ARGS.patch) a.push('--patch');
|
|
144
|
+
if (ARGS.mockJudge) a.push('--mock-judge');
|
|
145
|
+
if (ARGS.out) a.push('--out', ARGS.out);
|
|
146
|
+
return a;
|
|
147
|
+
}
|
|
148
|
+
case 'patch': {
|
|
149
|
+
const a = ['patch'];
|
|
150
|
+
if (ARGS.config) a.push('--config', ARGS.config);
|
|
151
|
+
if (ARGS.mockJudge) a.push('--mock-judge');
|
|
152
|
+
if (ARGS.out) a.push('--out', ARGS.out);
|
|
153
|
+
return a;
|
|
154
|
+
}
|
|
155
|
+
case 'attack': {
|
|
156
|
+
if (!ARGS.family || !VALID_ATTACK_FAMILIES.has(ARGS.family)) {
|
|
157
|
+
console.error(`redblue: --attack family must be one of ${[...VALID_ATTACK_FAMILIES].join('|')} (got: ${ARGS.family ?? 'none'})`);
|
|
158
|
+
process.exit(2);
|
|
159
|
+
}
|
|
160
|
+
const a = ['attack', ARGS.family];
|
|
161
|
+
if (ARGS.count !== null && Number.isFinite(ARGS.count)) a.push('--count', String(ARGS.count));
|
|
162
|
+
return a;
|
|
163
|
+
}
|
|
164
|
+
case 'report': {
|
|
165
|
+
if (!ARGS.inPath) {
|
|
166
|
+
console.error('redblue: report requires --in <path>');
|
|
167
|
+
process.exit(2);
|
|
168
|
+
}
|
|
169
|
+
return ['report', '--in', ARGS.inPath];
|
|
170
|
+
}
|
|
171
|
+
default:
|
|
172
|
+
console.error(`redblue: unknown subcommand "${ARGS.sub}". Valid: ${[...VALID_SUBCOMMANDS].join(', ')}`);
|
|
173
|
+
process.exit(2);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function main() {
|
|
178
|
+
if (!ARGS.sub || ARGS.sub === 'help' || ARGS.sub === '--help' || ARGS.sub === '-h') {
|
|
179
|
+
printHelp();
|
|
180
|
+
process.exit(0);
|
|
181
|
+
}
|
|
182
|
+
if (!VALID_SUBCOMMANDS.has(ARGS.sub)) {
|
|
183
|
+
console.error(`redblue: unknown subcommand "${ARGS.sub}". Valid: ${[...VALID_SUBCOMMANDS].join(', ')}`);
|
|
184
|
+
process.exit(2);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// For `run` and `patch` we want the report JSON in our hands even when
|
|
188
|
+
// the caller didn't pass --out (so MCP tools can read it back from stdout).
|
|
189
|
+
let synthOut = null;
|
|
190
|
+
if ((ARGS.sub === 'run' || ARGS.sub === 'patch') && !ARGS.out) {
|
|
191
|
+
const dir = mkdtempSync(join(tmpdir(), 'ruflo-redblue-'));
|
|
192
|
+
synthOut = join(dir, 'report.json');
|
|
193
|
+
ARGS.out = synthOut;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const upstreamArgs = buildUpstreamArgs();
|
|
197
|
+
if (ARGS._passthrough?.length) upstreamArgs.push(...ARGS._passthrough);
|
|
198
|
+
|
|
199
|
+
const r = runRedblue(upstreamArgs, { timeoutMs: ARGS.timeoutMs ?? undefined });
|
|
200
|
+
|
|
201
|
+
if (r.degraded) {
|
|
202
|
+
if (synthOut && existsSync(synthOut)) {
|
|
203
|
+
try { unlinkSync(synthOut); } catch { /* ignore */ }
|
|
204
|
+
}
|
|
205
|
+
emitRedblueDegradedJsonAndExit(r.reason);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Pass through stderr (progress) when format=markdown so users see it live
|
|
210
|
+
if (ARGS.format === 'markdown' && r.stderr) {
|
|
211
|
+
process.stderr.write(r.stderr);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// For run/patch: read the report we asked redblue to write.
|
|
215
|
+
let payload = null;
|
|
216
|
+
if (ARGS.sub === 'run' || ARGS.sub === 'patch') {
|
|
217
|
+
const reportPath = resolve(ARGS.out);
|
|
218
|
+
if (existsSync(reportPath)) {
|
|
219
|
+
try {
|
|
220
|
+
payload = JSON.parse(readFileSync(reportPath, 'utf-8'));
|
|
221
|
+
} catch (e) {
|
|
222
|
+
console.error(`redblue: failed to parse report at ${reportPath}: ${e instanceof Error ? e.message : String(e)}`);
|
|
223
|
+
if (synthOut) { try { unlinkSync(synthOut); } catch { /* ignore */ } }
|
|
224
|
+
process.exit(2);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Decorate every payload with our own metadata + the safety boundary
|
|
230
|
+
// reminder so consumers always see "this was capability-contained".
|
|
231
|
+
const enriched = payload && typeof payload === 'object' ? {
|
|
232
|
+
...payload,
|
|
233
|
+
_ruflo: {
|
|
234
|
+
subcommand: ARGS.sub,
|
|
235
|
+
mockJudge: ARGS.mockJudge,
|
|
236
|
+
durationMs: r.durationMs,
|
|
237
|
+
safetyBoundary: 'enforced-by-upstream-redblue (no creds, no live targets, no shell, no eval)',
|
|
238
|
+
},
|
|
239
|
+
} : payload;
|
|
240
|
+
|
|
241
|
+
// Determine overall verdict for --alert-on-fail (post-patch run only).
|
|
242
|
+
// redblue reports include a `verdict` or `gate` field; we treat absence
|
|
243
|
+
// as "no data → no alert" rather than erroring.
|
|
244
|
+
let alertTriggered = false;
|
|
245
|
+
if (ARGS.alertOnFail && enriched && typeof enriched === 'object') {
|
|
246
|
+
const v = (enriched.verdict || enriched.gate || enriched.status || '').toString().toUpperCase();
|
|
247
|
+
if (v.includes('FAIL')) alertTriggered = true;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (ARGS.format === 'json') {
|
|
251
|
+
if (enriched !== null) {
|
|
252
|
+
console.log(JSON.stringify(enriched, null, 2));
|
|
253
|
+
} else {
|
|
254
|
+
// init / attack / report subcommands — forward upstream stdout verbatim
|
|
255
|
+
// (it's already markdown/yaml). Wrap in a tiny JSON envelope.
|
|
256
|
+
console.log(JSON.stringify({
|
|
257
|
+
subcommand: ARGS.sub,
|
|
258
|
+
ok: r.exitCode === 0,
|
|
259
|
+
durationMs: r.durationMs,
|
|
260
|
+
stdout: r.stdout,
|
|
261
|
+
_ruflo: { safetyBoundary: 'enforced-by-upstream-redblue' },
|
|
262
|
+
}, null, 2));
|
|
263
|
+
}
|
|
264
|
+
} else {
|
|
265
|
+
// markdown / passthrough
|
|
266
|
+
if (r.stdout) process.stdout.write(r.stdout);
|
|
267
|
+
if (enriched && typeof enriched === 'object') {
|
|
268
|
+
console.log('');
|
|
269
|
+
console.log('---');
|
|
270
|
+
console.log('## redblue report (parsed)');
|
|
271
|
+
console.log('```json');
|
|
272
|
+
console.log(JSON.stringify(enriched, null, 2));
|
|
273
|
+
console.log('```');
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Clean up synthetic temp file
|
|
278
|
+
if (synthOut && existsSync(synthOut)) {
|
|
279
|
+
try { unlinkSync(synthOut); } catch { /* ignore */ }
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (alertTriggered) process.exit(1);
|
|
283
|
+
if (r.exitCode !== 0) process.exit(r.exitCode);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
main();
|