@claude-flow/cli 3.32.9 → 3.32.11
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/.proven-config-version +1 -0
- 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/.helpers-version +1 -1
- 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 +0 -0
- 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 +2 -2
- package/.claude/helpers/hook-handler.cjs +0 -0
- package/.claude/helpers/intelligence.cjs +0 -0
- 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 +0 -0
- 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.json +42 -0
- 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 +248 -158
- 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,143 +1,143 @@
|
|
|
1
|
-
// _redblue.mjs — invocation helper for `@metaharness/redblue`.
|
|
2
|
-
//
|
|
3
|
-
// Sibling of `_darwin.mjs` / `_harness.mjs`. Targets the `redblue` binary
|
|
4
|
-
// from the standalone `@metaharness/redblue@~0.1.4` package. Shared plumbing
|
|
5
|
-
// (degraded classification, versioned cache install, degraded emitter) lives
|
|
6
|
-
// in `_invoke.mjs`; what stays here is the genuinely-redblue part: the
|
|
7
|
-
// node-direct invocation rationale below.
|
|
8
|
-
//
|
|
9
|
-
// Subcommands surfaced (matches redblue 0.1.x):
|
|
10
|
-
// - `redblue init [--out redblue.yaml]`
|
|
11
|
-
// - `redblue run [--config redblue.yaml] [--tests N] [--patch] [--mock-judge] [--out report.json]`
|
|
12
|
-
// - `redblue attack <prompt|tools|data|all> [--count N]`
|
|
13
|
-
// - `redblue patch [--config redblue.yaml] [--mock-judge]`
|
|
14
|
-
// - `redblue report --in report.json`
|
|
15
|
-
//
|
|
16
|
-
// UPSTREAM BUG WORKAROUND
|
|
17
|
-
// -----------------------
|
|
18
|
-
// @metaharness/redblue@0.1.1's CLI bootstrap is:
|
|
19
|
-
// const isMain = import.meta.url === `file://${process.argv[1]}`;
|
|
20
|
-
// if (isMain) { dispatch(...) }
|
|
21
|
-
// When npx links `redblue` → `dist/cli/index.js`, process.argv[1] is the
|
|
22
|
-
// symlink path but import.meta.url is the resolved real path, so the
|
|
23
|
-
// check fails silently — the binary exits 0 with no output, no file,
|
|
24
|
-
// no error. Darwin's CLI doesn't suffer this (calls main() unconditionally).
|
|
25
|
-
//
|
|
26
|
-
// Workaround: install the package once into a ruflo-owned cache dir
|
|
27
|
-
// (~/.ruflo/redblue-cache-<pin>, via _invoke.ensureCachedInstall) and invoke
|
|
28
|
-
// `node <abs_path>/dist/cli/index.js` directly. argv[1] then equals the real
|
|
29
|
-
// path and isMain becomes true.
|
|
30
|
-
//
|
|
31
|
-
// Track upstream fix at: github.com/ruvnet/agent-harness-generator/issues
|
|
32
|
-
// (file separately — when fixed, we could go back to a bin-shim pattern,
|
|
33
|
-
// though the node-direct cached path is now the family-wide standard anyway).
|
|
34
|
-
//
|
|
35
|
-
// CONTRACT (matches runMetaharness/runDarwin):
|
|
36
|
-
// - returns `{ stdout, stderr, exitCode, durationMs, degraded, reason? }`
|
|
37
|
-
// - subprocess hard timeout (default 120s; --mock-judge runs are seconds)
|
|
38
|
-
// - on install failure / MODULE_NOT_FOUND / network failure, returns
|
|
39
|
-
// `degraded: true, reason: 'metaharness-redblue-not-available'`
|
|
40
|
-
// - never throws — ADR-150 graceful-degradation rule #3
|
|
41
|
-
//
|
|
42
|
-
// SAFETY NOTE
|
|
43
|
-
// redblue itself enforces hard safety boundaries in `src/config/safety.ts`
|
|
44
|
-
// (no real creds, no live targets, no shell, no eval, no arbitrary network).
|
|
45
|
-
// This wrapper does NOT relax those — it only forwards argv with shell:false.
|
|
46
|
-
// `--mock-judge` is the $0 CI path; the real model judge gates on
|
|
47
|
-
// $OPENROUTER_API_KEY which we never inject.
|
|
48
|
-
|
|
49
|
-
import { spawnSync } from 'node:child_process';
|
|
50
|
-
import { homedir } from 'node:os';
|
|
51
|
-
import { join } from 'node:path';
|
|
52
|
-
import {
|
|
53
|
-
classifyDegraded,
|
|
54
|
-
ensureCachedInstall,
|
|
55
|
-
makeDegradedEmitter,
|
|
56
|
-
} from './_invoke.mjs';
|
|
57
|
-
|
|
58
|
-
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
59
|
-
|
|
60
|
-
// Pinned semver range. Bump in lock-step with optionalDependencies in
|
|
61
|
-
// @claude-flow/cli/package.json + ruflo/package.json.
|
|
62
|
-
const REDBLUE_PKG = '@metaharness/redblue';
|
|
63
|
-
const REDBLUE_PIN_VERSION = '~0.1.4';
|
|
64
|
-
const REDBLUE_PIN = `${REDBLUE_PKG}@${REDBLUE_PIN_VERSION}`;
|
|
65
|
-
|
|
66
|
-
const REASON_PREFIX = 'metaharness-redblue';
|
|
67
|
-
|
|
68
|
-
// Cache dir is versioned by the pin so bumping REDBLUE_PIN_VERSION
|
|
69
|
-
// invalidates stale installs (handled inside ensureCachedInstall). The
|
|
70
|
-
// resolved layout matches the pre-consolidation helper so existing caches
|
|
71
|
-
// keep serving.
|
|
72
|
-
const CLI_REL_PATH = join('dist', 'cli', 'index.js');
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Sync invocation. `redblue` runs are bounded by `max_cost_usd` and
|
|
76
|
-
* `max_runtime_minutes` from the config, so sync is fine for the CLI
|
|
77
|
-
* wrapper. The default --mock-judge fixture path completes in seconds.
|
|
78
|
-
*/
|
|
79
|
-
export function runRedblue(args, opts = {}) {
|
|
80
|
-
const start = Date.now();
|
|
81
|
-
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
82
|
-
|
|
83
|
-
// 1. Ensure redblue is installed in our cache dir (one-time install).
|
|
84
|
-
const install = ensureCachedInstall({
|
|
85
|
-
pkg: REDBLUE_PKG,
|
|
86
|
-
pinVersion: REDBLUE_PIN_VERSION,
|
|
87
|
-
cliRelPath: CLI_REL_PATH,
|
|
88
|
-
});
|
|
89
|
-
if (!install.ok) {
|
|
90
|
-
return {
|
|
91
|
-
stdout: install.stdout ?? '',
|
|
92
|
-
stderr: install.stderr ?? install.error ?? '',
|
|
93
|
-
exitCode: 127,
|
|
94
|
-
durationMs: Date.now() - start,
|
|
95
|
-
degraded: true,
|
|
96
|
-
reason: install.reason === 'install-failed'
|
|
97
|
-
? `${REASON_PREFIX}-not-available`
|
|
98
|
-
: `${REASON_PREFIX}-${install.reason}`,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// 2. Invoke `node <real-path-to-cli> <args>` so upstream's isMain check
|
|
103
|
-
// succeeds (argv[1] matches import.meta.url).
|
|
104
|
-
const r = spawnSync('node', [install.cliPath, ...args], {
|
|
105
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
106
|
-
encoding: 'utf-8',
|
|
107
|
-
timeout: timeoutMs,
|
|
108
|
-
cwd: opts.cwd,
|
|
109
|
-
env: { ...process.env, ...(opts.env || {}) },
|
|
110
|
-
shell: process.platform === 'win32',
|
|
111
|
-
});
|
|
112
|
-
const durationMs = Date.now() - start;
|
|
113
|
-
const stdout = r.stdout || '';
|
|
114
|
-
const stderr = r.stderr || '';
|
|
115
|
-
const classified = classifyDegraded(stderr, r.status, REASON_PREFIX);
|
|
116
|
-
if (classified.degraded) {
|
|
117
|
-
return {
|
|
118
|
-
stdout, stderr,
|
|
119
|
-
exitCode: r.status ?? 127,
|
|
120
|
-
durationMs,
|
|
121
|
-
degraded: true,
|
|
122
|
-
reason: classified.reason,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
return {
|
|
126
|
-
stdout, stderr,
|
|
127
|
-
exitCode: r.status ?? 0,
|
|
128
|
-
durationMs,
|
|
129
|
-
degraded: false,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Match the existing `emit*DegradedJsonAndExit` shape used by sibling
|
|
135
|
-
* scripts so MCP tool consumers see one contract. Exit 0 — ADR-150
|
|
136
|
-
* architectural constraint #3.
|
|
137
|
-
*/
|
|
138
|
-
export const emitRedblueDegradedJsonAndExit = makeDegradedEmitter(REDBLUE_PKG, REDBLUE_PIN_VERSION);
|
|
139
|
-
|
|
140
|
-
export const REDBLUE_VERSION_PIN = REDBLUE_PIN;
|
|
141
|
-
export const REDBLUE_CACHE_DIR = join(
|
|
142
|
-
homedir(), '.ruflo', `redblue-cache-${REDBLUE_PIN_VERSION.replace(/[~^]/g, '')}`,
|
|
143
|
-
);
|
|
1
|
+
// _redblue.mjs — invocation helper for `@metaharness/redblue`.
|
|
2
|
+
//
|
|
3
|
+
// Sibling of `_darwin.mjs` / `_harness.mjs`. Targets the `redblue` binary
|
|
4
|
+
// from the standalone `@metaharness/redblue@~0.1.4` package. Shared plumbing
|
|
5
|
+
// (degraded classification, versioned cache install, degraded emitter) lives
|
|
6
|
+
// in `_invoke.mjs`; what stays here is the genuinely-redblue part: the
|
|
7
|
+
// node-direct invocation rationale below.
|
|
8
|
+
//
|
|
9
|
+
// Subcommands surfaced (matches redblue 0.1.x):
|
|
10
|
+
// - `redblue init [--out redblue.yaml]`
|
|
11
|
+
// - `redblue run [--config redblue.yaml] [--tests N] [--patch] [--mock-judge] [--out report.json]`
|
|
12
|
+
// - `redblue attack <prompt|tools|data|all> [--count N]`
|
|
13
|
+
// - `redblue patch [--config redblue.yaml] [--mock-judge]`
|
|
14
|
+
// - `redblue report --in report.json`
|
|
15
|
+
//
|
|
16
|
+
// UPSTREAM BUG WORKAROUND
|
|
17
|
+
// -----------------------
|
|
18
|
+
// @metaharness/redblue@0.1.1's CLI bootstrap is:
|
|
19
|
+
// const isMain = import.meta.url === `file://${process.argv[1]}`;
|
|
20
|
+
// if (isMain) { dispatch(...) }
|
|
21
|
+
// When npx links `redblue` → `dist/cli/index.js`, process.argv[1] is the
|
|
22
|
+
// symlink path but import.meta.url is the resolved real path, so the
|
|
23
|
+
// check fails silently — the binary exits 0 with no output, no file,
|
|
24
|
+
// no error. Darwin's CLI doesn't suffer this (calls main() unconditionally).
|
|
25
|
+
//
|
|
26
|
+
// Workaround: install the package once into a ruflo-owned cache dir
|
|
27
|
+
// (~/.ruflo/redblue-cache-<pin>, via _invoke.ensureCachedInstall) and invoke
|
|
28
|
+
// `node <abs_path>/dist/cli/index.js` directly. argv[1] then equals the real
|
|
29
|
+
// path and isMain becomes true.
|
|
30
|
+
//
|
|
31
|
+
// Track upstream fix at: github.com/ruvnet/agent-harness-generator/issues
|
|
32
|
+
// (file separately — when fixed, we could go back to a bin-shim pattern,
|
|
33
|
+
// though the node-direct cached path is now the family-wide standard anyway).
|
|
34
|
+
//
|
|
35
|
+
// CONTRACT (matches runMetaharness/runDarwin):
|
|
36
|
+
// - returns `{ stdout, stderr, exitCode, durationMs, degraded, reason? }`
|
|
37
|
+
// - subprocess hard timeout (default 120s; --mock-judge runs are seconds)
|
|
38
|
+
// - on install failure / MODULE_NOT_FOUND / network failure, returns
|
|
39
|
+
// `degraded: true, reason: 'metaharness-redblue-not-available'`
|
|
40
|
+
// - never throws — ADR-150 graceful-degradation rule #3
|
|
41
|
+
//
|
|
42
|
+
// SAFETY NOTE
|
|
43
|
+
// redblue itself enforces hard safety boundaries in `src/config/safety.ts`
|
|
44
|
+
// (no real creds, no live targets, no shell, no eval, no arbitrary network).
|
|
45
|
+
// This wrapper does NOT relax those — it only forwards argv with shell:false.
|
|
46
|
+
// `--mock-judge` is the $0 CI path; the real model judge gates on
|
|
47
|
+
// $OPENROUTER_API_KEY which we never inject.
|
|
48
|
+
|
|
49
|
+
import { spawnSync } from 'node:child_process';
|
|
50
|
+
import { homedir } from 'node:os';
|
|
51
|
+
import { join } from 'node:path';
|
|
52
|
+
import {
|
|
53
|
+
classifyDegraded,
|
|
54
|
+
ensureCachedInstall,
|
|
55
|
+
makeDegradedEmitter,
|
|
56
|
+
} from './_invoke.mjs';
|
|
57
|
+
|
|
58
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
59
|
+
|
|
60
|
+
// Pinned semver range. Bump in lock-step with optionalDependencies in
|
|
61
|
+
// @claude-flow/cli/package.json + ruflo/package.json.
|
|
62
|
+
const REDBLUE_PKG = '@metaharness/redblue';
|
|
63
|
+
const REDBLUE_PIN_VERSION = '~0.1.4';
|
|
64
|
+
const REDBLUE_PIN = `${REDBLUE_PKG}@${REDBLUE_PIN_VERSION}`;
|
|
65
|
+
|
|
66
|
+
const REASON_PREFIX = 'metaharness-redblue';
|
|
67
|
+
|
|
68
|
+
// Cache dir is versioned by the pin so bumping REDBLUE_PIN_VERSION
|
|
69
|
+
// invalidates stale installs (handled inside ensureCachedInstall). The
|
|
70
|
+
// resolved layout matches the pre-consolidation helper so existing caches
|
|
71
|
+
// keep serving.
|
|
72
|
+
const CLI_REL_PATH = join('dist', 'cli', 'index.js');
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Sync invocation. `redblue` runs are bounded by `max_cost_usd` and
|
|
76
|
+
* `max_runtime_minutes` from the config, so sync is fine for the CLI
|
|
77
|
+
* wrapper. The default --mock-judge fixture path completes in seconds.
|
|
78
|
+
*/
|
|
79
|
+
export function runRedblue(args, opts = {}) {
|
|
80
|
+
const start = Date.now();
|
|
81
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
82
|
+
|
|
83
|
+
// 1. Ensure redblue is installed in our cache dir (one-time install).
|
|
84
|
+
const install = ensureCachedInstall({
|
|
85
|
+
pkg: REDBLUE_PKG,
|
|
86
|
+
pinVersion: REDBLUE_PIN_VERSION,
|
|
87
|
+
cliRelPath: CLI_REL_PATH,
|
|
88
|
+
});
|
|
89
|
+
if (!install.ok) {
|
|
90
|
+
return {
|
|
91
|
+
stdout: install.stdout ?? '',
|
|
92
|
+
stderr: install.stderr ?? install.error ?? '',
|
|
93
|
+
exitCode: 127,
|
|
94
|
+
durationMs: Date.now() - start,
|
|
95
|
+
degraded: true,
|
|
96
|
+
reason: install.reason === 'install-failed'
|
|
97
|
+
? `${REASON_PREFIX}-not-available`
|
|
98
|
+
: `${REASON_PREFIX}-${install.reason}`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// 2. Invoke `node <real-path-to-cli> <args>` so upstream's isMain check
|
|
103
|
+
// succeeds (argv[1] matches import.meta.url).
|
|
104
|
+
const r = spawnSync('node', [install.cliPath, ...args], {
|
|
105
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
106
|
+
encoding: 'utf-8',
|
|
107
|
+
timeout: timeoutMs,
|
|
108
|
+
cwd: opts.cwd,
|
|
109
|
+
env: { ...process.env, ...(opts.env || {}) },
|
|
110
|
+
shell: process.platform === 'win32',
|
|
111
|
+
});
|
|
112
|
+
const durationMs = Date.now() - start;
|
|
113
|
+
const stdout = r.stdout || '';
|
|
114
|
+
const stderr = r.stderr || '';
|
|
115
|
+
const classified = classifyDegraded(stderr, r.status, REASON_PREFIX);
|
|
116
|
+
if (classified.degraded) {
|
|
117
|
+
return {
|
|
118
|
+
stdout, stderr,
|
|
119
|
+
exitCode: r.status ?? 127,
|
|
120
|
+
durationMs,
|
|
121
|
+
degraded: true,
|
|
122
|
+
reason: classified.reason,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
stdout, stderr,
|
|
127
|
+
exitCode: r.status ?? 0,
|
|
128
|
+
durationMs,
|
|
129
|
+
degraded: false,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Match the existing `emit*DegradedJsonAndExit` shape used by sibling
|
|
135
|
+
* scripts so MCP tool consumers see one contract. Exit 0 — ADR-150
|
|
136
|
+
* architectural constraint #3.
|
|
137
|
+
*/
|
|
138
|
+
export const emitRedblueDegradedJsonAndExit = makeDegradedEmitter(REDBLUE_PKG, REDBLUE_PIN_VERSION);
|
|
139
|
+
|
|
140
|
+
export const REDBLUE_VERSION_PIN = REDBLUE_PIN;
|
|
141
|
+
export const REDBLUE_CACHE_DIR = join(
|
|
142
|
+
homedir(), '.ruflo', `redblue-cache-${REDBLUE_PIN_VERSION.replace(/[~^]/g, '')}`,
|
|
143
|
+
);
|
|
@@ -1,161 +1,161 @@
|
|
|
1
|
-
// _similarity.mjs — ADR-152 production similarity module.
|
|
2
|
-
//
|
|
3
|
-
// Graduated from `_spike-similarity.mjs` (iter 35) after both invariants
|
|
4
|
-
// passed on the LEGAL/SUPPORT/DEVOPS fixtures. The spike file STAYS as
|
|
5
|
-
// the regression-suite anchor; this file is what production callers
|
|
6
|
-
// (`similarity.mjs` skill, `metaharness_similarity` MCP tool) import.
|
|
7
|
-
//
|
|
8
|
-
// ADR-150 ARCHITECTURAL CONSTRAINTS PRESERVED
|
|
9
|
-
// Removable ✓ pure-TS — no `@metaharness/*` import path
|
|
10
|
-
// Optional ✓ no new dep on `@metaharness/*`
|
|
11
|
-
// Graceful ✓ malformed input → low-confidence output, never throws
|
|
12
|
-
// CI-gate ✓ standalone unit-importable; no `npx` needed
|
|
13
|
-
//
|
|
14
|
-
// CONTRACT (PUBLIC)
|
|
15
|
-
// projectToVec(input) → 9-dim numerical feature vector
|
|
16
|
-
// cosine(a, b) → [0,1]
|
|
17
|
-
// categoricalAgreement(a, b) → [0,1] over 4 enum fields
|
|
18
|
-
// jaccard(a, b) → [0,1] over agent_topology[]
|
|
19
|
-
// similarity(a, b, opts?) → { overall, components, perDimension? }
|
|
20
|
-
//
|
|
21
|
-
// WEIGHT DEFAULTS (from ADR-152 §Decision)
|
|
22
|
-
// overall = 0.60·cosine + 0.25·categorical + 0.15·jaccard
|
|
23
|
-
//
|
|
24
|
-
// ADR-152 reserves a future per-org weight override; for §3.1 the defaults
|
|
25
|
-
// are global. The opts.weights hook is here so consumers can experiment
|
|
26
|
-
// without forking the module — it is NOT a stable public API.
|
|
27
|
-
|
|
28
|
-
const DEFAULT_WEIGHTS = Object.freeze({ cosine: 0.6, categorical: 0.25, jaccard: 0.15 });
|
|
29
|
-
|
|
30
|
-
const CATEGORICAL_FIELDS = Object.freeze(['repo_type', 'archetype', 'template', 'recommendedMode']);
|
|
31
|
-
|
|
32
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
33
|
-
// 9-dim feature vector. The mapping mirrors ADR-152 §Decision Table 1.
|
|
34
|
-
// Missing fields default to 0 — that's the graceful-degradation path.
|
|
35
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
36
|
-
|
|
37
|
-
export function projectToVec(input) {
|
|
38
|
-
const s = input?.score ?? {};
|
|
39
|
-
const g = input?.genome ?? {};
|
|
40
|
-
return [
|
|
41
|
-
(s.harnessFit ?? 0) / 100,
|
|
42
|
-
(s.compileConfidence ?? 0) / 100,
|
|
43
|
-
(s.taskCoverage ?? 0) / 100,
|
|
44
|
-
(s.toolSafety ?? 0) / 100,
|
|
45
|
-
(s.memoryUsefulness ?? 0) / 100,
|
|
46
|
-
g.risk_score ?? 0,
|
|
47
|
-
g.test_confidence ?? 0,
|
|
48
|
-
g.publish_readiness ?? 0,
|
|
49
|
-
Math.max(0, Math.min(1, Math.log10((s.estCostPerRunUsd ?? 0) + 0.001) / Math.log10(10))),
|
|
50
|
-
];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function cosine(a, b) {
|
|
54
|
-
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return 0;
|
|
55
|
-
let dot = 0, na = 0, nb = 0;
|
|
56
|
-
for (let i = 0; i < a.length; i++) {
|
|
57
|
-
dot += a[i] * b[i];
|
|
58
|
-
na += a[i] * a[i];
|
|
59
|
-
nb += b[i] * b[i];
|
|
60
|
-
}
|
|
61
|
-
const denom = Math.sqrt(na) * Math.sqrt(nb);
|
|
62
|
-
if (denom === 0) return 0;
|
|
63
|
-
return Math.max(0, Math.min(1, dot / denom));
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export function categoricalAgreement(a, b) {
|
|
67
|
-
let matches = 0;
|
|
68
|
-
for (const f of CATEGORICAL_FIELDS) {
|
|
69
|
-
const av = a?.genome?.[f] ?? a?.score?.[f];
|
|
70
|
-
const bv = b?.genome?.[f] ?? b?.score?.[f];
|
|
71
|
-
if (av && bv && av === bv) matches++;
|
|
72
|
-
}
|
|
73
|
-
return matches / CATEGORICAL_FIELDS.length;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export function jaccard(a, b) {
|
|
77
|
-
const A = new Set(a?.genome?.agent_topology ?? []);
|
|
78
|
-
const B = new Set(b?.genome?.agent_topology ?? []);
|
|
79
|
-
if (A.size === 0 && B.size === 0) return 1;
|
|
80
|
-
const intersection = [...A].filter((x) => B.has(x)).length;
|
|
81
|
-
const union = new Set([...A, ...B]).size;
|
|
82
|
-
return union === 0 ? 0 : intersection / union;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
86
|
-
// Composite similarity with optional per-dimension breakdown.
|
|
87
|
-
// Returns the ADR-152 §"return shape": overall + components + per-dim.
|
|
88
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
89
|
-
|
|
90
|
-
export function similarity(a, b, opts = {}) {
|
|
91
|
-
const weights = { ...DEFAULT_WEIGHTS, ...(opts.weights ?? {}) };
|
|
92
|
-
const va = projectToVec(a);
|
|
93
|
-
const vb = projectToVec(b);
|
|
94
|
-
const cos = cosine(va, vb);
|
|
95
|
-
const cat = categoricalAgreement(a, b);
|
|
96
|
-
const jac = jaccard(a, b);
|
|
97
|
-
|
|
98
|
-
const overall = weights.cosine * cos + weights.categorical * cat + weights.jaccard * jac;
|
|
99
|
-
|
|
100
|
-
const result = {
|
|
101
|
-
overall: round4(overall),
|
|
102
|
-
components: {
|
|
103
|
-
cosine: round4(cos),
|
|
104
|
-
categorical: round4(cat),
|
|
105
|
-
jaccard: round4(jac),
|
|
106
|
-
},
|
|
107
|
-
weights,
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
if (opts.perDimension) {
|
|
111
|
-
result.perDimension = perDimensionBreakdown(a, b, va, vb, weights);
|
|
112
|
-
}
|
|
113
|
-
return result;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function round4(x) {
|
|
117
|
-
return Math.round(x * 10000) / 10000;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function perDimensionBreakdown(a, b, va, vb, weights) {
|
|
121
|
-
// Per-dimension contribution = squared-error-normalized cosine slice + categorical/jaccard direct.
|
|
122
|
-
// We surface raw a/b values + a contribution sign so callers can explain
|
|
123
|
-
// why two harnesses scored as they did (used by Recommendation Engine
|
|
124
|
-
// §3.2 confidence calc + Drift Detection §3.3 alert reason).
|
|
125
|
-
const out = {};
|
|
126
|
-
|
|
127
|
-
const numericKeys = [
|
|
128
|
-
['harnessFit', 'score', 100], ['compileConfidence', 'score', 100],
|
|
129
|
-
['taskCoverage', 'score', 100], ['toolSafety', 'score', 100],
|
|
130
|
-
['memoryUsefulness', 'score', 100],
|
|
131
|
-
['risk_score', 'genome', 1], ['test_confidence', 'genome', 1],
|
|
132
|
-
['publish_readiness', 'genome', 1],
|
|
133
|
-
['estCostPerRunUsd', 'score', 1],
|
|
134
|
-
];
|
|
135
|
-
for (let i = 0; i < numericKeys.length; i++) {
|
|
136
|
-
const [k, src] = numericKeys[i];
|
|
137
|
-
const av = a?.[src]?.[k];
|
|
138
|
-
const bv = b?.[src]?.[k];
|
|
139
|
-
out[`numeric.${k}`] = {
|
|
140
|
-
a: av ?? null, b: bv ?? null,
|
|
141
|
-
contribution: round4(va[i] * vb[i] * weights.cosine / 9),
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
for (const f of CATEGORICAL_FIELDS) {
|
|
145
|
-
const av = a?.genome?.[f] ?? a?.score?.[f];
|
|
146
|
-
const bv = b?.genome?.[f] ?? b?.score?.[f];
|
|
147
|
-
out[`categorical.${f}`] = {
|
|
148
|
-
a: av ?? null, b: bv ?? null,
|
|
149
|
-
contribution: av && bv && av === bv ? round4(weights.categorical / 4) : 0,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
const A = new Set(a?.genome?.agent_topology ?? []);
|
|
153
|
-
const B = new Set(b?.genome?.agent_topology ?? []);
|
|
154
|
-
const overlap = [...A].filter((x) => B.has(x));
|
|
155
|
-
const union = new Set([...A, ...B]);
|
|
156
|
-
out['set.agent_topology'] = {
|
|
157
|
-
a: [...A], b: [...B],
|
|
158
|
-
contribution: union.size === 0 ? 0 : round4((overlap.length / union.size) * weights.jaccard),
|
|
159
|
-
};
|
|
160
|
-
return out;
|
|
161
|
-
}
|
|
1
|
+
// _similarity.mjs — ADR-152 production similarity module.
|
|
2
|
+
//
|
|
3
|
+
// Graduated from `_spike-similarity.mjs` (iter 35) after both invariants
|
|
4
|
+
// passed on the LEGAL/SUPPORT/DEVOPS fixtures. The spike file STAYS as
|
|
5
|
+
// the regression-suite anchor; this file is what production callers
|
|
6
|
+
// (`similarity.mjs` skill, `metaharness_similarity` MCP tool) import.
|
|
7
|
+
//
|
|
8
|
+
// ADR-150 ARCHITECTURAL CONSTRAINTS PRESERVED
|
|
9
|
+
// Removable ✓ pure-TS — no `@metaharness/*` import path
|
|
10
|
+
// Optional ✓ no new dep on `@metaharness/*`
|
|
11
|
+
// Graceful ✓ malformed input → low-confidence output, never throws
|
|
12
|
+
// CI-gate ✓ standalone unit-importable; no `npx` needed
|
|
13
|
+
//
|
|
14
|
+
// CONTRACT (PUBLIC)
|
|
15
|
+
// projectToVec(input) → 9-dim numerical feature vector
|
|
16
|
+
// cosine(a, b) → [0,1]
|
|
17
|
+
// categoricalAgreement(a, b) → [0,1] over 4 enum fields
|
|
18
|
+
// jaccard(a, b) → [0,1] over agent_topology[]
|
|
19
|
+
// similarity(a, b, opts?) → { overall, components, perDimension? }
|
|
20
|
+
//
|
|
21
|
+
// WEIGHT DEFAULTS (from ADR-152 §Decision)
|
|
22
|
+
// overall = 0.60·cosine + 0.25·categorical + 0.15·jaccard
|
|
23
|
+
//
|
|
24
|
+
// ADR-152 reserves a future per-org weight override; for §3.1 the defaults
|
|
25
|
+
// are global. The opts.weights hook is here so consumers can experiment
|
|
26
|
+
// without forking the module — it is NOT a stable public API.
|
|
27
|
+
|
|
28
|
+
const DEFAULT_WEIGHTS = Object.freeze({ cosine: 0.6, categorical: 0.25, jaccard: 0.15 });
|
|
29
|
+
|
|
30
|
+
const CATEGORICAL_FIELDS = Object.freeze(['repo_type', 'archetype', 'template', 'recommendedMode']);
|
|
31
|
+
|
|
32
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
33
|
+
// 9-dim feature vector. The mapping mirrors ADR-152 §Decision Table 1.
|
|
34
|
+
// Missing fields default to 0 — that's the graceful-degradation path.
|
|
35
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
36
|
+
|
|
37
|
+
export function projectToVec(input) {
|
|
38
|
+
const s = input?.score ?? {};
|
|
39
|
+
const g = input?.genome ?? {};
|
|
40
|
+
return [
|
|
41
|
+
(s.harnessFit ?? 0) / 100,
|
|
42
|
+
(s.compileConfidence ?? 0) / 100,
|
|
43
|
+
(s.taskCoverage ?? 0) / 100,
|
|
44
|
+
(s.toolSafety ?? 0) / 100,
|
|
45
|
+
(s.memoryUsefulness ?? 0) / 100,
|
|
46
|
+
g.risk_score ?? 0,
|
|
47
|
+
g.test_confidence ?? 0,
|
|
48
|
+
g.publish_readiness ?? 0,
|
|
49
|
+
Math.max(0, Math.min(1, Math.log10((s.estCostPerRunUsd ?? 0) + 0.001) / Math.log10(10))),
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function cosine(a, b) {
|
|
54
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return 0;
|
|
55
|
+
let dot = 0, na = 0, nb = 0;
|
|
56
|
+
for (let i = 0; i < a.length; i++) {
|
|
57
|
+
dot += a[i] * b[i];
|
|
58
|
+
na += a[i] * a[i];
|
|
59
|
+
nb += b[i] * b[i];
|
|
60
|
+
}
|
|
61
|
+
const denom = Math.sqrt(na) * Math.sqrt(nb);
|
|
62
|
+
if (denom === 0) return 0;
|
|
63
|
+
return Math.max(0, Math.min(1, dot / denom));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function categoricalAgreement(a, b) {
|
|
67
|
+
let matches = 0;
|
|
68
|
+
for (const f of CATEGORICAL_FIELDS) {
|
|
69
|
+
const av = a?.genome?.[f] ?? a?.score?.[f];
|
|
70
|
+
const bv = b?.genome?.[f] ?? b?.score?.[f];
|
|
71
|
+
if (av && bv && av === bv) matches++;
|
|
72
|
+
}
|
|
73
|
+
return matches / CATEGORICAL_FIELDS.length;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function jaccard(a, b) {
|
|
77
|
+
const A = new Set(a?.genome?.agent_topology ?? []);
|
|
78
|
+
const B = new Set(b?.genome?.agent_topology ?? []);
|
|
79
|
+
if (A.size === 0 && B.size === 0) return 1;
|
|
80
|
+
const intersection = [...A].filter((x) => B.has(x)).length;
|
|
81
|
+
const union = new Set([...A, ...B]).size;
|
|
82
|
+
return union === 0 ? 0 : intersection / union;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
86
|
+
// Composite similarity with optional per-dimension breakdown.
|
|
87
|
+
// Returns the ADR-152 §"return shape": overall + components + per-dim.
|
|
88
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
89
|
+
|
|
90
|
+
export function similarity(a, b, opts = {}) {
|
|
91
|
+
const weights = { ...DEFAULT_WEIGHTS, ...(opts.weights ?? {}) };
|
|
92
|
+
const va = projectToVec(a);
|
|
93
|
+
const vb = projectToVec(b);
|
|
94
|
+
const cos = cosine(va, vb);
|
|
95
|
+
const cat = categoricalAgreement(a, b);
|
|
96
|
+
const jac = jaccard(a, b);
|
|
97
|
+
|
|
98
|
+
const overall = weights.cosine * cos + weights.categorical * cat + weights.jaccard * jac;
|
|
99
|
+
|
|
100
|
+
const result = {
|
|
101
|
+
overall: round4(overall),
|
|
102
|
+
components: {
|
|
103
|
+
cosine: round4(cos),
|
|
104
|
+
categorical: round4(cat),
|
|
105
|
+
jaccard: round4(jac),
|
|
106
|
+
},
|
|
107
|
+
weights,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
if (opts.perDimension) {
|
|
111
|
+
result.perDimension = perDimensionBreakdown(a, b, va, vb, weights);
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function round4(x) {
|
|
117
|
+
return Math.round(x * 10000) / 10000;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function perDimensionBreakdown(a, b, va, vb, weights) {
|
|
121
|
+
// Per-dimension contribution = squared-error-normalized cosine slice + categorical/jaccard direct.
|
|
122
|
+
// We surface raw a/b values + a contribution sign so callers can explain
|
|
123
|
+
// why two harnesses scored as they did (used by Recommendation Engine
|
|
124
|
+
// §3.2 confidence calc + Drift Detection §3.3 alert reason).
|
|
125
|
+
const out = {};
|
|
126
|
+
|
|
127
|
+
const numericKeys = [
|
|
128
|
+
['harnessFit', 'score', 100], ['compileConfidence', 'score', 100],
|
|
129
|
+
['taskCoverage', 'score', 100], ['toolSafety', 'score', 100],
|
|
130
|
+
['memoryUsefulness', 'score', 100],
|
|
131
|
+
['risk_score', 'genome', 1], ['test_confidence', 'genome', 1],
|
|
132
|
+
['publish_readiness', 'genome', 1],
|
|
133
|
+
['estCostPerRunUsd', 'score', 1],
|
|
134
|
+
];
|
|
135
|
+
for (let i = 0; i < numericKeys.length; i++) {
|
|
136
|
+
const [k, src] = numericKeys[i];
|
|
137
|
+
const av = a?.[src]?.[k];
|
|
138
|
+
const bv = b?.[src]?.[k];
|
|
139
|
+
out[`numeric.${k}`] = {
|
|
140
|
+
a: av ?? null, b: bv ?? null,
|
|
141
|
+
contribution: round4(va[i] * vb[i] * weights.cosine / 9),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
for (const f of CATEGORICAL_FIELDS) {
|
|
145
|
+
const av = a?.genome?.[f] ?? a?.score?.[f];
|
|
146
|
+
const bv = b?.genome?.[f] ?? b?.score?.[f];
|
|
147
|
+
out[`categorical.${f}`] = {
|
|
148
|
+
a: av ?? null, b: bv ?? null,
|
|
149
|
+
contribution: av && bv && av === bv ? round4(weights.categorical / 4) : 0,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const A = new Set(a?.genome?.agent_topology ?? []);
|
|
153
|
+
const B = new Set(b?.genome?.agent_topology ?? []);
|
|
154
|
+
const overlap = [...A].filter((x) => B.has(x));
|
|
155
|
+
const union = new Set([...A, ...B]);
|
|
156
|
+
out['set.agent_topology'] = {
|
|
157
|
+
a: [...A], b: [...B],
|
|
158
|
+
contribution: union.size === 0 ? 0 : round4((overlap.length / union.size) * weights.jaccard),
|
|
159
|
+
};
|
|
160
|
+
return out;
|
|
161
|
+
}
|