claude-flow 3.6.30 → 3.7.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/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 +201 -201
- package/.claude/agents/dual-mode/codex-worker.md +183 -183
- 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 +335 -335
- 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 +547 -547
- package/.claude/agents/github/swarm-pr.md +398 -398
- package/.claude/agents/github/sync-coordinator.md +422 -422
- 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/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 +564 -564
- package/.claude/helpers/checkpoint-manager.sh +251 -251
- package/.claude/helpers/context-persistence-hook.mjs +1979 -1979
- package/.claude/helpers/daemon-manager.sh +252 -252
- package/.claude/helpers/ddd-tracker.sh +144 -144
- package/.claude/helpers/github-safe.js +106 -106
- package/.claude/helpers/github-setup.sh +28 -28
- package/.claude/helpers/guidance-hook.sh +13 -13
- package/.claude/helpers/guidance-hooks.sh +102 -102
- package/.claude/helpers/health-monitor.sh +108 -108
- package/.claude/helpers/hook-handler.cjs +263 -263
- package/.claude/helpers/intelligence.cjs +230 -230
- 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 +488 -488
- 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 +819 -809
- 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/scheduled_tasks.lock +1 -1
- package/.claude/settings.json +283 -283
- 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/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 +1263 -1250
- 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 +647 -647
- 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-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 +74 -74
- package/.claude-plugin/marketplace.json +170 -170
- package/.claude-plugin/plugin.json +71 -71
- package/.claude-plugin/scripts/install.sh +234 -234
- package/.claude-plugin/scripts/uninstall.sh +36 -36
- package/.claude-plugin/scripts/verify.sh +108 -108
- package/LICENSE +21 -21
- package/README.md +393 -391
- package/bin/cli.js +11 -11
- package/bin/npx-repair.js +7 -7
- package/bin/npx-safe-launch.js +9 -9
- package/package.json +7 -1
- package/v3/@claude-flow/cli/README.md +393 -391
- package/v3/@claude-flow/cli/bin/cli.js +220 -220
- 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/dist/src/commands/agent-wasm.js +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/completions.js +409 -409
- package/v3/@claude-flow/cli/dist/src/commands/daemon.js +19 -3
- package/v3/@claude-flow/cli/dist/src/commands/doctor.js +105 -23
- package/v3/@claude-flow/cli/dist/src/commands/embeddings.js +26 -26
- package/v3/@claude-flow/cli/dist/src/commands/hive-mind.js +122 -104
- package/v3/@claude-flow/cli/dist/src/commands/hooks.js +34 -21
- package/v3/@claude-flow/cli/dist/src/commands/memory.js +68 -0
- 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/index.d.ts +5 -1
- package/v3/@claude-flow/cli/dist/src/index.js +59 -18
- package/v3/@claude-flow/cli/dist/src/init/claudemd-generator.js +226 -226
- package/v3/@claude-flow/cli/dist/src/init/executor.js +511 -453
- package/v3/@claude-flow/cli/dist/src/init/helpers-generator.js +645 -645
- package/v3/@claude-flow/cli/dist/src/init/settings-generator.js +11 -5
- package/v3/@claude-flow/cli/dist/src/init/statusline-generator.js +858 -858
- package/v3/@claude-flow/cli/dist/src/init/types.d.ts +7 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agentdb-tools.d.ts +3 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agentdb-tools.js +108 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.js +4 -2
- package/v3/@claude-flow/cli/dist/src/mcp-tools/memory-tools.js +19 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/neural-tools.js +14 -1
- package/v3/@claude-flow/cli/dist/src/mcp-tools/security-tools.js +28 -3
- package/v3/@claude-flow/cli/dist/src/mcp-tools/swarm-tools.js +72 -3
- package/v3/@claude-flow/cli/dist/src/mcp-tools/types.d.ts +4 -33
- package/v3/@claude-flow/cli/dist/src/mcp-tools/types.js +4 -14
- package/v3/@claude-flow/cli/dist/src/mcp-tools/validate-input.d.ts +5 -57
- package/v3/@claude-flow/cli/dist/src/mcp-tools/validate-input.js +5 -233
- package/v3/@claude-flow/cli/dist/src/mcp-tools/wasm-agent-tools.js +1 -1
- package/v3/@claude-flow/cli/dist/src/memory/intelligence.js +28 -3
- package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.d.ts +69 -0
- package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.js +319 -66
- package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.d.ts +5 -0
- package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.js +369 -363
- package/v3/@claude-flow/cli/dist/src/memory/neural-package-bridge.d.ts +48 -0
- package/v3/@claude-flow/cli/dist/src/memory/neural-package-bridge.js +87 -0
- package/v3/@claude-flow/cli/dist/src/memory/rabitq-index.js +5 -5
- package/v3/@claude-flow/cli/dist/src/memory/sona-optimizer.js +1 -0
- package/v3/@claude-flow/cli/dist/src/output.d.ts +6 -130
- package/v3/@claude-flow/cli/dist/src/output.js +6 -511
- package/v3/@claude-flow/cli/dist/src/parser.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/parser.js +11 -0
- package/v3/@claude-flow/cli/dist/src/runtime/headless.js +28 -28
- package/v3/@claude-flow/cli/dist/src/ruvector/agent-wasm.js +4 -1
- package/v3/@claude-flow/cli/dist/src/ruvector/index.d.ts +0 -2
- package/v3/@claude-flow/cli/dist/src/ruvector/index.js +8 -2
- package/v3/@claude-flow/cli/dist/src/ruvector/model-router.d.ts +22 -1
- package/v3/@claude-flow/cli/dist/src/ruvector/model-router.js +125 -5
- package/v3/@claude-flow/cli/dist/src/services/headless-worker-executor.js +84 -84
- package/v3/@claude-flow/cli/dist/src/transfer/deploy-seraphine.js +23 -23
- package/v3/@claude-flow/cli/dist/src/types.d.ts +10 -195
- package/v3/@claude-flow/cli/dist/src/types.js +10 -35
- package/v3/@claude-flow/cli/package.json +6 -4
- 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/package.json +43 -43
- package/v3/README.md +493 -493
|
@@ -1,564 +1,564 @@
|
|
|
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 log = (msg) => console.log(`${CYAN}[AutoMemory] ${msg}${RESET}`);
|
|
31
|
-
const success = (msg) => console.log(`${GREEN}[AutoMemory] ✓ ${msg}${RESET}`);
|
|
32
|
-
const dim = (msg) => console.log(` ${DIM}${msg}${RESET}`);
|
|
33
|
-
|
|
34
|
-
// Ensure data dir
|
|
35
|
-
if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
|
|
36
|
-
|
|
37
|
-
// ============================================================================
|
|
38
|
-
// Simple JSON File Backend (implements IMemoryBackend interface)
|
|
39
|
-
// ============================================================================
|
|
40
|
-
|
|
41
|
-
class JsonFileBackend {
|
|
42
|
-
constructor(filePath) {
|
|
43
|
-
this.filePath = filePath;
|
|
44
|
-
this.entries = new Map();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
async initialize() {
|
|
48
|
-
if (existsSync(this.filePath)) {
|
|
49
|
-
try {
|
|
50
|
-
const data = JSON.parse(readFileSync(this.filePath, 'utf-8'));
|
|
51
|
-
if (Array.isArray(data)) {
|
|
52
|
-
for (const entry of data) this.entries.set(entry.id, entry);
|
|
53
|
-
}
|
|
54
|
-
} catch { /* start fresh */ }
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async shutdown() { this._persist(); }
|
|
59
|
-
async store(entry) { this.entries.set(entry.id, entry); this._persist(); }
|
|
60
|
-
async get(id) { return this.entries.get(id) ?? null; }
|
|
61
|
-
async getByKey(key, ns) {
|
|
62
|
-
for (const e of this.entries.values()) {
|
|
63
|
-
if (e.key === key && (!ns || e.namespace === ns)) return e;
|
|
64
|
-
}
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
async update(id, updates) {
|
|
68
|
-
const e = this.entries.get(id);
|
|
69
|
-
if (!e) return null;
|
|
70
|
-
if (updates.metadata) Object.assign(e.metadata, updates.metadata);
|
|
71
|
-
if (updates.content !== undefined) e.content = updates.content;
|
|
72
|
-
if (updates.tags) e.tags = updates.tags;
|
|
73
|
-
e.updatedAt = Date.now();
|
|
74
|
-
this._persist();
|
|
75
|
-
return e;
|
|
76
|
-
}
|
|
77
|
-
async delete(id) { return this.entries.delete(id); }
|
|
78
|
-
async query(opts) {
|
|
79
|
-
let results = [...this.entries.values()];
|
|
80
|
-
if (opts?.namespace) results = results.filter(e => e.namespace === opts.namespace);
|
|
81
|
-
if (opts?.type) results = results.filter(e => e.type === opts.type);
|
|
82
|
-
if (opts?.limit) results = results.slice(0, opts.limit);
|
|
83
|
-
return results;
|
|
84
|
-
}
|
|
85
|
-
async search() { return []; } // No vector search in JSON backend
|
|
86
|
-
async bulkInsert(entries) { for (const e of entries) this.entries.set(e.id, e); this._persist(); }
|
|
87
|
-
async bulkDelete(ids) { let n = 0; for (const id of ids) { if (this.entries.delete(id)) n++; } this._persist(); return n; }
|
|
88
|
-
async count() { return this.entries.size; }
|
|
89
|
-
async listNamespaces() {
|
|
90
|
-
const ns = new Set();
|
|
91
|
-
for (const e of this.entries.values()) ns.add(e.namespace || 'default');
|
|
92
|
-
return [...ns];
|
|
93
|
-
}
|
|
94
|
-
async clearNamespace(ns) {
|
|
95
|
-
let n = 0;
|
|
96
|
-
for (const [id, e] of this.entries) {
|
|
97
|
-
if (e.namespace === ns) { this.entries.delete(id); n++; }
|
|
98
|
-
}
|
|
99
|
-
this._persist();
|
|
100
|
-
return n;
|
|
101
|
-
}
|
|
102
|
-
async getStats() {
|
|
103
|
-
return {
|
|
104
|
-
totalEntries: this.entries.size,
|
|
105
|
-
entriesByNamespace: {},
|
|
106
|
-
entriesByType: { semantic: 0, episodic: 0, procedural: 0, working: 0, cache: 0 },
|
|
107
|
-
memoryUsage: 0, avgQueryTime: 0, avgSearchTime: 0,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
async healthCheck() {
|
|
111
|
-
return {
|
|
112
|
-
status: 'healthy',
|
|
113
|
-
components: {
|
|
114
|
-
storage: { status: 'healthy', latency: 0 },
|
|
115
|
-
index: { status: 'healthy', latency: 0 },
|
|
116
|
-
cache: { status: 'healthy', latency: 0 },
|
|
117
|
-
},
|
|
118
|
-
timestamp: Date.now(), issues: [], recommendations: [],
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
_persist() {
|
|
123
|
-
try {
|
|
124
|
-
writeFileSync(this.filePath, JSON.stringify([...this.entries.values()], null, 2), 'utf-8');
|
|
125
|
-
} catch { /* best effort */ }
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// ============================================================================
|
|
130
|
-
// Resolve memory package path (local dev or npm installed)
|
|
131
|
-
// ============================================================================
|
|
132
|
-
|
|
133
|
-
async function loadMemoryPackage() {
|
|
134
|
-
// Strategy 1: Local dev (built dist)
|
|
135
|
-
const localDist = join(PROJECT_ROOT, 'v3/@claude-flow/memory/dist/index.js');
|
|
136
|
-
if (existsSync(localDist)) {
|
|
137
|
-
try {
|
|
138
|
-
return await import(`file://${localDist}`);
|
|
139
|
-
} catch { /* fall through */ }
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Strategy 2: Use createRequire for CJS-style resolution (handles nested node_modules
|
|
143
|
-
// when installed as a transitive dependency via npx ruflo / npx claude-flow)
|
|
144
|
-
try {
|
|
145
|
-
const { createRequire } = await import('module');
|
|
146
|
-
const require = createRequire(join(PROJECT_ROOT, 'package.json'));
|
|
147
|
-
return require('@claude-flow/memory');
|
|
148
|
-
} catch { /* fall through */ }
|
|
149
|
-
|
|
150
|
-
// Strategy 3: ESM import (works when @claude-flow/memory is a direct dependency)
|
|
151
|
-
try {
|
|
152
|
-
return await import('@claude-flow/memory');
|
|
153
|
-
} catch { /* fall through */ }
|
|
154
|
-
|
|
155
|
-
// Strategy 4: Walk up from PROJECT_ROOT looking for @claude-flow/memory in any node_modules
|
|
156
|
-
let searchDir = PROJECT_ROOT;
|
|
157
|
-
const { parse } = await import('path');
|
|
158
|
-
while (searchDir !== parse(searchDir).root) {
|
|
159
|
-
const candidate = join(searchDir, 'node_modules', '@claude-flow', 'memory', 'dist', 'index.js');
|
|
160
|
-
if (existsSync(candidate)) {
|
|
161
|
-
try {
|
|
162
|
-
return await import(`file://${candidate}`);
|
|
163
|
-
} catch { /* fall through */ }
|
|
164
|
-
}
|
|
165
|
-
searchDir = dirname(searchDir);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return null;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// ============================================================================
|
|
172
|
-
// Read config from .claude-flow/config.yaml
|
|
173
|
-
// ============================================================================
|
|
174
|
-
|
|
175
|
-
function readConfig() {
|
|
176
|
-
const configPath = join(PROJECT_ROOT, '.claude-flow', 'config.yaml');
|
|
177
|
-
const defaults = {
|
|
178
|
-
learningBridge: { enabled: true, sonaMode: 'balanced', confidenceDecayRate: 0.005, accessBoostAmount: 0.03, consolidationThreshold: 10 },
|
|
179
|
-
memoryGraph: { enabled: true, pageRankDamping: 0.85, maxNodes: 5000, similarityThreshold: 0.8 },
|
|
180
|
-
agentScopes: { enabled: true, defaultScope: 'project' },
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
if (!existsSync(configPath)) return defaults;
|
|
184
|
-
|
|
185
|
-
try {
|
|
186
|
-
const yaml = readFileSync(configPath, 'utf-8');
|
|
187
|
-
// Simple YAML parser for the memory section
|
|
188
|
-
const getBool = (key) => {
|
|
189
|
-
const match = yaml.match(new RegExp(`${key}:\\s*(true|false)`, 'i'));
|
|
190
|
-
return match ? match[1] === 'true' : undefined;
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
const lbEnabled = getBool('learningBridge[\\s\\S]*?enabled');
|
|
194
|
-
if (lbEnabled !== undefined) defaults.learningBridge.enabled = lbEnabled;
|
|
195
|
-
|
|
196
|
-
const mgEnabled = getBool('memoryGraph[\\s\\S]*?enabled');
|
|
197
|
-
if (mgEnabled !== undefined) defaults.memoryGraph.enabled = mgEnabled;
|
|
198
|
-
|
|
199
|
-
const asEnabled = getBool('agentScopes[\\s\\S]*?enabled');
|
|
200
|
-
if (asEnabled !== undefined) defaults.agentScopes.enabled = asEnabled;
|
|
201
|
-
|
|
202
|
-
return defaults;
|
|
203
|
-
} catch {
|
|
204
|
-
return defaults;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// ============================================================================
|
|
209
|
-
// Commands
|
|
210
|
-
// ============================================================================
|
|
211
|
-
|
|
212
|
-
async function doImport() {
|
|
213
|
-
log('Importing auto memory files into bridge...');
|
|
214
|
-
|
|
215
|
-
const memPkg = await loadMemoryPackage();
|
|
216
|
-
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
217
|
-
dim('Memory package not available — skipping auto memory import');
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
const config = readConfig();
|
|
222
|
-
const backend = new JsonFileBackend(STORE_PATH);
|
|
223
|
-
await backend.initialize();
|
|
224
|
-
|
|
225
|
-
const bridgeConfig = {
|
|
226
|
-
workingDir: PROJECT_ROOT,
|
|
227
|
-
syncMode: 'on-session-end',
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
// Wire learning if enabled and available
|
|
231
|
-
if (config.learningBridge.enabled && memPkg.LearningBridge) {
|
|
232
|
-
bridgeConfig.learning = {
|
|
233
|
-
sonaMode: config.learningBridge.sonaMode,
|
|
234
|
-
confidenceDecayRate: config.learningBridge.confidenceDecayRate,
|
|
235
|
-
accessBoostAmount: config.learningBridge.accessBoostAmount,
|
|
236
|
-
consolidationThreshold: config.learningBridge.consolidationThreshold,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Wire graph if enabled and available
|
|
241
|
-
if (config.memoryGraph.enabled && memPkg.MemoryGraph) {
|
|
242
|
-
bridgeConfig.graph = {
|
|
243
|
-
pageRankDamping: config.memoryGraph.pageRankDamping,
|
|
244
|
-
maxNodes: config.memoryGraph.maxNodes,
|
|
245
|
-
similarityThreshold: config.memoryGraph.similarityThreshold,
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const bridge = new memPkg.AutoMemoryBridge(backend, bridgeConfig);
|
|
250
|
-
|
|
251
|
-
try {
|
|
252
|
-
const result = await bridge.importFromAutoMemory();
|
|
253
|
-
success(`Imported ${result.imported} entries (${result.skipped} skipped)`);
|
|
254
|
-
dim(`├─ Backend entries: ${await backend.count()}`);
|
|
255
|
-
dim(`├─ Learning: ${config.learningBridge.enabled ? 'active' : 'disabled'}`);
|
|
256
|
-
dim(`├─ Graph: ${config.memoryGraph.enabled ? 'active' : 'disabled'}`);
|
|
257
|
-
dim(`└─ Agent scopes: ${config.agentScopes.enabled ? 'active' : 'disabled'}`);
|
|
258
|
-
|
|
259
|
-
// Bridge to AgentDB: store entries with ONNX vector embeddings for semantic search
|
|
260
|
-
let vectorized = 0;
|
|
261
|
-
try {
|
|
262
|
-
const cliDistPath = join(PROJECT_ROOT, 'v3/@claude-flow/cli/dist/src/memory/memory-initializer.js');
|
|
263
|
-
if (existsSync(cliDistPath)) {
|
|
264
|
-
const memInit = await import(`file://${cliDistPath}`);
|
|
265
|
-
await memInit.initializeMemoryDatabase({ force: false, verbose: false });
|
|
266
|
-
|
|
267
|
-
const entries = await backend.query({});
|
|
268
|
-
for (const entry of entries) {
|
|
269
|
-
if (!entry.content || entry.content.length < 10) continue;
|
|
270
|
-
try {
|
|
271
|
-
await memInit.storeEntry({
|
|
272
|
-
key: entry.key || entry.id,
|
|
273
|
-
value: entry.content,
|
|
274
|
-
namespace: entry.namespace || 'auto-memory',
|
|
275
|
-
generateEmbeddingFlag: true,
|
|
276
|
-
});
|
|
277
|
-
vectorized++;
|
|
278
|
-
} catch { /* skip entries that fail to embed */ }
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
if (vectorized > 0) {
|
|
282
|
-
success(`Vectorized ${vectorized} entries into AgentDB (ONNX 384-dim)`);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
} catch (vecErr) {
|
|
286
|
-
dim(`AgentDB vectorization skipped: ${vecErr.message?.slice(0, 60)}`);
|
|
287
|
-
}
|
|
288
|
-
} catch (err) {
|
|
289
|
-
dim(`Import failed (non-critical): ${err.message}`);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
await backend.shutdown();
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
async function doSync() {
|
|
296
|
-
log('Syncing insights to auto memory files...');
|
|
297
|
-
|
|
298
|
-
const memPkg = await loadMemoryPackage();
|
|
299
|
-
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
300
|
-
dim('Memory package not available — skipping sync');
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
const config = readConfig();
|
|
305
|
-
const backend = new JsonFileBackend(STORE_PATH);
|
|
306
|
-
await backend.initialize();
|
|
307
|
-
|
|
308
|
-
const entryCount = await backend.count();
|
|
309
|
-
if (entryCount === 0) {
|
|
310
|
-
dim('No entries to sync');
|
|
311
|
-
await backend.shutdown();
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
const bridgeConfig = {
|
|
316
|
-
workingDir: PROJECT_ROOT,
|
|
317
|
-
syncMode: 'on-session-end',
|
|
318
|
-
};
|
|
319
|
-
|
|
320
|
-
if (config.learningBridge.enabled && memPkg.LearningBridge) {
|
|
321
|
-
bridgeConfig.learning = {
|
|
322
|
-
sonaMode: config.learningBridge.sonaMode,
|
|
323
|
-
confidenceDecayRate: config.learningBridge.confidenceDecayRate,
|
|
324
|
-
consolidationThreshold: config.learningBridge.consolidationThreshold,
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
if (config.memoryGraph.enabled && memPkg.MemoryGraph) {
|
|
329
|
-
bridgeConfig.graph = {
|
|
330
|
-
pageRankDamping: config.memoryGraph.pageRankDamping,
|
|
331
|
-
maxNodes: config.memoryGraph.maxNodes,
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
const bridge = new memPkg.AutoMemoryBridge(backend, bridgeConfig);
|
|
336
|
-
|
|
337
|
-
try {
|
|
338
|
-
const syncResult = await bridge.syncToAutoMemory();
|
|
339
|
-
success(`Synced ${syncResult.synced} entries to auto memory`);
|
|
340
|
-
dim(`├─ Categories updated: ${syncResult.categories?.join(', ') || 'none'}`);
|
|
341
|
-
dim(`└─ Backend entries: ${entryCount}`);
|
|
342
|
-
|
|
343
|
-
// Curate MEMORY.md index with graph-aware ordering
|
|
344
|
-
await bridge.curateIndex();
|
|
345
|
-
success('Curated MEMORY.md index');
|
|
346
|
-
|
|
347
|
-
// Flush intelligence patterns to disk (SONA + ReasoningBank)
|
|
348
|
-
try {
|
|
349
|
-
const intPath = join(PROJECT_ROOT, 'v3/@claude-flow/cli/dist/src/memory/intelligence.js');
|
|
350
|
-
if (existsSync(intPath)) {
|
|
351
|
-
const intelligence = await import(`file://${intPath}`);
|
|
352
|
-
if (intelligence.flushPatterns) {
|
|
353
|
-
intelligence.flushPatterns();
|
|
354
|
-
const stats = intelligence.getIntelligenceStats?.();
|
|
355
|
-
if (stats && stats.patternsLearned > 0) {
|
|
356
|
-
success(`Flushed ${stats.patternsLearned} learned patterns to disk`);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
} catch { /* non-critical */ }
|
|
361
|
-
} catch (err) {
|
|
362
|
-
dim(`Sync failed (non-critical): ${err.message}`);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
if (bridge.destroy) bridge.destroy();
|
|
366
|
-
await backend.shutdown();
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
async function doStatus() {
|
|
370
|
-
const memPkg = await loadMemoryPackage();
|
|
371
|
-
const config = readConfig();
|
|
372
|
-
|
|
373
|
-
console.log('\n=== Auto Memory Bridge Status ===\n');
|
|
374
|
-
console.log(` Package: ${memPkg ? '✅ Available' : '❌ Not found'}`);
|
|
375
|
-
console.log(` Store: ${existsSync(STORE_PATH) ? '✅ ' + STORE_PATH : '⏸ Not initialized'}`);
|
|
376
|
-
console.log(` LearningBridge: ${config.learningBridge.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
377
|
-
console.log(` MemoryGraph: ${config.memoryGraph.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
378
|
-
console.log(` AgentScopes: ${config.agentScopes.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
379
|
-
|
|
380
|
-
if (existsSync(STORE_PATH)) {
|
|
381
|
-
try {
|
|
382
|
-
const data = JSON.parse(readFileSync(STORE_PATH, 'utf-8'));
|
|
383
|
-
console.log(` Entries: ${Array.isArray(data) ? data.length : 0}`);
|
|
384
|
-
} catch { /* ignore */ }
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// AgentDB vector status
|
|
388
|
-
try {
|
|
389
|
-
const dbPath = join(PROJECT_ROOT, '.claude-flow', 'memory', 'memory.db');
|
|
390
|
-
const swarmDbPath = join(PROJECT_ROOT, '.swarm', 'memory.db');
|
|
391
|
-
const hasDb = existsSync(dbPath) || existsSync(swarmDbPath);
|
|
392
|
-
console.log(` AgentDB: ${hasDb ? '✅ sql.js database exists' : '⏸ Not initialized'}`);
|
|
393
|
-
|
|
394
|
-
const intPath = join(PROJECT_ROOT, 'v3/@claude-flow/cli/dist/src/memory/intelligence.js');
|
|
395
|
-
if (existsSync(intPath)) {
|
|
396
|
-
const intelligence = await import(`file://${intPath}`);
|
|
397
|
-
const stats = intelligence.getIntelligenceStats?.();
|
|
398
|
-
if (stats) {
|
|
399
|
-
console.log(` SONA: ${stats.sonaEnabled ? '✅ Active' : '⏸ Not initialized'}`);
|
|
400
|
-
console.log(` Patterns: ${stats.patternsLearned} learned`);
|
|
401
|
-
console.log(` Trajectories: ${stats.trajectoriesRecorded} recorded`);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
} catch { /* ignore */ }
|
|
405
|
-
|
|
406
|
-
console.log('');
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// ============================================================================
|
|
410
|
-
// Import ALL Claude Code memories from all projects into AgentDB
|
|
411
|
-
// ============================================================================
|
|
412
|
-
|
|
413
|
-
async function doImportAll() {
|
|
414
|
-
log('Importing ALL Claude Code memories into AgentDB...');
|
|
415
|
-
|
|
416
|
-
const { homedir } = await import('os');
|
|
417
|
-
const { readdirSync } = await import('fs');
|
|
418
|
-
const claudeProjectsDir = join(homedir(), '.claude', 'projects');
|
|
419
|
-
|
|
420
|
-
if (!existsSync(claudeProjectsDir)) {
|
|
421
|
-
dim('No Claude Code projects found at ' + claudeProjectsDir);
|
|
422
|
-
return;
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
// Find all memory files across all projects
|
|
426
|
-
const memoryFiles = [];
|
|
427
|
-
try {
|
|
428
|
-
const projects = readdirSync(claudeProjectsDir, { withFileTypes: true });
|
|
429
|
-
for (const project of projects) {
|
|
430
|
-
if (!project.isDirectory()) continue;
|
|
431
|
-
const memDir = join(claudeProjectsDir, project.name, 'memory');
|
|
432
|
-
if (!existsSync(memDir)) continue;
|
|
433
|
-
const files = readdirSync(memDir).filter(f => f.endsWith('.md'));
|
|
434
|
-
for (const file of files) {
|
|
435
|
-
memoryFiles.push({
|
|
436
|
-
path: join(memDir, file),
|
|
437
|
-
project: project.name,
|
|
438
|
-
file,
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
} catch (err) {
|
|
443
|
-
dim('Error scanning projects: ' + err.message);
|
|
444
|
-
return;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
if (memoryFiles.length === 0) {
|
|
448
|
-
dim('No memory files found');
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
log(`Found ${memoryFiles.length} memory files across ${new Set(memoryFiles.map(f => f.project)).size} projects`);
|
|
453
|
-
|
|
454
|
-
// Load memory-initializer for vectorized storage
|
|
455
|
-
let memInit = null;
|
|
456
|
-
try {
|
|
457
|
-
const cliDistPath = join(PROJECT_ROOT, 'v3/@claude-flow/cli/dist/src/memory/memory-initializer.js');
|
|
458
|
-
if (existsSync(cliDistPath)) {
|
|
459
|
-
memInit = await import(`file://${cliDistPath}`);
|
|
460
|
-
await memInit.initializeMemoryDatabase({ force: false, verbose: false });
|
|
461
|
-
}
|
|
462
|
-
} catch (err) {
|
|
463
|
-
dim('Memory initializer not available: ' + err.message?.slice(0, 60));
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
if (!memInit) {
|
|
467
|
-
dim('Cannot vectorize without memory-initializer. Run: cd v3/@claude-flow/cli && npm run build');
|
|
468
|
-
return;
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
let imported = 0;
|
|
472
|
-
let skipped = 0;
|
|
473
|
-
|
|
474
|
-
for (const memFile of memoryFiles) {
|
|
475
|
-
try {
|
|
476
|
-
const content = readFileSync(memFile.path, 'utf-8');
|
|
477
|
-
|
|
478
|
-
// Parse YAML frontmatter + body
|
|
479
|
-
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
480
|
-
let name = memFile.file.replace('.md', '');
|
|
481
|
-
let description = '';
|
|
482
|
-
let type = 'auto-memory';
|
|
483
|
-
let body = content;
|
|
484
|
-
|
|
485
|
-
if (frontmatterMatch) {
|
|
486
|
-
const yaml = frontmatterMatch[1];
|
|
487
|
-
body = frontmatterMatch[2].trim();
|
|
488
|
-
const nameMatch = yaml.match(/^name:\s*(.+)$/m);
|
|
489
|
-
const descMatch = yaml.match(/^description:\s*(.+)$/m);
|
|
490
|
-
const typeMatch = yaml.match(/^type:\s*(.+)$/m);
|
|
491
|
-
if (nameMatch) name = nameMatch[1].trim();
|
|
492
|
-
if (descMatch) description = descMatch[1].trim();
|
|
493
|
-
if (typeMatch) type = typeMatch[1].trim();
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
// Split body into sections (## headers) for granular entries
|
|
497
|
-
const sections = body.split(/^(?=## )/m).filter(s => s.trim().length > 20);
|
|
498
|
-
|
|
499
|
-
if (sections.length === 0) {
|
|
500
|
-
// Store whole file as one entry
|
|
501
|
-
if (body.length > 10) {
|
|
502
|
-
await memInit.storeEntry({
|
|
503
|
-
key: `claude-memory:${memFile.project}:${name}`,
|
|
504
|
-
value: body.slice(0, 4096),
|
|
505
|
-
namespace: 'claude-memories',
|
|
506
|
-
generateEmbeddingFlag: true,
|
|
507
|
-
});
|
|
508
|
-
imported++;
|
|
509
|
-
}
|
|
510
|
-
} else {
|
|
511
|
-
// Store each section separately for better search granularity
|
|
512
|
-
for (const section of sections) {
|
|
513
|
-
const titleMatch = section.match(/^##\s+(.+)/);
|
|
514
|
-
const sectionTitle = titleMatch ? titleMatch[1].trim() : name;
|
|
515
|
-
const sectionBody = section.replace(/^##\s+.+\n/, '').trim();
|
|
516
|
-
if (sectionBody.length < 10) continue;
|
|
517
|
-
|
|
518
|
-
await memInit.storeEntry({
|
|
519
|
-
key: `claude-memory:${memFile.project}:${name}:${sectionTitle.slice(0, 50)}`,
|
|
520
|
-
value: sectionBody.slice(0, 4096),
|
|
521
|
-
namespace: 'claude-memories',
|
|
522
|
-
generateEmbeddingFlag: true,
|
|
523
|
-
});
|
|
524
|
-
imported++;
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
dim(` ✓ ${memFile.project}/${memFile.file} (${sections.length || 1} entries)`);
|
|
529
|
-
} catch (err) {
|
|
530
|
-
dim(` ✗ ${memFile.project}/${memFile.file}: ${err.message?.slice(0, 60)}`);
|
|
531
|
-
skipped++;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
success(`Imported ${imported} entries from ${memoryFiles.length} files (${skipped} skipped)`);
|
|
536
|
-
success('All Claude Code memories now searchable via AgentDB vector search');
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
// ============================================================================
|
|
540
|
-
// Main
|
|
541
|
-
// ============================================================================
|
|
542
|
-
|
|
543
|
-
const command = process.argv[2] || 'status';
|
|
544
|
-
|
|
545
|
-
// Suppress unhandled rejection warnings from dynamic import() failures
|
|
546
|
-
// which can cause non-zero exit codes even when caught
|
|
547
|
-
process.on('unhandledRejection', () => {});
|
|
548
|
-
|
|
549
|
-
try {
|
|
550
|
-
switch (command) {
|
|
551
|
-
case 'import': await doImport(); break;
|
|
552
|
-
case 'import-all': await doImportAll(); break;
|
|
553
|
-
case 'sync': await doSync(); break;
|
|
554
|
-
case 'status': await doStatus(); break;
|
|
555
|
-
default:
|
|
556
|
-
console.log('Usage: auto-memory-hook.mjs <import|sync|status>');
|
|
557
|
-
process.exit(1);
|
|
558
|
-
}
|
|
559
|
-
} catch (err) {
|
|
560
|
-
// Hooks must never crash Claude Code - fail silently
|
|
561
|
-
dim(`Error (non-critical): ${err.message}`);
|
|
562
|
-
}
|
|
563
|
-
// Ensure clean exit for Claude Code hooks (exit 0 = success, no stderr = no error)
|
|
564
|
-
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 log = (msg) => console.log(`${CYAN}[AutoMemory] ${msg}${RESET}`);
|
|
31
|
+
const success = (msg) => console.log(`${GREEN}[AutoMemory] ✓ ${msg}${RESET}`);
|
|
32
|
+
const dim = (msg) => console.log(` ${DIM}${msg}${RESET}`);
|
|
33
|
+
|
|
34
|
+
// Ensure data dir
|
|
35
|
+
if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
|
|
36
|
+
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Simple JSON File Backend (implements IMemoryBackend interface)
|
|
39
|
+
// ============================================================================
|
|
40
|
+
|
|
41
|
+
class JsonFileBackend {
|
|
42
|
+
constructor(filePath) {
|
|
43
|
+
this.filePath = filePath;
|
|
44
|
+
this.entries = new Map();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async initialize() {
|
|
48
|
+
if (existsSync(this.filePath)) {
|
|
49
|
+
try {
|
|
50
|
+
const data = JSON.parse(readFileSync(this.filePath, 'utf-8'));
|
|
51
|
+
if (Array.isArray(data)) {
|
|
52
|
+
for (const entry of data) this.entries.set(entry.id, entry);
|
|
53
|
+
}
|
|
54
|
+
} catch { /* start fresh */ }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async shutdown() { this._persist(); }
|
|
59
|
+
async store(entry) { this.entries.set(entry.id, entry); this._persist(); }
|
|
60
|
+
async get(id) { return this.entries.get(id) ?? null; }
|
|
61
|
+
async getByKey(key, ns) {
|
|
62
|
+
for (const e of this.entries.values()) {
|
|
63
|
+
if (e.key === key && (!ns || e.namespace === ns)) return e;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
async update(id, updates) {
|
|
68
|
+
const e = this.entries.get(id);
|
|
69
|
+
if (!e) return null;
|
|
70
|
+
if (updates.metadata) Object.assign(e.metadata, updates.metadata);
|
|
71
|
+
if (updates.content !== undefined) e.content = updates.content;
|
|
72
|
+
if (updates.tags) e.tags = updates.tags;
|
|
73
|
+
e.updatedAt = Date.now();
|
|
74
|
+
this._persist();
|
|
75
|
+
return e;
|
|
76
|
+
}
|
|
77
|
+
async delete(id) { return this.entries.delete(id); }
|
|
78
|
+
async query(opts) {
|
|
79
|
+
let results = [...this.entries.values()];
|
|
80
|
+
if (opts?.namespace) results = results.filter(e => e.namespace === opts.namespace);
|
|
81
|
+
if (opts?.type) results = results.filter(e => e.type === opts.type);
|
|
82
|
+
if (opts?.limit) results = results.slice(0, opts.limit);
|
|
83
|
+
return results;
|
|
84
|
+
}
|
|
85
|
+
async search() { return []; } // No vector search in JSON backend
|
|
86
|
+
async bulkInsert(entries) { for (const e of entries) this.entries.set(e.id, e); this._persist(); }
|
|
87
|
+
async bulkDelete(ids) { let n = 0; for (const id of ids) { if (this.entries.delete(id)) n++; } this._persist(); return n; }
|
|
88
|
+
async count() { return this.entries.size; }
|
|
89
|
+
async listNamespaces() {
|
|
90
|
+
const ns = new Set();
|
|
91
|
+
for (const e of this.entries.values()) ns.add(e.namespace || 'default');
|
|
92
|
+
return [...ns];
|
|
93
|
+
}
|
|
94
|
+
async clearNamespace(ns) {
|
|
95
|
+
let n = 0;
|
|
96
|
+
for (const [id, e] of this.entries) {
|
|
97
|
+
if (e.namespace === ns) { this.entries.delete(id); n++; }
|
|
98
|
+
}
|
|
99
|
+
this._persist();
|
|
100
|
+
return n;
|
|
101
|
+
}
|
|
102
|
+
async getStats() {
|
|
103
|
+
return {
|
|
104
|
+
totalEntries: this.entries.size,
|
|
105
|
+
entriesByNamespace: {},
|
|
106
|
+
entriesByType: { semantic: 0, episodic: 0, procedural: 0, working: 0, cache: 0 },
|
|
107
|
+
memoryUsage: 0, avgQueryTime: 0, avgSearchTime: 0,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
async healthCheck() {
|
|
111
|
+
return {
|
|
112
|
+
status: 'healthy',
|
|
113
|
+
components: {
|
|
114
|
+
storage: { status: 'healthy', latency: 0 },
|
|
115
|
+
index: { status: 'healthy', latency: 0 },
|
|
116
|
+
cache: { status: 'healthy', latency: 0 },
|
|
117
|
+
},
|
|
118
|
+
timestamp: Date.now(), issues: [], recommendations: [],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
_persist() {
|
|
123
|
+
try {
|
|
124
|
+
writeFileSync(this.filePath, JSON.stringify([...this.entries.values()], null, 2), 'utf-8');
|
|
125
|
+
} catch { /* best effort */ }
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ============================================================================
|
|
130
|
+
// Resolve memory package path (local dev or npm installed)
|
|
131
|
+
// ============================================================================
|
|
132
|
+
|
|
133
|
+
async function loadMemoryPackage() {
|
|
134
|
+
// Strategy 1: Local dev (built dist)
|
|
135
|
+
const localDist = join(PROJECT_ROOT, 'v3/@claude-flow/memory/dist/index.js');
|
|
136
|
+
if (existsSync(localDist)) {
|
|
137
|
+
try {
|
|
138
|
+
return await import(`file://${localDist}`);
|
|
139
|
+
} catch { /* fall through */ }
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Strategy 2: Use createRequire for CJS-style resolution (handles nested node_modules
|
|
143
|
+
// when installed as a transitive dependency via npx ruflo / npx claude-flow)
|
|
144
|
+
try {
|
|
145
|
+
const { createRequire } = await import('module');
|
|
146
|
+
const require = createRequire(join(PROJECT_ROOT, 'package.json'));
|
|
147
|
+
return require('@claude-flow/memory');
|
|
148
|
+
} catch { /* fall through */ }
|
|
149
|
+
|
|
150
|
+
// Strategy 3: ESM import (works when @claude-flow/memory is a direct dependency)
|
|
151
|
+
try {
|
|
152
|
+
return await import('@claude-flow/memory');
|
|
153
|
+
} catch { /* fall through */ }
|
|
154
|
+
|
|
155
|
+
// Strategy 4: Walk up from PROJECT_ROOT looking for @claude-flow/memory in any node_modules
|
|
156
|
+
let searchDir = PROJECT_ROOT;
|
|
157
|
+
const { parse } = await import('path');
|
|
158
|
+
while (searchDir !== parse(searchDir).root) {
|
|
159
|
+
const candidate = join(searchDir, 'node_modules', '@claude-flow', 'memory', 'dist', 'index.js');
|
|
160
|
+
if (existsSync(candidate)) {
|
|
161
|
+
try {
|
|
162
|
+
return await import(`file://${candidate}`);
|
|
163
|
+
} catch { /* fall through */ }
|
|
164
|
+
}
|
|
165
|
+
searchDir = dirname(searchDir);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ============================================================================
|
|
172
|
+
// Read config from .claude-flow/config.yaml
|
|
173
|
+
// ============================================================================
|
|
174
|
+
|
|
175
|
+
function readConfig() {
|
|
176
|
+
const configPath = join(PROJECT_ROOT, '.claude-flow', 'config.yaml');
|
|
177
|
+
const defaults = {
|
|
178
|
+
learningBridge: { enabled: true, sonaMode: 'balanced', confidenceDecayRate: 0.005, accessBoostAmount: 0.03, consolidationThreshold: 10 },
|
|
179
|
+
memoryGraph: { enabled: true, pageRankDamping: 0.85, maxNodes: 5000, similarityThreshold: 0.8 },
|
|
180
|
+
agentScopes: { enabled: true, defaultScope: 'project' },
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
if (!existsSync(configPath)) return defaults;
|
|
184
|
+
|
|
185
|
+
try {
|
|
186
|
+
const yaml = readFileSync(configPath, 'utf-8');
|
|
187
|
+
// Simple YAML parser for the memory section
|
|
188
|
+
const getBool = (key) => {
|
|
189
|
+
const match = yaml.match(new RegExp(`${key}:\\s*(true|false)`, 'i'));
|
|
190
|
+
return match ? match[1] === 'true' : undefined;
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const lbEnabled = getBool('learningBridge[\\s\\S]*?enabled');
|
|
194
|
+
if (lbEnabled !== undefined) defaults.learningBridge.enabled = lbEnabled;
|
|
195
|
+
|
|
196
|
+
const mgEnabled = getBool('memoryGraph[\\s\\S]*?enabled');
|
|
197
|
+
if (mgEnabled !== undefined) defaults.memoryGraph.enabled = mgEnabled;
|
|
198
|
+
|
|
199
|
+
const asEnabled = getBool('agentScopes[\\s\\S]*?enabled');
|
|
200
|
+
if (asEnabled !== undefined) defaults.agentScopes.enabled = asEnabled;
|
|
201
|
+
|
|
202
|
+
return defaults;
|
|
203
|
+
} catch {
|
|
204
|
+
return defaults;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// ============================================================================
|
|
209
|
+
// Commands
|
|
210
|
+
// ============================================================================
|
|
211
|
+
|
|
212
|
+
async function doImport() {
|
|
213
|
+
log('Importing auto memory files into bridge...');
|
|
214
|
+
|
|
215
|
+
const memPkg = await loadMemoryPackage();
|
|
216
|
+
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
217
|
+
dim('Memory package not available — skipping auto memory import');
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const config = readConfig();
|
|
222
|
+
const backend = new JsonFileBackend(STORE_PATH);
|
|
223
|
+
await backend.initialize();
|
|
224
|
+
|
|
225
|
+
const bridgeConfig = {
|
|
226
|
+
workingDir: PROJECT_ROOT,
|
|
227
|
+
syncMode: 'on-session-end',
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
// Wire learning if enabled and available
|
|
231
|
+
if (config.learningBridge.enabled && memPkg.LearningBridge) {
|
|
232
|
+
bridgeConfig.learning = {
|
|
233
|
+
sonaMode: config.learningBridge.sonaMode,
|
|
234
|
+
confidenceDecayRate: config.learningBridge.confidenceDecayRate,
|
|
235
|
+
accessBoostAmount: config.learningBridge.accessBoostAmount,
|
|
236
|
+
consolidationThreshold: config.learningBridge.consolidationThreshold,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Wire graph if enabled and available
|
|
241
|
+
if (config.memoryGraph.enabled && memPkg.MemoryGraph) {
|
|
242
|
+
bridgeConfig.graph = {
|
|
243
|
+
pageRankDamping: config.memoryGraph.pageRankDamping,
|
|
244
|
+
maxNodes: config.memoryGraph.maxNodes,
|
|
245
|
+
similarityThreshold: config.memoryGraph.similarityThreshold,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const bridge = new memPkg.AutoMemoryBridge(backend, bridgeConfig);
|
|
250
|
+
|
|
251
|
+
try {
|
|
252
|
+
const result = await bridge.importFromAutoMemory();
|
|
253
|
+
success(`Imported ${result.imported} entries (${result.skipped} skipped)`);
|
|
254
|
+
dim(`├─ Backend entries: ${await backend.count()}`);
|
|
255
|
+
dim(`├─ Learning: ${config.learningBridge.enabled ? 'active' : 'disabled'}`);
|
|
256
|
+
dim(`├─ Graph: ${config.memoryGraph.enabled ? 'active' : 'disabled'}`);
|
|
257
|
+
dim(`└─ Agent scopes: ${config.agentScopes.enabled ? 'active' : 'disabled'}`);
|
|
258
|
+
|
|
259
|
+
// Bridge to AgentDB: store entries with ONNX vector embeddings for semantic search
|
|
260
|
+
let vectorized = 0;
|
|
261
|
+
try {
|
|
262
|
+
const cliDistPath = join(PROJECT_ROOT, 'v3/@claude-flow/cli/dist/src/memory/memory-initializer.js');
|
|
263
|
+
if (existsSync(cliDistPath)) {
|
|
264
|
+
const memInit = await import(`file://${cliDistPath}`);
|
|
265
|
+
await memInit.initializeMemoryDatabase({ force: false, verbose: false });
|
|
266
|
+
|
|
267
|
+
const entries = await backend.query({});
|
|
268
|
+
for (const entry of entries) {
|
|
269
|
+
if (!entry.content || entry.content.length < 10) continue;
|
|
270
|
+
try {
|
|
271
|
+
await memInit.storeEntry({
|
|
272
|
+
key: entry.key || entry.id,
|
|
273
|
+
value: entry.content,
|
|
274
|
+
namespace: entry.namespace || 'auto-memory',
|
|
275
|
+
generateEmbeddingFlag: true,
|
|
276
|
+
});
|
|
277
|
+
vectorized++;
|
|
278
|
+
} catch { /* skip entries that fail to embed */ }
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (vectorized > 0) {
|
|
282
|
+
success(`Vectorized ${vectorized} entries into AgentDB (ONNX 384-dim)`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
} catch (vecErr) {
|
|
286
|
+
dim(`AgentDB vectorization skipped: ${vecErr.message?.slice(0, 60)}`);
|
|
287
|
+
}
|
|
288
|
+
} catch (err) {
|
|
289
|
+
dim(`Import failed (non-critical): ${err.message}`);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
await backend.shutdown();
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async function doSync() {
|
|
296
|
+
log('Syncing insights to auto memory files...');
|
|
297
|
+
|
|
298
|
+
const memPkg = await loadMemoryPackage();
|
|
299
|
+
if (!memPkg || !memPkg.AutoMemoryBridge) {
|
|
300
|
+
dim('Memory package not available — skipping sync');
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const config = readConfig();
|
|
305
|
+
const backend = new JsonFileBackend(STORE_PATH);
|
|
306
|
+
await backend.initialize();
|
|
307
|
+
|
|
308
|
+
const entryCount = await backend.count();
|
|
309
|
+
if (entryCount === 0) {
|
|
310
|
+
dim('No entries to sync');
|
|
311
|
+
await backend.shutdown();
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const bridgeConfig = {
|
|
316
|
+
workingDir: PROJECT_ROOT,
|
|
317
|
+
syncMode: 'on-session-end',
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
if (config.learningBridge.enabled && memPkg.LearningBridge) {
|
|
321
|
+
bridgeConfig.learning = {
|
|
322
|
+
sonaMode: config.learningBridge.sonaMode,
|
|
323
|
+
confidenceDecayRate: config.learningBridge.confidenceDecayRate,
|
|
324
|
+
consolidationThreshold: config.learningBridge.consolidationThreshold,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (config.memoryGraph.enabled && memPkg.MemoryGraph) {
|
|
329
|
+
bridgeConfig.graph = {
|
|
330
|
+
pageRankDamping: config.memoryGraph.pageRankDamping,
|
|
331
|
+
maxNodes: config.memoryGraph.maxNodes,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
const bridge = new memPkg.AutoMemoryBridge(backend, bridgeConfig);
|
|
336
|
+
|
|
337
|
+
try {
|
|
338
|
+
const syncResult = await bridge.syncToAutoMemory();
|
|
339
|
+
success(`Synced ${syncResult.synced} entries to auto memory`);
|
|
340
|
+
dim(`├─ Categories updated: ${syncResult.categories?.join(', ') || 'none'}`);
|
|
341
|
+
dim(`└─ Backend entries: ${entryCount}`);
|
|
342
|
+
|
|
343
|
+
// Curate MEMORY.md index with graph-aware ordering
|
|
344
|
+
await bridge.curateIndex();
|
|
345
|
+
success('Curated MEMORY.md index');
|
|
346
|
+
|
|
347
|
+
// Flush intelligence patterns to disk (SONA + ReasoningBank)
|
|
348
|
+
try {
|
|
349
|
+
const intPath = join(PROJECT_ROOT, 'v3/@claude-flow/cli/dist/src/memory/intelligence.js');
|
|
350
|
+
if (existsSync(intPath)) {
|
|
351
|
+
const intelligence = await import(`file://${intPath}`);
|
|
352
|
+
if (intelligence.flushPatterns) {
|
|
353
|
+
intelligence.flushPatterns();
|
|
354
|
+
const stats = intelligence.getIntelligenceStats?.();
|
|
355
|
+
if (stats && stats.patternsLearned > 0) {
|
|
356
|
+
success(`Flushed ${stats.patternsLearned} learned patterns to disk`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
} catch { /* non-critical */ }
|
|
361
|
+
} catch (err) {
|
|
362
|
+
dim(`Sync failed (non-critical): ${err.message}`);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if (bridge.destroy) bridge.destroy();
|
|
366
|
+
await backend.shutdown();
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
async function doStatus() {
|
|
370
|
+
const memPkg = await loadMemoryPackage();
|
|
371
|
+
const config = readConfig();
|
|
372
|
+
|
|
373
|
+
console.log('\n=== Auto Memory Bridge Status ===\n');
|
|
374
|
+
console.log(` Package: ${memPkg ? '✅ Available' : '❌ Not found'}`);
|
|
375
|
+
console.log(` Store: ${existsSync(STORE_PATH) ? '✅ ' + STORE_PATH : '⏸ Not initialized'}`);
|
|
376
|
+
console.log(` LearningBridge: ${config.learningBridge.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
377
|
+
console.log(` MemoryGraph: ${config.memoryGraph.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
378
|
+
console.log(` AgentScopes: ${config.agentScopes.enabled ? '✅ Enabled' : '⏸ Disabled'}`);
|
|
379
|
+
|
|
380
|
+
if (existsSync(STORE_PATH)) {
|
|
381
|
+
try {
|
|
382
|
+
const data = JSON.parse(readFileSync(STORE_PATH, 'utf-8'));
|
|
383
|
+
console.log(` Entries: ${Array.isArray(data) ? data.length : 0}`);
|
|
384
|
+
} catch { /* ignore */ }
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// AgentDB vector status
|
|
388
|
+
try {
|
|
389
|
+
const dbPath = join(PROJECT_ROOT, '.claude-flow', 'memory', 'memory.db');
|
|
390
|
+
const swarmDbPath = join(PROJECT_ROOT, '.swarm', 'memory.db');
|
|
391
|
+
const hasDb = existsSync(dbPath) || existsSync(swarmDbPath);
|
|
392
|
+
console.log(` AgentDB: ${hasDb ? '✅ sql.js database exists' : '⏸ Not initialized'}`);
|
|
393
|
+
|
|
394
|
+
const intPath = join(PROJECT_ROOT, 'v3/@claude-flow/cli/dist/src/memory/intelligence.js');
|
|
395
|
+
if (existsSync(intPath)) {
|
|
396
|
+
const intelligence = await import(`file://${intPath}`);
|
|
397
|
+
const stats = intelligence.getIntelligenceStats?.();
|
|
398
|
+
if (stats) {
|
|
399
|
+
console.log(` SONA: ${stats.sonaEnabled ? '✅ Active' : '⏸ Not initialized'}`);
|
|
400
|
+
console.log(` Patterns: ${stats.patternsLearned} learned`);
|
|
401
|
+
console.log(` Trajectories: ${stats.trajectoriesRecorded} recorded`);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
} catch { /* ignore */ }
|
|
405
|
+
|
|
406
|
+
console.log('');
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// ============================================================================
|
|
410
|
+
// Import ALL Claude Code memories from all projects into AgentDB
|
|
411
|
+
// ============================================================================
|
|
412
|
+
|
|
413
|
+
async function doImportAll() {
|
|
414
|
+
log('Importing ALL Claude Code memories into AgentDB...');
|
|
415
|
+
|
|
416
|
+
const { homedir } = await import('os');
|
|
417
|
+
const { readdirSync } = await import('fs');
|
|
418
|
+
const claudeProjectsDir = join(homedir(), '.claude', 'projects');
|
|
419
|
+
|
|
420
|
+
if (!existsSync(claudeProjectsDir)) {
|
|
421
|
+
dim('No Claude Code projects found at ' + claudeProjectsDir);
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// Find all memory files across all projects
|
|
426
|
+
const memoryFiles = [];
|
|
427
|
+
try {
|
|
428
|
+
const projects = readdirSync(claudeProjectsDir, { withFileTypes: true });
|
|
429
|
+
for (const project of projects) {
|
|
430
|
+
if (!project.isDirectory()) continue;
|
|
431
|
+
const memDir = join(claudeProjectsDir, project.name, 'memory');
|
|
432
|
+
if (!existsSync(memDir)) continue;
|
|
433
|
+
const files = readdirSync(memDir).filter(f => f.endsWith('.md'));
|
|
434
|
+
for (const file of files) {
|
|
435
|
+
memoryFiles.push({
|
|
436
|
+
path: join(memDir, file),
|
|
437
|
+
project: project.name,
|
|
438
|
+
file,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
} catch (err) {
|
|
443
|
+
dim('Error scanning projects: ' + err.message);
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
if (memoryFiles.length === 0) {
|
|
448
|
+
dim('No memory files found');
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
log(`Found ${memoryFiles.length} memory files across ${new Set(memoryFiles.map(f => f.project)).size} projects`);
|
|
453
|
+
|
|
454
|
+
// Load memory-initializer for vectorized storage
|
|
455
|
+
let memInit = null;
|
|
456
|
+
try {
|
|
457
|
+
const cliDistPath = join(PROJECT_ROOT, 'v3/@claude-flow/cli/dist/src/memory/memory-initializer.js');
|
|
458
|
+
if (existsSync(cliDistPath)) {
|
|
459
|
+
memInit = await import(`file://${cliDistPath}`);
|
|
460
|
+
await memInit.initializeMemoryDatabase({ force: false, verbose: false });
|
|
461
|
+
}
|
|
462
|
+
} catch (err) {
|
|
463
|
+
dim('Memory initializer not available: ' + err.message?.slice(0, 60));
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
if (!memInit) {
|
|
467
|
+
dim('Cannot vectorize without memory-initializer. Run: cd v3/@claude-flow/cli && npm run build');
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
let imported = 0;
|
|
472
|
+
let skipped = 0;
|
|
473
|
+
|
|
474
|
+
for (const memFile of memoryFiles) {
|
|
475
|
+
try {
|
|
476
|
+
const content = readFileSync(memFile.path, 'utf-8');
|
|
477
|
+
|
|
478
|
+
// Parse YAML frontmatter + body
|
|
479
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
480
|
+
let name = memFile.file.replace('.md', '');
|
|
481
|
+
let description = '';
|
|
482
|
+
let type = 'auto-memory';
|
|
483
|
+
let body = content;
|
|
484
|
+
|
|
485
|
+
if (frontmatterMatch) {
|
|
486
|
+
const yaml = frontmatterMatch[1];
|
|
487
|
+
body = frontmatterMatch[2].trim();
|
|
488
|
+
const nameMatch = yaml.match(/^name:\s*(.+)$/m);
|
|
489
|
+
const descMatch = yaml.match(/^description:\s*(.+)$/m);
|
|
490
|
+
const typeMatch = yaml.match(/^type:\s*(.+)$/m);
|
|
491
|
+
if (nameMatch) name = nameMatch[1].trim();
|
|
492
|
+
if (descMatch) description = descMatch[1].trim();
|
|
493
|
+
if (typeMatch) type = typeMatch[1].trim();
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// Split body into sections (## headers) for granular entries
|
|
497
|
+
const sections = body.split(/^(?=## )/m).filter(s => s.trim().length > 20);
|
|
498
|
+
|
|
499
|
+
if (sections.length === 0) {
|
|
500
|
+
// Store whole file as one entry
|
|
501
|
+
if (body.length > 10) {
|
|
502
|
+
await memInit.storeEntry({
|
|
503
|
+
key: `claude-memory:${memFile.project}:${name}`,
|
|
504
|
+
value: body.slice(0, 4096),
|
|
505
|
+
namespace: 'claude-memories',
|
|
506
|
+
generateEmbeddingFlag: true,
|
|
507
|
+
});
|
|
508
|
+
imported++;
|
|
509
|
+
}
|
|
510
|
+
} else {
|
|
511
|
+
// Store each section separately for better search granularity
|
|
512
|
+
for (const section of sections) {
|
|
513
|
+
const titleMatch = section.match(/^##\s+(.+)/);
|
|
514
|
+
const sectionTitle = titleMatch ? titleMatch[1].trim() : name;
|
|
515
|
+
const sectionBody = section.replace(/^##\s+.+\n/, '').trim();
|
|
516
|
+
if (sectionBody.length < 10) continue;
|
|
517
|
+
|
|
518
|
+
await memInit.storeEntry({
|
|
519
|
+
key: `claude-memory:${memFile.project}:${name}:${sectionTitle.slice(0, 50)}`,
|
|
520
|
+
value: sectionBody.slice(0, 4096),
|
|
521
|
+
namespace: 'claude-memories',
|
|
522
|
+
generateEmbeddingFlag: true,
|
|
523
|
+
});
|
|
524
|
+
imported++;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
dim(` ✓ ${memFile.project}/${memFile.file} (${sections.length || 1} entries)`);
|
|
529
|
+
} catch (err) {
|
|
530
|
+
dim(` ✗ ${memFile.project}/${memFile.file}: ${err.message?.slice(0, 60)}`);
|
|
531
|
+
skipped++;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
success(`Imported ${imported} entries from ${memoryFiles.length} files (${skipped} skipped)`);
|
|
536
|
+
success('All Claude Code memories now searchable via AgentDB vector search');
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// ============================================================================
|
|
540
|
+
// Main
|
|
541
|
+
// ============================================================================
|
|
542
|
+
|
|
543
|
+
const command = process.argv[2] || 'status';
|
|
544
|
+
|
|
545
|
+
// Suppress unhandled rejection warnings from dynamic import() failures
|
|
546
|
+
// which can cause non-zero exit codes even when caught
|
|
547
|
+
process.on('unhandledRejection', () => {});
|
|
548
|
+
|
|
549
|
+
try {
|
|
550
|
+
switch (command) {
|
|
551
|
+
case 'import': await doImport(); break;
|
|
552
|
+
case 'import-all': await doImportAll(); break;
|
|
553
|
+
case 'sync': await doSync(); break;
|
|
554
|
+
case 'status': await doStatus(); break;
|
|
555
|
+
default:
|
|
556
|
+
console.log('Usage: auto-memory-hook.mjs <import|sync|status>');
|
|
557
|
+
process.exit(1);
|
|
558
|
+
}
|
|
559
|
+
} catch (err) {
|
|
560
|
+
// Hooks must never crash Claude Code - fail silently
|
|
561
|
+
dim(`Error (non-critical): ${err.message}`);
|
|
562
|
+
}
|
|
563
|
+
// Ensure clean exit for Claude Code hooks (exit 0 = success, no stderr = no error)
|
|
564
|
+
process.exit(0);
|