@claude-flow/cli 3.27.4 → 3.29.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/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 +460 -460
- 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 +925 -925
- 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/proven-config.json +1 -1
- 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/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.d.ts +23 -0
- package/dist/src/commands/daemon.js +216 -44
- package/dist/src/commands/embeddings.js +26 -26
- package/dist/src/commands/funnel.d.ts +2 -0
- package/dist/src/commands/funnel.js +110 -2
- package/dist/src/commands/hive-mind.js +97 -97
- package/dist/src/commands/hooks.js +9 -9
- package/dist/src/commands/init.js +94 -38
- package/dist/src/commands/memory.js +85 -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.d.ts +1 -0
- package/dist/src/funnel/disclosure.js +12 -0
- package/dist/src/funnel/index.d.ts +1 -1
- package/dist/src/funnel/index.js +1 -1
- package/dist/src/init/claudemd-generator.js +231 -231
- package/dist/src/init/executor.js +453 -453
- package/dist/src/init/helper-signing.d.ts +8 -1
- package/dist/src/init/helper-signing.js +9 -2
- package/dist/src/init/helpers-generator.js +751 -751
- package/dist/src/init/statusline-generator.js +994 -951
- package/dist/src/mcp-tools/agentdb-tools.js +15 -15
- package/dist/src/mcp-tools/browser-intent-tools.js +19 -19
- package/dist/src/memory/graph-edge-writer.js +22 -22
- package/dist/src/memory/memory-bridge.d.ts +10 -0
- package/dist/src/memory/memory-bridge.js +139 -88
- package/dist/src/memory/memory-initializer.d.ts +18 -0
- package/dist/src/memory/memory-initializer.js +539 -407
- package/dist/src/memory/rabitq-index.js +5 -5
- package/dist/src/runtime/headless.js +28 -28
- package/dist/src/ruvector/flash-attention.d.ts +195 -0
- package/dist/src/ruvector/flash-attention.js +643 -0
- package/dist/src/ruvector/moe-router.d.ts +206 -0
- package/dist/src/ruvector/moe-router.js +626 -0
- package/dist/src/services/distill-tuning.js +7 -7
- package/dist/src/services/event-stream.d.ts +25 -0
- package/dist/src/services/event-stream.js +27 -0
- package/dist/src/services/global-ai-budget.d.ts +25 -0
- package/dist/src/services/global-ai-budget.js +56 -0
- package/dist/src/services/headless-worker-executor.d.ts +21 -0
- package/dist/src/services/headless-worker-executor.js +152 -86
- package/dist/src/services/loop-worker-runner.d.ts +16 -0
- package/dist/src/services/loop-worker-runner.js +34 -0
- package/dist/src/services/memory-distillation.js +4 -4
- package/dist/src/services/repo-supervisor.d.ts +70 -0
- package/dist/src/services/repo-supervisor.js +228 -0
- package/dist/src/services/runtime-capabilities.d.ts +22 -0
- package/dist/src/services/runtime-capabilities.js +45 -0
- package/dist/src/services/worker-daemon.d.ts +26 -0
- package/dist/src/services/worker-daemon.js +95 -5
- package/dist/src/services/workspace-lease.d.ts +55 -0
- package/dist/src/services/workspace-lease.js +191 -0
- package/dist/src/transfer/deploy-seraphine.js +23 -23
- package/package.json +134 -133
- 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 +2353 -2353
- 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
|
@@ -31,6 +31,29 @@ export declare function daemonCommandLineBelongsToWorkspace(commandLine: string,
|
|
|
31
31
|
* Returns null for pre-#1914 daemons that never stamped a workspace.
|
|
32
32
|
*/
|
|
33
33
|
export declare function extractWorkspaceFromDaemonLine(commandLine: string): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* #2661 root-fix — one-time upgrade migration warning. A user who had
|
|
36
|
+
* `aiWorkersEnabled: true` configured BEFORE this fix landed (old config
|
|
37
|
+
* file or RUFLO_DAEMON_AI_WORKERS=1) and already has multiple worktree
|
|
38
|
+
* daemons running is exactly the P0 scenario the issue describes — surface
|
|
39
|
+
* it plainly, ONCE ever (not on every `daemon start`, which would just be
|
|
40
|
+
* noise once the user has seen and acted on it). The supervisor/lease
|
|
41
|
+
* mechanism (task #9) already makes only one of those daemons actually
|
|
42
|
+
* schedule AI workers going forward; this warning's job is purely to make
|
|
43
|
+
* a pre-existing fleet VISIBLE the first time this code runs, not to take
|
|
44
|
+
* any destructive action — nothing here stops or kills another daemon.
|
|
45
|
+
*
|
|
46
|
+
* `opts` exists for tests ONLY, mirroring the injectable-dependency pattern
|
|
47
|
+
* used elsewhere in this codebase (e.g. helper-refresh.ts's
|
|
48
|
+
* sourceDirOverride) — real callers always use the defaults.
|
|
49
|
+
*/
|
|
50
|
+
export declare function maybeShowMultiDaemonMigrationWarning(opts?: {
|
|
51
|
+
markerFile?: string;
|
|
52
|
+
fleetScanner?: () => Promise<Array<{
|
|
53
|
+
pid: number;
|
|
54
|
+
workspace: string | null;
|
|
55
|
+
}>>;
|
|
56
|
+
}): Promise<void>;
|
|
34
57
|
export declare const daemonCommand: Command;
|
|
35
58
|
export default daemonCommand;
|
|
36
59
|
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -7,6 +7,7 @@ import { getDaemon, startDaemon, stopDaemon } from '../services/worker-daemon.js
|
|
|
7
7
|
import { fork } from 'child_process';
|
|
8
8
|
import { fileURLToPath } from 'url';
|
|
9
9
|
import { dirname, join, resolve } from 'path';
|
|
10
|
+
import { homedir } from 'os';
|
|
10
11
|
import * as fs from 'fs';
|
|
11
12
|
// Start daemon subcommand
|
|
12
13
|
const startCommand = {
|
|
@@ -580,6 +581,11 @@ async function startBackgroundDaemon(projectRoot, quiet, forwarded = {}) {
|
|
|
580
581
|
}
|
|
581
582
|
}
|
|
582
583
|
catch { /* best-effort visibility — never fail the start */ }
|
|
584
|
+
// #2661 root-fix — one-time migration warning for a pre-existing
|
|
585
|
+
// multi-daemon fleet that already had AI workers enabled before this
|
|
586
|
+
// fix landed. Separate from the always-shown notice above: this one
|
|
587
|
+
// fires at most once ever, and only for the genuinely risky shape.
|
|
588
|
+
await maybeShowMultiDaemonMigrationWarning();
|
|
583
589
|
}
|
|
584
590
|
return { success: true };
|
|
585
591
|
}
|
|
@@ -942,6 +948,68 @@ async function scanRunningDaemons() {
|
|
|
942
948
|
return [];
|
|
943
949
|
}
|
|
944
950
|
}
|
|
951
|
+
function defaultMultiDaemonWarningMarker() {
|
|
952
|
+
return join(homedir(), '.claude-flow', 'multi-daemon-warning-shown.json');
|
|
953
|
+
}
|
|
954
|
+
/**
|
|
955
|
+
* #2661 root-fix — one-time upgrade migration warning. A user who had
|
|
956
|
+
* `aiWorkersEnabled: true` configured BEFORE this fix landed (old config
|
|
957
|
+
* file or RUFLO_DAEMON_AI_WORKERS=1) and already has multiple worktree
|
|
958
|
+
* daemons running is exactly the P0 scenario the issue describes — surface
|
|
959
|
+
* it plainly, ONCE ever (not on every `daemon start`, which would just be
|
|
960
|
+
* noise once the user has seen and acted on it). The supervisor/lease
|
|
961
|
+
* mechanism (task #9) already makes only one of those daemons actually
|
|
962
|
+
* schedule AI workers going forward; this warning's job is purely to make
|
|
963
|
+
* a pre-existing fleet VISIBLE the first time this code runs, not to take
|
|
964
|
+
* any destructive action — nothing here stops or kills another daemon.
|
|
965
|
+
*
|
|
966
|
+
* `opts` exists for tests ONLY, mirroring the injectable-dependency pattern
|
|
967
|
+
* used elsewhere in this codebase (e.g. helper-refresh.ts's
|
|
968
|
+
* sourceDirOverride) — real callers always use the defaults.
|
|
969
|
+
*/
|
|
970
|
+
export async function maybeShowMultiDaemonMigrationWarning(opts) {
|
|
971
|
+
const markerFile = opts?.markerFile ?? defaultMultiDaemonWarningMarker();
|
|
972
|
+
try {
|
|
973
|
+
if (fs.existsSync(markerFile))
|
|
974
|
+
return;
|
|
975
|
+
const fleet = await (opts?.fleetScanner ?? scanRunningDaemons)();
|
|
976
|
+
if (fleet.length <= 1)
|
|
977
|
+
return;
|
|
978
|
+
let anyAiEnabled = false;
|
|
979
|
+
for (const d of fleet) {
|
|
980
|
+
if (!d.workspace)
|
|
981
|
+
continue;
|
|
982
|
+
try {
|
|
983
|
+
const statePath = join(d.workspace, '.claude-flow', 'daemon-state.json');
|
|
984
|
+
if (!fs.existsSync(statePath))
|
|
985
|
+
continue;
|
|
986
|
+
const st = JSON.parse(fs.readFileSync(statePath, 'utf-8'));
|
|
987
|
+
if (st?.config?.aiWorkersEnabled === true) {
|
|
988
|
+
anyAiEnabled = true;
|
|
989
|
+
break;
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
catch { /* unreadable state — skip this daemon */ }
|
|
993
|
+
}
|
|
994
|
+
// Only the genuinely risky shape (pre-existing fleet + AI workers
|
|
995
|
+
// enabled somewhere in it) warrants the migration warning. A harmless
|
|
996
|
+
// multi-daemon fleet with AI workers off everywhere already gets the
|
|
997
|
+
// lighter, always-shown fleet-size notice at daemon start.
|
|
998
|
+
if (anyAiEnabled) {
|
|
999
|
+
output.writeln();
|
|
1000
|
+
output.printWarning(`Ruflo found ${fleet.length} worktree daemons. Scheduled AI workers are now supervisor-gated.`);
|
|
1001
|
+
output.printInfo('Inspect: ruflo daemon status --all');
|
|
1002
|
+
output.printInfo('Stop all: ruflo daemon stop --all');
|
|
1003
|
+
output.printInfo('Pause autonomous launches: ruflo daemon budget pause');
|
|
1004
|
+
output.writeln();
|
|
1005
|
+
}
|
|
1006
|
+
const dir = dirname(markerFile);
|
|
1007
|
+
if (!fs.existsSync(dir))
|
|
1008
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
1009
|
+
fs.writeFileSync(markerFile, JSON.stringify({ shownAt: new Date().toISOString(), fleetSize: fleet.length, anyAiEnabled }), { mode: 0o600 });
|
|
1010
|
+
}
|
|
1011
|
+
catch { /* best-effort visibility — never fail the command */ }
|
|
1012
|
+
}
|
|
945
1013
|
/**
|
|
946
1014
|
* #2356: render the global `daemon status --all` view. For each running daemon
|
|
947
1015
|
* it reads that workspace's daemon-state.json to show age + configured TTL,
|
|
@@ -1010,6 +1078,39 @@ async function renderAllDaemonsStatus() {
|
|
|
1010
1078
|
if (daemons.length > 1) {
|
|
1011
1079
|
output.printInfo('Stop all daemons across workspaces with: ruflo daemon stop --all');
|
|
1012
1080
|
}
|
|
1081
|
+
// #2661 root-fix — repository supervisor state, one row per distinct
|
|
1082
|
+
// repository among the scanned daemons' workspaces. Resolving identity
|
|
1083
|
+
// per workspace is cheap (a couple of `git rev-parse` calls, cached).
|
|
1084
|
+
try {
|
|
1085
|
+
const { resolveGitWorkspaceIdentity } = await import('../services/git-workspace-identity.js');
|
|
1086
|
+
const { getRepoSupervisorRegistry } = await import('../services/repo-supervisor.js');
|
|
1087
|
+
const { getWorkspaceLeaseRegistry } = await import('../services/workspace-lease.js');
|
|
1088
|
+
const seenRepos = new Map(); // repositoryId -> a representative workspace path
|
|
1089
|
+
for (const d of daemons) {
|
|
1090
|
+
if (!d.workspace)
|
|
1091
|
+
continue;
|
|
1092
|
+
const identity = resolveGitWorkspaceIdentity(d.workspace);
|
|
1093
|
+
if (identity.isGit && !seenRepos.has(identity.repositoryId)) {
|
|
1094
|
+
seenRepos.set(identity.repositoryId, d.workspace);
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
if (seenRepos.size > 0) {
|
|
1098
|
+
const supervisorReg = getRepoSupervisorRegistry();
|
|
1099
|
+
const leaseReg = getWorkspaceLeaseRegistry();
|
|
1100
|
+
const lines = [];
|
|
1101
|
+
for (const [repositoryId, sampleWorkspace] of seenRepos) {
|
|
1102
|
+
const record = supervisorReg.getRecord(repositoryId);
|
|
1103
|
+
const activeLeases = leaseReg.listActive(repositoryId).length;
|
|
1104
|
+
const label = repositoryId.slice(0, 12);
|
|
1105
|
+
lines.push(record
|
|
1106
|
+
? ` ${label}… supervisor: ${record.worktreeRoot} (pid ${record.pid}) | active leases: ${activeLeases}`
|
|
1107
|
+
: ` ${label}… supervisor: ${output.dim('none elected')} | active leases: ${activeLeases}`);
|
|
1108
|
+
}
|
|
1109
|
+
output.writeln();
|
|
1110
|
+
output.printBox(lines.join('\n'), 'Repository Supervisors (#2661 root-fix)');
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
catch { /* supervisor registry unavailable — skip the panel */ }
|
|
1013
1114
|
// #2661: user-global AI launch usage — the shared budget every daemon
|
|
1014
1115
|
// draws from, independent of worktree count.
|
|
1015
1116
|
try {
|
|
@@ -1330,33 +1431,33 @@ const installSupervisorCommand = {
|
|
|
1330
1431
|
const plistDir = join(home, 'Library', 'LaunchAgents');
|
|
1331
1432
|
const plistPath = join(plistDir, 'io.ruv.ruflo.daemon.plist');
|
|
1332
1433
|
const logDir = join(projectRoot, '.claude-flow', 'logs');
|
|
1333
|
-
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
1334
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
1335
|
-
<plist version="1.0">
|
|
1336
|
-
<dict>
|
|
1337
|
-
<key>Label</key><string>io.ruv.ruflo.daemon</string>
|
|
1338
|
-
<key>ProgramArguments</key>
|
|
1339
|
-
<array>
|
|
1340
|
-
<string>${nodeBin}</string>
|
|
1341
|
-
<string>${cliJs}</string>
|
|
1342
|
-
<string>daemon</string><string>start</string><string>--foreground</string><string>--quiet</string>
|
|
1343
|
-
</array>
|
|
1344
|
-
<key>WorkingDirectory</key><string>${projectRoot}</string>
|
|
1345
|
-
<key>RunAtLoad</key><true/>
|
|
1346
|
-
<key>KeepAlive</key>
|
|
1347
|
-
<dict>
|
|
1348
|
-
<key>SuccessfulExit</key><false/>
|
|
1349
|
-
<key>Crashed</key><true/>
|
|
1350
|
-
</dict>
|
|
1351
|
-
<key>ThrottleInterval</key><integer>10</integer>
|
|
1352
|
-
<key>StandardOutPath</key><string>${logDir}/supervisor.out.log</string>
|
|
1353
|
-
<key>StandardErrorPath</key><string>${logDir}/supervisor.err.log</string>
|
|
1354
|
-
<key>EnvironmentVariables</key>
|
|
1355
|
-
<dict>
|
|
1356
|
-
<key>CLAUDE_FLOW_DAEMON</key><string>1</string>
|
|
1357
|
-
</dict>
|
|
1358
|
-
</dict>
|
|
1359
|
-
</plist>
|
|
1434
|
+
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
1435
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
1436
|
+
<plist version="1.0">
|
|
1437
|
+
<dict>
|
|
1438
|
+
<key>Label</key><string>io.ruv.ruflo.daemon</string>
|
|
1439
|
+
<key>ProgramArguments</key>
|
|
1440
|
+
<array>
|
|
1441
|
+
<string>${nodeBin}</string>
|
|
1442
|
+
<string>${cliJs}</string>
|
|
1443
|
+
<string>daemon</string><string>start</string><string>--foreground</string><string>--quiet</string>
|
|
1444
|
+
</array>
|
|
1445
|
+
<key>WorkingDirectory</key><string>${projectRoot}</string>
|
|
1446
|
+
<key>RunAtLoad</key><true/>
|
|
1447
|
+
<key>KeepAlive</key>
|
|
1448
|
+
<dict>
|
|
1449
|
+
<key>SuccessfulExit</key><false/>
|
|
1450
|
+
<key>Crashed</key><true/>
|
|
1451
|
+
</dict>
|
|
1452
|
+
<key>ThrottleInterval</key><integer>10</integer>
|
|
1453
|
+
<key>StandardOutPath</key><string>${logDir}/supervisor.out.log</string>
|
|
1454
|
+
<key>StandardErrorPath</key><string>${logDir}/supervisor.err.log</string>
|
|
1455
|
+
<key>EnvironmentVariables</key>
|
|
1456
|
+
<dict>
|
|
1457
|
+
<key>CLAUDE_FLOW_DAEMON</key><string>1</string>
|
|
1458
|
+
</dict>
|
|
1459
|
+
</dict>
|
|
1460
|
+
</plist>
|
|
1360
1461
|
`;
|
|
1361
1462
|
if (dryRun) {
|
|
1362
1463
|
output.writeln(plist);
|
|
@@ -1397,23 +1498,23 @@ const installSupervisorCommand = {
|
|
|
1397
1498
|
// Linux: systemd-user
|
|
1398
1499
|
const unitDir = join(home, '.config', 'systemd', 'user');
|
|
1399
1500
|
const unitPath = join(unitDir, 'ruflo-daemon.service');
|
|
1400
|
-
const unit = `[Unit]
|
|
1401
|
-
Description=RuFlo background worker daemon
|
|
1402
|
-
After=default.target
|
|
1403
|
-
|
|
1404
|
-
[Service]
|
|
1405
|
-
Type=simple
|
|
1406
|
-
WorkingDirectory=${projectRoot}
|
|
1407
|
-
Environment=CLAUDE_FLOW_DAEMON=1
|
|
1408
|
-
ExecStart=${nodeBin} ${cliJs} daemon start --foreground --quiet
|
|
1409
|
-
Restart=on-failure
|
|
1410
|
-
RestartSec=10
|
|
1411
|
-
# Restart on Crashed (signal) too
|
|
1412
|
-
StartLimitIntervalSec=300
|
|
1413
|
-
StartLimitBurst=5
|
|
1414
|
-
|
|
1415
|
-
[Install]
|
|
1416
|
-
WantedBy=default.target
|
|
1501
|
+
const unit = `[Unit]
|
|
1502
|
+
Description=RuFlo background worker daemon
|
|
1503
|
+
After=default.target
|
|
1504
|
+
|
|
1505
|
+
[Service]
|
|
1506
|
+
Type=simple
|
|
1507
|
+
WorkingDirectory=${projectRoot}
|
|
1508
|
+
Environment=CLAUDE_FLOW_DAEMON=1
|
|
1509
|
+
ExecStart=${nodeBin} ${cliJs} daemon start --foreground --quiet
|
|
1510
|
+
Restart=on-failure
|
|
1511
|
+
RestartSec=10
|
|
1512
|
+
# Restart on Crashed (signal) too
|
|
1513
|
+
StartLimitIntervalSec=300
|
|
1514
|
+
StartLimitBurst=5
|
|
1515
|
+
|
|
1516
|
+
[Install]
|
|
1517
|
+
WantedBy=default.target
|
|
1417
1518
|
`;
|
|
1418
1519
|
if (dryRun) {
|
|
1419
1520
|
output.writeln(unit);
|
|
@@ -1496,6 +1597,76 @@ const uninstallSupervisorCommand = {
|
|
|
1496
1597
|
return { success: false, exitCode: 1 };
|
|
1497
1598
|
},
|
|
1498
1599
|
};
|
|
1600
|
+
// #2661 root-fix — `daemon budget show|pause|resume`. The budget state was
|
|
1601
|
+
// previously visible only inline in `daemon status --all`; these give it an
|
|
1602
|
+
// independently scriptable surface (e.g. `ruflo daemon budget pause` before
|
|
1603
|
+
// a long interactive session, `... resume` after).
|
|
1604
|
+
const budgetShowCommand = {
|
|
1605
|
+
name: 'show',
|
|
1606
|
+
description: 'Show the user-global AI launch budget (launches, active children, circuit-breaker state)',
|
|
1607
|
+
options: [],
|
|
1608
|
+
examples: [{ command: 'claude-flow daemon budget show', description: 'Show current budget usage and limits' }],
|
|
1609
|
+
action: async () => {
|
|
1610
|
+
const { getGlobalAiBudget } = await import('../services/global-ai-budget.js');
|
|
1611
|
+
const budget = getGlobalAiBudget();
|
|
1612
|
+
const usage = budget.getUsage();
|
|
1613
|
+
const limits = budget.getLimits();
|
|
1614
|
+
output.writeln();
|
|
1615
|
+
const byWs = usage.byWorkspace.slice(0, 10).map((w) => ` ${w.launches}× ${w.workspace}`);
|
|
1616
|
+
output.printBox([
|
|
1617
|
+
`Launches (last hour): ${usage.lastHour}/${limits.maxLaunchesPerHour}`,
|
|
1618
|
+
`Launches (last 24h): ${usage.lastDay}/${limits.maxLaunchesPerDay}`,
|
|
1619
|
+
`Active Claude children: ${usage.active}/${limits.maxConcurrentGlobal}`,
|
|
1620
|
+
usage.pausedUntil
|
|
1621
|
+
? output.warning(`PAUSED until ${new Date(usage.pausedUntil).toISOString()} (${usage.pauseReason ?? 'quota error'})`)
|
|
1622
|
+
: `Circuit breaker: ${output.dim('closed (normal)')}`,
|
|
1623
|
+
...(byWs.length > 0 ? ['Launches by workspace (24h):', ...byWs] : []),
|
|
1624
|
+
].join('\n'), 'Global AI Budget');
|
|
1625
|
+
return { success: true, data: { usage, limits } };
|
|
1626
|
+
},
|
|
1627
|
+
};
|
|
1628
|
+
const budgetPauseCommand = {
|
|
1629
|
+
name: 'pause',
|
|
1630
|
+
description: 'Pause ALL autonomous Claude launches across every daemon until resumed',
|
|
1631
|
+
options: [
|
|
1632
|
+
{ name: 'reason', short: 'r', type: 'string', description: 'Optional reason recorded in the pause receipt' },
|
|
1633
|
+
],
|
|
1634
|
+
examples: [{ command: 'claude-flow daemon budget pause --reason "conserving quota for a demo"', description: 'Pause autonomous launches' }],
|
|
1635
|
+
action: async (ctx) => {
|
|
1636
|
+
const { getGlobalAiBudget } = await import('../services/global-ai-budget.js');
|
|
1637
|
+
await getGlobalAiBudget().pause(ctx.flags.reason);
|
|
1638
|
+
output.printSuccess('Autonomous AI worker launches paused across all daemons. Resume with: ruflo daemon budget resume');
|
|
1639
|
+
return { success: true };
|
|
1640
|
+
},
|
|
1641
|
+
};
|
|
1642
|
+
const budgetResumeCommand = {
|
|
1643
|
+
name: 'resume',
|
|
1644
|
+
description: 'Resume autonomous Claude launches (clears a manual pause or a quota-triggered circuit-breaker pause)',
|
|
1645
|
+
options: [],
|
|
1646
|
+
examples: [{ command: 'claude-flow daemon budget resume', description: 'Resume autonomous launches' }],
|
|
1647
|
+
action: async () => {
|
|
1648
|
+
const { getGlobalAiBudget } = await import('../services/global-ai-budget.js');
|
|
1649
|
+
await getGlobalAiBudget().resume();
|
|
1650
|
+
output.printSuccess('Autonomous AI worker launches resumed.');
|
|
1651
|
+
return { success: true };
|
|
1652
|
+
},
|
|
1653
|
+
};
|
|
1654
|
+
const budgetCommand = {
|
|
1655
|
+
name: 'budget',
|
|
1656
|
+
description: 'Inspect and control the user-global AI launch budget (#2661)',
|
|
1657
|
+
subcommands: [budgetShowCommand, budgetPauseCommand, budgetResumeCommand],
|
|
1658
|
+
options: [],
|
|
1659
|
+
examples: [
|
|
1660
|
+
{ command: 'claude-flow daemon budget show', description: 'Show current usage/limits' },
|
|
1661
|
+
{ command: 'claude-flow daemon budget pause', description: 'Pause all autonomous launches' },
|
|
1662
|
+
{ command: 'claude-flow daemon budget resume', description: 'Resume autonomous launches' },
|
|
1663
|
+
],
|
|
1664
|
+
// Bare `daemon budget` (no subcommand) shows usage — same as `show`.
|
|
1665
|
+
action: async (ctx) => {
|
|
1666
|
+
const result = await budgetShowCommand.action(ctx);
|
|
1667
|
+
return result ?? { success: true };
|
|
1668
|
+
},
|
|
1669
|
+
};
|
|
1499
1670
|
// Main daemon command
|
|
1500
1671
|
export const daemonCommand = {
|
|
1501
1672
|
name: 'daemon',
|
|
@@ -1506,6 +1677,7 @@ export const daemonCommand = {
|
|
|
1506
1677
|
statusCommand,
|
|
1507
1678
|
triggerCommand,
|
|
1508
1679
|
enableCommand,
|
|
1680
|
+
budgetCommand,
|
|
1509
1681
|
installSupervisorCommand,
|
|
1510
1682
|
uninstallSupervisorCommand,
|
|
1511
1683
|
],
|
|
@@ -147,13 +147,13 @@ const searchCommand = {
|
|
|
147
147
|
// Get all entries with embeddings from database
|
|
148
148
|
// Parameterized query to prevent SQL injection (CRIT-01)
|
|
149
149
|
const embeddingSql = namespace !== 'all'
|
|
150
|
-
? `SELECT id, key, namespace, content, embedding, embedding_dimensions
|
|
151
|
-
FROM memory_entries
|
|
152
|
-
WHERE status = 'active' AND embedding IS NOT NULL AND namespace = ?
|
|
150
|
+
? `SELECT id, key, namespace, content, embedding, embedding_dimensions
|
|
151
|
+
FROM memory_entries
|
|
152
|
+
WHERE status = 'active' AND embedding IS NOT NULL AND namespace = ?
|
|
153
153
|
LIMIT 1000`
|
|
154
|
-
: `SELECT id, key, namespace, content, embedding, embedding_dimensions
|
|
155
|
-
FROM memory_entries
|
|
156
|
-
WHERE status = 'active' AND embedding IS NOT NULL
|
|
154
|
+
: `SELECT id, key, namespace, content, embedding, embedding_dimensions
|
|
155
|
+
FROM memory_entries
|
|
156
|
+
WHERE status = 'active' AND embedding IS NOT NULL
|
|
157
157
|
LIMIT 1000`;
|
|
158
158
|
const embeddingStmt = db.prepare(embeddingSql);
|
|
159
159
|
if (namespace !== 'all') {
|
|
@@ -192,16 +192,16 @@ const searchCommand = {
|
|
|
192
192
|
const likePattern = `%${query}%`;
|
|
193
193
|
const remainingLimit = Math.max(0, limit - results.length);
|
|
194
194
|
const keywordSql = namespace !== 'all'
|
|
195
|
-
? `SELECT id, key, namespace, content
|
|
196
|
-
FROM memory_entries
|
|
197
|
-
WHERE status = 'active'
|
|
198
|
-
AND (content LIKE ? OR key LIKE ?)
|
|
199
|
-
AND namespace = ?
|
|
195
|
+
? `SELECT id, key, namespace, content
|
|
196
|
+
FROM memory_entries
|
|
197
|
+
WHERE status = 'active'
|
|
198
|
+
AND (content LIKE ? OR key LIKE ?)
|
|
199
|
+
AND namespace = ?
|
|
200
200
|
LIMIT ?`
|
|
201
|
-
: `SELECT id, key, namespace, content
|
|
202
|
-
FROM memory_entries
|
|
203
|
-
WHERE status = 'active'
|
|
204
|
-
AND (content LIKE ? OR key LIKE ?)
|
|
201
|
+
: `SELECT id, key, namespace, content
|
|
202
|
+
FROM memory_entries
|
|
203
|
+
WHERE status = 'active'
|
|
204
|
+
AND (content LIKE ? OR key LIKE ?)
|
|
205
205
|
LIMIT ?`;
|
|
206
206
|
const keywordStmt = db.prepare(keywordSql);
|
|
207
207
|
if (namespace !== 'all') {
|
|
@@ -408,17 +408,17 @@ const collectionsCommand = {
|
|
|
408
408
|
const fileBuffer = fs.readFileSync(fullDbPath);
|
|
409
409
|
const db = new SQL.Database(fileBuffer);
|
|
410
410
|
// Get collection stats from database
|
|
411
|
-
const statsQuery = db.exec(`
|
|
412
|
-
SELECT
|
|
413
|
-
namespace,
|
|
414
|
-
COUNT(*) as total_entries,
|
|
415
|
-
SUM(CASE WHEN embedding IS NOT NULL THEN 1 ELSE 0 END) as with_embeddings,
|
|
416
|
-
AVG(embedding_dimensions) as avg_dimensions,
|
|
417
|
-
SUM(LENGTH(content)) as total_content_size
|
|
418
|
-
FROM memory_entries
|
|
419
|
-
WHERE status = 'active'
|
|
420
|
-
GROUP BY namespace
|
|
421
|
-
ORDER BY total_entries DESC
|
|
411
|
+
const statsQuery = db.exec(`
|
|
412
|
+
SELECT
|
|
413
|
+
namespace,
|
|
414
|
+
COUNT(*) as total_entries,
|
|
415
|
+
SUM(CASE WHEN embedding IS NOT NULL THEN 1 ELSE 0 END) as with_embeddings,
|
|
416
|
+
AVG(embedding_dimensions) as avg_dimensions,
|
|
417
|
+
SUM(LENGTH(content)) as total_content_size
|
|
418
|
+
FROM memory_entries
|
|
419
|
+
WHERE status = 'active'
|
|
420
|
+
GROUP BY namespace
|
|
421
|
+
ORDER BY total_entries DESC
|
|
422
422
|
`);
|
|
423
423
|
// Get vector index info
|
|
424
424
|
const indexQuery = db.exec(`SELECT name, dimensions, hnsw_m FROM vector_indexes`);
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* funnel status effective state and which precedence source decided it
|
|
6
6
|
* funnel disable user-level opt-out (all surfaces) + delete funnel data
|
|
7
7
|
* funnel enable re-enable at the user tier (cannot override env/enterprise)
|
|
8
|
+
* funnel accept acknowledge the disclosure so rotation starts immediately
|
|
9
|
+
* funnel open open the currently-shown promo URL in the default browser
|
|
8
10
|
* funnel id print the pseudonymous funnel ID, if one exists
|
|
9
11
|
*/
|
|
10
12
|
import type { Command } from '../types.js';
|
|
@@ -5,10 +5,16 @@
|
|
|
5
5
|
* funnel status effective state and which precedence source decided it
|
|
6
6
|
* funnel disable user-level opt-out (all surfaces) + delete funnel data
|
|
7
7
|
* funnel enable re-enable at the user tier (cannot override env/enterprise)
|
|
8
|
+
* funnel accept acknowledge the disclosure so rotation starts immediately
|
|
9
|
+
* funnel open open the currently-shown promo URL in the default browser
|
|
8
10
|
* funnel id print the pseudonymous funnel ID, if one exists
|
|
9
11
|
*/
|
|
12
|
+
import { execFile } from 'node:child_process';
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import * as path from 'node:path';
|
|
10
16
|
import { output } from '../output.js';
|
|
11
|
-
import { deleteFunnelData, funnelStateDir, getDisclosure, getFunnelId, readConsents, recordDisclosureDeclined, recordDisclosureReenabled, resolveFunnelEnabled, } from '../funnel/index.js';
|
|
17
|
+
import { deleteFunnelData, funnelStateDir, getDisclosure, getFunnelId, promoEligible, readConsents, recordDisclosureAccepted, recordDisclosureDeclined, recordDisclosureReenabled, resolveFunnelEnabled, } from '../funnel/index.js';
|
|
12
18
|
import { readStateJson, writeStateJson } from '../funnel/state.js';
|
|
13
19
|
function setUserConfigEnabled(enabled) {
|
|
14
20
|
const cfg = readStateJson('funnel.json') ?? {};
|
|
@@ -75,6 +81,106 @@ const enableSub = {
|
|
|
75
81
|
return { success: true, data: decision };
|
|
76
82
|
},
|
|
77
83
|
};
|
|
84
|
+
const acceptSub = {
|
|
85
|
+
name: 'accept',
|
|
86
|
+
description: 'Acknowledge the disclosure so rotation starts immediately (skips the 24h grace window)',
|
|
87
|
+
action: async () => {
|
|
88
|
+
const decision = resolveFunnelEnabled();
|
|
89
|
+
if (!decision.enabled) {
|
|
90
|
+
output.printWarning(`Funnel is currently disabled by: ${decision.decidedBy}. Run 'ruflo funnel enable' first, then re-run accept.`);
|
|
91
|
+
return { success: false, data: decision };
|
|
92
|
+
}
|
|
93
|
+
const current = getDisclosure();
|
|
94
|
+
if (current.state === 'disclosed_disabled') {
|
|
95
|
+
output.printWarning("Disclosure is in a declined state. Run 'ruflo funnel enable' first, then re-run accept.");
|
|
96
|
+
return { success: false, data: current };
|
|
97
|
+
}
|
|
98
|
+
const rec = recordDisclosureAccepted();
|
|
99
|
+
const eligible = promoEligible();
|
|
100
|
+
output.printSuccess(`Disclosure accepted (firstShownAt backdated to ${rec.firstShownAt}). Promo rotation eligible: ${eligible}.`);
|
|
101
|
+
return { success: true, data: { record: rec, eligible } };
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
// Reads the memoized promo written by the statusline renderer. Same file
|
|
105
|
+
// path as .claude/helpers/statusline.cjs's PROMO_MEMO_FILE — kept in sync
|
|
106
|
+
// by convention. Returns null on any error so a broken memo can't crash
|
|
107
|
+
// the subcommand.
|
|
108
|
+
function readCurrentPromo() {
|
|
109
|
+
try {
|
|
110
|
+
const memoPath = path.join(os.homedir(), '.ruflo', 'statusline-promo.json');
|
|
111
|
+
const raw = JSON.parse(fs.readFileSync(memoPath, 'utf-8'));
|
|
112
|
+
if (raw && raw.promo && typeof raw.promo === 'object')
|
|
113
|
+
return raw.promo;
|
|
114
|
+
}
|
|
115
|
+
catch { /* memo absent or corrupt — treat as "nothing shown yet" */ }
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
// Allowlist mirrors the OSC 8 hyperlink allowlist in the statusline renderer.
|
|
119
|
+
// Never open a URL whose host isn't on this list, even if a corrupted memo
|
|
120
|
+
// somehow lands one there — the memo is user-writable so we must not treat
|
|
121
|
+
// it as trusted. Kept in sync with .claude/helpers/statusline.cjs's
|
|
122
|
+
// PROMO_LINK_HOSTS.
|
|
123
|
+
const OPEN_ALLOWED_HOSTS = new Set([
|
|
124
|
+
'cognitum.one', 'www.cognitum.one', 'docs.cognitum.one',
|
|
125
|
+
'agentics.org', 'www.agentics.org',
|
|
126
|
+
'funnel.ruv.io',
|
|
127
|
+
'cognitum-analytics-63rzcdswba-uc.a.run.app',
|
|
128
|
+
]);
|
|
129
|
+
// Open a URL using the platform's default browser handler. execFile (not
|
|
130
|
+
// exec) — no shell involved, so nothing in the URL can be interpreted as a
|
|
131
|
+
// shell command even in the pathological case where allowlisting is
|
|
132
|
+
// bypassed. Runs detached + hidden so no cmd window flashes on Windows.
|
|
133
|
+
function openInBrowser(url) {
|
|
134
|
+
return new Promise((resolve, reject) => {
|
|
135
|
+
const platform = process.platform;
|
|
136
|
+
const [cmd, args] = platform === 'win32'
|
|
137
|
+
// "start" needs an empty title argument first, else the first quoted
|
|
138
|
+
// arg becomes the title and the URL is ignored. cmd /c is required to
|
|
139
|
+
// invoke the built-in start command.
|
|
140
|
+
? ['cmd', ['/c', 'start', '""', url]]
|
|
141
|
+
: platform === 'darwin'
|
|
142
|
+
? ['open', [url]]
|
|
143
|
+
: ['xdg-open', [url]];
|
|
144
|
+
execFile(cmd, args, { windowsHide: true }, (err) => (err ? reject(err) : resolve()));
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const openSub = {
|
|
148
|
+
name: 'open',
|
|
149
|
+
description: 'Open the currently-shown statusline promo URL in the default browser',
|
|
150
|
+
action: async () => {
|
|
151
|
+
const promo = readCurrentPromo();
|
|
152
|
+
if (!promo) {
|
|
153
|
+
output.printWarning("No promo has been shown yet. Wait for the statusline to render one, then re-run 'ruflo funnel open'.");
|
|
154
|
+
return { success: false };
|
|
155
|
+
}
|
|
156
|
+
if (!promo.url) {
|
|
157
|
+
output.printWarning(`Current promo (kind=${promo.kind ?? 'unknown'}) has no URL. Nothing to open: "${promo.text}"`);
|
|
158
|
+
return { success: false, data: promo };
|
|
159
|
+
}
|
|
160
|
+
let parsed;
|
|
161
|
+
try {
|
|
162
|
+
parsed = new URL(promo.url);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
output.printError(`Promo URL is malformed: ${promo.url}`);
|
|
166
|
+
return { success: false, data: promo };
|
|
167
|
+
}
|
|
168
|
+
if (parsed.protocol !== 'https:' || !OPEN_ALLOWED_HOSTS.has(parsed.hostname)) {
|
|
169
|
+
output.printError(`Refusing to open URL — not on the allowlist: ${parsed.protocol}//${parsed.hostname}`);
|
|
170
|
+
return { success: false, data: { url: promo.url } };
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
await openInBrowser(parsed.href);
|
|
174
|
+
output.printSuccess(`Opened: ${parsed.href}`);
|
|
175
|
+
return { success: true, data: { url: parsed.href } };
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
output.printError(`Failed to open URL: ${err instanceof Error ? err.message : String(err)}`);
|
|
179
|
+
output.writeln(`URL for manual copy: ${parsed.href}`);
|
|
180
|
+
return { success: false, data: { url: parsed.href } };
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
};
|
|
78
184
|
const idSub = {
|
|
79
185
|
name: 'id',
|
|
80
186
|
description: 'Print the pseudonymous funnel ID (exists only with telemetry consent)',
|
|
@@ -92,9 +198,11 @@ const idSub = {
|
|
|
92
198
|
export const funnelCommand = {
|
|
93
199
|
name: 'funnel',
|
|
94
200
|
description: 'Control the Cognitum lifecycle funnel surfaces (tips, enrollment, notices)',
|
|
95
|
-
subcommands: [statusSub, disableSub, enableSub, idSub],
|
|
201
|
+
subcommands: [statusSub, disableSub, enableSub, acceptSub, openSub, idSub],
|
|
96
202
|
examples: [
|
|
97
203
|
{ command: 'ruflo funnel status', description: 'Effective state + deciding source' },
|
|
204
|
+
{ command: 'ruflo funnel accept', description: 'Skip the 24h grace so rotation starts now' },
|
|
205
|
+
{ command: 'ruflo funnel open', description: 'Open the current promo URL in the browser' },
|
|
98
206
|
{ command: 'ruflo funnel disable', description: 'Turn off every funnel surface' },
|
|
99
207
|
],
|
|
100
208
|
action: statusSub.action,
|