@claude-flow/cli 3.32.9 → 3.32.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/analysis/analyze-code-quality.md +178 -178
- package/.claude/agents/analysis/code-analyzer.md +209 -209
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +178 -178
- package/.claude/agents/architecture/arch-system-design.md +156 -156
- package/.claude/agents/architecture/system-design/arch-system-design.md +154 -154
- package/.claude/agents/browser/browser-agent.yaml +182 -182
- package/.claude/agents/consensus/byzantine-coordinator.md +62 -62
- package/.claude/agents/consensus/crdt-synchronizer.md +996 -996
- package/.claude/agents/consensus/gossip-coordinator.md +62 -62
- package/.claude/agents/consensus/performance-benchmarker.md +850 -850
- package/.claude/agents/consensus/quorum-manager.md +822 -822
- package/.claude/agents/consensus/raft-manager.md +62 -62
- package/.claude/agents/consensus/security-manager.md +621 -621
- package/.claude/agents/core/planner.md +374 -374
- package/.claude/agents/custom/test-long-runner.md +44 -44
- package/.claude/agents/data/data-ml-model.md +444 -444
- package/.claude/agents/data/ml/data-ml-model.md +192 -192
- package/.claude/agents/development/backend/dev-backend-api.md +141 -141
- package/.claude/agents/development/dev-backend-api.md +344 -344
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +163 -163
- package/.claude/agents/devops/ops-cicd-github.md +164 -164
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +173 -173
- package/.claude/agents/documentation/docs-api-openapi.md +354 -354
- package/.claude/agents/flow-nexus/app-store.md +87 -87
- package/.claude/agents/flow-nexus/authentication.md +68 -68
- package/.claude/agents/flow-nexus/challenges.md +80 -80
- package/.claude/agents/flow-nexus/neural-network.md +87 -87
- package/.claude/agents/flow-nexus/payments.md +82 -82
- package/.claude/agents/flow-nexus/sandbox.md +75 -75
- package/.claude/agents/flow-nexus/swarm.md +75 -75
- package/.claude/agents/flow-nexus/user-tools.md +95 -95
- package/.claude/agents/flow-nexus/workflow.md +83 -83
- package/.claude/agents/github/code-review-swarm.md +377 -377
- package/.claude/agents/github/github-modes.md +172 -172
- package/.claude/agents/github/issue-tracker.md +575 -575
- package/.claude/agents/github/multi-repo-swarm.md +552 -552
- package/.claude/agents/github/pr-manager.md +437 -437
- package/.claude/agents/github/project-board-sync.md +508 -508
- package/.claude/agents/github/release-manager.md +604 -604
- package/.claude/agents/github/release-swarm.md +582 -582
- package/.claude/agents/github/repo-architect.md +397 -397
- package/.claude/agents/github/swarm-issue.md +572 -572
- package/.claude/agents/github/swarm-pr.md +427 -427
- package/.claude/agents/github/sync-coordinator.md +451 -451
- package/.claude/agents/github/workflow-automation.md +902 -902
- package/.claude/agents/goal/agent.md +815 -815
- package/.claude/agents/optimization/benchmark-suite.md +664 -664
- package/.claude/agents/optimization/load-balancer.md +430 -430
- package/.claude/agents/optimization/performance-monitor.md +671 -671
- package/.claude/agents/optimization/resource-allocator.md +673 -673
- package/.claude/agents/optimization/topology-optimizer.md +807 -807
- package/.claude/agents/payments/agentic-payments.md +126 -126
- package/.claude/agents/sona/sona-learning-optimizer.md +74 -74
- package/.claude/agents/sparc/architecture.md +698 -698
- package/.claude/agents/sparc/pseudocode.md +519 -519
- package/.claude/agents/sparc/refinement.md +801 -801
- package/.claude/agents/sparc/specification.md +477 -477
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +224 -224
- package/.claude/agents/specialized/spec-mobile-react-native.md +226 -226
- package/.claude/agents/sublinear/consensus-coordinator.md +337 -337
- package/.claude/agents/sublinear/matrix-optimizer.md +184 -184
- package/.claude/agents/sublinear/pagerank-analyzer.md +298 -298
- package/.claude/agents/sublinear/performance-optimizer.md +367 -367
- package/.claude/agents/sublinear/trading-predictor.md +245 -245
- package/.claude/agents/swarm/adaptive-coordinator.md +1126 -1126
- package/.claude/agents/swarm/hierarchical-coordinator.md +709 -709
- package/.claude/agents/swarm/mesh-coordinator.md +962 -962
- package/.claude/agents/templates/automation-smart-agent.md +204 -204
- package/.claude/agents/templates/base-template-generator.md +289 -289
- package/.claude/agents/templates/coordinator-swarm-init.md +89 -89
- package/.claude/agents/templates/github-pr-manager.md +176 -176
- package/.claude/agents/templates/implementer-sparc-coder.md +258 -258
- package/.claude/agents/templates/memory-coordinator.md +186 -186
- package/.claude/agents/templates/orchestrator-task.md +138 -138
- package/.claude/agents/templates/performance-analyzer.md +198 -198
- package/.claude/agents/templates/sparc-coordinator.md +513 -513
- package/.claude/agents/testing/production-validator.md +394 -394
- package/.claude/agents/testing/tdd-london-swarm.md +243 -243
- package/.claude/agents/v3/aidefence-guardian.md +282 -282
- package/.claude/agents/v3/claims-authorizer.md +208 -208
- package/.claude/agents/v3/collective-intelligence-coordinator.md +993 -993
- package/.claude/agents/v3/ddd-domain-expert.md +220 -220
- package/.claude/agents/v3/injection-analyst.md +236 -236
- package/.claude/agents/v3/performance-engineer.md +1233 -1233
- package/.claude/agents/v3/pii-detector.md +151 -151
- package/.claude/agents/v3/reasoningbank-learner.md +213 -213
- package/.claude/agents/v3/security-architect-aidefence.md +410 -410
- package/.claude/agents/v3/security-architect.md +867 -867
- package/.claude/agents/v3/swarm-memory-manager.md +157 -157
- package/.claude/agents/v3/v3-integration-architect.md +205 -205
- package/.claude/commands/agents/README.md +50 -50
- package/.claude/commands/agents/agent-capabilities.md +140 -140
- package/.claude/commands/agents/agent-coordination.md +28 -28
- package/.claude/commands/agents/agent-spawning.md +28 -28
- package/.claude/commands/agents/agent-types.md +216 -216
- package/.claude/commands/agents/health.md +139 -139
- package/.claude/commands/agents/list.md +100 -100
- package/.claude/commands/agents/logs.md +130 -130
- package/.claude/commands/agents/metrics.md +122 -122
- package/.claude/commands/agents/pool.md +127 -127
- package/.claude/commands/agents/spawn.md +140 -140
- package/.claude/commands/agents/status.md +115 -115
- package/.claude/commands/agents/stop.md +102 -102
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +53 -53
- package/.claude/commands/analysis/README.md +9 -9
- package/.claude/commands/analysis/bottleneck-detect.md +162 -162
- package/.claude/commands/analysis/performance-bottlenecks.md +58 -58
- package/.claude/commands/analysis/performance-report.md +25 -25
- package/.claude/commands/analysis/token-efficiency.md +44 -44
- package/.claude/commands/analysis/token-usage.md +25 -25
- package/.claude/commands/automation/README.md +9 -9
- package/.claude/commands/automation/auto-agent.md +122 -122
- package/.claude/commands/automation/self-healing.md +105 -105
- package/.claude/commands/automation/session-memory.md +89 -89
- package/.claude/commands/automation/smart-agents.md +72 -72
- package/.claude/commands/automation/smart-spawn.md +25 -25
- package/.claude/commands/automation/workflow-select.md +25 -25
- package/.claude/commands/claude-flow-help.md +103 -103
- package/.claude/commands/claude-flow-memory.md +107 -107
- package/.claude/commands/claude-flow-swarm.md +205 -205
- package/.claude/commands/coordination/README.md +9 -9
- package/.claude/commands/coordination/agent-spawn.md +25 -25
- package/.claude/commands/coordination/init.md +44 -44
- package/.claude/commands/coordination/orchestrate.md +43 -43
- package/.claude/commands/coordination/spawn.md +45 -45
- package/.claude/commands/coordination/swarm-init.md +85 -85
- package/.claude/commands/coordination/task-orchestrate.md +25 -25
- package/.claude/commands/github/README.md +11 -11
- package/.claude/commands/github/code-review-swarm.md +513 -513
- package/.claude/commands/github/code-review.md +25 -25
- package/.claude/commands/github/github-modes.md +146 -146
- package/.claude/commands/github/github-swarm.md +121 -121
- package/.claude/commands/github/issue-tracker.md +291 -291
- package/.claude/commands/github/issue-triage.md +25 -25
- package/.claude/commands/github/multi-repo-swarm.md +518 -518
- package/.claude/commands/github/pr-enhance.md +26 -26
- package/.claude/commands/github/pr-manager.md +169 -169
- package/.claude/commands/github/project-board-sync.md +470 -470
- package/.claude/commands/github/release-manager.md +339 -339
- package/.claude/commands/github/release-swarm.md +543 -543
- package/.claude/commands/github/repo-analyze.md +25 -25
- package/.claude/commands/github/repo-architect.md +366 -366
- package/.claude/commands/github/swarm-issue.md +484 -484
- package/.claude/commands/github/swarm-pr.md +287 -287
- package/.claude/commands/github/sync-coordinator.md +302 -302
- package/.claude/commands/github/workflow-automation.md +441 -441
- package/.claude/commands/hive-mind/README.md +17 -17
- package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-init.md +18 -18
- package/.claude/commands/hive-mind/hive-mind-memory.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-resume.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -21
- package/.claude/commands/hive-mind/hive-mind-status.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-stop.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -8
- package/.claude/commands/hive-mind/hive-mind.md +27 -27
- package/.claude/commands/hooks/README.md +11 -11
- package/.claude/commands/hooks/overview.md +57 -57
- package/.claude/commands/hooks/post-edit.md +117 -117
- package/.claude/commands/hooks/post-task.md +112 -112
- package/.claude/commands/hooks/pre-edit.md +113 -113
- package/.claude/commands/hooks/pre-task.md +111 -111
- package/.claude/commands/hooks/session-end.md +118 -118
- package/.claude/commands/hooks/setup.md +102 -102
- package/.claude/commands/memory/README.md +9 -9
- package/.claude/commands/memory/memory-persist.md +25 -25
- package/.claude/commands/memory/memory-search.md +25 -25
- package/.claude/commands/memory/memory-usage.md +25 -25
- package/.claude/commands/memory/neural.md +47 -47
- package/.claude/commands/monitoring/README.md +9 -9
- package/.claude/commands/monitoring/agent-metrics.md +25 -25
- package/.claude/commands/monitoring/agents.md +44 -44
- package/.claude/commands/monitoring/real-time-view.md +25 -25
- package/.claude/commands/monitoring/status.md +46 -46
- package/.claude/commands/monitoring/swarm-monitor.md +25 -25
- package/.claude/commands/optimization/README.md +9 -9
- package/.claude/commands/optimization/auto-topology.md +61 -61
- package/.claude/commands/optimization/cache-manage.md +25 -25
- package/.claude/commands/optimization/parallel-execute.md +25 -25
- package/.claude/commands/optimization/parallel-execution.md +49 -49
- package/.claude/commands/optimization/topology-optimize.md +25 -25
- package/.claude/commands/pair/README.md +260 -260
- package/.claude/commands/pair/commands.md +545 -545
- package/.claude/commands/pair/config.md +509 -509
- package/.claude/commands/pair/examples.md +511 -511
- package/.claude/commands/pair/modes.md +347 -347
- package/.claude/commands/pair/session.md +406 -406
- package/.claude/commands/pair/start.md +208 -208
- package/.claude/commands/sparc/analyzer.md +51 -51
- package/.claude/commands/sparc/architect.md +53 -53
- package/.claude/commands/sparc/ask.md +97 -97
- package/.claude/commands/sparc/batch-executor.md +54 -54
- package/.claude/commands/sparc/code.md +89 -89
- package/.claude/commands/sparc/coder.md +54 -54
- package/.claude/commands/sparc/debug.md +83 -83
- package/.claude/commands/sparc/debugger.md +54 -54
- package/.claude/commands/sparc/designer.md +53 -53
- package/.claude/commands/sparc/devops.md +109 -109
- package/.claude/commands/sparc/docs-writer.md +80 -80
- package/.claude/commands/sparc/documenter.md +54 -54
- package/.claude/commands/sparc/innovator.md +54 -54
- package/.claude/commands/sparc/integration.md +83 -83
- package/.claude/commands/sparc/mcp.md +117 -117
- package/.claude/commands/sparc/memory-manager.md +54 -54
- package/.claude/commands/sparc/optimizer.md +54 -54
- package/.claude/commands/sparc/orchestrator.md +131 -131
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -83
- package/.claude/commands/sparc/refinement-optimization-mode.md +83 -83
- package/.claude/commands/sparc/researcher.md +54 -54
- package/.claude/commands/sparc/reviewer.md +54 -54
- package/.claude/commands/sparc/security-review.md +80 -80
- package/.claude/commands/sparc/sparc-modes.md +174 -174
- package/.claude/commands/sparc/sparc.md +111 -111
- package/.claude/commands/sparc/spec-pseudocode.md +80 -80
- package/.claude/commands/sparc/supabase-admin.md +348 -348
- package/.claude/commands/sparc/swarm-coordinator.md +54 -54
- package/.claude/commands/sparc/tdd.md +54 -54
- package/.claude/commands/sparc/tester.md +54 -54
- package/.claude/commands/sparc/tutorial.md +79 -79
- package/.claude/commands/sparc/workflow-manager.md +54 -54
- package/.claude/commands/sparc.md +166 -166
- package/.claude/commands/stream-chain/pipeline.md +120 -120
- package/.claude/commands/stream-chain/run.md +69 -69
- package/.claude/commands/swarm/README.md +15 -15
- package/.claude/commands/swarm/analysis.md +95 -95
- package/.claude/commands/swarm/development.md +96 -96
- package/.claude/commands/swarm/examples.md +168 -168
- package/.claude/commands/swarm/maintenance.md +102 -102
- package/.claude/commands/swarm/optimization.md +117 -117
- package/.claude/commands/swarm/research.md +136 -136
- package/.claude/commands/swarm/swarm-analysis.md +8 -8
- package/.claude/commands/swarm/swarm-background.md +8 -8
- package/.claude/commands/swarm/swarm-init.md +19 -19
- package/.claude/commands/swarm/swarm-modes.md +8 -8
- package/.claude/commands/swarm/swarm-monitor.md +8 -8
- package/.claude/commands/swarm/swarm-spawn.md +19 -19
- package/.claude/commands/swarm/swarm-status.md +8 -8
- package/.claude/commands/swarm/swarm-strategies.md +8 -8
- package/.claude/commands/swarm/swarm.md +87 -87
- package/.claude/commands/swarm/testing.md +131 -131
- package/.claude/commands/training/README.md +9 -9
- package/.claude/commands/training/model-update.md +25 -25
- package/.claude/commands/training/neural-patterns.md +107 -107
- package/.claude/commands/training/neural-train.md +75 -75
- package/.claude/commands/training/pattern-learn.md +25 -25
- package/.claude/commands/training/specialization.md +62 -62
- package/.claude/commands/truth/start.md +142 -142
- package/.claude/commands/verify/check.md +49 -49
- package/.claude/commands/verify/start.md +127 -127
- package/.claude/commands/workflows/README.md +9 -9
- package/.claude/commands/workflows/development.md +77 -77
- package/.claude/commands/workflows/research.md +62 -62
- package/.claude/commands/workflows/workflow-create.md +25 -25
- package/.claude/commands/workflows/workflow-execute.md +25 -25
- package/.claude/commands/workflows/workflow-export.md +25 -25
- package/.claude/eval/human-relevance-frozen-v1.json +17 -17
- package/.claude/evolve-proof/generation-0.json +211 -211
- package/.claude/evolve-proof/real-generation-0.json +406 -406
- package/.claude/evolve-proof/real-generation-1.json +406 -406
- package/.claude/helpers/README.md +96 -96
- package/.claude/helpers/adr-compliance.sh +186 -186
- package/.claude/helpers/auto-commit.sh +178 -178
- package/.claude/helpers/auto-memory-hook.mjs +430 -430
- package/.claude/helpers/checkpoint-manager.sh +251 -251
- package/.claude/helpers/daemon-manager.sh +252 -252
- package/.claude/helpers/ddd-tracker.sh +144 -144
- package/.claude/helpers/github-safe.js +156 -156
- package/.claude/helpers/github-setup.sh +45 -45
- package/.claude/helpers/guidance-hook.sh +13 -13
- package/.claude/helpers/guidance-hooks.sh +102 -102
- package/.claude/helpers/health-monitor.sh +108 -108
- package/.claude/helpers/helpers.manifest.json +6 -6
- package/.claude/helpers/hook-handler.cjs +565 -565
- package/.claude/helpers/intelligence.cjs +1058 -1058
- package/.claude/helpers/learning-hooks.sh +329 -329
- package/.claude/helpers/learning-optimizer.sh +127 -127
- package/.claude/helpers/learning-service.mjs +1144 -1144
- package/.claude/helpers/memory.js +83 -83
- package/.claude/helpers/metrics-db.mjs +503 -503
- package/.claude/helpers/pattern-consolidator.sh +86 -86
- package/.claude/helpers/perf-worker.sh +160 -160
- package/.claude/helpers/post-commit +16 -16
- package/.claude/helpers/pre-commit +26 -26
- package/.claude/helpers/quick-start.sh +19 -19
- package/.claude/helpers/router.js +105 -105
- package/.claude/helpers/security-scanner.sh +127 -127
- package/.claude/helpers/session.js +157 -157
- package/.claude/helpers/setup-mcp.sh +18 -18
- package/.claude/helpers/standard-checkpoint-hooks.sh +189 -189
- package/.claude/helpers/statusline-hook.sh +21 -21
- package/.claude/helpers/statusline.cjs +1060 -1060
- package/.claude/helpers/statusline.js +340 -340
- package/.claude/helpers/swarm-comms.sh +353 -353
- package/.claude/helpers/swarm-hooks.sh +761 -761
- package/.claude/helpers/swarm-monitor.sh +210 -210
- package/.claude/helpers/sync-v3-metrics.sh +245 -245
- package/.claude/helpers/update-v3-progress.sh +165 -165
- package/.claude/helpers/v3-quick-status.sh +57 -57
- package/.claude/helpers/v3.sh +110 -110
- package/.claude/helpers/validate-v3-config.sh +215 -215
- package/.claude/helpers/worker-manager.sh +170 -170
- package/.claude/proven-config.manifest.json +37 -37
- package/.claude/proven-config.signed.json +41 -41
- package/.claude/settings.json +182 -182
- package/.claude/skills/agentdb-advanced/SKILL.md +550 -550
- package/.claude/skills/agentdb-learning/SKILL.md +545 -545
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -339
- package/.claude/skills/agentdb-optimization/SKILL.md +509 -509
- package/.claude/skills/agentdb-vector-search/SKILL.md +339 -339
- package/.claude/skills/browser/SKILL.md +204 -204
- package/.claude/skills/dual-mode/README.md +71 -71
- package/.claude/skills/dual-mode/dual-collect.md +103 -103
- package/.claude/skills/dual-mode/dual-coordinate.md +85 -85
- package/.claude/skills/dual-mode/dual-spawn.md +81 -81
- package/.claude/skills/flow-nexus-neural/SKILL.md +727 -727
- package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -1154
- package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -604
- package/.claude/skills/github-code-review/SKILL.md +1125 -1125
- package/.claude/skills/github-multi-repo/SKILL.md +862 -862
- package/.claude/skills/github-project-management/SKILL.md +1262 -1262
- package/.claude/skills/github-release-management/SKILL.md +1064 -1064
- package/.claude/skills/github-workflow-automation/SKILL.md +1047 -1047
- package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
- package/.claude/skills/pair-programming/SKILL.md +1202 -1202
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -446
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -201
- package/.claude/skills/skill-builder/SKILL.md +910 -910
- package/.claude/skills/sparc-methodology/SKILL.md +1106 -1106
- package/.claude/skills/stream-chain/SKILL.md +560 -560
- package/.claude/skills/swarm-advanced/SKILL.md +970 -970
- package/.claude/skills/swarm-orchestration/SKILL.md +179 -179
- package/.claude/skills/v3-cli-modernization/SKILL.md +871 -871
- package/.claude/skills/v3-core-implementation/SKILL.md +796 -796
- package/.claude/skills/v3-ddd-architecture/SKILL.md +441 -441
- package/.claude/skills/v3-integration-deep/SKILL.md +240 -240
- package/.claude/skills/v3-mcp-optimization/SKILL.md +776 -776
- package/.claude/skills/v3-memory-unification/SKILL.md +173 -173
- package/.claude/skills/v3-performance-optimization/SKILL.md +389 -389
- package/.claude/skills/v3-security-overhaul/SKILL.md +81 -81
- package/.claude/skills/v3-swarm-coordination/SKILL.md +339 -339
- package/.claude/skills/verification-quality/SKILL.md +691 -691
- package/README.md +419 -419
- package/bin/cli.js +314 -314
- package/bin/mcp-server.js +224 -224
- package/bin/preinstall.cjs +2 -2
- package/catalog-manifest.json +2 -2
- package/dist/src/autopilot-state.js +24 -7
- package/dist/src/benchmarks/gaia-critic.js +24 -24
- package/dist/src/business-pods/bbs-budget-tracker.js +53 -53
- package/dist/src/commands/completions.js +409 -409
- package/dist/src/commands/daemon.js +44 -44
- package/dist/src/commands/embeddings.js +26 -26
- package/dist/src/commands/hive-mind.js +97 -97
- package/dist/src/commands/hooks.js +31 -10
- package/dist/src/commands/init.js +202 -34
- package/dist/src/commands/memory.js +12 -1
- package/dist/src/commands/ruvector/backup.js +23 -23
- package/dist/src/commands/ruvector/benchmark.js +31 -31
- package/dist/src/commands/ruvector/import.js +14 -14
- package/dist/src/commands/ruvector/init.js +115 -115
- package/dist/src/commands/ruvector/migrate.js +99 -99
- package/dist/src/commands/ruvector/optimize.js +51 -51
- package/dist/src/commands/ruvector/setup.js +624 -624
- package/dist/src/commands/ruvector/status.js +38 -38
- package/dist/src/config/proven-config.js +2 -2
- package/dist/src/funnel/disclosure.js +13 -2
- package/dist/src/funnel/messages.d.ts +12 -10
- package/dist/src/funnel/messages.js +83 -11
- package/dist/src/init/claudemd-generator.js +231 -231
- package/dist/src/init/executor.js +453 -453
- package/dist/src/init/helper-signing.js +2 -2
- package/dist/src/init/helpers-generator.js +751 -751
- package/dist/src/init/statusline-generator.js +24 -24
- package/dist/src/mcp-tools/agentdb-tools.js +15 -15
- package/dist/src/mcp-tools/browser-intent-tools.js +19 -19
- package/dist/src/mcp-tools/browser-tools.js +8 -0
- package/dist/src/mcp-tools/hooks-tools.js +21 -0
- package/dist/src/mcp-tools/memory-tools.js +4 -3
- package/dist/src/memory/graph-edge-writer.js +22 -22
- package/dist/src/memory/memory-bridge.js +192 -123
- package/dist/src/memory/memory-initializer.js +407 -407
- package/dist/src/memory/rabitq-index.js +5 -5
- package/dist/src/parser.js +25 -9
- package/dist/src/proxy/verify.js +2 -2
- package/dist/src/runtime/headless.js +28 -28
- package/dist/src/services/distill-tuning.js +7 -7
- package/dist/src/services/headless-worker-executor.js +84 -84
- package/dist/src/services/memory-distillation.js +4 -4
- package/dist/src/services/worker-daemon.js +7 -4
- package/dist/src/transfer/deploy-seraphine.js +23 -23
- package/package.json +137 -137
- package/plugins/ruflo-metaharness/.claude-plugin/plugin.json +32 -32
- package/plugins/ruflo-metaharness/README.md +72 -72
- package/plugins/ruflo-metaharness/agents/metaharness-architect.md +58 -58
- package/plugins/ruflo-metaharness/commands/ruflo-metaharness.md +48 -48
- package/plugins/ruflo-metaharness/scripts/_darwin.mjs +210 -210
- package/plugins/ruflo-metaharness/scripts/_harness.mjs +330 -330
- package/plugins/ruflo-metaharness/scripts/_invoke.mjs +231 -231
- package/plugins/ruflo-metaharness/scripts/_redblue.mjs +143 -143
- package/plugins/ruflo-metaharness/scripts/_similarity.mjs +161 -161
- package/plugins/ruflo-metaharness/scripts/_spike-similarity.mjs +223 -223
- package/plugins/ruflo-metaharness/scripts/audit-list.mjs +158 -158
- package/plugins/ruflo-metaharness/scripts/audit-trend.mjs +272 -272
- package/plugins/ruflo-metaharness/scripts/bench-parse-mcp-scan.mjs +146 -146
- package/plugins/ruflo-metaharness/scripts/bench-recordpair-overhead.mjs +186 -186
- package/plugins/ruflo-metaharness/scripts/bench-similarity.mjs +177 -177
- package/plugins/ruflo-metaharness/scripts/bench.mjs +95 -95
- package/plugins/ruflo-metaharness/scripts/drift-from-history.mjs +363 -363
- package/plugins/ruflo-metaharness/scripts/evolve.mjs +404 -404
- package/plugins/ruflo-metaharness/scripts/genome.mjs +80 -80
- package/plugins/ruflo-metaharness/scripts/gepa.mjs +153 -153
- package/plugins/ruflo-metaharness/scripts/learn.mjs +127 -127
- package/plugins/ruflo-metaharness/scripts/mcp-scan.mjs +111 -111
- package/plugins/ruflo-metaharness/scripts/mint.mjs +126 -126
- package/plugins/ruflo-metaharness/scripts/oia-audit.mjs +228 -228
- package/plugins/ruflo-metaharness/scripts/redblue.mjs +286 -286
- package/plugins/ruflo-metaharness/scripts/router-parallel-analyze.mjs +250 -250
- package/plugins/ruflo-metaharness/scripts/score.mjs +92 -92
- package/plugins/ruflo-metaharness/scripts/security-bench.mjs +174 -174
- package/plugins/ruflo-metaharness/scripts/similarity.mjs +158 -158
- package/plugins/ruflo-metaharness/scripts/smoke.sh +2356 -2356
- package/plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs +165 -165
- package/plugins/ruflo-metaharness/scripts/test-mcp-tools.mjs +472 -472
- package/plugins/ruflo-metaharness/scripts/test-parallel-pipeline.mjs +204 -204
- package/plugins/ruflo-metaharness/scripts/test-pipeline-roundtrip.mjs +586 -586
- package/plugins/ruflo-metaharness/scripts/test-similarity.mjs +334 -334
- package/plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs +229 -229
- package/plugins/ruflo-metaharness/scripts/threat-model.mjs +59 -59
- package/plugins/ruflo-metaharness/skills/harness-bench/SKILL.md +64 -64
- package/plugins/ruflo-metaharness/skills/harness-drift-from-history/SKILL.md +65 -65
- package/plugins/ruflo-metaharness/skills/harness-evolve/SKILL.md +131 -131
- package/plugins/ruflo-metaharness/skills/harness-genome/SKILL.md +54 -54
- package/plugins/ruflo-metaharness/skills/harness-gepa/SKILL.md +65 -65
- package/plugins/ruflo-metaharness/skills/harness-learn/SKILL.md +65 -65
- package/plugins/ruflo-metaharness/skills/harness-mcp-scan/SKILL.md +49 -49
- package/plugins/ruflo-metaharness/skills/harness-mint/SKILL.md +72 -72
- package/plugins/ruflo-metaharness/skills/harness-oia-audit/SKILL.md +79 -79
- package/plugins/ruflo-metaharness/skills/harness-score/SKILL.md +66 -66
- package/plugins/ruflo-metaharness/skills/harness-security-bench/SKILL.md +101 -101
- package/plugins/ruflo-metaharness/skills/harness-similarity/SKILL.md +67 -67
- package/plugins/ruflo-metaharness/skills/harness-threat-model/SKILL.md +41 -41
- package/scripts/postinstall.cjs +153 -153
|
@@ -1,231 +1,231 @@
|
|
|
1
|
-
// _invoke.mjs — shared subprocess/plumbing layer for the metaharness plugin family.
|
|
2
|
-
//
|
|
3
|
-
// Extracted from the copy-pasted plumbing that had accreted across
|
|
4
|
-
// _harness.mjs / _darwin.mjs / _redblue.mjs / gepa.mjs (converged
|
|
5
|
-
// security/perf/arch review, 2026-07). The four invocation helpers are now
|
|
6
|
-
// thin adapters on top of this module; their exported function signatures
|
|
7
|
-
// are unchanged (~15 scripts import them).
|
|
8
|
-
//
|
|
9
|
-
// WHAT LIVES HERE (the genuinely-shared parts):
|
|
10
|
-
// - DEGRADED_RX one superset regex (incl. `npm ERR` — previously
|
|
11
|
-
// only _redblue had it) for "upstream unavailable"
|
|
12
|
-
// - classifyDegraded() timeout vs not-available distinction, per-package
|
|
13
|
-
// reason prefix
|
|
14
|
-
// - injectJson() append --json unless caller opted out / present
|
|
15
|
-
// - parseTrailingJson() LAST-{...}-block extraction (the _darwin variant;
|
|
16
|
-
// the old _harness FIRST-block variant was a live
|
|
17
|
-
// bug — a progress line containing `{...}` would
|
|
18
|
-
// shadow the final structured result)
|
|
19
|
-
// - ensureCachedInstall() one-time `npm install --prefix ~/.ruflo/<name>-cache-<pin>`
|
|
20
|
-
// of a PINNED range — generalizes _redblue.mjs /
|
|
21
|
-
// gepa.mjs; the versioned dir means pin bumps
|
|
22
|
-
// invalidate stale caches automatically
|
|
23
|
-
// - findLocalPackageDir() walk-up node_modules resolution so an already
|
|
24
|
-
// installed optionalDependency is used for free
|
|
25
|
-
// - importOptionalLibrary() bare-import → cached-install fallback for
|
|
26
|
-
// library entries (gepa) — never throws on absence
|
|
27
|
-
// - makeDegradedEmitter() the ADR-150 rule-#3 exit-0 degraded payload
|
|
28
|
-
//
|
|
29
|
-
// WHAT DOES NOT LIVE HERE (the per-consumer parts):
|
|
30
|
-
// - _redblue's node-direct isMain workaround rationale
|
|
31
|
-
// - _darwin's async streaming (`onProgress`) for long evolve runs
|
|
32
|
-
// - _harness's dual-binary (metaharness + harness) resolution
|
|
33
|
-
//
|
|
34
|
-
// TEST SEAMS (used by test-graceful-degradation.mjs so the ADR-150 drill
|
|
35
|
-
// stays meaningful on machines with a warm cache / local install):
|
|
36
|
-
// - RUFLO_METAHARNESS_CACHE_BASE overrides ~/.ruflo as the cache root
|
|
37
|
-
// - RUFLO_METAHARNESS_SKIP_LOCAL=1 disables local node_modules resolution
|
|
38
|
-
|
|
39
|
-
import { spawnSync } from 'node:child_process';
|
|
40
|
-
import { existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
41
|
-
import { homedir } from 'node:os';
|
|
42
|
-
import { dirname, join } from 'node:path';
|
|
43
|
-
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
44
|
-
|
|
45
|
-
const INSTALL_TIMEOUT_MS = 180_000; // npm install can be slow on cold cache
|
|
46
|
-
|
|
47
|
-
// Superset of the three per-file regexes. `npm ERR` (from _redblue) is
|
|
48
|
-
// included for everyone: an npm-level failure during a cached install or an
|
|
49
|
-
// npx shim means "upstream unavailable", never a ruflo bug.
|
|
50
|
-
export const DEGRADED_RX = /could not determine executable|404|not installed|MODULE_NOT_FOUND|ENOTFOUND|getaddrinfo|ECONNREFUSED|ETIMEDOUT|npm ERR/i;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Classify a finished subprocess as degraded or healthy.
|
|
54
|
-
* `exitCode === null` means the harness killed it (timeout) — that is a
|
|
55
|
-
* DIFFERENT operational signal from "package not installable", so the two
|
|
56
|
-
* reasons stay distinct: `<prefix>-timeout` vs `<prefix>-not-available`.
|
|
57
|
-
*/
|
|
58
|
-
export function classifyDegraded(stderr, exitCode, reasonPrefix) {
|
|
59
|
-
if (exitCode === null) return { degraded: true, reason: `${reasonPrefix}-timeout` };
|
|
60
|
-
if (DEGRADED_RX.test(stderr || '')) return { degraded: true, reason: `${reasonPrefix}-not-available` };
|
|
61
|
-
return { degraded: false };
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** Append --json unless the caller opted out or already passed it. */
|
|
65
|
-
export function injectJson(args, wantJson) {
|
|
66
|
-
if (!wantJson || args.includes('--json')) return [...args];
|
|
67
|
-
return [...args, '--json'];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Parse the trailing JSON object from mixed stdout. CLIs in this family emit
|
|
72
|
-
* human-readable progress first and a structured JSON object LAST — so grab
|
|
73
|
-
* the last parseable {...} block, falling back to a greedy whole-span match
|
|
74
|
-
* for nested objects the lazy regex fragments.
|
|
75
|
-
*/
|
|
76
|
-
export function parseTrailingJson(stdout) {
|
|
77
|
-
const s = stdout || '';
|
|
78
|
-
const matches = [...s.matchAll(/\{[\s\S]*?\}/g)];
|
|
79
|
-
for (let i = matches.length - 1; i >= 0; i--) {
|
|
80
|
-
try { return JSON.parse(matches[i][0]); } catch { /* try previous */ }
|
|
81
|
-
}
|
|
82
|
-
const greedy = /\{[\s\S]*\}/.exec(s);
|
|
83
|
-
if (greedy) { try { return JSON.parse(greedy[0]); } catch { return null; } }
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/** Cache root — ~/.ruflo unless the test seam overrides it. */
|
|
88
|
-
export function cacheBaseDir() {
|
|
89
|
-
return process.env.RUFLO_METAHARNESS_CACHE_BASE || join(homedir(), '.ruflo');
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/** Minimal `~X.Y.Z` satisfaction check (no semver dep): same major.minor, patch >= Z. */
|
|
93
|
-
export function satisfiesTildeRange(version, pinVersion) {
|
|
94
|
-
const pin = /^~(\d+)\.(\d+)\.(\d+)/.exec(String(pinVersion));
|
|
95
|
-
const ver = /^(\d+)\.(\d+)\.(\d+)/.exec(String(version));
|
|
96
|
-
if (!pin || !ver) return false;
|
|
97
|
-
return ver[1] === pin[1] && ver[2] === pin[2] && parseInt(ver[3], 10) >= parseInt(pin[3], 10);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Walk up node_modules from this plugin's directory AND from $CWD looking
|
|
102
|
-
* for an already-installed copy of `pkg` (e.g. the optionalDependency the
|
|
103
|
-
* user's ruflo install shipped with). Returns the package dir or null.
|
|
104
|
-
* When `pinVersion` is given, only a copy satisfying the pin is accepted —
|
|
105
|
-
* a stale major/minor in an ancestor node_modules is skipped, not used.
|
|
106
|
-
*/
|
|
107
|
-
export function findLocalPackageDir(pkg, pinVersion) {
|
|
108
|
-
if (process.env.RUFLO_METAHARNESS_SKIP_LOCAL === '1') return null;
|
|
109
|
-
const segments = pkg.split('/');
|
|
110
|
-
const starts = [dirname(fileURLToPath(import.meta.url)), process.cwd()];
|
|
111
|
-
const seen = new Set();
|
|
112
|
-
for (const start of starts) {
|
|
113
|
-
let dir = start;
|
|
114
|
-
for (;;) {
|
|
115
|
-
if (!seen.has(dir)) {
|
|
116
|
-
seen.add(dir);
|
|
117
|
-
const candidate = join(dir, 'node_modules', ...segments);
|
|
118
|
-
const pj = join(candidate, 'package.json');
|
|
119
|
-
if (existsSync(pj)) {
|
|
120
|
-
if (!pinVersion) return candidate;
|
|
121
|
-
try {
|
|
122
|
-
const version = JSON.parse(readFileSync(pj, 'utf-8')).version;
|
|
123
|
-
if (satisfiesTildeRange(version, pinVersion)) return candidate;
|
|
124
|
-
} catch { /* unreadable — keep walking */ }
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
const parent = dirname(dir);
|
|
128
|
-
if (parent === dir) break;
|
|
129
|
-
dir = parent;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* One-time versioned cache install of a PINNED range. Generalizes
|
|
137
|
-
* gepa.mjs:98-121 / _redblue.mjs:72-102. The cache dir is
|
|
138
|
-
* `<base>/<shortname>-cache-<pin-digits>` (e.g. redblue-cache-0.1.4,
|
|
139
|
-
* darwin-cache-0.8.0, metaharness-cache-0.3.0) so existing caches created
|
|
140
|
-
* by the pre-consolidation helpers remain valid, and bumping the pin
|
|
141
|
-
* invalidates stale installs automatically.
|
|
142
|
-
*
|
|
143
|
-
* @param {object} spec
|
|
144
|
-
* @param {string} spec.pkg npm package name (may be scoped)
|
|
145
|
-
* @param {string} spec.pinVersion tilde range, e.g. '~0.3.0'
|
|
146
|
-
* @param {string} [spec.cliRelPath] path inside the package that must exist
|
|
147
|
-
* post-install (also returned as cliPath)
|
|
148
|
-
* @param {number} [spec.timeoutMs] install timeout (default 180s)
|
|
149
|
-
* @returns {{ok:true, cacheDir:string, pkgDir:string, cliPath:string|null} |
|
|
150
|
-
* {ok:false, reason:string, stderr?:string, stdout?:string, error?:string}}
|
|
151
|
-
*/
|
|
152
|
-
export function ensureCachedInstall({ pkg, pinVersion, cliRelPath, timeoutMs = INSTALL_TIMEOUT_MS }) {
|
|
153
|
-
const short = pkg.split('/').pop();
|
|
154
|
-
const cacheDir = join(cacheBaseDir(), `${short}-cache-${pinVersion.replace(/[~^]/g, '')}`);
|
|
155
|
-
const pkgDir = join(cacheDir, 'node_modules', ...pkg.split('/'));
|
|
156
|
-
const cliPath = cliRelPath ? join(pkgDir, cliRelPath) : null;
|
|
157
|
-
const probe = cliPath ?? join(pkgDir, 'package.json');
|
|
158
|
-
if (existsSync(probe)) return { ok: true, cacheDir, pkgDir, cliPath };
|
|
159
|
-
try {
|
|
160
|
-
mkdirSync(cacheDir, { recursive: true });
|
|
161
|
-
} catch (e) {
|
|
162
|
-
return { ok: false, reason: 'cache-dir-create-failed', error: String(e) };
|
|
163
|
-
}
|
|
164
|
-
// `npm install --prefix` puts the package in a known location; this both
|
|
165
|
-
// avoids npx's symlinked bin shim (the _redblue isMain upstream bug) and
|
|
166
|
-
// removes the per-call registry check that `npx -y pkg@latest` forced.
|
|
167
|
-
// shell:false; argv only.
|
|
168
|
-
const r = spawnSync('npm', [
|
|
169
|
-
'install',
|
|
170
|
-
'--no-audit', '--no-fund', '--no-package-lock',
|
|
171
|
-
'--prefix', cacheDir,
|
|
172
|
-
`${pkg}@${pinVersion}`,
|
|
173
|
-
], {
|
|
174
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
175
|
-
encoding: 'utf-8',
|
|
176
|
-
timeout: timeoutMs,
|
|
177
|
-
shell: process.platform === 'win32',
|
|
178
|
-
});
|
|
179
|
-
if (r.status !== 0 || !existsSync(probe)) {
|
|
180
|
-
return {
|
|
181
|
-
ok: false,
|
|
182
|
-
reason: 'install-failed',
|
|
183
|
-
stderr: (r.stderr || '').slice(0, 600),
|
|
184
|
-
stdout: (r.stdout || '').slice(0, 600),
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
return { ok: true, cacheDir, pkgDir, cliPath };
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Import an optional LIBRARY entry (as opposed to spawning a CLI):
|
|
192
|
-
* 1. bare `import(specifier)` — free when the optional dep is installed in
|
|
193
|
-
* an ancestor node_modules;
|
|
194
|
-
* 2. versioned cache install + file-URL import of `entryRelPath`.
|
|
195
|
-
* Returns the module namespace or null. Never throws on absence / stale
|
|
196
|
-
* installs (ERR_PACKAGE_PATH_NOT_EXPORTED covers pre-subpath versions).
|
|
197
|
-
*/
|
|
198
|
-
export async function importOptionalLibrary({ specifier, pkg, pinVersion, entryRelPath }) {
|
|
199
|
-
try {
|
|
200
|
-
return await import(specifier);
|
|
201
|
-
} catch (e) {
|
|
202
|
-
const msg = String(e?.message ?? e);
|
|
203
|
-
const recoverable = /Cannot find (module|package)|ERR_MODULE_NOT_FOUND|MODULE_NOT_FOUND|ERR_PACKAGE_PATH_NOT_EXPORTED|is not defined by "exports"/i;
|
|
204
|
-
if (!recoverable.test(msg)) throw e;
|
|
205
|
-
}
|
|
206
|
-
const r = ensureCachedInstall({ pkg, pinVersion, cliRelPath: entryRelPath });
|
|
207
|
-
if (!r.ok || !r.cliPath) return null;
|
|
208
|
-
try {
|
|
209
|
-
return await import(pathToFileURL(r.cliPath).href);
|
|
210
|
-
} catch {
|
|
211
|
-
return null;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Build the per-package `emit*DegradedJsonAndExit(reason)` helper. Emits the
|
|
217
|
-
* structured degraded payload and exits 0 — ADR-150 architectural constraint
|
|
218
|
-
* rule #3: ruflo continues to function when MetaHarness is absent.
|
|
219
|
-
*/
|
|
220
|
-
export function makeDegradedEmitter(pkg, pinVersion) {
|
|
221
|
-
return function emitDegradedAndExit(reason) {
|
|
222
|
-
const payload = {
|
|
223
|
-
degraded: true,
|
|
224
|
-
reason,
|
|
225
|
-
hint: `Install with \`npm i -D ${pkg}@${pinVersion}\` (pinned range — this plugin never fetches @latest) or verify network access for the one-time cache install.`,
|
|
226
|
-
generatedAt: new Date().toISOString(),
|
|
227
|
-
};
|
|
228
|
-
console.log(JSON.stringify(payload, null, 2));
|
|
229
|
-
process.exit(0);
|
|
230
|
-
};
|
|
231
|
-
}
|
|
1
|
+
// _invoke.mjs — shared subprocess/plumbing layer for the metaharness plugin family.
|
|
2
|
+
//
|
|
3
|
+
// Extracted from the copy-pasted plumbing that had accreted across
|
|
4
|
+
// _harness.mjs / _darwin.mjs / _redblue.mjs / gepa.mjs (converged
|
|
5
|
+
// security/perf/arch review, 2026-07). The four invocation helpers are now
|
|
6
|
+
// thin adapters on top of this module; their exported function signatures
|
|
7
|
+
// are unchanged (~15 scripts import them).
|
|
8
|
+
//
|
|
9
|
+
// WHAT LIVES HERE (the genuinely-shared parts):
|
|
10
|
+
// - DEGRADED_RX one superset regex (incl. `npm ERR` — previously
|
|
11
|
+
// only _redblue had it) for "upstream unavailable"
|
|
12
|
+
// - classifyDegraded() timeout vs not-available distinction, per-package
|
|
13
|
+
// reason prefix
|
|
14
|
+
// - injectJson() append --json unless caller opted out / present
|
|
15
|
+
// - parseTrailingJson() LAST-{...}-block extraction (the _darwin variant;
|
|
16
|
+
// the old _harness FIRST-block variant was a live
|
|
17
|
+
// bug — a progress line containing `{...}` would
|
|
18
|
+
// shadow the final structured result)
|
|
19
|
+
// - ensureCachedInstall() one-time `npm install --prefix ~/.ruflo/<name>-cache-<pin>`
|
|
20
|
+
// of a PINNED range — generalizes _redblue.mjs /
|
|
21
|
+
// gepa.mjs; the versioned dir means pin bumps
|
|
22
|
+
// invalidate stale caches automatically
|
|
23
|
+
// - findLocalPackageDir() walk-up node_modules resolution so an already
|
|
24
|
+
// installed optionalDependency is used for free
|
|
25
|
+
// - importOptionalLibrary() bare-import → cached-install fallback for
|
|
26
|
+
// library entries (gepa) — never throws on absence
|
|
27
|
+
// - makeDegradedEmitter() the ADR-150 rule-#3 exit-0 degraded payload
|
|
28
|
+
//
|
|
29
|
+
// WHAT DOES NOT LIVE HERE (the per-consumer parts):
|
|
30
|
+
// - _redblue's node-direct isMain workaround rationale
|
|
31
|
+
// - _darwin's async streaming (`onProgress`) for long evolve runs
|
|
32
|
+
// - _harness's dual-binary (metaharness + harness) resolution
|
|
33
|
+
//
|
|
34
|
+
// TEST SEAMS (used by test-graceful-degradation.mjs so the ADR-150 drill
|
|
35
|
+
// stays meaningful on machines with a warm cache / local install):
|
|
36
|
+
// - RUFLO_METAHARNESS_CACHE_BASE overrides ~/.ruflo as the cache root
|
|
37
|
+
// - RUFLO_METAHARNESS_SKIP_LOCAL=1 disables local node_modules resolution
|
|
38
|
+
|
|
39
|
+
import { spawnSync } from 'node:child_process';
|
|
40
|
+
import { existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
41
|
+
import { homedir } from 'node:os';
|
|
42
|
+
import { dirname, join } from 'node:path';
|
|
43
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
44
|
+
|
|
45
|
+
const INSTALL_TIMEOUT_MS = 180_000; // npm install can be slow on cold cache
|
|
46
|
+
|
|
47
|
+
// Superset of the three per-file regexes. `npm ERR` (from _redblue) is
|
|
48
|
+
// included for everyone: an npm-level failure during a cached install or an
|
|
49
|
+
// npx shim means "upstream unavailable", never a ruflo bug.
|
|
50
|
+
export const DEGRADED_RX = /could not determine executable|404|not installed|MODULE_NOT_FOUND|ENOTFOUND|getaddrinfo|ECONNREFUSED|ETIMEDOUT|npm ERR/i;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Classify a finished subprocess as degraded or healthy.
|
|
54
|
+
* `exitCode === null` means the harness killed it (timeout) — that is a
|
|
55
|
+
* DIFFERENT operational signal from "package not installable", so the two
|
|
56
|
+
* reasons stay distinct: `<prefix>-timeout` vs `<prefix>-not-available`.
|
|
57
|
+
*/
|
|
58
|
+
export function classifyDegraded(stderr, exitCode, reasonPrefix) {
|
|
59
|
+
if (exitCode === null) return { degraded: true, reason: `${reasonPrefix}-timeout` };
|
|
60
|
+
if (DEGRADED_RX.test(stderr || '')) return { degraded: true, reason: `${reasonPrefix}-not-available` };
|
|
61
|
+
return { degraded: false };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Append --json unless the caller opted out or already passed it. */
|
|
65
|
+
export function injectJson(args, wantJson) {
|
|
66
|
+
if (!wantJson || args.includes('--json')) return [...args];
|
|
67
|
+
return [...args, '--json'];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Parse the trailing JSON object from mixed stdout. CLIs in this family emit
|
|
72
|
+
* human-readable progress first and a structured JSON object LAST — so grab
|
|
73
|
+
* the last parseable {...} block, falling back to a greedy whole-span match
|
|
74
|
+
* for nested objects the lazy regex fragments.
|
|
75
|
+
*/
|
|
76
|
+
export function parseTrailingJson(stdout) {
|
|
77
|
+
const s = stdout || '';
|
|
78
|
+
const matches = [...s.matchAll(/\{[\s\S]*?\}/g)];
|
|
79
|
+
for (let i = matches.length - 1; i >= 0; i--) {
|
|
80
|
+
try { return JSON.parse(matches[i][0]); } catch { /* try previous */ }
|
|
81
|
+
}
|
|
82
|
+
const greedy = /\{[\s\S]*\}/.exec(s);
|
|
83
|
+
if (greedy) { try { return JSON.parse(greedy[0]); } catch { return null; } }
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Cache root — ~/.ruflo unless the test seam overrides it. */
|
|
88
|
+
export function cacheBaseDir() {
|
|
89
|
+
return process.env.RUFLO_METAHARNESS_CACHE_BASE || join(homedir(), '.ruflo');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Minimal `~X.Y.Z` satisfaction check (no semver dep): same major.minor, patch >= Z. */
|
|
93
|
+
export function satisfiesTildeRange(version, pinVersion) {
|
|
94
|
+
const pin = /^~(\d+)\.(\d+)\.(\d+)/.exec(String(pinVersion));
|
|
95
|
+
const ver = /^(\d+)\.(\d+)\.(\d+)/.exec(String(version));
|
|
96
|
+
if (!pin || !ver) return false;
|
|
97
|
+
return ver[1] === pin[1] && ver[2] === pin[2] && parseInt(ver[3], 10) >= parseInt(pin[3], 10);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Walk up node_modules from this plugin's directory AND from $CWD looking
|
|
102
|
+
* for an already-installed copy of `pkg` (e.g. the optionalDependency the
|
|
103
|
+
* user's ruflo install shipped with). Returns the package dir or null.
|
|
104
|
+
* When `pinVersion` is given, only a copy satisfying the pin is accepted —
|
|
105
|
+
* a stale major/minor in an ancestor node_modules is skipped, not used.
|
|
106
|
+
*/
|
|
107
|
+
export function findLocalPackageDir(pkg, pinVersion) {
|
|
108
|
+
if (process.env.RUFLO_METAHARNESS_SKIP_LOCAL === '1') return null;
|
|
109
|
+
const segments = pkg.split('/');
|
|
110
|
+
const starts = [dirname(fileURLToPath(import.meta.url)), process.cwd()];
|
|
111
|
+
const seen = new Set();
|
|
112
|
+
for (const start of starts) {
|
|
113
|
+
let dir = start;
|
|
114
|
+
for (;;) {
|
|
115
|
+
if (!seen.has(dir)) {
|
|
116
|
+
seen.add(dir);
|
|
117
|
+
const candidate = join(dir, 'node_modules', ...segments);
|
|
118
|
+
const pj = join(candidate, 'package.json');
|
|
119
|
+
if (existsSync(pj)) {
|
|
120
|
+
if (!pinVersion) return candidate;
|
|
121
|
+
try {
|
|
122
|
+
const version = JSON.parse(readFileSync(pj, 'utf-8')).version;
|
|
123
|
+
if (satisfiesTildeRange(version, pinVersion)) return candidate;
|
|
124
|
+
} catch { /* unreadable — keep walking */ }
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const parent = dirname(dir);
|
|
128
|
+
if (parent === dir) break;
|
|
129
|
+
dir = parent;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* One-time versioned cache install of a PINNED range. Generalizes
|
|
137
|
+
* gepa.mjs:98-121 / _redblue.mjs:72-102. The cache dir is
|
|
138
|
+
* `<base>/<shortname>-cache-<pin-digits>` (e.g. redblue-cache-0.1.4,
|
|
139
|
+
* darwin-cache-0.8.0, metaharness-cache-0.3.0) so existing caches created
|
|
140
|
+
* by the pre-consolidation helpers remain valid, and bumping the pin
|
|
141
|
+
* invalidates stale installs automatically.
|
|
142
|
+
*
|
|
143
|
+
* @param {object} spec
|
|
144
|
+
* @param {string} spec.pkg npm package name (may be scoped)
|
|
145
|
+
* @param {string} spec.pinVersion tilde range, e.g. '~0.3.0'
|
|
146
|
+
* @param {string} [spec.cliRelPath] path inside the package that must exist
|
|
147
|
+
* post-install (also returned as cliPath)
|
|
148
|
+
* @param {number} [spec.timeoutMs] install timeout (default 180s)
|
|
149
|
+
* @returns {{ok:true, cacheDir:string, pkgDir:string, cliPath:string|null} |
|
|
150
|
+
* {ok:false, reason:string, stderr?:string, stdout?:string, error?:string}}
|
|
151
|
+
*/
|
|
152
|
+
export function ensureCachedInstall({ pkg, pinVersion, cliRelPath, timeoutMs = INSTALL_TIMEOUT_MS }) {
|
|
153
|
+
const short = pkg.split('/').pop();
|
|
154
|
+
const cacheDir = join(cacheBaseDir(), `${short}-cache-${pinVersion.replace(/[~^]/g, '')}`);
|
|
155
|
+
const pkgDir = join(cacheDir, 'node_modules', ...pkg.split('/'));
|
|
156
|
+
const cliPath = cliRelPath ? join(pkgDir, cliRelPath) : null;
|
|
157
|
+
const probe = cliPath ?? join(pkgDir, 'package.json');
|
|
158
|
+
if (existsSync(probe)) return { ok: true, cacheDir, pkgDir, cliPath };
|
|
159
|
+
try {
|
|
160
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
161
|
+
} catch (e) {
|
|
162
|
+
return { ok: false, reason: 'cache-dir-create-failed', error: String(e) };
|
|
163
|
+
}
|
|
164
|
+
// `npm install --prefix` puts the package in a known location; this both
|
|
165
|
+
// avoids npx's symlinked bin shim (the _redblue isMain upstream bug) and
|
|
166
|
+
// removes the per-call registry check that `npx -y pkg@latest` forced.
|
|
167
|
+
// shell:false; argv only.
|
|
168
|
+
const r = spawnSync('npm', [
|
|
169
|
+
'install',
|
|
170
|
+
'--no-audit', '--no-fund', '--no-package-lock',
|
|
171
|
+
'--prefix', cacheDir,
|
|
172
|
+
`${pkg}@${pinVersion}`,
|
|
173
|
+
], {
|
|
174
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
175
|
+
encoding: 'utf-8',
|
|
176
|
+
timeout: timeoutMs,
|
|
177
|
+
shell: process.platform === 'win32',
|
|
178
|
+
});
|
|
179
|
+
if (r.status !== 0 || !existsSync(probe)) {
|
|
180
|
+
return {
|
|
181
|
+
ok: false,
|
|
182
|
+
reason: 'install-failed',
|
|
183
|
+
stderr: (r.stderr || '').slice(0, 600),
|
|
184
|
+
stdout: (r.stdout || '').slice(0, 600),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return { ok: true, cacheDir, pkgDir, cliPath };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Import an optional LIBRARY entry (as opposed to spawning a CLI):
|
|
192
|
+
* 1. bare `import(specifier)` — free when the optional dep is installed in
|
|
193
|
+
* an ancestor node_modules;
|
|
194
|
+
* 2. versioned cache install + file-URL import of `entryRelPath`.
|
|
195
|
+
* Returns the module namespace or null. Never throws on absence / stale
|
|
196
|
+
* installs (ERR_PACKAGE_PATH_NOT_EXPORTED covers pre-subpath versions).
|
|
197
|
+
*/
|
|
198
|
+
export async function importOptionalLibrary({ specifier, pkg, pinVersion, entryRelPath }) {
|
|
199
|
+
try {
|
|
200
|
+
return await import(specifier);
|
|
201
|
+
} catch (e) {
|
|
202
|
+
const msg = String(e?.message ?? e);
|
|
203
|
+
const recoverable = /Cannot find (module|package)|ERR_MODULE_NOT_FOUND|MODULE_NOT_FOUND|ERR_PACKAGE_PATH_NOT_EXPORTED|is not defined by "exports"/i;
|
|
204
|
+
if (!recoverable.test(msg)) throw e;
|
|
205
|
+
}
|
|
206
|
+
const r = ensureCachedInstall({ pkg, pinVersion, cliRelPath: entryRelPath });
|
|
207
|
+
if (!r.ok || !r.cliPath) return null;
|
|
208
|
+
try {
|
|
209
|
+
return await import(pathToFileURL(r.cliPath).href);
|
|
210
|
+
} catch {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Build the per-package `emit*DegradedJsonAndExit(reason)` helper. Emits the
|
|
217
|
+
* structured degraded payload and exits 0 — ADR-150 architectural constraint
|
|
218
|
+
* rule #3: ruflo continues to function when MetaHarness is absent.
|
|
219
|
+
*/
|
|
220
|
+
export function makeDegradedEmitter(pkg, pinVersion) {
|
|
221
|
+
return function emitDegradedAndExit(reason) {
|
|
222
|
+
const payload = {
|
|
223
|
+
degraded: true,
|
|
224
|
+
reason,
|
|
225
|
+
hint: `Install with \`npm i -D ${pkg}@${pinVersion}\` (pinned range — this plugin never fetches @latest) or verify network access for the one-time cache install.`,
|
|
226
|
+
generatedAt: new Date().toISOString(),
|
|
227
|
+
};
|
|
228
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
229
|
+
process.exit(0);
|
|
230
|
+
};
|
|
231
|
+
}
|