@claude-flow/cli 3.10.46 → 3.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/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/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 +368 -368
- 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/hook-handler.cjs +286 -286
- package/.claude/helpers/intelligence.cjs +1031 -1031
- 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 +488 -488
- 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 +604 -604
- package/.claude/helpers/statusline.js +352 -352
- 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/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 +412 -412
- package/bin/cli.js +314 -314
- package/bin/mcp-server.js +224 -224
- package/bin/preinstall.cjs +2 -2
- package/dist/src/benchmarks/gaia-critic.js +24 -24
- package/dist/src/commands/completions.js +409 -409
- package/dist/src/commands/daemon.js +44 -44
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +175 -1
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/eject.d.ts +33 -0
- package/dist/src/commands/eject.d.ts.map +1 -0
- package/dist/src/commands/eject.js +195 -0
- package/dist/src/commands/eject.js.map +1 -0
- package/dist/src/commands/embeddings.js +26 -26
- package/dist/src/commands/hive-mind.js +97 -97
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +11 -10
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +4 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +3 -0
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/metaharness.d.ts +39 -0
- package/dist/src/commands/metaharness.d.ts.map +1 -0
- package/dist/src/commands/metaharness.js +194 -0
- package/dist/src/commands/metaharness.js.map +1 -0
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +2351 -1
- package/dist/src/commands/neural.js.map +1 -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/init/claudemd-generator.js +231 -231
- package/dist/src/init/executor.js +453 -453
- package/dist/src/init/helpers-generator.js +727 -727
- package/dist/src/init/statusline-generator.js +717 -717
- package/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +4 -0
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-tools/agent-execute-core.d.ts +23 -1
- package/dist/src/mcp-tools/agent-execute-core.d.ts.map +1 -1
- package/dist/src/mcp-tools/agent-execute-core.js +136 -9
- package/dist/src/mcp-tools/agent-execute-core.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +48 -4
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.js +15 -15
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +196 -0
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +1 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +2 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/metaharness-tools.d.ts +31 -0
- package/dist/src/mcp-tools/metaharness-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/metaharness-tools.js +372 -0
- package/dist/src/mcp-tools/metaharness-tools.js.map +1 -0
- package/dist/src/memory/graph-edge-writer.js +18 -18
- package/dist/src/memory/memory-bridge.js +84 -84
- package/dist/src/memory/memory-initializer.js +393 -393
- package/dist/src/memory/rabitq-index.js +5 -5
- package/dist/src/plugins/store/discovery.d.ts.map +1 -1
- package/dist/src/plugins/store/discovery.js +3 -0
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/types.d.ts +6 -1
- package/dist/src/plugins/store/types.d.ts.map +1 -1
- package/dist/src/runtime/headless.js +28 -28
- package/dist/src/ruvector/enhanced-model-router.d.ts +5 -0
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.js +18 -1
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/model-prices.d.ts +50 -0
- package/dist/src/ruvector/model-prices.d.ts.map +1 -0
- package/dist/src/ruvector/model-prices.js +72 -0
- package/dist/src/ruvector/model-prices.js.map +1 -0
- package/dist/src/ruvector/model-router.d.ts +147 -8
- package/dist/src/ruvector/model-router.d.ts.map +1 -1
- package/dist/src/ruvector/model-router.js +455 -18
- package/dist/src/ruvector/model-router.js.map +1 -1
- package/dist/src/ruvector/neural-router.d.ts +172 -39
- package/dist/src/ruvector/neural-router.d.ts.map +1 -1
- package/dist/src/ruvector/neural-router.js +780 -91
- package/dist/src/ruvector/neural-router.js.map +1 -1
- package/dist/src/ruvector/router-calibrator.d.ts +65 -0
- package/dist/src/ruvector/router-calibrator.d.ts.map +1 -0
- package/dist/src/ruvector/router-calibrator.js +120 -0
- package/dist/src/ruvector/router-calibrator.js.map +1 -0
- package/dist/src/ruvector/router-parallel-recorder.d.ts +127 -0
- package/dist/src/ruvector/router-parallel-recorder.d.ts.map +1 -0
- package/dist/src/ruvector/router-parallel-recorder.js +183 -0
- package/dist/src/ruvector/router-parallel-recorder.js.map +1 -0
- package/dist/src/ruvector/router-trajectory.d.ts +137 -45
- package/dist/src/ruvector/router-trajectory.d.ts.map +1 -1
- package/dist/src/ruvector/router-trajectory.js +226 -63
- package/dist/src/ruvector/router-trajectory.js.map +1 -1
- package/dist/src/ruvector/task-embedder.d.ts +56 -0
- package/dist/src/ruvector/task-embedder.d.ts.map +1 -0
- package/dist/src/ruvector/task-embedder.js +237 -0
- package/dist/src/ruvector/task-embedder.js.map +1 -0
- package/dist/src/services/headless-worker-executor.js +84 -84
- package/dist/src/transfer/deploy-seraphine.js +23 -23
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +138 -134
- package/scripts/beir-bootstrap-significance.mjs +162 -162
- package/scripts/bench-rvagent.mjs +312 -312
- package/scripts/benchmark-codemods.mjs +127 -127
- package/scripts/benchmark-cross-repo.mjs +206 -206
- package/scripts/benchmark-pretrained-retrieval.mjs +305 -305
- package/scripts/benchmark-self-learning.mjs +241 -241
- package/scripts/benchmark-trajectory-mrr.mjs +191 -191
- package/scripts/deploy-ipfs-node.sh +153 -153
- package/scripts/grid-search-retrieval.mjs +216 -216
- package/scripts/postinstall.cjs +153 -153
- package/scripts/pretrain-from-github.mjs +358 -358
- package/scripts/publish-registry.ts +345 -345
- package/scripts/publish.sh +57 -57
- package/scripts/run-beir-bge.mjs +324 -324
- package/scripts/run-beir-hybrid.mjs +261 -261
- package/scripts/run-beir-lucene-bm25.mjs +154 -154
- package/scripts/run-beir-nfcorpus.mjs +231 -231
- package/scripts/run-beir-rrf-ablation.mjs +221 -221
- package/scripts/setup-ipfs-registry.md +366 -366
- package/dist/src/ruvector/flash-attention.d.ts +0 -195
- package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
- package/dist/src/ruvector/flash-attention.js +0 -643
- package/dist/src/ruvector/flash-attention.js.map +0 -1
- package/dist/src/ruvector/moe-router.d.ts +0 -206
- package/dist/src/ruvector/moe-router.d.ts.map +0 -1
- package/dist/src/ruvector/moe-router.js +0 -626
- package/dist/src/ruvector/moe-router.js.map +0 -1
- package/dist/src/services/event-stream.d.ts +0 -25
- package/dist/src/services/event-stream.js +0 -27
- package/dist/src/services/loop-worker-runner.d.ts +0 -16
- package/dist/src/services/loop-worker-runner.js +0 -34
- package/dist/src/services/runtime-capabilities.d.ts +0 -22
- package/dist/src/services/runtime-capabilities.js +0 -45
|
@@ -1,305 +1,305 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// benchmark-pretrained-retrieval.mjs — proof that pretrained patterns are
|
|
3
|
-
// retrievable, not just stored.
|
|
4
|
-
//
|
|
5
|
-
// Runs sample queries against the neural store (post-pretrain) and reports
|
|
6
|
-
// the top-k matches. Demonstrates that after `pretrain-from-github.mjs`
|
|
7
|
-
// runs, an agent can recall relevant past work by intent.
|
|
8
|
-
//
|
|
9
|
-
// Usage:
|
|
10
|
-
// 1. node scripts/pretrain-from-github.mjs # populate the store
|
|
11
|
-
// 2. node scripts/benchmark-pretrained-retrieval.mjs # query + report
|
|
12
|
-
|
|
13
|
-
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
14
|
-
import { fileURLToPath } from 'node:url';
|
|
15
|
-
import { dirname, join, resolve } from 'node:path';
|
|
16
|
-
import { performance } from 'node:perf_hooks';
|
|
17
|
-
|
|
18
|
-
const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url));
|
|
19
|
-
const CLI_ROOT = resolve(SCRIPT_DIR, '..');
|
|
20
|
-
const REPO_ROOT = resolve(SCRIPT_DIR, '../../../..');
|
|
21
|
-
const RUNS_DIR = join(REPO_ROOT, 'docs', 'benchmarks', 'runs');
|
|
22
|
-
|
|
23
|
-
// ADR-081 labelled held-out corpus. Each query has hand-curated
|
|
24
|
-
// `expectedSubstrings` — case-insensitive substring matches against the
|
|
25
|
-
// pattern's name. A result is "relevant" if its name contains ANY of the
|
|
26
|
-
// substrings. Tighter than the regex proxy used in ADRs 077-080 (which
|
|
27
|
-
// matched related-but-not-exact commits).
|
|
28
|
-
//
|
|
29
|
-
// `expect` (regex) is kept for backwards compatibility with the older
|
|
30
|
-
// numbers in ADRs 077-080. New metrics use expectedSubstrings.
|
|
31
|
-
const QUERIES = [
|
|
32
|
-
{
|
|
33
|
-
q: 'how was the Opus model alias fixed',
|
|
34
|
-
expect: /opus|2232|model.*alias|4\.8/i,
|
|
35
|
-
expectedSubstrings: ['opus 4.8', 'opus alias', 'opus model alias', '#2232'],
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
q: 'self-learning wiring task-completed pretrain',
|
|
39
|
-
expect: /self.?learning|task.?completed|pretrain|2245|074/i,
|
|
40
|
-
expectedSubstrings: ['self-learning', 'adr-074', 'self learning', '#2245', 'task-completed'],
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
q: 'deterministic codemod engine var-to-const',
|
|
44
|
-
expect: /codemod|var.?to.?const|143|deterministic/i,
|
|
45
|
-
expectedSubstrings: ['deterministic tier-1 codemod', 'adr-143', 'codemod', 'var-to-const'],
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
q: 'MCP server orphan leak parent-death',
|
|
49
|
-
expect: /mcp.*orphan|orphan.*mcp|parent.?death|leak/i,
|
|
50
|
-
expectedSubstrings: ['mcp orphan', 'mcp servers orphan', 'parent-death', '#2234', 'orphan on every claude'],
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
q: 'unified learning stats aggregator',
|
|
54
|
-
expect: /unified|stats|aggregator|075/i,
|
|
55
|
-
expectedSubstrings: ['unified learning-stats', 'adr-075', 'unified learning stats'],
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
q: 'structured distillation 4-field schema',
|
|
59
|
-
expect: /distillation|structured|076|4.?field/i,
|
|
60
|
-
expectedSubstrings: ['structured distillation', 'adr-076', '4-field schema'],
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
q: 'SQL injection migrate.ts table identifier',
|
|
64
|
-
expect: /sql.?injection|migrate|table|identifier/i,
|
|
65
|
-
expectedSubstrings: ['sql injection', 'shell injection', 'migrate.ts', 'agentdb', 'cve'],
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
q: 'recall@k HNSW benchmark harness',
|
|
69
|
-
expect: /recall|hnsw|benchmark|harness/i,
|
|
70
|
-
expectedSubstrings: ['hnsw', 'memory-recall', 'benchmark suite', 'recall@k', 'benchmark intelligence'],
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
q: 'Q-learning encoder keyword block',
|
|
74
|
-
expect: /q.?learning|encoder|keyword|2239/i,
|
|
75
|
-
expectedSubstrings: ['q-state encoder', 'route q-state', 'keyword block', '#2239', 'q-encoder'],
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
q: 'security hardening crypto random IDs',
|
|
79
|
-
expect: /security|hardening|crypto|random/i,
|
|
80
|
-
expectedSubstrings: ['cwe-347', 'crypto.randomuuid', 'security fix', 'random id', 'crypto random'],
|
|
81
|
-
},
|
|
82
|
-
];
|
|
83
|
-
|
|
84
|
-
/** Returns true if name contains ANY of the labelled substrings (case-insensitive). */
|
|
85
|
-
function isRelevant(name, expectedSubstrings) {
|
|
86
|
-
if (!name || !expectedSubstrings?.length) return false;
|
|
87
|
-
const lower = String(name).toLowerCase();
|
|
88
|
-
return expectedSubstrings.some((s) => lower.includes(s.toLowerCase()));
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/** nDCG@k with binary relevance (each relevant item contributes 1 / log2(i+1)). */
|
|
92
|
-
function ndcgAtK(rankedRelevance, k) {
|
|
93
|
-
const arr = rankedRelevance.slice(0, k);
|
|
94
|
-
const dcg = arr.reduce((acc, rel, i) => acc + (rel ? 1 / Math.log2(i + 2) : 0), 0);
|
|
95
|
-
const numRelevant = arr.filter(Boolean).length;
|
|
96
|
-
if (numRelevant === 0) return 0;
|
|
97
|
-
// Ideal: all relevant items packed at positions 1..numRelevant
|
|
98
|
-
let idcg = 0;
|
|
99
|
-
for (let i = 0; i < numRelevant; i++) idcg += 1 / Math.log2(i + 2);
|
|
100
|
-
return idcg > 0 ? dcg / idcg : 0;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const TOP_K = 5;
|
|
104
|
-
|
|
105
|
-
async function main() {
|
|
106
|
-
const intel = await import(join(CLI_ROOT, 'dist/src/memory/intelligence.js'));
|
|
107
|
-
const neural = await import(join(CLI_ROOT, 'dist/src/mcp-tools/neural-tools.js'));
|
|
108
|
-
|
|
109
|
-
// §1 — snapshot the neural store + globalStats so we know what's there.
|
|
110
|
-
const unified = await intel.getUnifiedLearningStats();
|
|
111
|
-
const total = unified.neuralPatterns.patternCount;
|
|
112
|
-
|
|
113
|
-
if (total === 0) {
|
|
114
|
-
console.error('No patterns in neural store. Run scripts/pretrain-from-github.mjs first.');
|
|
115
|
-
process.exit(2);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// §2 — A/B hybrid vs cosine-only (HYBRID=0 forces pre-3.10.18 behaviour).
|
|
119
|
-
// Default runs hybrid (cosine + BM25 + MMR per ADR-078).
|
|
120
|
-
const listTool = neural.neuralTools.find((t) => t.name === 'neural_patterns');
|
|
121
|
-
const mode = process.env.HYBRID === '0' ? 'cosine' : 'hybrid';
|
|
122
|
-
// ADR-080 opt-in cross-encoder rerank — set RERANK=1 to enable.
|
|
123
|
-
const useRerank = process.env.RERANK === '1';
|
|
124
|
-
|
|
125
|
-
// top-1-uniqueness — fraction of queries whose top-1 result is NOT the
|
|
126
|
-
// same pattern ID as another query's top-1. Catches the "everyone gets
|
|
127
|
-
// the same generic top-1" failure mode.
|
|
128
|
-
const top1Ids = new Map();
|
|
129
|
-
|
|
130
|
-
const tQuery0 = performance.now();
|
|
131
|
-
const results = [];
|
|
132
|
-
for (const { q, expect, expectedSubstrings } of QUERIES) {
|
|
133
|
-
const r = await listTool.handler({ action: 'search', query: q, mode, limit: TOP_K, rerank: useRerank });
|
|
134
|
-
const matches = (r.patterns || r.results || r.matches || []).slice(0, TOP_K);
|
|
135
|
-
if (matches.length > 0) {
|
|
136
|
-
const top1 = matches[0].id;
|
|
137
|
-
top1Ids.set(top1, (top1Ids.get(top1) ?? 0) + 1);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Two relevance signals per result:
|
|
141
|
-
// regexRel — old proxy (kept for back-compat with ADR-077-080 numbers)
|
|
142
|
-
// labelRel — ADR-081 hand-curated label match
|
|
143
|
-
const regexRel = matches.map((m) => expect.test(m?.name ?? ''));
|
|
144
|
-
const labelRel = matches.map((m) => isRelevant(m?.name, expectedSubstrings));
|
|
145
|
-
|
|
146
|
-
// First rank where a labelled-relevant doc appears.
|
|
147
|
-
let firstLabelRank = -1;
|
|
148
|
-
for (let i = 0; i < matches.length; i++) {
|
|
149
|
-
if (labelRel[i]) { firstLabelRank = i + 1; break; }
|
|
150
|
-
}
|
|
151
|
-
let firstRegexRank = -1;
|
|
152
|
-
for (let i = 0; i < matches.length; i++) {
|
|
153
|
-
if (regexRel[i]) { firstRegexRank = i + 1; break; }
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
results.push({
|
|
157
|
-
query: q,
|
|
158
|
-
matched: matches.length > 0,
|
|
159
|
-
// Regex-proxy metrics (back-compat with ADR-077-080)
|
|
160
|
-
top1Relevant: regexRel[0] || false,
|
|
161
|
-
top3Relevant: regexRel.slice(0, 3).some(Boolean),
|
|
162
|
-
firstRelevantRank: firstRegexRank,
|
|
163
|
-
// ADR-081 labelled metrics
|
|
164
|
-
label_top1: labelRel[0] || false,
|
|
165
|
-
label_top3_count: labelRel.slice(0, 3).filter(Boolean).length,
|
|
166
|
-
label_top5_count: labelRel.slice(0, 5).filter(Boolean).length,
|
|
167
|
-
label_firstRank: firstLabelRank,
|
|
168
|
-
label_ndcg3: ndcgAtK(labelRel, 3),
|
|
169
|
-
label_ndcg5: ndcgAtK(labelRel, 5),
|
|
170
|
-
topK: matches.map((m, i) => ({
|
|
171
|
-
id: m.id,
|
|
172
|
-
name: m.name?.slice(0, 100),
|
|
173
|
-
type: m.type,
|
|
174
|
-
score: m.score ?? m.similarity,
|
|
175
|
-
cosineScore: m.cosineScore,
|
|
176
|
-
bm25Score: m.bm25Score,
|
|
177
|
-
mmrScore: m.mmrScore,
|
|
178
|
-
labelRelevant: labelRel[i],
|
|
179
|
-
})),
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
const queryMs = performance.now() - tQuery0;
|
|
183
|
-
|
|
184
|
-
const matchedQueries = results.filter((r) => r.matched).length;
|
|
185
|
-
// Regex-proxy metrics (back-compat)
|
|
186
|
-
const top1Hits = results.filter((r) => r.top1Relevant).length;
|
|
187
|
-
const top3Hits = results.filter((r) => r.top3Relevant).length;
|
|
188
|
-
const ranks = results.filter((r) => r.firstRelevantRank > 0).map((r) => r.firstRelevantRank);
|
|
189
|
-
const mrr3 = QUERIES.length > 0
|
|
190
|
-
? Number((ranks.reduce((s, r) => s + 1 / r, 0) / QUERIES.length).toFixed(4))
|
|
191
|
-
: 0;
|
|
192
|
-
|
|
193
|
-
// ADR-081 labelled metrics — tighter ground truth than regex proxy.
|
|
194
|
-
const label_top1Hits = results.filter((r) => r.label_top1).length;
|
|
195
|
-
const label_top3HitsBinary = results.filter((r) => r.label_top3_count > 0).length;
|
|
196
|
-
const label_ranks = results.filter((r) => r.label_firstRank > 0).map((r) => r.label_firstRank);
|
|
197
|
-
const label_mrr3 = QUERIES.length > 0
|
|
198
|
-
? Number((label_ranks.reduce((s, r) => s + 1 / r, 0) / QUERIES.length).toFixed(4))
|
|
199
|
-
: 0;
|
|
200
|
-
const label_ndcg3_mean = QUERIES.length > 0
|
|
201
|
-
? Number((results.reduce((s, r) => s + r.label_ndcg3, 0) / QUERIES.length).toFixed(4))
|
|
202
|
-
: 0;
|
|
203
|
-
const label_ndcg5_mean = QUERIES.length > 0
|
|
204
|
-
? Number((results.reduce((s, r) => s + r.label_ndcg5, 0) / QUERIES.length).toFixed(4))
|
|
205
|
-
: 0;
|
|
206
|
-
// Mean precision@3 — fraction of top-3 that's relevant per query, averaged.
|
|
207
|
-
const label_precision3 = QUERIES.length > 0
|
|
208
|
-
? Number((results.reduce((s, r) => s + r.label_top3_count / 3, 0) / QUERIES.length).toFixed(4))
|
|
209
|
-
: 0;
|
|
210
|
-
// top-1 collision: number of distinct top-1 IDs over the query count.
|
|
211
|
-
const uniqueTop1 = top1Ids.size;
|
|
212
|
-
const top1Diversity = Number((uniqueTop1 / QUERIES.length).toFixed(4));
|
|
213
|
-
|
|
214
|
-
// top-3 redundancy: average fraction of top-3 results that are duplicates
|
|
215
|
-
// of the same pattern within a single query (should be 0 — but if the same
|
|
216
|
-
// ID appears twice in top-3 we surface it).
|
|
217
|
-
let dupCount = 0, top3Slots = 0;
|
|
218
|
-
for (const r of results) {
|
|
219
|
-
const ids = r.topK.slice(0, 3).map((m) => m.id);
|
|
220
|
-
top3Slots += ids.length;
|
|
221
|
-
const seen = new Set();
|
|
222
|
-
for (const id of ids) {
|
|
223
|
-
if (seen.has(id)) dupCount++;
|
|
224
|
-
seen.add(id);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
const top3DupRate = top3Slots > 0 ? Number((dupCount / top3Slots).toFixed(4)) : 0;
|
|
228
|
-
|
|
229
|
-
const summary = {
|
|
230
|
-
runAt: new Date().toISOString(),
|
|
231
|
-
benchmark: 'pretrained-retrieval',
|
|
232
|
-
mode, // ADR-078: which retrieval path was used
|
|
233
|
-
rerank: useRerank, // ADR-080: cross-encoder rerank on/off
|
|
234
|
-
storeSize: total,
|
|
235
|
-
queries: QUERIES.length,
|
|
236
|
-
matchedQueries,
|
|
237
|
-
matchRate: Number((matchedQueries / QUERIES.length).toFixed(4)),
|
|
238
|
-
// Regex-proxy metrics (ADR-077-080 back-compat)
|
|
239
|
-
top1HitRate: Number((top1Hits / QUERIES.length).toFixed(4)),
|
|
240
|
-
top3HitRate: Number((top3Hits / QUERIES.length).toFixed(4)),
|
|
241
|
-
mrr3,
|
|
242
|
-
// ADR-081 labelled metrics — tighter ground truth
|
|
243
|
-
label_top1HitRate: Number((label_top1Hits / QUERIES.length).toFixed(4)),
|
|
244
|
-
label_top3HitRate: Number((label_top3HitsBinary / QUERIES.length).toFixed(4)),
|
|
245
|
-
label_mrr3,
|
|
246
|
-
label_precision3,
|
|
247
|
-
label_ndcg3: label_ndcg3_mean,
|
|
248
|
-
label_ndcg5: label_ndcg5_mean,
|
|
249
|
-
top1Diversity, // 1.0 = every query gets a distinct top-1
|
|
250
|
-
top3DupRate, // 0.0 = no duplicate IDs inside any top-3
|
|
251
|
-
avgQueryLatencyMs: Number((queryMs / QUERIES.length).toFixed(2)),
|
|
252
|
-
totalQueryMs: Number(queryMs.toFixed(2)),
|
|
253
|
-
results,
|
|
254
|
-
passed: matchedQueries === QUERIES.length,
|
|
255
|
-
};
|
|
256
|
-
|
|
257
|
-
if (process.env.BENCH_JSON) {
|
|
258
|
-
console.log(JSON.stringify(summary, null, 2));
|
|
259
|
-
} else {
|
|
260
|
-
console.log(`# Pretrained-retrieval benchmark — proof of learning`);
|
|
261
|
-
console.log(`Mode: ${mode}${mode === 'hybrid' ? ' (cosine + BM25 + MMR, ADR-078)' : ' (cosine-only, pre-3.10.18)'}${useRerank ? ' + cross-encoder rerank (ADR-080)' : ''}`);
|
|
262
|
-
console.log(`Store size: ${total} patterns`);
|
|
263
|
-
console.log(`Queries: ${QUERIES.length}`);
|
|
264
|
-
console.log(`Match rate: ${(summary.matchRate * 100).toFixed(0)}% (${matchedQueries}/${QUERIES.length})`);
|
|
265
|
-
console.log(`Top-1 hit rate (regex proxy): ${(summary.top1HitRate * 100).toFixed(0)}% (${top1Hits}/${QUERIES.length})`);
|
|
266
|
-
console.log(`Top-3 hit rate (regex proxy): ${(summary.top3HitRate * 100).toFixed(0)}% (${top3Hits}/${QUERIES.length})`);
|
|
267
|
-
console.log(`MRR@3 (regex proxy): ${summary.mrr3}`);
|
|
268
|
-
console.log('');
|
|
269
|
-
console.log(`Top-1 hit rate (ADR-081 labelled): ${(summary.label_top1HitRate * 100).toFixed(0)}% (${label_top1Hits}/${QUERIES.length})`);
|
|
270
|
-
console.log(`Top-3 hit rate (ADR-081 labelled): ${(summary.label_top3HitRate * 100).toFixed(0)}% (${label_top3HitsBinary}/${QUERIES.length})`);
|
|
271
|
-
console.log(`MRR@3 (labelled): ${summary.label_mrr3}`);
|
|
272
|
-
console.log(`Precision@3 (labelled, mean): ${summary.label_precision3}`);
|
|
273
|
-
console.log(`nDCG@3 (labelled, mean): ${summary.label_ndcg3}`);
|
|
274
|
-
console.log(`nDCG@5 (labelled, mean): ${summary.label_ndcg5}`);
|
|
275
|
-
console.log(`Top-1 diversity: ${(summary.top1Diversity * 100).toFixed(0)}% (${uniqueTop1} distinct top-1 IDs across ${QUERIES.length} queries)`);
|
|
276
|
-
console.log(`Top-3 dup rate: ${(summary.top3DupRate * 100).toFixed(0)}%`);
|
|
277
|
-
console.log(`Avg query latency: ${summary.avgQueryLatencyMs} ms`);
|
|
278
|
-
console.log('');
|
|
279
|
-
for (const r of results) {
|
|
280
|
-
console.log(`Q: "${r.query}"`);
|
|
281
|
-
if (r.topK.length === 0) {
|
|
282
|
-
console.log(` → no matches`);
|
|
283
|
-
} else {
|
|
284
|
-
for (const m of r.topK.slice(0, 3)) {
|
|
285
|
-
console.log(` → ${m.score?.toFixed?.(3) ?? '—'} ${m.name}`);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
console.log('');
|
|
290
|
-
console.log(`Overall: ${summary.passed ? '✅ PASSED' : '⚠️ partial'}`);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
if (!process.env.BENCH_NO_WRITE) {
|
|
294
|
-
mkdirSync(RUNS_DIR, { recursive: true });
|
|
295
|
-
const stamp = summary.runAt.replace(/[:.]/g, '-');
|
|
296
|
-
writeFileSync(join(RUNS_DIR, `pretrained-retrieval-${stamp}.json`), JSON.stringify(summary, null, 2));
|
|
297
|
-
writeFileSync(join(RUNS_DIR, 'pretrained-retrieval-latest.json'), JSON.stringify(summary, null, 2));
|
|
298
|
-
if (!process.env.BENCH_JSON) console.log(`\nWrote ${join(RUNS_DIR, `pretrained-retrieval-${stamp}.json`)}`);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// ONNX runtime keeps a worker thread alive — force exit.
|
|
302
|
-
process.exit(summary.passed ? 0 : 1);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
main().catch((err) => { console.error(err); process.exit(1); });
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// benchmark-pretrained-retrieval.mjs — proof that pretrained patterns are
|
|
3
|
+
// retrievable, not just stored.
|
|
4
|
+
//
|
|
5
|
+
// Runs sample queries against the neural store (post-pretrain) and reports
|
|
6
|
+
// the top-k matches. Demonstrates that after `pretrain-from-github.mjs`
|
|
7
|
+
// runs, an agent can recall relevant past work by intent.
|
|
8
|
+
//
|
|
9
|
+
// Usage:
|
|
10
|
+
// 1. node scripts/pretrain-from-github.mjs # populate the store
|
|
11
|
+
// 2. node scripts/benchmark-pretrained-retrieval.mjs # query + report
|
|
12
|
+
|
|
13
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { dirname, join, resolve } from 'node:path';
|
|
16
|
+
import { performance } from 'node:perf_hooks';
|
|
17
|
+
|
|
18
|
+
const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const CLI_ROOT = resolve(SCRIPT_DIR, '..');
|
|
20
|
+
const REPO_ROOT = resolve(SCRIPT_DIR, '../../../..');
|
|
21
|
+
const RUNS_DIR = join(REPO_ROOT, 'docs', 'benchmarks', 'runs');
|
|
22
|
+
|
|
23
|
+
// ADR-081 labelled held-out corpus. Each query has hand-curated
|
|
24
|
+
// `expectedSubstrings` — case-insensitive substring matches against the
|
|
25
|
+
// pattern's name. A result is "relevant" if its name contains ANY of the
|
|
26
|
+
// substrings. Tighter than the regex proxy used in ADRs 077-080 (which
|
|
27
|
+
// matched related-but-not-exact commits).
|
|
28
|
+
//
|
|
29
|
+
// `expect` (regex) is kept for backwards compatibility with the older
|
|
30
|
+
// numbers in ADRs 077-080. New metrics use expectedSubstrings.
|
|
31
|
+
const QUERIES = [
|
|
32
|
+
{
|
|
33
|
+
q: 'how was the Opus model alias fixed',
|
|
34
|
+
expect: /opus|2232|model.*alias|4\.8/i,
|
|
35
|
+
expectedSubstrings: ['opus 4.8', 'opus alias', 'opus model alias', '#2232'],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
q: 'self-learning wiring task-completed pretrain',
|
|
39
|
+
expect: /self.?learning|task.?completed|pretrain|2245|074/i,
|
|
40
|
+
expectedSubstrings: ['self-learning', 'adr-074', 'self learning', '#2245', 'task-completed'],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
q: 'deterministic codemod engine var-to-const',
|
|
44
|
+
expect: /codemod|var.?to.?const|143|deterministic/i,
|
|
45
|
+
expectedSubstrings: ['deterministic tier-1 codemod', 'adr-143', 'codemod', 'var-to-const'],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
q: 'MCP server orphan leak parent-death',
|
|
49
|
+
expect: /mcp.*orphan|orphan.*mcp|parent.?death|leak/i,
|
|
50
|
+
expectedSubstrings: ['mcp orphan', 'mcp servers orphan', 'parent-death', '#2234', 'orphan on every claude'],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
q: 'unified learning stats aggregator',
|
|
54
|
+
expect: /unified|stats|aggregator|075/i,
|
|
55
|
+
expectedSubstrings: ['unified learning-stats', 'adr-075', 'unified learning stats'],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
q: 'structured distillation 4-field schema',
|
|
59
|
+
expect: /distillation|structured|076|4.?field/i,
|
|
60
|
+
expectedSubstrings: ['structured distillation', 'adr-076', '4-field schema'],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
q: 'SQL injection migrate.ts table identifier',
|
|
64
|
+
expect: /sql.?injection|migrate|table|identifier/i,
|
|
65
|
+
expectedSubstrings: ['sql injection', 'shell injection', 'migrate.ts', 'agentdb', 'cve'],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
q: 'recall@k HNSW benchmark harness',
|
|
69
|
+
expect: /recall|hnsw|benchmark|harness/i,
|
|
70
|
+
expectedSubstrings: ['hnsw', 'memory-recall', 'benchmark suite', 'recall@k', 'benchmark intelligence'],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
q: 'Q-learning encoder keyword block',
|
|
74
|
+
expect: /q.?learning|encoder|keyword|2239/i,
|
|
75
|
+
expectedSubstrings: ['q-state encoder', 'route q-state', 'keyword block', '#2239', 'q-encoder'],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
q: 'security hardening crypto random IDs',
|
|
79
|
+
expect: /security|hardening|crypto|random/i,
|
|
80
|
+
expectedSubstrings: ['cwe-347', 'crypto.randomuuid', 'security fix', 'random id', 'crypto random'],
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
/** Returns true if name contains ANY of the labelled substrings (case-insensitive). */
|
|
85
|
+
function isRelevant(name, expectedSubstrings) {
|
|
86
|
+
if (!name || !expectedSubstrings?.length) return false;
|
|
87
|
+
const lower = String(name).toLowerCase();
|
|
88
|
+
return expectedSubstrings.some((s) => lower.includes(s.toLowerCase()));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** nDCG@k with binary relevance (each relevant item contributes 1 / log2(i+1)). */
|
|
92
|
+
function ndcgAtK(rankedRelevance, k) {
|
|
93
|
+
const arr = rankedRelevance.slice(0, k);
|
|
94
|
+
const dcg = arr.reduce((acc, rel, i) => acc + (rel ? 1 / Math.log2(i + 2) : 0), 0);
|
|
95
|
+
const numRelevant = arr.filter(Boolean).length;
|
|
96
|
+
if (numRelevant === 0) return 0;
|
|
97
|
+
// Ideal: all relevant items packed at positions 1..numRelevant
|
|
98
|
+
let idcg = 0;
|
|
99
|
+
for (let i = 0; i < numRelevant; i++) idcg += 1 / Math.log2(i + 2);
|
|
100
|
+
return idcg > 0 ? dcg / idcg : 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const TOP_K = 5;
|
|
104
|
+
|
|
105
|
+
async function main() {
|
|
106
|
+
const intel = await import(join(CLI_ROOT, 'dist/src/memory/intelligence.js'));
|
|
107
|
+
const neural = await import(join(CLI_ROOT, 'dist/src/mcp-tools/neural-tools.js'));
|
|
108
|
+
|
|
109
|
+
// §1 — snapshot the neural store + globalStats so we know what's there.
|
|
110
|
+
const unified = await intel.getUnifiedLearningStats();
|
|
111
|
+
const total = unified.neuralPatterns.patternCount;
|
|
112
|
+
|
|
113
|
+
if (total === 0) {
|
|
114
|
+
console.error('No patterns in neural store. Run scripts/pretrain-from-github.mjs first.');
|
|
115
|
+
process.exit(2);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// §2 — A/B hybrid vs cosine-only (HYBRID=0 forces pre-3.10.18 behaviour).
|
|
119
|
+
// Default runs hybrid (cosine + BM25 + MMR per ADR-078).
|
|
120
|
+
const listTool = neural.neuralTools.find((t) => t.name === 'neural_patterns');
|
|
121
|
+
const mode = process.env.HYBRID === '0' ? 'cosine' : 'hybrid';
|
|
122
|
+
// ADR-080 opt-in cross-encoder rerank — set RERANK=1 to enable.
|
|
123
|
+
const useRerank = process.env.RERANK === '1';
|
|
124
|
+
|
|
125
|
+
// top-1-uniqueness — fraction of queries whose top-1 result is NOT the
|
|
126
|
+
// same pattern ID as another query's top-1. Catches the "everyone gets
|
|
127
|
+
// the same generic top-1" failure mode.
|
|
128
|
+
const top1Ids = new Map();
|
|
129
|
+
|
|
130
|
+
const tQuery0 = performance.now();
|
|
131
|
+
const results = [];
|
|
132
|
+
for (const { q, expect, expectedSubstrings } of QUERIES) {
|
|
133
|
+
const r = await listTool.handler({ action: 'search', query: q, mode, limit: TOP_K, rerank: useRerank });
|
|
134
|
+
const matches = (r.patterns || r.results || r.matches || []).slice(0, TOP_K);
|
|
135
|
+
if (matches.length > 0) {
|
|
136
|
+
const top1 = matches[0].id;
|
|
137
|
+
top1Ids.set(top1, (top1Ids.get(top1) ?? 0) + 1);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Two relevance signals per result:
|
|
141
|
+
// regexRel — old proxy (kept for back-compat with ADR-077-080 numbers)
|
|
142
|
+
// labelRel — ADR-081 hand-curated label match
|
|
143
|
+
const regexRel = matches.map((m) => expect.test(m?.name ?? ''));
|
|
144
|
+
const labelRel = matches.map((m) => isRelevant(m?.name, expectedSubstrings));
|
|
145
|
+
|
|
146
|
+
// First rank where a labelled-relevant doc appears.
|
|
147
|
+
let firstLabelRank = -1;
|
|
148
|
+
for (let i = 0; i < matches.length; i++) {
|
|
149
|
+
if (labelRel[i]) { firstLabelRank = i + 1; break; }
|
|
150
|
+
}
|
|
151
|
+
let firstRegexRank = -1;
|
|
152
|
+
for (let i = 0; i < matches.length; i++) {
|
|
153
|
+
if (regexRel[i]) { firstRegexRank = i + 1; break; }
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
results.push({
|
|
157
|
+
query: q,
|
|
158
|
+
matched: matches.length > 0,
|
|
159
|
+
// Regex-proxy metrics (back-compat with ADR-077-080)
|
|
160
|
+
top1Relevant: regexRel[0] || false,
|
|
161
|
+
top3Relevant: regexRel.slice(0, 3).some(Boolean),
|
|
162
|
+
firstRelevantRank: firstRegexRank,
|
|
163
|
+
// ADR-081 labelled metrics
|
|
164
|
+
label_top1: labelRel[0] || false,
|
|
165
|
+
label_top3_count: labelRel.slice(0, 3).filter(Boolean).length,
|
|
166
|
+
label_top5_count: labelRel.slice(0, 5).filter(Boolean).length,
|
|
167
|
+
label_firstRank: firstLabelRank,
|
|
168
|
+
label_ndcg3: ndcgAtK(labelRel, 3),
|
|
169
|
+
label_ndcg5: ndcgAtK(labelRel, 5),
|
|
170
|
+
topK: matches.map((m, i) => ({
|
|
171
|
+
id: m.id,
|
|
172
|
+
name: m.name?.slice(0, 100),
|
|
173
|
+
type: m.type,
|
|
174
|
+
score: m.score ?? m.similarity,
|
|
175
|
+
cosineScore: m.cosineScore,
|
|
176
|
+
bm25Score: m.bm25Score,
|
|
177
|
+
mmrScore: m.mmrScore,
|
|
178
|
+
labelRelevant: labelRel[i],
|
|
179
|
+
})),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
const queryMs = performance.now() - tQuery0;
|
|
183
|
+
|
|
184
|
+
const matchedQueries = results.filter((r) => r.matched).length;
|
|
185
|
+
// Regex-proxy metrics (back-compat)
|
|
186
|
+
const top1Hits = results.filter((r) => r.top1Relevant).length;
|
|
187
|
+
const top3Hits = results.filter((r) => r.top3Relevant).length;
|
|
188
|
+
const ranks = results.filter((r) => r.firstRelevantRank > 0).map((r) => r.firstRelevantRank);
|
|
189
|
+
const mrr3 = QUERIES.length > 0
|
|
190
|
+
? Number((ranks.reduce((s, r) => s + 1 / r, 0) / QUERIES.length).toFixed(4))
|
|
191
|
+
: 0;
|
|
192
|
+
|
|
193
|
+
// ADR-081 labelled metrics — tighter ground truth than regex proxy.
|
|
194
|
+
const label_top1Hits = results.filter((r) => r.label_top1).length;
|
|
195
|
+
const label_top3HitsBinary = results.filter((r) => r.label_top3_count > 0).length;
|
|
196
|
+
const label_ranks = results.filter((r) => r.label_firstRank > 0).map((r) => r.label_firstRank);
|
|
197
|
+
const label_mrr3 = QUERIES.length > 0
|
|
198
|
+
? Number((label_ranks.reduce((s, r) => s + 1 / r, 0) / QUERIES.length).toFixed(4))
|
|
199
|
+
: 0;
|
|
200
|
+
const label_ndcg3_mean = QUERIES.length > 0
|
|
201
|
+
? Number((results.reduce((s, r) => s + r.label_ndcg3, 0) / QUERIES.length).toFixed(4))
|
|
202
|
+
: 0;
|
|
203
|
+
const label_ndcg5_mean = QUERIES.length > 0
|
|
204
|
+
? Number((results.reduce((s, r) => s + r.label_ndcg5, 0) / QUERIES.length).toFixed(4))
|
|
205
|
+
: 0;
|
|
206
|
+
// Mean precision@3 — fraction of top-3 that's relevant per query, averaged.
|
|
207
|
+
const label_precision3 = QUERIES.length > 0
|
|
208
|
+
? Number((results.reduce((s, r) => s + r.label_top3_count / 3, 0) / QUERIES.length).toFixed(4))
|
|
209
|
+
: 0;
|
|
210
|
+
// top-1 collision: number of distinct top-1 IDs over the query count.
|
|
211
|
+
const uniqueTop1 = top1Ids.size;
|
|
212
|
+
const top1Diversity = Number((uniqueTop1 / QUERIES.length).toFixed(4));
|
|
213
|
+
|
|
214
|
+
// top-3 redundancy: average fraction of top-3 results that are duplicates
|
|
215
|
+
// of the same pattern within a single query (should be 0 — but if the same
|
|
216
|
+
// ID appears twice in top-3 we surface it).
|
|
217
|
+
let dupCount = 0, top3Slots = 0;
|
|
218
|
+
for (const r of results) {
|
|
219
|
+
const ids = r.topK.slice(0, 3).map((m) => m.id);
|
|
220
|
+
top3Slots += ids.length;
|
|
221
|
+
const seen = new Set();
|
|
222
|
+
for (const id of ids) {
|
|
223
|
+
if (seen.has(id)) dupCount++;
|
|
224
|
+
seen.add(id);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const top3DupRate = top3Slots > 0 ? Number((dupCount / top3Slots).toFixed(4)) : 0;
|
|
228
|
+
|
|
229
|
+
const summary = {
|
|
230
|
+
runAt: new Date().toISOString(),
|
|
231
|
+
benchmark: 'pretrained-retrieval',
|
|
232
|
+
mode, // ADR-078: which retrieval path was used
|
|
233
|
+
rerank: useRerank, // ADR-080: cross-encoder rerank on/off
|
|
234
|
+
storeSize: total,
|
|
235
|
+
queries: QUERIES.length,
|
|
236
|
+
matchedQueries,
|
|
237
|
+
matchRate: Number((matchedQueries / QUERIES.length).toFixed(4)),
|
|
238
|
+
// Regex-proxy metrics (ADR-077-080 back-compat)
|
|
239
|
+
top1HitRate: Number((top1Hits / QUERIES.length).toFixed(4)),
|
|
240
|
+
top3HitRate: Number((top3Hits / QUERIES.length).toFixed(4)),
|
|
241
|
+
mrr3,
|
|
242
|
+
// ADR-081 labelled metrics — tighter ground truth
|
|
243
|
+
label_top1HitRate: Number((label_top1Hits / QUERIES.length).toFixed(4)),
|
|
244
|
+
label_top3HitRate: Number((label_top3HitsBinary / QUERIES.length).toFixed(4)),
|
|
245
|
+
label_mrr3,
|
|
246
|
+
label_precision3,
|
|
247
|
+
label_ndcg3: label_ndcg3_mean,
|
|
248
|
+
label_ndcg5: label_ndcg5_mean,
|
|
249
|
+
top1Diversity, // 1.0 = every query gets a distinct top-1
|
|
250
|
+
top3DupRate, // 0.0 = no duplicate IDs inside any top-3
|
|
251
|
+
avgQueryLatencyMs: Number((queryMs / QUERIES.length).toFixed(2)),
|
|
252
|
+
totalQueryMs: Number(queryMs.toFixed(2)),
|
|
253
|
+
results,
|
|
254
|
+
passed: matchedQueries === QUERIES.length,
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
if (process.env.BENCH_JSON) {
|
|
258
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
259
|
+
} else {
|
|
260
|
+
console.log(`# Pretrained-retrieval benchmark — proof of learning`);
|
|
261
|
+
console.log(`Mode: ${mode}${mode === 'hybrid' ? ' (cosine + BM25 + MMR, ADR-078)' : ' (cosine-only, pre-3.10.18)'}${useRerank ? ' + cross-encoder rerank (ADR-080)' : ''}`);
|
|
262
|
+
console.log(`Store size: ${total} patterns`);
|
|
263
|
+
console.log(`Queries: ${QUERIES.length}`);
|
|
264
|
+
console.log(`Match rate: ${(summary.matchRate * 100).toFixed(0)}% (${matchedQueries}/${QUERIES.length})`);
|
|
265
|
+
console.log(`Top-1 hit rate (regex proxy): ${(summary.top1HitRate * 100).toFixed(0)}% (${top1Hits}/${QUERIES.length})`);
|
|
266
|
+
console.log(`Top-3 hit rate (regex proxy): ${(summary.top3HitRate * 100).toFixed(0)}% (${top3Hits}/${QUERIES.length})`);
|
|
267
|
+
console.log(`MRR@3 (regex proxy): ${summary.mrr3}`);
|
|
268
|
+
console.log('');
|
|
269
|
+
console.log(`Top-1 hit rate (ADR-081 labelled): ${(summary.label_top1HitRate * 100).toFixed(0)}% (${label_top1Hits}/${QUERIES.length})`);
|
|
270
|
+
console.log(`Top-3 hit rate (ADR-081 labelled): ${(summary.label_top3HitRate * 100).toFixed(0)}% (${label_top3HitsBinary}/${QUERIES.length})`);
|
|
271
|
+
console.log(`MRR@3 (labelled): ${summary.label_mrr3}`);
|
|
272
|
+
console.log(`Precision@3 (labelled, mean): ${summary.label_precision3}`);
|
|
273
|
+
console.log(`nDCG@3 (labelled, mean): ${summary.label_ndcg3}`);
|
|
274
|
+
console.log(`nDCG@5 (labelled, mean): ${summary.label_ndcg5}`);
|
|
275
|
+
console.log(`Top-1 diversity: ${(summary.top1Diversity * 100).toFixed(0)}% (${uniqueTop1} distinct top-1 IDs across ${QUERIES.length} queries)`);
|
|
276
|
+
console.log(`Top-3 dup rate: ${(summary.top3DupRate * 100).toFixed(0)}%`);
|
|
277
|
+
console.log(`Avg query latency: ${summary.avgQueryLatencyMs} ms`);
|
|
278
|
+
console.log('');
|
|
279
|
+
for (const r of results) {
|
|
280
|
+
console.log(`Q: "${r.query}"`);
|
|
281
|
+
if (r.topK.length === 0) {
|
|
282
|
+
console.log(` → no matches`);
|
|
283
|
+
} else {
|
|
284
|
+
for (const m of r.topK.slice(0, 3)) {
|
|
285
|
+
console.log(` → ${m.score?.toFixed?.(3) ?? '—'} ${m.name}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
console.log('');
|
|
290
|
+
console.log(`Overall: ${summary.passed ? '✅ PASSED' : '⚠️ partial'}`);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (!process.env.BENCH_NO_WRITE) {
|
|
294
|
+
mkdirSync(RUNS_DIR, { recursive: true });
|
|
295
|
+
const stamp = summary.runAt.replace(/[:.]/g, '-');
|
|
296
|
+
writeFileSync(join(RUNS_DIR, `pretrained-retrieval-${stamp}.json`), JSON.stringify(summary, null, 2));
|
|
297
|
+
writeFileSync(join(RUNS_DIR, 'pretrained-retrieval-latest.json'), JSON.stringify(summary, null, 2));
|
|
298
|
+
if (!process.env.BENCH_JSON) console.log(`\nWrote ${join(RUNS_DIR, `pretrained-retrieval-${stamp}.json`)}`);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// ONNX runtime keeps a worker thread alive — force exit.
|
|
302
|
+
process.exit(summary.passed ? 0 : 1);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
main().catch((err) => { console.error(err); process.exit(1); });
|