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
|
@@ -1,430 +1,430 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Auto Memory Bridge Hook (ADR-048/049)
|
|
4
|
-
*
|
|
5
|
-
* Wires AutoMemoryBridge + LearningBridge + MemoryGraph into Claude Code
|
|
6
|
-
* session lifecycle. Called by settings.json SessionStart/SessionEnd hooks.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* node auto-memory-hook.mjs import # SessionStart: import auto memory files into backend
|
|
10
|
-
* node auto-memory-hook.mjs sync # SessionEnd: sync insights back to MEMORY.md
|
|
11
|
-
* node auto-memory-hook.mjs status # Show bridge status
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
15
|
-
import { join, dirname } from 'path';
|
|
16
|
-
import { fileURLToPath } from 'url';
|
|
17
|
-
|
|
18
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
-
const __dirname = dirname(__filename);
|
|
20
|
-
const PROJECT_ROOT = join(__dirname, '../..');
|
|
21
|
-
const DATA_DIR = join(PROJECT_ROOT, '.claude-flow', 'data');
|
|
22
|
-
const STORE_PATH = join(DATA_DIR, 'auto-memory-store.json');
|
|
23
|
-
|
|
24
|
-
// Colors
|
|
25
|
-
const GREEN = '\x1b[0;32m';
|
|
26
|
-
const CYAN = '\x1b[0;36m';
|
|
27
|
-
const DIM = '\x1b[2m';
|
|
28
|
-
const RESET = '\x1b[0m';
|
|
29
|
-
|
|
30
|
-
const YELLOW = '\x1b[0;33m';
|
|
31
|
-
const log = (msg) => console.log(`${CYAN}[AutoMemory] ${msg}${RESET}`);
|
|
32
|
-
const success = (msg) => console.log(`${GREEN}[AutoMemory] ✓ ${msg}${RESET}`);
|
|
33
|
-
const dim = (msg) => console.log(` ${DIM}${msg}${RESET}`);
|
|
34
|
-
|
|
35
|
-
// #2545: fail LOUD instead of a silent dim skip. When @claude-flow/memory cannot
|
|
36
|
-
// be resolved, self-learning imports are a no-op — the user must see this and be
|
|
37
|
-
// told exactly how to fix it (on both stdout, so it shows in the Claude Code hook
|
|
38
|
-
// transcript, and stderr, per the issue's requested channel).
|
|
39
|
-
function warnMemoryUnavailable() {
|
|
40
|
-
const line1 = `[AutoMemory] @claude-flow/memory not resolvable from ${PROJECT_ROOT} — self-learning imports are DISABLED.`;
|
|
41
|
-
const line2 = ' Fix: npm i -D @claude-flow/memory (or re-run: npx ruflo@latest init, then npx ruflo@latest doctor --fix)';
|
|
42
|
-
console.log(`${YELLOW}${line1}${RESET}`);
|
|
43
|
-
console.log(`${YELLOW}${line2}${RESET}`);
|
|
44
|
-
process.stderr.write(`${line1}\n${line2}\n`);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const DEBUG = !!(process.env.RUFLO_DEBUG || process.env.DEBUG);
|
|
48
|
-
|
|
49
|
-
// ── Graceful shutdown (FIX 3) ───────────────────────────────────────────────
|
|
50
|
-
// Track the backend in use so a SIGTERM/SIGINT mid-run can still flush it
|
|
51
|
-
// (the JSON backend persists; a SQLite-backed one closes/flushes WAL) instead
|
|
52
|
-
// of leaving a half-written store or a stale lock behind.
|
|
53
|
-
let activeBackend = null;
|
|
54
|
-
let shuttingDown = false;
|
|
55
|
-
function trackBackend(b) { activeBackend = b; return b; }
|
|
56
|
-
async function gracefulExit(signal) {
|
|
57
|
-
if (shuttingDown) return;
|
|
58
|
-
shuttingDown = true;
|
|
59
|
-
if (DEBUG) process.stderr.write(`[AutoMemory] received ${signal}, flushing backend before exit\n`);
|
|
60
|
-
try {
|
|
61
|
-
if (activeBackend && typeof activeBackend.shutdown === 'function') await activeBackend.shutdown();
|
|
62
|
-
} catch { /* best effort — never block exit on cleanup */ }
|
|
63
|
-
process.exit(0);
|
|
64
|
-
}
|
|
65
|
-
process.on('SIGTERM', () => { gracefulExit('SIGTERM'); });
|
|
66
|
-
process.on('SIGINT', () => { gracefulExit('SIGINT'); });
|
|
67
|
-
|
|
68
|
-
// Ensure data dir
|
|
69
|
-
if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
|
|
70
|
-
|
|
71
|
-
// ============================================================================
|
|
72
|
-
// Simple JSON File Backend (implements IMemoryBackend interface)
|
|
73
|
-
// ============================================================================
|
|
74
|
-
|
|
75
|
-
class JsonFileBackend {
|
|
76
|
-
constructor(filePath) {
|
|
77
|
-
this.filePath = filePath;
|
|
78
|
-
this.entries = new Map();
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
async initialize() {
|
|
82
|
-
if (existsSync(this.filePath)) {
|
|
83
|
-
try {
|
|
84
|
-
const data = JSON.parse(readFileSync(this.filePath, 'utf-8'));
|
|
85
|
-
if (Array.isArray(data)) {
|
|
86
|
-
for (const entry of data) this.entries.set(entry.id, entry);
|
|
87
|
-
}
|
|
88
|
-
} catch { /* start fresh */ }
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
async shutdown() { this._persist(); }
|
|
93
|
-
async store(entry) { this.entries.set(entry.id, entry); this._persist(); }
|
|
94
|
-
async get(id) { return this.entries.get(id) ?? null; }
|
|
95
|
-
async getByKey(key, ns) {
|
|
96
|
-
for (const e of this.entries.values()) {
|
|
97
|
-
if (e.key === key && (!ns || e.namespace === ns)) return e;
|
|
98
|
-
}
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
async update(id, updates) {
|
|
102
|
-
const e = this.entries.get(id);
|
|
103
|
-
if (!e) return null;
|
|
104
|
-
if (updates.metadata) Object.assign(e.metadata, updates.metadata);
|
|
105
|
-
if (updates.content !== undefined) e.content = updates.content;
|
|
106
|
-
if (updates.tags) e.tags = updates.tags;
|
|
107
|
-
e.updatedAt = Date.now();
|
|
108
|
-
this._persist();
|
|
109
|
-
return e;
|
|
110
|
-
}
|
|
111
|
-
async delete(id) { return this.entries.delete(id); }
|
|
112
|
-
async query(opts) {
|
|
113
|
-
let results = [...this.entries.values()];
|
|
114
|
-
if (opts?.namespace) results = results.filter(e => e.namespace === opts.namespace);
|
|
115
|
-
if (opts?.type) results = results.filter(e => e.type === opts.type);
|
|
116
|
-
if (opts?.limit) results = results.slice(0, opts.limit);
|
|
117
|
-
return results;
|
|
118
|
-
}
|
|
119
|
-
async search() { return []; } // No vector search in JSON backend
|
|
120
|
-
async bulkInsert(entries) { for (const e of entries) this.entries.set(e.id, e); this._persist(); }
|
|
121
|
-
async bulkDelete(ids) { let n = 0; for (const id of ids) { if (this.entries.delete(id)) n++; } this._persist(); return n; }
|
|
122
|
-
async count() { return this.entries.size; }
|
|
123
|
-
async listNamespaces() {
|
|
124
|
-
const ns = new Set();
|
|
125
|
-
for (const e of this.entries.values()) ns.add(e.namespace || 'default');
|
|
126
|
-
return [...ns];
|
|
127
|
-
}
|
|
128
|
-
async clearNamespace(ns) {
|
|
129
|
-
let n = 0;
|
|
130
|
-
for (const [id, e] of this.entries) {
|
|
131
|
-
if (e.namespace === ns) { this.entries.delete(id); n++; }
|
|
132
|
-
}
|
|
133
|
-
this._persist();
|
|
134
|
-
return n;
|
|
135
|
-
}
|
|
136
|
-
async getStats() {
|
|
137
|
-
return {
|
|
138
|
-
totalEntries: this.entries.size,
|
|
139
|
-
entriesByNamespace: {},
|
|
140
|
-
entriesByType: { semantic: 0, episodic: 0, procedural: 0, working: 0, cache: 0 },
|
|
141
|
-
memoryUsage: 0, avgQueryTime: 0, avgSearchTime: 0,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
async healthCheck() {
|
|
145
|
-
return {
|
|
146
|
-
status: 'healthy',
|
|
147
|
-
components: {
|
|
148
|
-
storage: { status: 'healthy', latency: 0 },
|
|
149
|
-
index: { status: 'healthy', latency: 0 },
|
|
150
|
-
cache: { status: 'healthy', latency: 0 },
|
|
151
|
-
},
|
|
152
|
-
timestamp: Date.now(), issues: [], recommendations: [],
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
_persist() {
|
|
157
|
-
try {
|
|
158
|
-
writeFileSync(this.filePath, JSON.stringify([...this.entries.values()], null, 2), 'utf-8');
|
|
159
|
-
} catch { /* best effort */ }
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// ============================================================================
|
|
164
|
-
// Resolve memory package path (local dev or npm installed)
|
|
165
|
-
// ============================================================================
|
|
166
|
-
|
|
167
|
-
async function loadMemoryPackage() {
|
|
168
|
-
// Strategy 0 (#2545): sidecar recorded by `init` / `doctor --fix`. On the
|
|
169
|
-
// documented `npx ruflo` path @claude-flow/memory (an optionalDependency of
|
|
170
|
-
// the CLI) lands in the npx cache, which is NOT on the walk-up path from the
|
|
171
|
-
// project — so init resolves it from the CLI's own context and records the
|
|
172
|
-
// absolute path here. This is the only strategy that works on that install.
|
|
173
|
-
try {
|
|
174
|
-
const sidecar = join(PROJECT_ROOT, '.claude-flow', 'memory-package.json');
|
|
175
|
-
if (existsSync(sidecar)) {
|
|
176
|
-
const rec = JSON.parse(readFileSync(sidecar, 'utf-8'));
|
|
177
|
-
if (rec?.distPath && existsSync(rec.distPath)) {
|
|
178
|
-
return await import(`file://${rec.distPath}`);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
} catch { /* fall through */ }
|
|
182
|
-
|
|
183
|
-
// Strategy 1: Local dev (built dist)
|
|
184
|
-
const localDist = join(PROJECT_ROOT, 'v3/@claude-flow/memory/dist/index.js');
|
|
185
|
-
if (existsSync(localDist)) {
|
|
186
|
-
try {
|
|
187
|
-
return await import(`file://${localDist}`);
|
|
188
|
-
} catch { /* fall through */ }
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Strategy 2: Use createRequire for CJS-style resolution (handles nested node_modules
|
|
192
|
-
// when installed as a transitive dependency via npx ruflo / npx claude-flow)
|
|
193
|
-
try {
|
|
194
|
-
const { createRequire } = await import('module');
|
|
195
|
-
const require = createRequire(join(PROJECT_ROOT, 'package.json'));
|
|
196
|
-
return require('@claude-flow/memory');
|
|
197
|
-
} catch { /* fall through */ }
|
|
198
|
-
|
|
199
|
-
// Strategy 3: ESM import (works when @claude-flow/memory is a direct dependency)
|
|
200
|
-
try {
|
|
201
|
-
return await import('@claude-flow/memory');
|
|
202
|
-
} catch { /* fall through */ }
|
|
203
|
-
|
|
204
|
-
// Strategy 4: Walk up from PROJECT_ROOT looking for @claude-flow/memory in any node_modules
|
|
205
|
-
let searchDir = PROJECT_ROOT;
|
|
206
|
-
const { parse } = await import('path');
|
|
207
|
-
while (searchDir !== parse(searchDir).root) {
|
|
208
|
-
const candidate = join(searchDir, 'node_modules', '@claude-flow', 'memory', 'dist', 'index.js');
|
|
209
|
-
if (existsSync(candidate)) {
|
|
210
|
-
try {
|
|
211
|
-
return await import(`file://${candidate}`);
|
|
212
|
-
} catch { /* fall through */ }
|
|
213
|
-
}
|
|
214
|
-
searchDir = dirname(searchDir);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
return null;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// ============================================================================
|
|
221
|
-
// Read config from .claude-flow/config.yaml
|
|
222
|
-
// ============================================================================
|
|
223
|
-
|
|
224
|
-
function readConfig() {
|
|
225
|
-
const configPath = join(PROJECT_ROOT, '.claude-flow', 'config.yaml');
|
|
226
|
-
const defaults = {
|
|
227
|
-
learningBridge: { enabled: true, sonaMode: 'balanced', confidenceDecayRate: 0.005, accessBoostAmount: 0.03, consolidationThreshold: 10 },
|
|
228
|
-
memoryGraph: { enabled: true, pageRankDamping: 0.85, maxNodes: 5000, similarityThreshold: 0.8 },
|
|
229
|
-
agentScopes: { enabled: true, defaultScope: 'project' },
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
if (!existsSync(configPath)) return defaults;
|
|
233
|
-
|
|
234
|
-
try {
|
|
235
|
-
const yaml = readFileSync(configPath, 'utf-8');
|
|
236
|
-
// Simple YAML parser for the memory section
|
|
237
|
-
const getBool = (key) => {
|
|
238
|
-
const match = yaml.match(new RegExp(`${key}:\\s*(true|false)`, 'i'));
|
|
239
|
-
return match ? match[1] === 'true' : undefined;
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
const lbEnabled = getBool('learningBridge[\\s\\S]*?enabled');
|
|
243
|
-
if (lbEnabled !== undefined) defaults.learningBridge.enabled = lbEnabled;
|
|
244
|
-
|
|
245
|
-
const mgEnabled = getBool('memoryGraph[\\s\\S]*?enabled');
|
|
246
|
-
if (mgEnabled !== undefined) defaults.memoryGraph.enabled = mgEnabled;
|
|
247
|
-
|
|
248
|
-
const asEnabled = getBool('agentScopes[\\s\\S]*?enabled');
|
|
249
|
-
if (asEnabled !== undefined) defaults.agentScopes.enabled = asEnabled;
|
|
250
|
-
|
|
251
|
-
return defaults;
|
|
252
|
-
} catch {
|
|
253
|
-
return defaults;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// ============================================================================
|
|
258
|
-
// Commands
|
|
259
|
-
// ============================================================================
|
|
260
|
-
|
|
261
|
-
async function doImport() {
|
|
262
|
-
log('Importing auto memory files into bridge...');
|
|
263
|
-
|
|
264
|
-
const memPkg = await loadMemoryPackage();
|
|
265
|
-
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
266
|
-
warnMemoryUnavailable();
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const config = readConfig();
|
|
271
|
-
const backend = trackBackend(new JsonFileBackend(STORE_PATH));
|
|
272
|
-
await backend.initialize();
|
|
273
|
-
|
|
274
|
-
const bridgeConfig = {
|
|
275
|
-
workingDir: PROJECT_ROOT,
|
|
276
|
-
syncMode: 'on-session-end',
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
// Wire learning if enabled and available
|
|
280
|
-
if (config.learningBridge.enabled && memPkg.LearningBridge) {
|
|
281
|
-
bridgeConfig.learning = {
|
|
282
|
-
sonaMode: config.learningBridge.sonaMode,
|
|
283
|
-
confidenceDecayRate: config.learningBridge.confidenceDecayRate,
|
|
284
|
-
accessBoostAmount: config.learningBridge.accessBoostAmount,
|
|
285
|
-
consolidationThreshold: config.learningBridge.consolidationThreshold,
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Wire graph if enabled and available
|
|
290
|
-
if (config.memoryGraph.enabled && memPkg.MemoryGraph) {
|
|
291
|
-
bridgeConfig.graph = {
|
|
292
|
-
pageRankDamping: config.memoryGraph.pageRankDamping,
|
|
293
|
-
maxNodes: config.memoryGraph.maxNodes,
|
|
294
|
-
similarityThreshold: config.memoryGraph.similarityThreshold,
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
const bridge = new memPkg.AutoMemoryBridge(backend, bridgeConfig);
|
|
299
|
-
|
|
300
|
-
try {
|
|
301
|
-
const result = await bridge.importFromAutoMemory();
|
|
302
|
-
success(`Imported ${result.imported} entries (${result.skipped} skipped)`);
|
|
303
|
-
dim(`├─ Backend entries: ${await backend.count()}`);
|
|
304
|
-
dim(`├─ Learning: ${config.learningBridge.enabled ? 'active' : 'disabled'}`);
|
|
305
|
-
dim(`├─ Graph: ${config.memoryGraph.enabled ? 'active' : 'disabled'}`);
|
|
306
|
-
dim(`└─ Agent scopes: ${config.agentScopes.enabled ? 'active' : 'disabled'}`);
|
|
307
|
-
} catch (err) {
|
|
308
|
-
dim(`Import failed (non-critical): ${err.message}`);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
await backend.shutdown();
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
async function doSync() {
|
|
315
|
-
log('Syncing insights to auto memory files...');
|
|
316
|
-
|
|
317
|
-
const memPkg = await loadMemoryPackage();
|
|
318
|
-
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
319
|
-
warnMemoryUnavailable();
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
const config = readConfig();
|
|
324
|
-
const backend = trackBackend(new JsonFileBackend(STORE_PATH));
|
|
325
|
-
await backend.initialize();
|
|
326
|
-
|
|
327
|
-
const entryCount = await backend.count();
|
|
328
|
-
if (entryCount === 0) {
|
|
329
|
-
dim('No entries to sync');
|
|
330
|
-
await backend.shutdown();
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
const bridgeConfig = {
|
|
335
|
-
workingDir: PROJECT_ROOT,
|
|
336
|
-
syncMode: 'on-session-end',
|
|
337
|
-
};
|
|
338
|
-
|
|
339
|
-
if (config.learningBridge.enabled && memPkg.LearningBridge) {
|
|
340
|
-
bridgeConfig.learning = {
|
|
341
|
-
sonaMode: config.learningBridge.sonaMode,
|
|
342
|
-
confidenceDecayRate: config.learningBridge.confidenceDecayRate,
|
|
343
|
-
consolidationThreshold: config.learningBridge.consolidationThreshold,
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
if (config.memoryGraph.enabled && memPkg.MemoryGraph) {
|
|
348
|
-
bridgeConfig.graph = {
|
|
349
|
-
pageRankDamping: config.memoryGraph.pageRankDamping,
|
|
350
|
-
maxNodes: config.memoryGraph.maxNodes,
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
const bridge = new memPkg.AutoMemoryBridge(backend, bridgeConfig);
|
|
355
|
-
|
|
356
|
-
try {
|
|
357
|
-
const syncResult = await bridge.syncToAutoMemory();
|
|
358
|
-
success(`Synced ${syncResult.synced} entries to auto memory`);
|
|
359
|
-
dim(`├─ Categories updated: ${syncResult.categories?.join(', ') || 'none'}`);
|
|
360
|
-
dim(`└─ Backend entries: ${entryCount}`);
|
|
361
|
-
|
|
362
|
-
// Curate MEMORY.md index with graph-aware ordering
|
|
363
|
-
await bridge.curateIndex();
|
|
364
|
-
success('Curated MEMORY.md index');
|
|
365
|
-
} catch (err) {
|
|
366
|
-
dim(`Sync failed (non-critical): ${err.message}`);
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
if (bridge.destroy) bridge.destroy();
|
|
370
|
-
await backend.shutdown();
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
async function doStatus() {
|
|
374
|
-
const memPkg = await loadMemoryPackage();
|
|
375
|
-
const config = readConfig();
|
|
376
|
-
|
|
377
|
-
const sidecar = join(PROJECT_ROOT, '.claude-flow', 'memory-package.json');
|
|
378
|
-
const hasSidecar = existsSync(sidecar);
|
|
379
|
-
|
|
380
|
-
console.log('\n=== Auto Memory Bridge Status ===\n');
|
|
381
|
-
console.log(` Package: ${memPkg ? '✅ Available' : '❌ Not found — self-learning DISABLED (fix: npm i -D @claude-flow/memory)'}`);
|
|
382
|
-
console.log(` Resolver: ${hasSidecar ? '✅ .claude-flow/memory-package.json' : '⏸ no sidecar (run: npx ruflo@latest doctor --fix)'}`);
|
|
383
|
-
console.log(` Store: ${existsSync(STORE_PATH) ? '✅ ' + STORE_PATH : '⏸ Not initialized'}`);
|
|
384
|
-
console.log(` LearningBridge: ${config.learningBridge.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
385
|
-
console.log(` MemoryGraph: ${config.memoryGraph.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
386
|
-
console.log(` AgentScopes: ${config.agentScopes.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
387
|
-
|
|
388
|
-
if (existsSync(STORE_PATH)) {
|
|
389
|
-
try {
|
|
390
|
-
const data = JSON.parse(readFileSync(STORE_PATH, 'utf-8'));
|
|
391
|
-
console.log(` Entries: ${Array.isArray(data) ? data.length : 0}`);
|
|
392
|
-
} catch { /* ignore */ }
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
console.log('');
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
// ============================================================================
|
|
399
|
-
// Main
|
|
400
|
-
// ============================================================================
|
|
401
|
-
|
|
402
|
-
const command = process.argv[2] || 'status';
|
|
403
|
-
|
|
404
|
-
// Dynamic import() failures can surface as unhandled rejections on a later
|
|
405
|
-
// microtask even when the awaiting call site already caught them, which would
|
|
406
|
-
// otherwise force a non-zero exit. Swallow to keep hooks exit-0, but surface the
|
|
407
|
-
// reason under RUFLO_DEBUG/DEBUG so genuine async bugs aren't silently hidden
|
|
408
|
-
// (FIX 2 — the previous `() => {}` discarded every rejection process-wide).
|
|
409
|
-
process.on('unhandledRejection', (reason) => {
|
|
410
|
-
if (DEBUG) {
|
|
411
|
-
const detail = reason && reason.message ? reason.message : String(reason);
|
|
412
|
-
process.stderr.write(`[AutoMemory] unhandledRejection (suppressed): ${detail}\n`);
|
|
413
|
-
}
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
try {
|
|
417
|
-
switch (command) {
|
|
418
|
-
case 'import': await doImport(); break;
|
|
419
|
-
case 'sync': await doSync(); break;
|
|
420
|
-
case 'status': await doStatus(); break;
|
|
421
|
-
default:
|
|
422
|
-
console.log('Usage: auto-memory-hook.mjs <import|sync|status>');
|
|
423
|
-
break;
|
|
424
|
-
}
|
|
425
|
-
} catch (err) {
|
|
426
|
-
// Hooks must never crash Claude Code - fail silently
|
|
427
|
-
try { dim(`Error (non-critical): ${err.message}`); } catch (_) {}
|
|
428
|
-
}
|
|
429
|
-
// Force clean exit — process.exitCode alone isn't enough if async errors override it
|
|
430
|
-
process.exit(0);
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Auto Memory Bridge Hook (ADR-048/049)
|
|
4
|
+
*
|
|
5
|
+
* Wires AutoMemoryBridge + LearningBridge + MemoryGraph into Claude Code
|
|
6
|
+
* session lifecycle. Called by settings.json SessionStart/SessionEnd hooks.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* node auto-memory-hook.mjs import # SessionStart: import auto memory files into backend
|
|
10
|
+
* node auto-memory-hook.mjs sync # SessionEnd: sync insights back to MEMORY.md
|
|
11
|
+
* node auto-memory-hook.mjs status # Show bridge status
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
15
|
+
import { join, dirname } from 'path';
|
|
16
|
+
import { fileURLToPath } from 'url';
|
|
17
|
+
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = dirname(__filename);
|
|
20
|
+
const PROJECT_ROOT = join(__dirname, '../..');
|
|
21
|
+
const DATA_DIR = join(PROJECT_ROOT, '.claude-flow', 'data');
|
|
22
|
+
const STORE_PATH = join(DATA_DIR, 'auto-memory-store.json');
|
|
23
|
+
|
|
24
|
+
// Colors
|
|
25
|
+
const GREEN = '\x1b[0;32m';
|
|
26
|
+
const CYAN = '\x1b[0;36m';
|
|
27
|
+
const DIM = '\x1b[2m';
|
|
28
|
+
const RESET = '\x1b[0m';
|
|
29
|
+
|
|
30
|
+
const YELLOW = '\x1b[0;33m';
|
|
31
|
+
const log = (msg) => console.log(`${CYAN}[AutoMemory] ${msg}${RESET}`);
|
|
32
|
+
const success = (msg) => console.log(`${GREEN}[AutoMemory] ✓ ${msg}${RESET}`);
|
|
33
|
+
const dim = (msg) => console.log(` ${DIM}${msg}${RESET}`);
|
|
34
|
+
|
|
35
|
+
// #2545: fail LOUD instead of a silent dim skip. When @claude-flow/memory cannot
|
|
36
|
+
// be resolved, self-learning imports are a no-op — the user must see this and be
|
|
37
|
+
// told exactly how to fix it (on both stdout, so it shows in the Claude Code hook
|
|
38
|
+
// transcript, and stderr, per the issue's requested channel).
|
|
39
|
+
function warnMemoryUnavailable() {
|
|
40
|
+
const line1 = `[AutoMemory] @claude-flow/memory not resolvable from ${PROJECT_ROOT} — self-learning imports are DISABLED.`;
|
|
41
|
+
const line2 = ' Fix: npm i -D @claude-flow/memory (or re-run: npx ruflo@latest init, then npx ruflo@latest doctor --fix)';
|
|
42
|
+
console.log(`${YELLOW}${line1}${RESET}`);
|
|
43
|
+
console.log(`${YELLOW}${line2}${RESET}`);
|
|
44
|
+
process.stderr.write(`${line1}\n${line2}\n`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const DEBUG = !!(process.env.RUFLO_DEBUG || process.env.DEBUG);
|
|
48
|
+
|
|
49
|
+
// ── Graceful shutdown (FIX 3) ───────────────────────────────────────────────
|
|
50
|
+
// Track the backend in use so a SIGTERM/SIGINT mid-run can still flush it
|
|
51
|
+
// (the JSON backend persists; a SQLite-backed one closes/flushes WAL) instead
|
|
52
|
+
// of leaving a half-written store or a stale lock behind.
|
|
53
|
+
let activeBackend = null;
|
|
54
|
+
let shuttingDown = false;
|
|
55
|
+
function trackBackend(b) { activeBackend = b; return b; }
|
|
56
|
+
async function gracefulExit(signal) {
|
|
57
|
+
if (shuttingDown) return;
|
|
58
|
+
shuttingDown = true;
|
|
59
|
+
if (DEBUG) process.stderr.write(`[AutoMemory] received ${signal}, flushing backend before exit\n`);
|
|
60
|
+
try {
|
|
61
|
+
if (activeBackend && typeof activeBackend.shutdown === 'function') await activeBackend.shutdown();
|
|
62
|
+
} catch { /* best effort — never block exit on cleanup */ }
|
|
63
|
+
process.exit(0);
|
|
64
|
+
}
|
|
65
|
+
process.on('SIGTERM', () => { gracefulExit('SIGTERM'); });
|
|
66
|
+
process.on('SIGINT', () => { gracefulExit('SIGINT'); });
|
|
67
|
+
|
|
68
|
+
// Ensure data dir
|
|
69
|
+
if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
|
|
70
|
+
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// Simple JSON File Backend (implements IMemoryBackend interface)
|
|
73
|
+
// ============================================================================
|
|
74
|
+
|
|
75
|
+
class JsonFileBackend {
|
|
76
|
+
constructor(filePath) {
|
|
77
|
+
this.filePath = filePath;
|
|
78
|
+
this.entries = new Map();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async initialize() {
|
|
82
|
+
if (existsSync(this.filePath)) {
|
|
83
|
+
try {
|
|
84
|
+
const data = JSON.parse(readFileSync(this.filePath, 'utf-8'));
|
|
85
|
+
if (Array.isArray(data)) {
|
|
86
|
+
for (const entry of data) this.entries.set(entry.id, entry);
|
|
87
|
+
}
|
|
88
|
+
} catch { /* start fresh */ }
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async shutdown() { this._persist(); }
|
|
93
|
+
async store(entry) { this.entries.set(entry.id, entry); this._persist(); }
|
|
94
|
+
async get(id) { return this.entries.get(id) ?? null; }
|
|
95
|
+
async getByKey(key, ns) {
|
|
96
|
+
for (const e of this.entries.values()) {
|
|
97
|
+
if (e.key === key && (!ns || e.namespace === ns)) return e;
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
async update(id, updates) {
|
|
102
|
+
const e = this.entries.get(id);
|
|
103
|
+
if (!e) return null;
|
|
104
|
+
if (updates.metadata) Object.assign(e.metadata, updates.metadata);
|
|
105
|
+
if (updates.content !== undefined) e.content = updates.content;
|
|
106
|
+
if (updates.tags) e.tags = updates.tags;
|
|
107
|
+
e.updatedAt = Date.now();
|
|
108
|
+
this._persist();
|
|
109
|
+
return e;
|
|
110
|
+
}
|
|
111
|
+
async delete(id) { return this.entries.delete(id); }
|
|
112
|
+
async query(opts) {
|
|
113
|
+
let results = [...this.entries.values()];
|
|
114
|
+
if (opts?.namespace) results = results.filter(e => e.namespace === opts.namespace);
|
|
115
|
+
if (opts?.type) results = results.filter(e => e.type === opts.type);
|
|
116
|
+
if (opts?.limit) results = results.slice(0, opts.limit);
|
|
117
|
+
return results;
|
|
118
|
+
}
|
|
119
|
+
async search() { return []; } // No vector search in JSON backend
|
|
120
|
+
async bulkInsert(entries) { for (const e of entries) this.entries.set(e.id, e); this._persist(); }
|
|
121
|
+
async bulkDelete(ids) { let n = 0; for (const id of ids) { if (this.entries.delete(id)) n++; } this._persist(); return n; }
|
|
122
|
+
async count() { return this.entries.size; }
|
|
123
|
+
async listNamespaces() {
|
|
124
|
+
const ns = new Set();
|
|
125
|
+
for (const e of this.entries.values()) ns.add(e.namespace || 'default');
|
|
126
|
+
return [...ns];
|
|
127
|
+
}
|
|
128
|
+
async clearNamespace(ns) {
|
|
129
|
+
let n = 0;
|
|
130
|
+
for (const [id, e] of this.entries) {
|
|
131
|
+
if (e.namespace === ns) { this.entries.delete(id); n++; }
|
|
132
|
+
}
|
|
133
|
+
this._persist();
|
|
134
|
+
return n;
|
|
135
|
+
}
|
|
136
|
+
async getStats() {
|
|
137
|
+
return {
|
|
138
|
+
totalEntries: this.entries.size,
|
|
139
|
+
entriesByNamespace: {},
|
|
140
|
+
entriesByType: { semantic: 0, episodic: 0, procedural: 0, working: 0, cache: 0 },
|
|
141
|
+
memoryUsage: 0, avgQueryTime: 0, avgSearchTime: 0,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
async healthCheck() {
|
|
145
|
+
return {
|
|
146
|
+
status: 'healthy',
|
|
147
|
+
components: {
|
|
148
|
+
storage: { status: 'healthy', latency: 0 },
|
|
149
|
+
index: { status: 'healthy', latency: 0 },
|
|
150
|
+
cache: { status: 'healthy', latency: 0 },
|
|
151
|
+
},
|
|
152
|
+
timestamp: Date.now(), issues: [], recommendations: [],
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
_persist() {
|
|
157
|
+
try {
|
|
158
|
+
writeFileSync(this.filePath, JSON.stringify([...this.entries.values()], null, 2), 'utf-8');
|
|
159
|
+
} catch { /* best effort */ }
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ============================================================================
|
|
164
|
+
// Resolve memory package path (local dev or npm installed)
|
|
165
|
+
// ============================================================================
|
|
166
|
+
|
|
167
|
+
async function loadMemoryPackage() {
|
|
168
|
+
// Strategy 0 (#2545): sidecar recorded by `init` / `doctor --fix`. On the
|
|
169
|
+
// documented `npx ruflo` path @claude-flow/memory (an optionalDependency of
|
|
170
|
+
// the CLI) lands in the npx cache, which is NOT on the walk-up path from the
|
|
171
|
+
// project — so init resolves it from the CLI's own context and records the
|
|
172
|
+
// absolute path here. This is the only strategy that works on that install.
|
|
173
|
+
try {
|
|
174
|
+
const sidecar = join(PROJECT_ROOT, '.claude-flow', 'memory-package.json');
|
|
175
|
+
if (existsSync(sidecar)) {
|
|
176
|
+
const rec = JSON.parse(readFileSync(sidecar, 'utf-8'));
|
|
177
|
+
if (rec?.distPath && existsSync(rec.distPath)) {
|
|
178
|
+
return await import(`file://${rec.distPath}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
} catch { /* fall through */ }
|
|
182
|
+
|
|
183
|
+
// Strategy 1: Local dev (built dist)
|
|
184
|
+
const localDist = join(PROJECT_ROOT, 'v3/@claude-flow/memory/dist/index.js');
|
|
185
|
+
if (existsSync(localDist)) {
|
|
186
|
+
try {
|
|
187
|
+
return await import(`file://${localDist}`);
|
|
188
|
+
} catch { /* fall through */ }
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Strategy 2: Use createRequire for CJS-style resolution (handles nested node_modules
|
|
192
|
+
// when installed as a transitive dependency via npx ruflo / npx claude-flow)
|
|
193
|
+
try {
|
|
194
|
+
const { createRequire } = await import('module');
|
|
195
|
+
const require = createRequire(join(PROJECT_ROOT, 'package.json'));
|
|
196
|
+
return require('@claude-flow/memory');
|
|
197
|
+
} catch { /* fall through */ }
|
|
198
|
+
|
|
199
|
+
// Strategy 3: ESM import (works when @claude-flow/memory is a direct dependency)
|
|
200
|
+
try {
|
|
201
|
+
return await import('@claude-flow/memory');
|
|
202
|
+
} catch { /* fall through */ }
|
|
203
|
+
|
|
204
|
+
// Strategy 4: Walk up from PROJECT_ROOT looking for @claude-flow/memory in any node_modules
|
|
205
|
+
let searchDir = PROJECT_ROOT;
|
|
206
|
+
const { parse } = await import('path');
|
|
207
|
+
while (searchDir !== parse(searchDir).root) {
|
|
208
|
+
const candidate = join(searchDir, 'node_modules', '@claude-flow', 'memory', 'dist', 'index.js');
|
|
209
|
+
if (existsSync(candidate)) {
|
|
210
|
+
try {
|
|
211
|
+
return await import(`file://${candidate}`);
|
|
212
|
+
} catch { /* fall through */ }
|
|
213
|
+
}
|
|
214
|
+
searchDir = dirname(searchDir);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// ============================================================================
|
|
221
|
+
// Read config from .claude-flow/config.yaml
|
|
222
|
+
// ============================================================================
|
|
223
|
+
|
|
224
|
+
function readConfig() {
|
|
225
|
+
const configPath = join(PROJECT_ROOT, '.claude-flow', 'config.yaml');
|
|
226
|
+
const defaults = {
|
|
227
|
+
learningBridge: { enabled: true, sonaMode: 'balanced', confidenceDecayRate: 0.005, accessBoostAmount: 0.03, consolidationThreshold: 10 },
|
|
228
|
+
memoryGraph: { enabled: true, pageRankDamping: 0.85, maxNodes: 5000, similarityThreshold: 0.8 },
|
|
229
|
+
agentScopes: { enabled: true, defaultScope: 'project' },
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
if (!existsSync(configPath)) return defaults;
|
|
233
|
+
|
|
234
|
+
try {
|
|
235
|
+
const yaml = readFileSync(configPath, 'utf-8');
|
|
236
|
+
// Simple YAML parser for the memory section
|
|
237
|
+
const getBool = (key) => {
|
|
238
|
+
const match = yaml.match(new RegExp(`${key}:\\s*(true|false)`, 'i'));
|
|
239
|
+
return match ? match[1] === 'true' : undefined;
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const lbEnabled = getBool('learningBridge[\\s\\S]*?enabled');
|
|
243
|
+
if (lbEnabled !== undefined) defaults.learningBridge.enabled = lbEnabled;
|
|
244
|
+
|
|
245
|
+
const mgEnabled = getBool('memoryGraph[\\s\\S]*?enabled');
|
|
246
|
+
if (mgEnabled !== undefined) defaults.memoryGraph.enabled = mgEnabled;
|
|
247
|
+
|
|
248
|
+
const asEnabled = getBool('agentScopes[\\s\\S]*?enabled');
|
|
249
|
+
if (asEnabled !== undefined) defaults.agentScopes.enabled = asEnabled;
|
|
250
|
+
|
|
251
|
+
return defaults;
|
|
252
|
+
} catch {
|
|
253
|
+
return defaults;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// ============================================================================
|
|
258
|
+
// Commands
|
|
259
|
+
// ============================================================================
|
|
260
|
+
|
|
261
|
+
async function doImport() {
|
|
262
|
+
log('Importing auto memory files into bridge...');
|
|
263
|
+
|
|
264
|
+
const memPkg = await loadMemoryPackage();
|
|
265
|
+
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
266
|
+
warnMemoryUnavailable();
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const config = readConfig();
|
|
271
|
+
const backend = trackBackend(new JsonFileBackend(STORE_PATH));
|
|
272
|
+
await backend.initialize();
|
|
273
|
+
|
|
274
|
+
const bridgeConfig = {
|
|
275
|
+
workingDir: PROJECT_ROOT,
|
|
276
|
+
syncMode: 'on-session-end',
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
// Wire learning if enabled and available
|
|
280
|
+
if (config.learningBridge.enabled && memPkg.LearningBridge) {
|
|
281
|
+
bridgeConfig.learning = {
|
|
282
|
+
sonaMode: config.learningBridge.sonaMode,
|
|
283
|
+
confidenceDecayRate: config.learningBridge.confidenceDecayRate,
|
|
284
|
+
accessBoostAmount: config.learningBridge.accessBoostAmount,
|
|
285
|
+
consolidationThreshold: config.learningBridge.consolidationThreshold,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Wire graph if enabled and available
|
|
290
|
+
if (config.memoryGraph.enabled && memPkg.MemoryGraph) {
|
|
291
|
+
bridgeConfig.graph = {
|
|
292
|
+
pageRankDamping: config.memoryGraph.pageRankDamping,
|
|
293
|
+
maxNodes: config.memoryGraph.maxNodes,
|
|
294
|
+
similarityThreshold: config.memoryGraph.similarityThreshold,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
const bridge = new memPkg.AutoMemoryBridge(backend, bridgeConfig);
|
|
299
|
+
|
|
300
|
+
try {
|
|
301
|
+
const result = await bridge.importFromAutoMemory();
|
|
302
|
+
success(`Imported ${result.imported} entries (${result.skipped} skipped)`);
|
|
303
|
+
dim(`├─ Backend entries: ${await backend.count()}`);
|
|
304
|
+
dim(`├─ Learning: ${config.learningBridge.enabled ? 'active' : 'disabled'}`);
|
|
305
|
+
dim(`├─ Graph: ${config.memoryGraph.enabled ? 'active' : 'disabled'}`);
|
|
306
|
+
dim(`└─ Agent scopes: ${config.agentScopes.enabled ? 'active' : 'disabled'}`);
|
|
307
|
+
} catch (err) {
|
|
308
|
+
dim(`Import failed (non-critical): ${err.message}`);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
await backend.shutdown();
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
async function doSync() {
|
|
315
|
+
log('Syncing insights to auto memory files...');
|
|
316
|
+
|
|
317
|
+
const memPkg = await loadMemoryPackage();
|
|
318
|
+
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
319
|
+
warnMemoryUnavailable();
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const config = readConfig();
|
|
324
|
+
const backend = trackBackend(new JsonFileBackend(STORE_PATH));
|
|
325
|
+
await backend.initialize();
|
|
326
|
+
|
|
327
|
+
const entryCount = await backend.count();
|
|
328
|
+
if (entryCount === 0) {
|
|
329
|
+
dim('No entries to sync');
|
|
330
|
+
await backend.shutdown();
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
const bridgeConfig = {
|
|
335
|
+
workingDir: PROJECT_ROOT,
|
|
336
|
+
syncMode: 'on-session-end',
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
if (config.learningBridge.enabled && memPkg.LearningBridge) {
|
|
340
|
+
bridgeConfig.learning = {
|
|
341
|
+
sonaMode: config.learningBridge.sonaMode,
|
|
342
|
+
confidenceDecayRate: config.learningBridge.confidenceDecayRate,
|
|
343
|
+
consolidationThreshold: config.learningBridge.consolidationThreshold,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (config.memoryGraph.enabled && memPkg.MemoryGraph) {
|
|
348
|
+
bridgeConfig.graph = {
|
|
349
|
+
pageRankDamping: config.memoryGraph.pageRankDamping,
|
|
350
|
+
maxNodes: config.memoryGraph.maxNodes,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
const bridge = new memPkg.AutoMemoryBridge(backend, bridgeConfig);
|
|
355
|
+
|
|
356
|
+
try {
|
|
357
|
+
const syncResult = await bridge.syncToAutoMemory();
|
|
358
|
+
success(`Synced ${syncResult.synced} entries to auto memory`);
|
|
359
|
+
dim(`├─ Categories updated: ${syncResult.categories?.join(', ') || 'none'}`);
|
|
360
|
+
dim(`└─ Backend entries: ${entryCount}`);
|
|
361
|
+
|
|
362
|
+
// Curate MEMORY.md index with graph-aware ordering
|
|
363
|
+
await bridge.curateIndex();
|
|
364
|
+
success('Curated MEMORY.md index');
|
|
365
|
+
} catch (err) {
|
|
366
|
+
dim(`Sync failed (non-critical): ${err.message}`);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
if (bridge.destroy) bridge.destroy();
|
|
370
|
+
await backend.shutdown();
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
async function doStatus() {
|
|
374
|
+
const memPkg = await loadMemoryPackage();
|
|
375
|
+
const config = readConfig();
|
|
376
|
+
|
|
377
|
+
const sidecar = join(PROJECT_ROOT, '.claude-flow', 'memory-package.json');
|
|
378
|
+
const hasSidecar = existsSync(sidecar);
|
|
379
|
+
|
|
380
|
+
console.log('\n=== Auto Memory Bridge Status ===\n');
|
|
381
|
+
console.log(` Package: ${memPkg ? '✅ Available' : '❌ Not found — self-learning DISABLED (fix: npm i -D @claude-flow/memory)'}`);
|
|
382
|
+
console.log(` Resolver: ${hasSidecar ? '✅ .claude-flow/memory-package.json' : '⏸ no sidecar (run: npx ruflo@latest doctor --fix)'}`);
|
|
383
|
+
console.log(` Store: ${existsSync(STORE_PATH) ? '✅ ' + STORE_PATH : '⏸ Not initialized'}`);
|
|
384
|
+
console.log(` LearningBridge: ${config.learningBridge.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
385
|
+
console.log(` MemoryGraph: ${config.memoryGraph.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
386
|
+
console.log(` AgentScopes: ${config.agentScopes.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
387
|
+
|
|
388
|
+
if (existsSync(STORE_PATH)) {
|
|
389
|
+
try {
|
|
390
|
+
const data = JSON.parse(readFileSync(STORE_PATH, 'utf-8'));
|
|
391
|
+
console.log(` Entries: ${Array.isArray(data) ? data.length : 0}`);
|
|
392
|
+
} catch { /* ignore */ }
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
console.log('');
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// ============================================================================
|
|
399
|
+
// Main
|
|
400
|
+
// ============================================================================
|
|
401
|
+
|
|
402
|
+
const command = process.argv[2] || 'status';
|
|
403
|
+
|
|
404
|
+
// Dynamic import() failures can surface as unhandled rejections on a later
|
|
405
|
+
// microtask even when the awaiting call site already caught them, which would
|
|
406
|
+
// otherwise force a non-zero exit. Swallow to keep hooks exit-0, but surface the
|
|
407
|
+
// reason under RUFLO_DEBUG/DEBUG so genuine async bugs aren't silently hidden
|
|
408
|
+
// (FIX 2 — the previous `() => {}` discarded every rejection process-wide).
|
|
409
|
+
process.on('unhandledRejection', (reason) => {
|
|
410
|
+
if (DEBUG) {
|
|
411
|
+
const detail = reason && reason.message ? reason.message : String(reason);
|
|
412
|
+
process.stderr.write(`[AutoMemory] unhandledRejection (suppressed): ${detail}\n`);
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
try {
|
|
417
|
+
switch (command) {
|
|
418
|
+
case 'import': await doImport(); break;
|
|
419
|
+
case 'sync': await doSync(); break;
|
|
420
|
+
case 'status': await doStatus(); break;
|
|
421
|
+
default:
|
|
422
|
+
console.log('Usage: auto-memory-hook.mjs <import|sync|status>');
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
} catch (err) {
|
|
426
|
+
// Hooks must never crash Claude Code - fail silently
|
|
427
|
+
try { dim(`Error (non-critical): ${err.message}`); } catch (_) {}
|
|
428
|
+
}
|
|
429
|
+
// Force clean exit — process.exitCode alone isn't enough if async errors override it
|
|
430
|
+
process.exit(0);
|