claude-flow 3.32.8 → 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/.proven-config-version +1 -0
- package/.claude/agents/MIGRATION_SUMMARY.md +221 -221
- package/.claude/agents/analysis/analyze-code-quality.md +57 -57
- package/.claude/agents/analysis/code-analyzer.md +188 -188
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +57 -57
- package/.claude/agents/architecture/system-design/arch-system-design.md +35 -35
- package/.claude/agents/base-template-generator.md +41 -41
- package/.claude/agents/consensus/byzantine-coordinator.md +42 -42
- package/.claude/agents/consensus/crdt-synchronizer.md +976 -976
- package/.claude/agents/consensus/gossip-coordinator.md +42 -42
- package/.claude/agents/consensus/performance-benchmarker.md +830 -830
- package/.claude/agents/consensus/quorum-manager.md +802 -802
- package/.claude/agents/consensus/raft-manager.md +42 -42
- package/.claude/agents/consensus/security-manager.md +601 -601
- package/.claude/agents/core/coder.md +254 -254
- package/.claude/agents/core/planner.md +151 -151
- package/.claude/agents/core/researcher.md +173 -173
- package/.claude/agents/core/reviewer.md +308 -308
- package/.claude/agents/core/tester.md +299 -299
- package/.claude/agents/custom/test-long-runner.md +43 -43
- package/.claude/agents/data/ml/data-ml-model.md +75 -75
- package/.claude/agents/database-specialist.md +9 -9
- package/.claude/agents/development/backend/dev-backend-api.md +28 -28
- package/.claude/agents/development/dev-backend-api.md +177 -177
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +51 -51
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +62 -62
- package/.claude/agents/dual-mode/codex-coordinator.md +206 -206
- package/.claude/agents/dual-mode/codex-worker.md +190 -190
- package/.claude/agents/dual-mode/dual-orchestrator.md +253 -253
- 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 +520 -520
- package/.claude/agents/github/github-modes.md +153 -153
- package/.claude/agents/github/issue-tracker.md +298 -298
- package/.claude/agents/github/multi-repo-swarm.md +524 -524
- package/.claude/agents/github/pr-manager.md +162 -162
- package/.claude/agents/github/project-board-sync.md +477 -477
- package/.claude/agents/github/release-manager.md +337 -337
- package/.claude/agents/github/release-swarm.md +550 -550
- package/.claude/agents/github/repo-architect.md +364 -364
- package/.claude/agents/github/swarm-issue.md +550 -550
- package/.claude/agents/github/swarm-pr.md +401 -401
- package/.claude/agents/github/sync-coordinator.md +424 -424
- package/.claude/agents/github/workflow-automation.md +604 -604
- package/.claude/agents/goal/agent.md +816 -816
- package/.claude/agents/goal/code-goal-planner.md +444 -444
- package/.claude/agents/goal/goal-planner.md +167 -167
- package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +128 -128
- package/.claude/agents/hive-mind/queen-coordinator.md +201 -201
- package/.claude/agents/hive-mind/scout-explorer.md +240 -240
- package/.claude/agents/hive-mind/swarm-memory-manager.md +191 -191
- package/.claude/agents/hive-mind/worker-specialist.md +215 -215
- package/.claude/agents/neural/safla-neural.md +73 -73
- package/.claude/agents/optimization/benchmark-suite.md +662 -662
- package/.claude/agents/optimization/load-balancer.md +428 -428
- package/.claude/agents/optimization/performance-monitor.md +669 -669
- package/.claude/agents/optimization/resource-allocator.md +671 -671
- package/.claude/agents/optimization/topology-optimizer.md +805 -805
- package/.claude/agents/payments/agentic-payments.md +126 -126
- package/.claude/agents/project-coordinator.md +8 -8
- package/.claude/agents/python-specialist.md +9 -9
- package/.claude/agents/reasoning/agent.md +816 -816
- package/.claude/agents/reasoning/goal-planner.md +72 -72
- package/.claude/agents/security-auditor.md +9 -9
- package/.claude/agents/sona/sona-learning-optimizer.md +65 -65
- package/.claude/agents/sparc/architecture.md +452 -452
- package/.claude/agents/sparc/pseudocode.md +298 -298
- package/.claude/agents/sparc/refinement.md +503 -503
- package/.claude/agents/sparc/specification.md +257 -257
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +87 -87
- 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 +363 -363
- package/.claude/agents/swarm/hierarchical-coordinator.md +299 -299
- package/.claude/agents/swarm/mesh-coordinator.md +362 -362
- package/.claude/agents/templates/automation-smart-agent.md +184 -184
- package/.claude/agents/templates/coordinator-swarm-init.md +82 -82
- package/.claude/agents/templates/github-pr-manager.md +154 -154
- package/.claude/agents/templates/implementer-sparc-coder.md +242 -242
- package/.claude/agents/templates/memory-coordinator.md +162 -162
- package/.claude/agents/templates/migration-plan.md +723 -723
- package/.claude/agents/templates/orchestrator-task.md +119 -119
- package/.claude/agents/templates/performance-analyzer.md +178 -178
- package/.claude/agents/templates/sparc-coordinator.md +162 -162
- package/.claude/agents/testing/production-validator.md +372 -372
- package/.claude/agents/testing/tdd-london-swarm.md +221 -221
- package/.claude/agents/testing/unit/tdd-london-swarm.md +221 -221
- package/.claude/agents/testing/validation/production-validator.md +372 -372
- package/.claude/agents/typescript-specialist.md +9 -9
- package/.claude/agents/v3/database-specialist.md +9 -9
- package/.claude/agents/v3/project-coordinator.md +8 -8
- package/.claude/agents/v3/python-specialist.md +9 -9
- package/.claude/agents/v3/test-architect.md +9 -9
- package/.claude/agents/v3/typescript-specialist.md +9 -9
- package/.claude/agents/v3/v3-integration-architect.md +311 -311
- package/.claude/agents/v3/v3-memory-specialist.md +280 -280
- package/.claude/agents/v3/v3-performance-engineer.md +362 -362
- package/.claude/agents/v3/v3-queen-coordinator.md +62 -62
- package/.claude/agents/v3/v3-security-architect.md +139 -139
- package/.claude/checkpoints/1767754460.json +8 -8
- package/.claude/commands/agents/README.md +10 -10
- package/.claude/commands/agents/agent-capabilities.md +21 -21
- 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 +26 -26
- 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/flow-nexus/app-store.md +123 -123
- package/.claude/commands/flow-nexus/challenges.md +119 -119
- package/.claude/commands/flow-nexus/login-registration.md +64 -64
- package/.claude/commands/flow-nexus/neural-network.md +133 -133
- package/.claude/commands/flow-nexus/payments.md +115 -115
- package/.claude/commands/flow-nexus/sandbox.md +82 -82
- package/.claude/commands/flow-nexus/swarm.md +86 -86
- package/.claude/commands/flow-nexus/user-tools.md +151 -151
- package/.claude/commands/flow-nexus/workflow.md +114 -114
- 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 +337 -337
- 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 +481 -481
- package/.claude/commands/github/swarm-pr.md +284 -284
- package/.claude/commands/github/sync-coordinator.md +300 -300
- 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 +27 -27
- 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 +73 -73
- package/.claude/commands/training/neural-train.md +25 -25
- 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/config/v3-dependency-optimization.json +265 -265
- package/.claude/config/v3-performance-targets.json +250 -250
- package/.claude/helpers/.LOCKED +2 -2
- package/.claude/helpers/.helpers-version +1 -0
- package/.claude/helpers/README.md +96 -96
- package/.claude/helpers/adr-compliance.sh +186 -186
- package/.claude/helpers/aggressive-microcompact.mjs +36 -36
- 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/context-persistence-hook.mjs +2001 -2001
- 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 +13 -0
- package/.claude/helpers/hook-handler.cjs +464 -464
- 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.cjs +84 -84
- package/.claude/helpers/metrics-db.mjs +503 -503
- package/.claude/helpers/patch-aggressive-prune.mjs +184 -184
- package/.claude/helpers/pattern-consolidator.sh +86 -86
- package/.claude/helpers/perf-worker.sh +160 -160
- package/.claude/helpers/quick-start.sh +19 -19
- package/.claude/helpers/router.cjs +62 -62
- package/.claude/helpers/security-scanner.sh +127 -127
- package/.claude/helpers/session.cjs +125 -125
- package/.claude/helpers/setup-mcp.sh +18 -18
- package/.claude/helpers/standard-checkpoint-hooks.sh +189 -189
- package/.claude/helpers/statusline.cjs +211 -2
- 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/mcp.json +12 -12
- package/.claude/proven-config.json +42 -0
- package/.claude/settings.json +284 -284
- package/.claude/settings.json.bak +526 -526
- 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/agentic-jujutsu/SKILL.md +645 -645
- 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/hive-mind-advanced/SKILL.md +709 -709
- package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
- package/.claude/skills/pair-programming/SKILL.md +1202 -1202
- package/.claude/skills/performance-analysis/SKILL.md +560 -560
- 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/.claude/skills/worker-benchmarks/SKILL.md +129 -129
- package/.claude/skills/worker-integration/SKILL.md +147 -147
- package/.claude/statusline-command.sh +176 -176
- package/.claude/statusline.mjs +109 -109
- package/.claude/statusline.sh +431 -431
- package/.claude/workflows/full-system-test.js +65 -65
- package/.claude/workflows/intelligence-system-hardening.js +120 -120
- package/.claude/workflows/plugin-contract-audit.js +91 -91
- package/.claude-plugin/README.md +720 -720
- package/.claude-plugin/docs/INSTALLATION.md +261 -261
- package/.claude-plugin/docs/PLUGIN_SUMMARY.md +361 -361
- package/.claude-plugin/docs/QUICKSTART.md +361 -361
- package/.claude-plugin/docs/STRUCTURE.md +128 -128
- package/.claude-plugin/hooks/hooks.json +79 -77
- package/.claude-plugin/marketplace.json +185 -185
- package/.claude-plugin/plugin.json +71 -71
- package/.claude-plugin/scripts/install.sh +234 -234
- package/.claude-plugin/scripts/ruflo-hook.cjs +166 -166
- package/.claude-plugin/scripts/ruflo-hook.sh +52 -52
- package/.claude-plugin/scripts/uninstall.sh +36 -36
- package/.claude-plugin/scripts/verify.sh +108 -108
- package/LICENSE +21 -21
- package/README.md +419 -419
- package/bin/cli.js +11 -11
- package/bin/npx-repair.js +7 -7
- package/bin/npx-safe-launch.js +9 -9
- package/package.json +192 -186
- package/v3/@claude-flow/cli/README.md +419 -419
- package/v3/@claude-flow/cli/bin/cli.js +314 -314
- package/v3/@claude-flow/cli/bin/mcp-server.js +224 -224
- package/v3/@claude-flow/cli/bin/preinstall.cjs +2 -2
- package/v3/@claude-flow/cli/catalog-manifest.json +2 -2
- package/v3/@claude-flow/cli/dist/src/autopilot-state.js +24 -7
- package/v3/@claude-flow/cli/dist/src/benchmarks/gaia-critic.js +24 -24
- package/v3/@claude-flow/cli/dist/src/business-pods/bbs-budget-tracker.js +53 -53
- package/v3/@claude-flow/cli/dist/src/commands/completions.js +409 -409
- package/v3/@claude-flow/cli/dist/src/commands/daemon.js +44 -44
- package/v3/@claude-flow/cli/dist/src/commands/doctor.js +267 -20
- package/v3/@claude-flow/cli/dist/src/commands/embeddings.js +26 -26
- package/v3/@claude-flow/cli/dist/src/commands/hive-mind.js +97 -97
- package/v3/@claude-flow/cli/dist/src/commands/hooks.js +74 -11
- package/v3/@claude-flow/cli/dist/src/commands/init.js +202 -34
- package/v3/@claude-flow/cli/dist/src/commands/memory.js +12 -1
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/backup.js +23 -23
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/benchmark.js +31 -31
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/import.js +14 -14
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/init.js +115 -115
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/migrate.js +99 -99
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/optimize.js +51 -51
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/setup.js +624 -624
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/status.js +38 -38
- package/v3/@claude-flow/cli/dist/src/config/proven-config.js +2 -2
- package/v3/@claude-flow/cli/dist/src/funnel/disclosure.js +13 -2
- package/v3/@claude-flow/cli/dist/src/funnel/message-transport.d.ts +11 -4
- package/v3/@claude-flow/cli/dist/src/funnel/message-transport.js +11 -4
- package/v3/@claude-flow/cli/dist/src/funnel/messages.d.ts +12 -10
- package/v3/@claude-flow/cli/dist/src/funnel/messages.js +83 -11
- package/v3/@claude-flow/cli/dist/src/init/claudemd-generator.js +231 -231
- package/v3/@claude-flow/cli/dist/src/init/executor.js +453 -453
- package/v3/@claude-flow/cli/dist/src/init/helper-signing.js +2 -2
- package/v3/@claude-flow/cli/dist/src/init/helpers-generator.js +751 -751
- package/v3/@claude-flow/cli/dist/src/init/statusline-generator.js +24 -24
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agentdb-tools.js +15 -15
- package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-intent-tools.js +19 -19
- package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-tools.js +8 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.js +21 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/memory-tools.js +4 -3
- package/v3/@claude-flow/cli/dist/src/memory/graph-edge-writer.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/memory/graph-edge-writer.js +35 -22
- package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.js +189 -93
- package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.js +479 -407
- package/v3/@claude-flow/cli/dist/src/memory/rabitq-index.js +5 -5
- package/v3/@claude-flow/cli/dist/src/parser.js +25 -9
- package/v3/@claude-flow/cli/dist/src/proxy/verify.js +2 -2
- package/v3/@claude-flow/cli/dist/src/runtime/headless.js +28 -28
- package/v3/@claude-flow/cli/dist/src/services/distill-tuning.js +7 -7
- package/v3/@claude-flow/cli/dist/src/services/headless-worker-executor.js +84 -84
- package/v3/@claude-flow/cli/dist/src/services/memory-distillation.js +4 -4
- package/v3/@claude-flow/cli/dist/src/services/worker-daemon.js +7 -4
- package/v3/@claude-flow/cli/dist/src/transfer/deploy-seraphine.js +23 -23
- package/v3/@claude-flow/cli/package.json +137 -135
- package/v3/@claude-flow/guidance/README.md +1195 -1195
- package/v3/@claude-flow/guidance/package.json +198 -198
- package/v3/@claude-flow/shared/README.md +323 -323
- package/v3/@claude-flow/shared/dist/events/event-store.js +31 -31
- package/v3/@claude-flow/shared/dist/hooks/safety/git-commit.js +3 -3
- package/v3/@claude-flow/shared/package.json +43 -43
- package/v3/README.md +493 -493
|
@@ -1431,33 +1431,33 @@ const installSupervisorCommand = {
|
|
|
1431
1431
|
const plistDir = join(home, 'Library', 'LaunchAgents');
|
|
1432
1432
|
const plistPath = join(plistDir, 'io.ruv.ruflo.daemon.plist');
|
|
1433
1433
|
const logDir = join(projectRoot, '.claude-flow', 'logs');
|
|
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>
|
|
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>
|
|
1461
1461
|
`;
|
|
1462
1462
|
if (dryRun) {
|
|
1463
1463
|
output.writeln(plist);
|
|
@@ -1498,23 +1498,23 @@ const installSupervisorCommand = {
|
|
|
1498
1498
|
// Linux: systemd-user
|
|
1499
1499
|
const unitDir = join(home, '.config', 'systemd', 'user');
|
|
1500
1500
|
const unitPath = join(unitDir, 'ruflo-daemon.service');
|
|
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
|
|
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
|
|
1518
1518
|
`;
|
|
1519
1519
|
if (dryRun) {
|
|
1520
1520
|
output.writeln(unit);
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Created with ruv.io
|
|
6
6
|
*/
|
|
7
7
|
import { output } from '../output.js';
|
|
8
|
-
import { existsSync, readFileSync, statSync } from 'fs';
|
|
8
|
+
import { existsSync, readFileSync, statSync, openSync, readSync, closeSync } from 'fs';
|
|
9
9
|
import { join, dirname } from 'path';
|
|
10
10
|
import { fileURLToPath } from 'url';
|
|
11
11
|
import { createHash } from 'crypto';
|
|
@@ -216,6 +216,16 @@ async function checkDaemonStatus() {
|
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
// Check memory database
|
|
219
|
+
//
|
|
220
|
+
// #2737: renamed the reported row from "Memory Database" to "Memory Database
|
|
221
|
+
// Presence" — this check is existsSync()+statSync() ONLY, it never opens the
|
|
222
|
+
// file or queries it, so it PASSES for any file that exists and can be
|
|
223
|
+
// stat'd, corrupt or not. It was the ONLY memory probe in the default
|
|
224
|
+
// `allChecks` run (the real integrity checks were --component memory only),
|
|
225
|
+
// so a corrupt .swarm/memory.db could sail through a bare `doctor` run as
|
|
226
|
+
// "healthy". The name change makes the check's actual scope honest; the
|
|
227
|
+
// behavior below is unchanged. See checkMemoryStructuralIntegrity below for
|
|
228
|
+
// the new default-run check that actually opens the file.
|
|
219
229
|
async function checkMemoryDatabase() {
|
|
220
230
|
// Authoritative path comes from `getMemoryRoot()` (honors
|
|
221
231
|
// `CLAUDE_FLOW_MEMORY_PATH`, claude-flow.config.json's `memory.persistPath`,
|
|
@@ -238,14 +248,14 @@ async function checkMemoryDatabase() {
|
|
|
238
248
|
try {
|
|
239
249
|
const stats = statSync(dbPath);
|
|
240
250
|
const sizeMB = (stats.size / 1024 / 1024).toFixed(2);
|
|
241
|
-
return { name: 'Memory Database', status: 'pass', message: `${dbPath} (${sizeMB} MB)` };
|
|
251
|
+
return { name: 'Memory Database Presence', status: 'pass', message: `${dbPath} (${sizeMB} MB) — existence/size only, not a health check (see Memory Structural Integrity)` };
|
|
242
252
|
}
|
|
243
253
|
catch {
|
|
244
|
-
return { name: 'Memory Database', status: 'warn', message: `${dbPath} (unable to stat)` };
|
|
254
|
+
return { name: 'Memory Database Presence', status: 'warn', message: `${dbPath} (unable to stat)` };
|
|
245
255
|
}
|
|
246
256
|
}
|
|
247
257
|
}
|
|
248
|
-
return { name: 'Memory Database', status: 'warn', message: 'Not initialized', fix: 'claude-flow memory configure --backend hybrid' };
|
|
258
|
+
return { name: 'Memory Database Presence', status: 'warn', message: 'Not initialized', fix: 'claude-flow memory configure --backend hybrid' };
|
|
249
259
|
}
|
|
250
260
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
251
261
|
// #2677 — memory doctor: functional checks (stuinfla)
|
|
@@ -305,46 +315,282 @@ async function tryOpenSqlJs(dbPath) {
|
|
|
305
315
|
return null;
|
|
306
316
|
}
|
|
307
317
|
}
|
|
308
|
-
//
|
|
309
|
-
//
|
|
310
|
-
//
|
|
311
|
-
//
|
|
312
|
-
//
|
|
318
|
+
// ── #2737 shared helpers: encryption-at-rest carve-out ─────────────────────
|
|
319
|
+
//
|
|
320
|
+
// "file is not a database" / "malformed" from sql.js or better-sqlite3 is
|
|
321
|
+
// EXACTLY the signal a legitimately RFE1-encrypted-at-rest memory.db also
|
|
322
|
+
// produces when opened without decrypting (ADR-096). Before either the new
|
|
323
|
+
// default-run check or the strengthened checkMemoryIntegrity below concludes
|
|
324
|
+
// "malformed = fail", they sniff for the RFE1 magic using the SAME detector
|
|
325
|
+
// checkEncryptionAtRest uses (isEncryptedBlob), so the two checks can never
|
|
326
|
+
// disagree about what counts as "encrypted".
|
|
327
|
+
/** Read just the first `len` bytes of a file without loading the whole file
|
|
328
|
+
* into memory — a multi-GB memory.db shouldn't get fully buffered just to
|
|
329
|
+
* check a 4-byte magic. Returns fewer bytes (or empty) when the file is
|
|
330
|
+
* shorter than `len`; isEncryptedBlob() correctly treats a too-short blob
|
|
331
|
+
* as "not encrypted", so callers don't need to special-case that. */
|
|
332
|
+
function readHeaderBytes(path, len) {
|
|
333
|
+
const fd = openSync(path, 'r');
|
|
334
|
+
try {
|
|
335
|
+
const buf = Buffer.alloc(len);
|
|
336
|
+
const bytesRead = readSync(fd, buf, 0, len, 0);
|
|
337
|
+
return buf.subarray(0, bytesRead);
|
|
338
|
+
}
|
|
339
|
+
finally {
|
|
340
|
+
closeSync(fd);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// RFE1 wire format is magic(4) + iv(12) + ciphertext(N) + tag(16); the
|
|
344
|
+
// shortest possible blob is 32 bytes. 64 gives headroom without importing
|
|
345
|
+
// vault.ts's private MIN_BLOB_LEN constant.
|
|
346
|
+
const ENCRYPTION_SNIFF_LEN = 64;
|
|
347
|
+
/** True iff `dbPath` is a legitimately RFE1-encrypted-at-rest file. A read
|
|
348
|
+
* failure (permissions, races) is treated as "not encrypted" — callers
|
|
349
|
+
* still hit their own open/query error handling right after, so nothing
|
|
350
|
+
* gets silently swallowed. */
|
|
351
|
+
function isMemoryDbEncryptedAtRest(dbPath) {
|
|
352
|
+
try {
|
|
353
|
+
return isEncryptedBlob(readHeaderBytes(dbPath, ENCRYPTION_SNIFF_LEN));
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// #2737 part 1 — bare `doctor` (no --component flag) never actually opened
|
|
360
|
+
// memory.db: checkMemoryDatabase above is existsSync()+statSync() only, so
|
|
361
|
+
// it PASSES on any file that exists and can be stat'd, corrupt or not, and
|
|
362
|
+
// it was the ONLY memory probe `allChecks` ran. The real integrity checks
|
|
363
|
+
// (checkMemoryIntegrity/Content/EmbeddingCoverage below) were, and remain,
|
|
364
|
+
// --component memory only.
|
|
365
|
+
//
|
|
366
|
+
// This is a NEW, cheaper, native check added to the default `allChecks` run
|
|
367
|
+
// (not a replacement for the deep trio):
|
|
368
|
+
// - better-sqlite3 (native) instead of sql.js: it's WAL-aware because
|
|
369
|
+
// SQLite itself resolves any sibling -wal file next to the main image;
|
|
370
|
+
// sql.js is WAL-blind — tryOpenSqlJs() above only readFileSync()s the
|
|
371
|
+
// main file and hands the raw bytes to the WASM build, so any
|
|
372
|
+
// committed-but-not-checkpointed rows sitting in a -wal file are
|
|
373
|
+
// invisible to it.
|
|
374
|
+
// - PRAGMA quick_check, not integrity_check: per sqlite.org, quick_check
|
|
375
|
+
// "is like integrity_check except that it does not verify UNIQUE
|
|
376
|
+
// constraints and does not verify that index content matches table
|
|
377
|
+
// content" — bounded enough to run unconditionally on every bare
|
|
378
|
+
// `doctor` call. The full integrity_check (with those extra
|
|
379
|
+
// cross-checks) is what the strengthened checkMemoryIntegrity below
|
|
380
|
+
// runs when better-sqlite3 is available.
|
|
381
|
+
// Explicitly labeled "structural-only" in both the row name and every
|
|
382
|
+
// message so nobody mistakes this cheap default-run probe for the deeper
|
|
383
|
+
// --component memory one.
|
|
384
|
+
async function checkMemoryStructuralIntegrity() {
|
|
385
|
+
const NAME = 'Memory Structural Integrity (quick_check)';
|
|
386
|
+
const dbPath = await resolveMemoryDbPath();
|
|
387
|
+
if (!dbPath) {
|
|
388
|
+
// Not-yet-initialized project — Memory Database Presence above already
|
|
389
|
+
// surfaces this; "UNKNOWN is never PASS" still applies, so this stays a
|
|
390
|
+
// warn rather than a silent skip, but doesn't pile on a second red for
|
|
391
|
+
// the same root cause.
|
|
392
|
+
return {
|
|
393
|
+
name: NAME,
|
|
394
|
+
status: 'warn',
|
|
395
|
+
message: 'no memory.db found (see Memory Database Presence above) — structural-only check skipped',
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
// Encryption-at-rest carve-out (#2737 part 3) — see helpers above.
|
|
399
|
+
if (isMemoryDbEncryptedAtRest(dbPath)) {
|
|
400
|
+
return {
|
|
401
|
+
name: NAME,
|
|
402
|
+
status: 'warn',
|
|
403
|
+
message: `${dbPath} — RFE1-encrypted at rest; structural-only check can't run without decrypting (expected, not corruption — see Encryption at Rest)`,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
let Database;
|
|
407
|
+
try {
|
|
408
|
+
Database = (await import('better-sqlite3')).default;
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
return {
|
|
412
|
+
name: NAME,
|
|
413
|
+
status: 'warn',
|
|
414
|
+
message: `${dbPath} — better-sqlite3 not installed; structural-only check skipped (optional native module)`,
|
|
415
|
+
fix: 'npm install better-sqlite3 (enables WAL-aware structural checks on every `doctor` run)',
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
let db;
|
|
419
|
+
try {
|
|
420
|
+
db = new Database(dbPath, { readonly: true, fileMustExist: true });
|
|
421
|
+
}
|
|
422
|
+
catch (e) {
|
|
423
|
+
const msg = e.message || String(e);
|
|
424
|
+
// Encryption already ruled out above — an unencrypted file
|
|
425
|
+
// better-sqlite3 can't even open is definitive corruption.
|
|
426
|
+
// #2737 part 3: fail, not warn.
|
|
427
|
+
return {
|
|
428
|
+
name: NAME,
|
|
429
|
+
status: 'fail',
|
|
430
|
+
message: `${dbPath} — better-sqlite3 failed to open: ${msg} (unencrypted; definitively malformed) [structural-only]`,
|
|
431
|
+
fix: 'back up .swarm/memory.db then `claude-flow memory init --force`',
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
try {
|
|
435
|
+
const rows = db.pragma('quick_check');
|
|
436
|
+
const values = rows.map((r) => String(Object.values(r)[0]));
|
|
437
|
+
if (values.length === 1 && values[0] === 'ok') {
|
|
438
|
+
return {
|
|
439
|
+
name: NAME,
|
|
440
|
+
status: 'pass',
|
|
441
|
+
message: `${dbPath} — PRAGMA quick_check: ok [structural-only, native + WAL-aware]`,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
return {
|
|
445
|
+
name: NAME,
|
|
446
|
+
status: 'fail',
|
|
447
|
+
message: `${dbPath} — PRAGMA quick_check: ${values.slice(0, 3).join('; ')}${values.length > 3 ? ` (+${values.length - 3} more)` : ''} [structural-only]`,
|
|
448
|
+
fix: 'back up .swarm/memory.db then `claude-flow memory init --force`',
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
catch (e) {
|
|
452
|
+
const msg = e.message || String(e);
|
|
453
|
+
// Encryption ruled out above; DB opened but the pragma itself threw —
|
|
454
|
+
// still definitive, unencrypted breakage. Fail, not warn.
|
|
455
|
+
return {
|
|
456
|
+
name: NAME,
|
|
457
|
+
status: 'fail',
|
|
458
|
+
message: `${dbPath} — quick_check probe threw: ${msg} (unencrypted) [structural-only]`,
|
|
459
|
+
fix: 'back up .swarm/memory.db then `claude-flow memory init --force`',
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
finally {
|
|
463
|
+
try {
|
|
464
|
+
db.close();
|
|
465
|
+
}
|
|
466
|
+
catch { /* best-effort */ }
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
// Check 1 (--component memory, deep path) — #2737 part 2 strengthens this:
|
|
470
|
+
// prefer native better-sqlite3 PRAGMA integrity_check (adds index↔table
|
|
471
|
+
// cross-checking + UNIQUE verification that quick_check above deliberately
|
|
472
|
+
// skips, and is WAL-aware — see checkMemoryStructuralIntegrity's comment)
|
|
473
|
+
// when better-sqlite3 is available, falling back to the original sql.js
|
|
474
|
+
// probe when it's not. The sql.js fallback is main-image-only (WAL-blind);
|
|
475
|
+
// its message says so explicitly so operators know its limits.
|
|
476
|
+
//
|
|
477
|
+
// #2737 part 3: with the encryption carve-out applied up front on BOTH
|
|
478
|
+
// paths, a "file is not a database" / "malformed" result is now definitive,
|
|
479
|
+
// unencrypted corruption in every branch below — fail, not warn (the
|
|
480
|
+
// previous version treated this as an ambiguous warn because it couldn't
|
|
481
|
+
// tell corruption from encryption; that ambiguity is what the carve-out
|
|
482
|
+
// resolves).
|
|
313
483
|
async function checkMemoryIntegrity() {
|
|
314
484
|
const dbPath = await resolveMemoryDbPath();
|
|
315
485
|
if (!dbPath)
|
|
316
|
-
return { name: 'Memory Integrity', status: 'warn', message: 'no memory.db found (see Memory Database check above)' };
|
|
486
|
+
return { name: 'Memory Integrity', status: 'warn', message: 'no memory.db found (see Memory Database Presence check above)' };
|
|
487
|
+
if (isMemoryDbEncryptedAtRest(dbPath)) {
|
|
488
|
+
return {
|
|
489
|
+
name: 'Memory Integrity',
|
|
490
|
+
status: 'warn',
|
|
491
|
+
message: `${dbPath} — RFE1-encrypted at rest; integrity check can't run without decrypting (expected, not corruption — see Encryption at Rest)`,
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
// Prefer native better-sqlite3 (WAL-aware, full integrity_check). Module
|
|
495
|
+
// load is isolated in its own try/catch so ONLY "not installed" falls
|
|
496
|
+
// through to the sql.js fallback below — once the module loaded, any
|
|
497
|
+
// open/query failure is resolved (fail) right here, not silently
|
|
498
|
+
// reclassified as "sql.js fallback, main-image-only" by an outer catch.
|
|
499
|
+
let Database;
|
|
500
|
+
try {
|
|
501
|
+
Database = (await import('better-sqlite3')).default;
|
|
502
|
+
}
|
|
503
|
+
catch {
|
|
504
|
+
Database = null; // not installed — fall through to the sql.js fallback below.
|
|
505
|
+
}
|
|
506
|
+
if (Database) {
|
|
507
|
+
let db;
|
|
508
|
+
try {
|
|
509
|
+
db = new Database(dbPath, { readonly: true, fileMustExist: true });
|
|
510
|
+
}
|
|
511
|
+
catch (e) {
|
|
512
|
+
const msg = e.message || String(e);
|
|
513
|
+
return {
|
|
514
|
+
name: 'Memory Integrity',
|
|
515
|
+
status: 'fail',
|
|
516
|
+
message: `${dbPath} — better-sqlite3 failed to open: ${msg} (unencrypted; definitively malformed) [native, WAL-aware]`,
|
|
517
|
+
fix: 'back up .swarm/memory.db then `claude-flow memory init --force`',
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
try {
|
|
521
|
+
const rows = db.pragma('integrity_check');
|
|
522
|
+
const values = rows.map((r) => String(Object.values(r)[0]));
|
|
523
|
+
if (values.length === 1 && values[0] === 'ok') {
|
|
524
|
+
return { name: 'Memory Integrity', status: 'pass', message: `${dbPath} — PRAGMA integrity_check: ok [native, WAL-aware]` };
|
|
525
|
+
}
|
|
526
|
+
return {
|
|
527
|
+
name: 'Memory Integrity',
|
|
528
|
+
status: 'fail',
|
|
529
|
+
message: `${dbPath} — PRAGMA integrity_check: ${values.slice(0, 3).join('; ')}${values.length > 3 ? ` (+${values.length - 3} more)` : ''} [native, WAL-aware]`,
|
|
530
|
+
fix: 'back up .swarm/memory.db then `claude-flow memory init --force`',
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
catch (e) {
|
|
534
|
+
// DB opened but the pragma itself threw — still definitive,
|
|
535
|
+
// unencrypted breakage (encryption ruled out above). Fail, not warn,
|
|
536
|
+
// and NOT a fall-through to the sql.js fallback: better-sqlite3 IS
|
|
537
|
+
// installed and just gave us the answer.
|
|
538
|
+
const msg = e.message || String(e);
|
|
539
|
+
return {
|
|
540
|
+
name: 'Memory Integrity',
|
|
541
|
+
status: 'fail',
|
|
542
|
+
message: `${dbPath} — integrity_check probe threw: ${msg} (unencrypted; definitively malformed) [native, WAL-aware]`,
|
|
543
|
+
fix: 'back up .swarm/memory.db then `claude-flow memory init --force`',
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
finally {
|
|
547
|
+
try {
|
|
548
|
+
db.close();
|
|
549
|
+
}
|
|
550
|
+
catch { /* best-effort */ }
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
// Fallback: sql.js — main-image-only (WAL-blind). tryOpenSqlJs()
|
|
554
|
+
// readFileSync()s the base file directly, so any committed-but-not-
|
|
555
|
+
// checkpointed rows sitting in a sibling -wal file are invisible here.
|
|
556
|
+
// Install better-sqlite3 for the WAL-aware path above.
|
|
317
557
|
const db = await tryOpenSqlJs(dbPath);
|
|
318
558
|
if (!db) {
|
|
559
|
+
// Encryption already ruled out above — an unencrypted file sql.js can't
|
|
560
|
+
// even open is definitive corruption too.
|
|
319
561
|
return {
|
|
320
562
|
name: 'Memory Integrity',
|
|
321
|
-
status: '
|
|
322
|
-
message: `${dbPath} — sql.js can't open (
|
|
323
|
-
fix: '
|
|
563
|
+
status: 'fail',
|
|
564
|
+
message: `${dbPath} — sql.js can't open (unencrypted; definitively malformed) [main-image-only fallback — install better-sqlite3 for WAL-aware checking]`,
|
|
565
|
+
fix: 'back up .swarm/memory.db then `claude-flow memory init --force`',
|
|
324
566
|
};
|
|
325
567
|
}
|
|
326
568
|
try {
|
|
327
569
|
const res = db.exec('PRAGMA integrity_check');
|
|
328
570
|
const rows = res[0]?.values?.map((v) => String(v[0])) ?? [];
|
|
329
571
|
if (rows.length === 1 && rows[0] === 'ok') {
|
|
330
|
-
return { name: 'Memory Integrity', status: 'pass', message: `${dbPath} — PRAGMA integrity_check: ok` };
|
|
572
|
+
return { name: 'Memory Integrity', status: 'pass', message: `${dbPath} — PRAGMA integrity_check: ok [main-image-only fallback — sql.js can't see WAL-only data; install better-sqlite3 for full coverage]` };
|
|
331
573
|
}
|
|
332
574
|
return {
|
|
333
575
|
name: 'Memory Integrity',
|
|
334
576
|
status: 'fail',
|
|
335
|
-
message: `${dbPath} — PRAGMA integrity_check: ${rows.slice(0, 3).join('; ')}${rows.length > 3 ? ` (+${rows.length - 3} more)` : ''}`,
|
|
577
|
+
message: `${dbPath} — PRAGMA integrity_check: ${rows.slice(0, 3).join('; ')}${rows.length > 3 ? ` (+${rows.length - 3} more)` : ''} [main-image-only fallback]`,
|
|
336
578
|
fix: 'back up .swarm/memory.db then `claude-flow memory init --force`',
|
|
337
579
|
};
|
|
338
580
|
}
|
|
339
581
|
catch (e) {
|
|
340
582
|
const msg = e.message || String(e);
|
|
341
|
-
const
|
|
583
|
+
const definitivelyMalformed = msg.includes('file is not a database') || msg.includes('malformed');
|
|
584
|
+
// Encryption already ruled out above, so — matched pattern or not —
|
|
585
|
+
// this is a query refusal on a file we KNOW isn't RFE1-encrypted.
|
|
586
|
+
// #2737 part 3: fail, not warn.
|
|
342
587
|
return {
|
|
343
588
|
name: 'Memory Integrity',
|
|
344
|
-
status: '
|
|
345
|
-
message:
|
|
346
|
-
? `${dbPath} — DB refused query: ${msg} (
|
|
347
|
-
: `${dbPath} — probe threw: ${msg}`,
|
|
589
|
+
status: 'fail',
|
|
590
|
+
message: definitivelyMalformed
|
|
591
|
+
? `${dbPath} — DB refused query: ${msg} (unencrypted; definitively malformed) [main-image-only fallback]`
|
|
592
|
+
: `${dbPath} — probe threw: ${msg} (unencrypted — encryption ruled out above) [main-image-only fallback]`,
|
|
593
|
+
fix: 'back up .swarm/memory.db then `claude-flow memory init --force`',
|
|
348
594
|
};
|
|
349
595
|
}
|
|
350
596
|
finally {
|
|
@@ -1715,6 +1961,7 @@ export const doctorCommand = {
|
|
|
1715
1961
|
checkStaleSettingsNpx, // #2448 — runaway `npx @latest` in statusLine/hooks
|
|
1716
1962
|
checkDaemonStatus,
|
|
1717
1963
|
checkMemoryDatabase,
|
|
1964
|
+
checkMemoryStructuralIntegrity, // #2737 — bounded, native quick_check on every default run
|
|
1718
1965
|
checkLearningBridge, // #2545 — can the auto-memory hook actually load @claude-flow/memory?
|
|
1719
1966
|
checkApiKeys,
|
|
1720
1967
|
checkMcpServers,
|
|
@@ -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`);
|