@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,228 +1,228 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// oia-audit.mjs — composite Phase-2 worker (ADR-150).
|
|
3
|
-
//
|
|
4
|
-
// Bundles three MetaHarness static-analysis surfaces into one timestamped
|
|
5
|
-
// audit record:
|
|
6
|
-
// - harness oia-manifest (Open Infrastructure Architecture L1-L9 alignment)
|
|
7
|
-
// - harness threat-model (categorized MCP-surface threat report)
|
|
8
|
-
// - harness mcp-scan (per-server/tool policy + permissions + deps)
|
|
9
|
-
//
|
|
10
|
-
// The combined record is stored in the `metaharness-audit` memory
|
|
11
|
-
// namespace, keyed by ISO timestamp. Designed to be invoked on a cron
|
|
12
|
-
// schedule (e.g. weekly) so audit drift is visible over time.
|
|
13
|
-
//
|
|
14
|
-
// USAGE
|
|
15
|
-
// node scripts/oia-audit.mjs # run + store
|
|
16
|
-
// node scripts/oia-audit.mjs --path <dir> # audit specific dir
|
|
17
|
-
// node scripts/oia-audit.mjs --dry-run # don't write to memory
|
|
18
|
-
// node scripts/oia-audit.mjs --alert-on-worst high
|
|
19
|
-
// # exit 1 if threat-model worst >= high
|
|
20
|
-
// node scripts/oia-audit.mjs --format json
|
|
21
|
-
//
|
|
22
|
-
// EXIT CODES
|
|
23
|
-
// 0 audit OK (or degraded)
|
|
24
|
-
// 1 --alert-on-worst threshold exceeded
|
|
25
|
-
// 2 config error or audit failure
|
|
26
|
-
|
|
27
|
-
import { spawnSync } from 'node:child_process';
|
|
28
|
-
// iter 63 — SEVERITY_RANK + rankSeverity consolidated to _harness.mjs
|
|
29
|
-
// (was local in iter 62; now shared with audit-trend + mcp-scan).
|
|
30
|
-
import { runHarness, runMetaharness, runHarnessAsync, runMetaharnessAsync, emitDegradedJsonAndExit, parseMcpScanText, SEVERITY_RANK, rankSeverity } from './_harness.mjs';
|
|
31
|
-
|
|
32
|
-
// iter 63 — SEVERITY_RANK + rankSeverity moved to _harness.mjs (single
|
|
33
|
-
// source of truth). The local copy from iter 62 is gone; the imports
|
|
34
|
-
// at the top of this file provide the same names.
|
|
35
|
-
const NS = process.env.OIA_AUDIT_NAMESPACE || 'metaharness-audit';
|
|
36
|
-
const CLI_PKG = process.env.CLI_CORE === '1'
|
|
37
|
-
? '@claude-flow/cli-core@alpha'
|
|
38
|
-
: '@claude-flow/cli@latest';
|
|
39
|
-
|
|
40
|
-
const ARGS = (() => {
|
|
41
|
-
const a = { path: '.', format: 'json', dryRun: false, alertWorst: null };
|
|
42
|
-
for (let i = 2; i < process.argv.length; i++) {
|
|
43
|
-
const v = process.argv[i];
|
|
44
|
-
if (v === '--path') a.path = process.argv[++i];
|
|
45
|
-
else if (v === '--dry-run') a.dryRun = true;
|
|
46
|
-
else if (v === '--alert-on-worst') a.alertWorst = String(process.argv[++i] || '').toLowerCase();
|
|
47
|
-
else if (v === '--format') a.format = process.argv[++i];
|
|
48
|
-
}
|
|
49
|
-
return a;
|
|
50
|
-
})();
|
|
51
|
-
|
|
52
|
-
// iter 47 — the `harness` and `metaharness` CLIs both have `score` /
|
|
53
|
-
// `genome` subcommands but with DIFFERENT output schemas. For the
|
|
54
|
-
// fingerprint to be consumable by _similarity.mjs (which expects the
|
|
55
|
-
// metaharness CLI shape: harnessFit/compileConfidence/agent_topology),
|
|
56
|
-
// we need to dispatch to runMetaharness for score+genome, not runHarness.
|
|
57
|
-
// iter 56 — annotated runOne result is identical for sync/async paths.
|
|
58
|
-
function annotateOne(r, label) {
|
|
59
|
-
let json = r.json;
|
|
60
|
-
if (label === 'mcp-scan' && !json && !r.degraded && r.stdout) {
|
|
61
|
-
const parsed = parseMcpScanText(r.stdout);
|
|
62
|
-
json = { findings: parsed.findings, summary: parsed.summary, rawStdout: r.stdout.slice(0, 400) };
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
label,
|
|
66
|
-
exitCode: r.exitCode,
|
|
67
|
-
degraded: r.degraded,
|
|
68
|
-
reason: r.degraded ? r.reason : null,
|
|
69
|
-
json,
|
|
70
|
-
durationMs: r.durationMs,
|
|
71
|
-
stderrTail: r.degraded ? (r.stderr || '').slice(-200) : null,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function runOne(args, label, engine = 'harness') {
|
|
76
|
-
const r = engine === 'metaharness' ? runMetaharness(args) : runHarness(args);
|
|
77
|
-
return annotateOne(r, label);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// iter 56 — parallel variant. The composite audit's 5 subprocess calls
|
|
81
|
-
// are mutually independent (each scans the same path read-only), so
|
|
82
|
-
// they can run concurrently. Worst-case wall-clock drops from
|
|
83
|
-
// 5×DEFAULT_TIMEOUT_MS (sequential) to 1×DEFAULT_TIMEOUT_MS (parallel)
|
|
84
|
-
// — the iter-55-flagged gap (oia-audit timeout under unreachable
|
|
85
|
-
// registry) is closed by this.
|
|
86
|
-
async function runAllParallel(path) {
|
|
87
|
-
const tasks = [
|
|
88
|
-
runHarnessAsync(['oia-manifest', path]).then((r) => ['oiaManifest', annotateOne(r, 'oia-manifest')]),
|
|
89
|
-
runHarnessAsync(['threat-model', path]).then((r) => ['threatModel', annotateOne(r, 'threat-model')]),
|
|
90
|
-
runHarnessAsync(['mcp-scan', path]).then((r) => ['mcpScan', annotateOne(r, 'mcp-scan')]),
|
|
91
|
-
runMetaharnessAsync(['score', path]).then((r) => ['score', annotateOne(r, 'score')]),
|
|
92
|
-
runMetaharnessAsync(['genome', path]).then((r) => ['genome', annotateOne(r, 'genome')]),
|
|
93
|
-
];
|
|
94
|
-
const results = await Promise.all(tasks);
|
|
95
|
-
return Object.fromEntries(results);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function persist(payload) {
|
|
99
|
-
const key = `audit-${new Date().toISOString().replace(/[:.]/g, '-')}`;
|
|
100
|
-
const r = spawnSync('npx', [
|
|
101
|
-
CLI_PKG, 'memory', 'store',
|
|
102
|
-
'--namespace', NS,
|
|
103
|
-
'--key', key,
|
|
104
|
-
'--value', JSON.stringify(payload),
|
|
105
|
-
], { stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf-8', shell: process.platform === 'win32' });
|
|
106
|
-
return {
|
|
107
|
-
ok: r.status === 0,
|
|
108
|
-
namespace: NS,
|
|
109
|
-
key,
|
|
110
|
-
error: r.status === 0 ? null : (r.stderr || '').slice(0, 200),
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async function main() {
|
|
115
|
-
if (ARGS.alertWorst !== null && !SEVERITY_RANK.hasOwnProperty(ARGS.alertWorst)) {
|
|
116
|
-
console.error(`oia-audit: --alert-on-worst must be one of clean|low|medium|high; got ${ARGS.alertWorst}`);
|
|
117
|
-
process.exit(2);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const startedAt = new Date().toISOString();
|
|
121
|
-
const wallStart = Date.now();
|
|
122
|
-
// iter 56 — run the 5 sub-audits in parallel (was sequential pre-iter-56).
|
|
123
|
-
// Worst-case wall-clock improves from 5×TIMEOUT to 1×TIMEOUT in the
|
|
124
|
-
// unreachable-registry case; the happy path improves from sum-of-durations
|
|
125
|
-
// to max-of-durations (typically ~2-4× faster).
|
|
126
|
-
const all = await runAllParallel(ARGS.path);
|
|
127
|
-
const wallMs = Date.now() - wallStart;
|
|
128
|
-
const { oiaManifest: oia, threatModel: tm, mcpScan: mcp, score, genome } = all;
|
|
129
|
-
|
|
130
|
-
// If all FIVE say "metaharness not available", surface the degraded
|
|
131
|
-
// payload exactly once and exit 0 (architectural constraint #3).
|
|
132
|
-
if (oia.degraded && tm.degraded && mcp.degraded && score.degraded && genome.degraded) {
|
|
133
|
-
emitDegradedJsonAndExit('metaharness-not-available');
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Aggregate the worst-severity signal across mcp-scan + threat-model.
|
|
138
|
-
// iter 62 — safe lookup using `?? 0` so unknown severities don't
|
|
139
|
-
// silently bump composite via NaN-comparison (was: `acc | undefined`
|
|
140
|
-
// → reduce never updated). Now any [WARN]/[CRITICAL]/[ERROR] finding
|
|
141
|
-
// correctly elevates composite worst.
|
|
142
|
-
const tmWorst = String(tm.json?.worst || 'clean').toLowerCase();
|
|
143
|
-
const mcpFindings = Array.isArray(mcp.json?.findings) ? mcp.json.findings : [];
|
|
144
|
-
// iter 63 — rankSeverity() from _harness.mjs handles unknown-severity
|
|
145
|
-
// safely (returns 0 instead of undefined) so the reduce never sees NaN.
|
|
146
|
-
const mcpWorst = mcpFindings.reduce((acc, f) => {
|
|
147
|
-
const s = String(f.severity || 'low').toLowerCase();
|
|
148
|
-
return rankSeverity(s) > rankSeverity(acc) ? s : acc;
|
|
149
|
-
}, 'clean');
|
|
150
|
-
const compositeWorst = rankSeverity(tmWorst) > rankSeverity(mcpWorst) ? tmWorst : mcpWorst;
|
|
151
|
-
|
|
152
|
-
let alertTriggered = false;
|
|
153
|
-
let alertReason = null;
|
|
154
|
-
if (ARGS.alertWorst !== null) {
|
|
155
|
-
const threshold = rankSeverity(ARGS.alertWorst);
|
|
156
|
-
const compositeRank = rankSeverity(compositeWorst);
|
|
157
|
-
if (compositeRank >= threshold && threshold > 0) {
|
|
158
|
-
alertTriggered = true;
|
|
159
|
-
alertReason = `composite worst=${compositeWorst} ≥ ${ARGS.alertWorst}`;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// iter 59 — surface parallelization metrics. wallMs is the actual
|
|
164
|
-
// time the 5 subprocess race took (max of components); the sum of
|
|
165
|
-
// component.durationMs is what a SERIAL implementation would have
|
|
166
|
-
// taken. A future smoke gate compares them to catch silent
|
|
167
|
-
// serialization regression.
|
|
168
|
-
const sumComponentMs = Object.values(all).reduce(
|
|
169
|
-
(a, c) => a + (c?.durationMs ?? 0), 0);
|
|
170
|
-
const payload = {
|
|
171
|
-
path: ARGS.path,
|
|
172
|
-
startedAt,
|
|
173
|
-
finishedAt: new Date().toISOString(),
|
|
174
|
-
timing: {
|
|
175
|
-
wallMs,
|
|
176
|
-
sumComponentMs,
|
|
177
|
-
parallelSpeedup: sumComponentMs > 0
|
|
178
|
-
? Math.round((sumComponentMs / Math.max(wallMs, 1)) * 100) / 100 : 0,
|
|
179
|
-
},
|
|
180
|
-
composite: { worst: compositeWorst, threatModelWorst: tmWorst, mcpScanWorst: mcpWorst },
|
|
181
|
-
components: { oiaManifest: oia, threatModel: tm, mcpScan: mcp, score, genome },
|
|
182
|
-
// iter 38 — denormalized harness fingerprint for cheap similarity().
|
|
183
|
-
// Mirrors the shape `_similarity.mjs::similarity()` expects so
|
|
184
|
-
// audit-trend can call it without reshuffling components.
|
|
185
|
-
fingerprint: {
|
|
186
|
-
score: score?.json && !score.degraded ? score.json : null,
|
|
187
|
-
genome: genome?.json && !genome.degraded ? genome.json : null,
|
|
188
|
-
},
|
|
189
|
-
alert: ARGS.alertWorst !== null ? {
|
|
190
|
-
threshold: ARGS.alertWorst,
|
|
191
|
-
triggered: alertTriggered,
|
|
192
|
-
reason: alertReason || `composite worst=${compositeWorst} < ${ARGS.alertWorst} — OK`,
|
|
193
|
-
} : null,
|
|
194
|
-
persisted: null,
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
if (!ARGS.dryRun) {
|
|
198
|
-
payload.persisted = persist(payload);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
if (ARGS.format === 'json') {
|
|
202
|
-
console.log(JSON.stringify(payload, null, 2));
|
|
203
|
-
} else {
|
|
204
|
-
console.log(`# oia-audit — ${ARGS.path}`);
|
|
205
|
-
console.log('');
|
|
206
|
-
console.log(`| Component | Exit | Degraded | Duration |`);
|
|
207
|
-
console.log(`|---|---:|:---:|---:|`);
|
|
208
|
-
console.log(`| oia-manifest | ${oia.exitCode} | ${oia.degraded ? '⚠' : '✓'} | ${oia.durationMs}ms |`);
|
|
209
|
-
console.log(`| threat-model | ${tm.exitCode} | ${tm.degraded ? '⚠' : '✓'} | ${tm.durationMs}ms |`);
|
|
210
|
-
console.log(`| mcp-scan | ${mcp.exitCode} | ${mcp.degraded ? '⚠' : '✓'} | ${mcp.durationMs}ms |`);
|
|
211
|
-
console.log('');
|
|
212
|
-
console.log(`Composite worst severity: **${compositeWorst}** (tm=${tmWorst}, mcp=${mcpWorst})`);
|
|
213
|
-
if (payload.persisted) {
|
|
214
|
-
console.log(`Persisted: ${payload.persisted.ok ? `${payload.persisted.namespace}:${payload.persisted.key}` : `FAILED: ${payload.persisted.error}`}`);
|
|
215
|
-
}
|
|
216
|
-
if (payload.alert) {
|
|
217
|
-
console.log('');
|
|
218
|
-
console.log(payload.alert.triggered ? `⚠ **ALERT**: ${payload.alert.reason}` : `✓ ${payload.alert.reason}`);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
if (alertTriggered) process.exit(1);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
main().catch((e) => {
|
|
226
|
-
console.error('oia-audit crashed:', e?.message ?? e);
|
|
227
|
-
process.exit(2);
|
|
228
|
-
});
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// oia-audit.mjs — composite Phase-2 worker (ADR-150).
|
|
3
|
+
//
|
|
4
|
+
// Bundles three MetaHarness static-analysis surfaces into one timestamped
|
|
5
|
+
// audit record:
|
|
6
|
+
// - harness oia-manifest (Open Infrastructure Architecture L1-L9 alignment)
|
|
7
|
+
// - harness threat-model (categorized MCP-surface threat report)
|
|
8
|
+
// - harness mcp-scan (per-server/tool policy + permissions + deps)
|
|
9
|
+
//
|
|
10
|
+
// The combined record is stored in the `metaharness-audit` memory
|
|
11
|
+
// namespace, keyed by ISO timestamp. Designed to be invoked on a cron
|
|
12
|
+
// schedule (e.g. weekly) so audit drift is visible over time.
|
|
13
|
+
//
|
|
14
|
+
// USAGE
|
|
15
|
+
// node scripts/oia-audit.mjs # run + store
|
|
16
|
+
// node scripts/oia-audit.mjs --path <dir> # audit specific dir
|
|
17
|
+
// node scripts/oia-audit.mjs --dry-run # don't write to memory
|
|
18
|
+
// node scripts/oia-audit.mjs --alert-on-worst high
|
|
19
|
+
// # exit 1 if threat-model worst >= high
|
|
20
|
+
// node scripts/oia-audit.mjs --format json
|
|
21
|
+
//
|
|
22
|
+
// EXIT CODES
|
|
23
|
+
// 0 audit OK (or degraded)
|
|
24
|
+
// 1 --alert-on-worst threshold exceeded
|
|
25
|
+
// 2 config error or audit failure
|
|
26
|
+
|
|
27
|
+
import { spawnSync } from 'node:child_process';
|
|
28
|
+
// iter 63 — SEVERITY_RANK + rankSeverity consolidated to _harness.mjs
|
|
29
|
+
// (was local in iter 62; now shared with audit-trend + mcp-scan).
|
|
30
|
+
import { runHarness, runMetaharness, runHarnessAsync, runMetaharnessAsync, emitDegradedJsonAndExit, parseMcpScanText, SEVERITY_RANK, rankSeverity } from './_harness.mjs';
|
|
31
|
+
|
|
32
|
+
// iter 63 — SEVERITY_RANK + rankSeverity moved to _harness.mjs (single
|
|
33
|
+
// source of truth). The local copy from iter 62 is gone; the imports
|
|
34
|
+
// at the top of this file provide the same names.
|
|
35
|
+
const NS = process.env.OIA_AUDIT_NAMESPACE || 'metaharness-audit';
|
|
36
|
+
const CLI_PKG = process.env.CLI_CORE === '1'
|
|
37
|
+
? '@claude-flow/cli-core@alpha'
|
|
38
|
+
: '@claude-flow/cli@latest';
|
|
39
|
+
|
|
40
|
+
const ARGS = (() => {
|
|
41
|
+
const a = { path: '.', format: 'json', dryRun: false, alertWorst: null };
|
|
42
|
+
for (let i = 2; i < process.argv.length; i++) {
|
|
43
|
+
const v = process.argv[i];
|
|
44
|
+
if (v === '--path') a.path = process.argv[++i];
|
|
45
|
+
else if (v === '--dry-run') a.dryRun = true;
|
|
46
|
+
else if (v === '--alert-on-worst') a.alertWorst = String(process.argv[++i] || '').toLowerCase();
|
|
47
|
+
else if (v === '--format') a.format = process.argv[++i];
|
|
48
|
+
}
|
|
49
|
+
return a;
|
|
50
|
+
})();
|
|
51
|
+
|
|
52
|
+
// iter 47 — the `harness` and `metaharness` CLIs both have `score` /
|
|
53
|
+
// `genome` subcommands but with DIFFERENT output schemas. For the
|
|
54
|
+
// fingerprint to be consumable by _similarity.mjs (which expects the
|
|
55
|
+
// metaharness CLI shape: harnessFit/compileConfidence/agent_topology),
|
|
56
|
+
// we need to dispatch to runMetaharness for score+genome, not runHarness.
|
|
57
|
+
// iter 56 — annotated runOne result is identical for sync/async paths.
|
|
58
|
+
function annotateOne(r, label) {
|
|
59
|
+
let json = r.json;
|
|
60
|
+
if (label === 'mcp-scan' && !json && !r.degraded && r.stdout) {
|
|
61
|
+
const parsed = parseMcpScanText(r.stdout);
|
|
62
|
+
json = { findings: parsed.findings, summary: parsed.summary, rawStdout: r.stdout.slice(0, 400) };
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
label,
|
|
66
|
+
exitCode: r.exitCode,
|
|
67
|
+
degraded: r.degraded,
|
|
68
|
+
reason: r.degraded ? r.reason : null,
|
|
69
|
+
json,
|
|
70
|
+
durationMs: r.durationMs,
|
|
71
|
+
stderrTail: r.degraded ? (r.stderr || '').slice(-200) : null,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function runOne(args, label, engine = 'harness') {
|
|
76
|
+
const r = engine === 'metaharness' ? runMetaharness(args) : runHarness(args);
|
|
77
|
+
return annotateOne(r, label);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// iter 56 — parallel variant. The composite audit's 5 subprocess calls
|
|
81
|
+
// are mutually independent (each scans the same path read-only), so
|
|
82
|
+
// they can run concurrently. Worst-case wall-clock drops from
|
|
83
|
+
// 5×DEFAULT_TIMEOUT_MS (sequential) to 1×DEFAULT_TIMEOUT_MS (parallel)
|
|
84
|
+
// — the iter-55-flagged gap (oia-audit timeout under unreachable
|
|
85
|
+
// registry) is closed by this.
|
|
86
|
+
async function runAllParallel(path) {
|
|
87
|
+
const tasks = [
|
|
88
|
+
runHarnessAsync(['oia-manifest', path]).then((r) => ['oiaManifest', annotateOne(r, 'oia-manifest')]),
|
|
89
|
+
runHarnessAsync(['threat-model', path]).then((r) => ['threatModel', annotateOne(r, 'threat-model')]),
|
|
90
|
+
runHarnessAsync(['mcp-scan', path]).then((r) => ['mcpScan', annotateOne(r, 'mcp-scan')]),
|
|
91
|
+
runMetaharnessAsync(['score', path]).then((r) => ['score', annotateOne(r, 'score')]),
|
|
92
|
+
runMetaharnessAsync(['genome', path]).then((r) => ['genome', annotateOne(r, 'genome')]),
|
|
93
|
+
];
|
|
94
|
+
const results = await Promise.all(tasks);
|
|
95
|
+
return Object.fromEntries(results);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function persist(payload) {
|
|
99
|
+
const key = `audit-${new Date().toISOString().replace(/[:.]/g, '-')}`;
|
|
100
|
+
const r = spawnSync('npx', [
|
|
101
|
+
CLI_PKG, 'memory', 'store',
|
|
102
|
+
'--namespace', NS,
|
|
103
|
+
'--key', key,
|
|
104
|
+
'--value', JSON.stringify(payload),
|
|
105
|
+
], { stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf-8', shell: process.platform === 'win32' });
|
|
106
|
+
return {
|
|
107
|
+
ok: r.status === 0,
|
|
108
|
+
namespace: NS,
|
|
109
|
+
key,
|
|
110
|
+
error: r.status === 0 ? null : (r.stderr || '').slice(0, 200),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function main() {
|
|
115
|
+
if (ARGS.alertWorst !== null && !SEVERITY_RANK.hasOwnProperty(ARGS.alertWorst)) {
|
|
116
|
+
console.error(`oia-audit: --alert-on-worst must be one of clean|low|medium|high; got ${ARGS.alertWorst}`);
|
|
117
|
+
process.exit(2);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const startedAt = new Date().toISOString();
|
|
121
|
+
const wallStart = Date.now();
|
|
122
|
+
// iter 56 — run the 5 sub-audits in parallel (was sequential pre-iter-56).
|
|
123
|
+
// Worst-case wall-clock improves from 5×TIMEOUT to 1×TIMEOUT in the
|
|
124
|
+
// unreachable-registry case; the happy path improves from sum-of-durations
|
|
125
|
+
// to max-of-durations (typically ~2-4× faster).
|
|
126
|
+
const all = await runAllParallel(ARGS.path);
|
|
127
|
+
const wallMs = Date.now() - wallStart;
|
|
128
|
+
const { oiaManifest: oia, threatModel: tm, mcpScan: mcp, score, genome } = all;
|
|
129
|
+
|
|
130
|
+
// If all FIVE say "metaharness not available", surface the degraded
|
|
131
|
+
// payload exactly once and exit 0 (architectural constraint #3).
|
|
132
|
+
if (oia.degraded && tm.degraded && mcp.degraded && score.degraded && genome.degraded) {
|
|
133
|
+
emitDegradedJsonAndExit('metaharness-not-available');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Aggregate the worst-severity signal across mcp-scan + threat-model.
|
|
138
|
+
// iter 62 — safe lookup using `?? 0` so unknown severities don't
|
|
139
|
+
// silently bump composite via NaN-comparison (was: `acc | undefined`
|
|
140
|
+
// → reduce never updated). Now any [WARN]/[CRITICAL]/[ERROR] finding
|
|
141
|
+
// correctly elevates composite worst.
|
|
142
|
+
const tmWorst = String(tm.json?.worst || 'clean').toLowerCase();
|
|
143
|
+
const mcpFindings = Array.isArray(mcp.json?.findings) ? mcp.json.findings : [];
|
|
144
|
+
// iter 63 — rankSeverity() from _harness.mjs handles unknown-severity
|
|
145
|
+
// safely (returns 0 instead of undefined) so the reduce never sees NaN.
|
|
146
|
+
const mcpWorst = mcpFindings.reduce((acc, f) => {
|
|
147
|
+
const s = String(f.severity || 'low').toLowerCase();
|
|
148
|
+
return rankSeverity(s) > rankSeverity(acc) ? s : acc;
|
|
149
|
+
}, 'clean');
|
|
150
|
+
const compositeWorst = rankSeverity(tmWorst) > rankSeverity(mcpWorst) ? tmWorst : mcpWorst;
|
|
151
|
+
|
|
152
|
+
let alertTriggered = false;
|
|
153
|
+
let alertReason = null;
|
|
154
|
+
if (ARGS.alertWorst !== null) {
|
|
155
|
+
const threshold = rankSeverity(ARGS.alertWorst);
|
|
156
|
+
const compositeRank = rankSeverity(compositeWorst);
|
|
157
|
+
if (compositeRank >= threshold && threshold > 0) {
|
|
158
|
+
alertTriggered = true;
|
|
159
|
+
alertReason = `composite worst=${compositeWorst} ≥ ${ARGS.alertWorst}`;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// iter 59 — surface parallelization metrics. wallMs is the actual
|
|
164
|
+
// time the 5 subprocess race took (max of components); the sum of
|
|
165
|
+
// component.durationMs is what a SERIAL implementation would have
|
|
166
|
+
// taken. A future smoke gate compares them to catch silent
|
|
167
|
+
// serialization regression.
|
|
168
|
+
const sumComponentMs = Object.values(all).reduce(
|
|
169
|
+
(a, c) => a + (c?.durationMs ?? 0), 0);
|
|
170
|
+
const payload = {
|
|
171
|
+
path: ARGS.path,
|
|
172
|
+
startedAt,
|
|
173
|
+
finishedAt: new Date().toISOString(),
|
|
174
|
+
timing: {
|
|
175
|
+
wallMs,
|
|
176
|
+
sumComponentMs,
|
|
177
|
+
parallelSpeedup: sumComponentMs > 0
|
|
178
|
+
? Math.round((sumComponentMs / Math.max(wallMs, 1)) * 100) / 100 : 0,
|
|
179
|
+
},
|
|
180
|
+
composite: { worst: compositeWorst, threatModelWorst: tmWorst, mcpScanWorst: mcpWorst },
|
|
181
|
+
components: { oiaManifest: oia, threatModel: tm, mcpScan: mcp, score, genome },
|
|
182
|
+
// iter 38 — denormalized harness fingerprint for cheap similarity().
|
|
183
|
+
// Mirrors the shape `_similarity.mjs::similarity()` expects so
|
|
184
|
+
// audit-trend can call it without reshuffling components.
|
|
185
|
+
fingerprint: {
|
|
186
|
+
score: score?.json && !score.degraded ? score.json : null,
|
|
187
|
+
genome: genome?.json && !genome.degraded ? genome.json : null,
|
|
188
|
+
},
|
|
189
|
+
alert: ARGS.alertWorst !== null ? {
|
|
190
|
+
threshold: ARGS.alertWorst,
|
|
191
|
+
triggered: alertTriggered,
|
|
192
|
+
reason: alertReason || `composite worst=${compositeWorst} < ${ARGS.alertWorst} — OK`,
|
|
193
|
+
} : null,
|
|
194
|
+
persisted: null,
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
if (!ARGS.dryRun) {
|
|
198
|
+
payload.persisted = persist(payload);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (ARGS.format === 'json') {
|
|
202
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
203
|
+
} else {
|
|
204
|
+
console.log(`# oia-audit — ${ARGS.path}`);
|
|
205
|
+
console.log('');
|
|
206
|
+
console.log(`| Component | Exit | Degraded | Duration |`);
|
|
207
|
+
console.log(`|---|---:|:---:|---:|`);
|
|
208
|
+
console.log(`| oia-manifest | ${oia.exitCode} | ${oia.degraded ? '⚠' : '✓'} | ${oia.durationMs}ms |`);
|
|
209
|
+
console.log(`| threat-model | ${tm.exitCode} | ${tm.degraded ? '⚠' : '✓'} | ${tm.durationMs}ms |`);
|
|
210
|
+
console.log(`| mcp-scan | ${mcp.exitCode} | ${mcp.degraded ? '⚠' : '✓'} | ${mcp.durationMs}ms |`);
|
|
211
|
+
console.log('');
|
|
212
|
+
console.log(`Composite worst severity: **${compositeWorst}** (tm=${tmWorst}, mcp=${mcpWorst})`);
|
|
213
|
+
if (payload.persisted) {
|
|
214
|
+
console.log(`Persisted: ${payload.persisted.ok ? `${payload.persisted.namespace}:${payload.persisted.key}` : `FAILED: ${payload.persisted.error}`}`);
|
|
215
|
+
}
|
|
216
|
+
if (payload.alert) {
|
|
217
|
+
console.log('');
|
|
218
|
+
console.log(payload.alert.triggered ? `⚠ **ALERT**: ${payload.alert.reason}` : `✓ ${payload.alert.reason}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (alertTriggered) process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
main().catch((e) => {
|
|
226
|
+
console.error('oia-audit crashed:', e?.message ?? e);
|
|
227
|
+
process.exit(2);
|
|
228
|
+
});
|