@aigentic/claude-flow 3.7.0-alpha.69
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 +222 -0
- package/.claude/agents/analysis/analyze-code-quality.md +58 -0
- package/.claude/agents/analysis/code-analyzer.md +189 -0
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +58 -0
- package/.claude/agents/architecture/arch-system-design.md +157 -0
- package/.claude/agents/architecture/system-design/arch-system-design.md +36 -0
- package/.claude/agents/base-template-generator.md +41 -0
- package/.claude/agents/browser/browser-agent.yaml +182 -0
- package/.claude/agents/consensus/byzantine-coordinator.md +43 -0
- package/.claude/agents/consensus/crdt-synchronizer.md +977 -0
- package/.claude/agents/consensus/gossip-coordinator.md +43 -0
- package/.claude/agents/consensus/performance-benchmarker.md +831 -0
- package/.claude/agents/consensus/quorum-manager.md +803 -0
- package/.claude/agents/consensus/raft-manager.md +43 -0
- package/.claude/agents/consensus/security-manager.md +602 -0
- package/.claude/agents/core/coder.md +255 -0
- package/.claude/agents/core/planner.md +152 -0
- package/.claude/agents/core/researcher.md +174 -0
- package/.claude/agents/core/reviewer.md +309 -0
- package/.claude/agents/core/tester.md +300 -0
- package/.claude/agents/custom/test-long-runner.md +43 -0
- package/.claude/agents/data/data-ml-model.md +445 -0
- package/.claude/agents/data/ml/data-ml-model.md +76 -0
- package/.claude/agents/database-specialist.md +9 -0
- package/.claude/agents/development/backend/dev-backend-api.md +29 -0
- package/.claude/agents/development/dev-backend-api.md +178 -0
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +52 -0
- package/.claude/agents/devops/ops-cicd-github.md +165 -0
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +63 -0
- package/.claude/agents/documentation/docs-api-openapi.md +355 -0
- package/.claude/agents/dual-mode/codex-coordinator.md +206 -0
- package/.claude/agents/dual-mode/codex-worker.md +190 -0
- package/.claude/agents/dual-mode/dual-orchestrator.md +253 -0
- package/.claude/agents/flow-nexus/app-store.md +88 -0
- package/.claude/agents/flow-nexus/authentication.md +69 -0
- package/.claude/agents/flow-nexus/challenges.md +81 -0
- package/.claude/agents/flow-nexus/neural-network.md +88 -0
- package/.claude/agents/flow-nexus/payments.md +83 -0
- package/.claude/agents/flow-nexus/sandbox.md +76 -0
- package/.claude/agents/flow-nexus/swarm.md +76 -0
- package/.claude/agents/flow-nexus/user-tools.md +96 -0
- package/.claude/agents/flow-nexus/workflow.md +84 -0
- package/.claude/agents/github/code-review-swarm.md +521 -0
- package/.claude/agents/github/github-modes.md +154 -0
- package/.claude/agents/github/issue-tracker.md +299 -0
- package/.claude/agents/github/multi-repo-swarm.md +525 -0
- package/.claude/agents/github/pr-manager.md +163 -0
- package/.claude/agents/github/project-board-sync.md +478 -0
- package/.claude/agents/github/release-manager.md +336 -0
- package/.claude/agents/github/release-swarm.md +551 -0
- package/.claude/agents/github/repo-architect.md +365 -0
- package/.claude/agents/github/swarm-issue.md +548 -0
- package/.claude/agents/github/swarm-pr.md +399 -0
- package/.claude/agents/github/sync-coordinator.md +423 -0
- package/.claude/agents/github/workflow-automation.md +605 -0
- package/.claude/agents/goal/agent.md +817 -0
- package/.claude/agents/goal/code-goal-planner.md +445 -0
- package/.claude/agents/goal/goal-planner.md +168 -0
- package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +129 -0
- package/.claude/agents/hive-mind/queen-coordinator.md +202 -0
- package/.claude/agents/hive-mind/scout-explorer.md +241 -0
- package/.claude/agents/hive-mind/swarm-memory-manager.md +192 -0
- package/.claude/agents/hive-mind/worker-specialist.md +216 -0
- package/.claude/agents/neural/safla-neural.md +74 -0
- package/.claude/agents/optimization/benchmark-suite.md +663 -0
- package/.claude/agents/optimization/load-balancer.md +429 -0
- package/.claude/agents/optimization/performance-monitor.md +670 -0
- package/.claude/agents/optimization/resource-allocator.md +672 -0
- package/.claude/agents/optimization/topology-optimizer.md +806 -0
- package/.claude/agents/payments/agentic-payments.md +126 -0
- package/.claude/agents/project-coordinator.md +8 -0
- package/.claude/agents/python-specialist.md +9 -0
- package/.claude/agents/reasoning/agent.md +817 -0
- package/.claude/agents/reasoning/goal-planner.md +73 -0
- package/.claude/agents/security-auditor.md +9 -0
- package/.claude/agents/sona/sona-learning-optimizer.md +65 -0
- package/.claude/agents/sparc/architecture.md +453 -0
- package/.claude/agents/sparc/pseudocode.md +299 -0
- package/.claude/agents/sparc/refinement.md +504 -0
- package/.claude/agents/sparc/specification.md +258 -0
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +88 -0
- package/.claude/agents/specialized/spec-mobile-react-native.md +227 -0
- package/.claude/agents/sublinear/consensus-coordinator.md +338 -0
- package/.claude/agents/sublinear/matrix-optimizer.md +185 -0
- package/.claude/agents/sublinear/pagerank-analyzer.md +299 -0
- package/.claude/agents/sublinear/performance-optimizer.md +368 -0
- package/.claude/agents/sublinear/trading-predictor.md +246 -0
- package/.claude/agents/swarm/adaptive-coordinator.md +364 -0
- package/.claude/agents/swarm/hierarchical-coordinator.md +300 -0
- package/.claude/agents/swarm/mesh-coordinator.md +363 -0
- package/.claude/agents/templates/automation-smart-agent.md +185 -0
- package/.claude/agents/templates/base-template-generator.md +289 -0
- package/.claude/agents/templates/coordinator-swarm-init.md +83 -0
- package/.claude/agents/templates/github-pr-manager.md +155 -0
- package/.claude/agents/templates/implementer-sparc-coder.md +243 -0
- package/.claude/agents/templates/memory-coordinator.md +163 -0
- package/.claude/agents/templates/migration-plan.md +724 -0
- package/.claude/agents/templates/orchestrator-task.md +120 -0
- package/.claude/agents/templates/performance-analyzer.md +179 -0
- package/.claude/agents/templates/sparc-coordinator.md +163 -0
- package/.claude/agents/testing/production-validator.md +373 -0
- package/.claude/agents/testing/tdd-london-swarm.md +222 -0
- package/.claude/agents/testing/unit/tdd-london-swarm.md +222 -0
- package/.claude/agents/testing/validation/production-validator.md +373 -0
- package/.claude/agents/typescript-specialist.md +9 -0
- package/.claude/agents/v3/adr-architect.md +184 -0
- package/.claude/agents/v3/aidefence-guardian.md +282 -0
- package/.claude/agents/v3/claims-authorizer.md +208 -0
- package/.claude/agents/v3/collective-intelligence-coordinator.md +993 -0
- package/.claude/agents/v3/database-specialist.md +9 -0
- package/.claude/agents/v3/ddd-domain-expert.md +220 -0
- package/.claude/agents/v3/injection-analyst.md +236 -0
- package/.claude/agents/v3/memory-specialist.md +995 -0
- package/.claude/agents/v3/performance-engineer.md +1233 -0
- package/.claude/agents/v3/pii-detector.md +151 -0
- package/.claude/agents/v3/project-coordinator.md +8 -0
- package/.claude/agents/v3/python-specialist.md +9 -0
- package/.claude/agents/v3/reasoningbank-learner.md +213 -0
- package/.claude/agents/v3/security-architect-aidefence.md +410 -0
- package/.claude/agents/v3/security-architect.md +867 -0
- package/.claude/agents/v3/security-auditor.md +771 -0
- package/.claude/agents/v3/sparc-orchestrator.md +182 -0
- package/.claude/agents/v3/swarm-memory-manager.md +157 -0
- package/.claude/agents/v3/test-architect.md +9 -0
- package/.claude/agents/v3/typescript-specialist.md +9 -0
- package/.claude/agents/v3/v3-integration-architect.md +312 -0
- package/.claude/agents/v3/v3-memory-specialist.md +281 -0
- package/.claude/agents/v3/v3-performance-engineer.md +363 -0
- package/.claude/agents/v3/v3-queen-coordinator.md +63 -0
- package/.claude/agents/v3/v3-security-architect.md +140 -0
- package/.claude/checkpoints/1767754460.json +8 -0
- package/.claude/commands/agents/README.md +10 -0
- package/.claude/commands/agents/agent-capabilities.md +21 -0
- package/.claude/commands/agents/agent-coordination.md +28 -0
- package/.claude/commands/agents/agent-spawning.md +28 -0
- package/.claude/commands/agents/agent-types.md +26 -0
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +54 -0
- package/.claude/commands/analysis/README.md +9 -0
- package/.claude/commands/analysis/bottleneck-detect.md +162 -0
- package/.claude/commands/analysis/performance-bottlenecks.md +59 -0
- package/.claude/commands/analysis/performance-report.md +25 -0
- package/.claude/commands/analysis/token-efficiency.md +45 -0
- package/.claude/commands/analysis/token-usage.md +25 -0
- package/.claude/commands/automation/README.md +9 -0
- package/.claude/commands/automation/auto-agent.md +122 -0
- package/.claude/commands/automation/self-healing.md +106 -0
- package/.claude/commands/automation/session-memory.md +90 -0
- package/.claude/commands/automation/smart-agents.md +73 -0
- package/.claude/commands/automation/smart-spawn.md +25 -0
- package/.claude/commands/automation/workflow-select.md +25 -0
- package/.claude/commands/claude-flow-help.md +103 -0
- package/.claude/commands/claude-flow-memory.md +107 -0
- package/.claude/commands/claude-flow-swarm.md +205 -0
- package/.claude/commands/coordination/README.md +9 -0
- package/.claude/commands/coordination/agent-spawn.md +25 -0
- package/.claude/commands/coordination/init.md +44 -0
- package/.claude/commands/coordination/orchestrate.md +43 -0
- package/.claude/commands/coordination/spawn.md +45 -0
- package/.claude/commands/coordination/swarm-init.md +85 -0
- package/.claude/commands/coordination/task-orchestrate.md +25 -0
- package/.claude/commands/flow-nexus/app-store.md +124 -0
- package/.claude/commands/flow-nexus/challenges.md +120 -0
- package/.claude/commands/flow-nexus/login-registration.md +65 -0
- package/.claude/commands/flow-nexus/neural-network.md +134 -0
- package/.claude/commands/flow-nexus/payments.md +116 -0
- package/.claude/commands/flow-nexus/sandbox.md +83 -0
- package/.claude/commands/flow-nexus/swarm.md +87 -0
- package/.claude/commands/flow-nexus/user-tools.md +152 -0
- package/.claude/commands/flow-nexus/workflow.md +115 -0
- package/.claude/commands/github/README.md +11 -0
- package/.claude/commands/github/code-review-swarm.md +514 -0
- package/.claude/commands/github/code-review.md +25 -0
- package/.claude/commands/github/github-modes.md +147 -0
- package/.claude/commands/github/github-swarm.md +121 -0
- package/.claude/commands/github/issue-tracker.md +292 -0
- package/.claude/commands/github/issue-triage.md +25 -0
- package/.claude/commands/github/multi-repo-swarm.md +519 -0
- package/.claude/commands/github/pr-enhance.md +26 -0
- package/.claude/commands/github/pr-manager.md +170 -0
- package/.claude/commands/github/project-board-sync.md +471 -0
- package/.claude/commands/github/release-manager.md +338 -0
- package/.claude/commands/github/release-swarm.md +544 -0
- package/.claude/commands/github/repo-analyze.md +25 -0
- package/.claude/commands/github/repo-architect.md +367 -0
- package/.claude/commands/github/swarm-issue.md +482 -0
- package/.claude/commands/github/swarm-pr.md +285 -0
- package/.claude/commands/github/sync-coordinator.md +301 -0
- package/.claude/commands/github/workflow-automation.md +442 -0
- package/.claude/commands/hive-mind/README.md +17 -0
- package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-init.md +18 -0
- package/.claude/commands/hive-mind/hive-mind-memory.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-resume.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -0
- package/.claude/commands/hive-mind/hive-mind-status.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-stop.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -0
- package/.claude/commands/hive-mind/hive-mind.md +27 -0
- package/.claude/commands/hooks/README.md +11 -0
- package/.claude/commands/hooks/overview.md +58 -0
- package/.claude/commands/hooks/post-edit.md +117 -0
- package/.claude/commands/hooks/post-task.md +112 -0
- package/.claude/commands/hooks/pre-edit.md +113 -0
- package/.claude/commands/hooks/pre-task.md +111 -0
- package/.claude/commands/hooks/session-end.md +118 -0
- package/.claude/commands/hooks/setup.md +103 -0
- package/.claude/commands/memory/README.md +9 -0
- package/.claude/commands/memory/memory-persist.md +25 -0
- package/.claude/commands/memory/memory-search.md +25 -0
- package/.claude/commands/memory/memory-usage.md +25 -0
- package/.claude/commands/memory/neural.md +47 -0
- package/.claude/commands/monitoring/README.md +9 -0
- package/.claude/commands/monitoring/agent-metrics.md +25 -0
- package/.claude/commands/monitoring/agents.md +44 -0
- package/.claude/commands/monitoring/real-time-view.md +25 -0
- package/.claude/commands/monitoring/status.md +46 -0
- package/.claude/commands/monitoring/swarm-monitor.md +25 -0
- package/.claude/commands/optimization/README.md +9 -0
- package/.claude/commands/optimization/auto-topology.md +62 -0
- package/.claude/commands/optimization/cache-manage.md +25 -0
- package/.claude/commands/optimization/parallel-execute.md +25 -0
- package/.claude/commands/optimization/parallel-execution.md +50 -0
- package/.claude/commands/optimization/topology-optimize.md +25 -0
- package/.claude/commands/pair/README.md +261 -0
- package/.claude/commands/pair/commands.md +546 -0
- package/.claude/commands/pair/config.md +510 -0
- package/.claude/commands/pair/examples.md +512 -0
- package/.claude/commands/pair/modes.md +348 -0
- package/.claude/commands/pair/session.md +407 -0
- package/.claude/commands/pair/start.md +209 -0
- package/.claude/commands/sparc/analyzer.md +52 -0
- package/.claude/commands/sparc/architect.md +53 -0
- package/.claude/commands/sparc/ask.md +97 -0
- package/.claude/commands/sparc/batch-executor.md +54 -0
- package/.claude/commands/sparc/code.md +89 -0
- package/.claude/commands/sparc/coder.md +54 -0
- package/.claude/commands/sparc/debug.md +83 -0
- package/.claude/commands/sparc/debugger.md +54 -0
- package/.claude/commands/sparc/designer.md +53 -0
- package/.claude/commands/sparc/devops.md +109 -0
- package/.claude/commands/sparc/docs-writer.md +80 -0
- package/.claude/commands/sparc/documenter.md +54 -0
- package/.claude/commands/sparc/innovator.md +54 -0
- package/.claude/commands/sparc/integration.md +83 -0
- package/.claude/commands/sparc/mcp.md +117 -0
- package/.claude/commands/sparc/memory-manager.md +54 -0
- package/.claude/commands/sparc/optimizer.md +54 -0
- package/.claude/commands/sparc/orchestrator.md +132 -0
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -0
- package/.claude/commands/sparc/refinement-optimization-mode.md +83 -0
- package/.claude/commands/sparc/researcher.md +54 -0
- package/.claude/commands/sparc/reviewer.md +54 -0
- package/.claude/commands/sparc/security-review.md +80 -0
- package/.claude/commands/sparc/sparc-modes.md +174 -0
- package/.claude/commands/sparc/sparc.md +111 -0
- package/.claude/commands/sparc/spec-pseudocode.md +80 -0
- package/.claude/commands/sparc/supabase-admin.md +348 -0
- package/.claude/commands/sparc/swarm-coordinator.md +54 -0
- package/.claude/commands/sparc/tdd.md +54 -0
- package/.claude/commands/sparc/tester.md +54 -0
- package/.claude/commands/sparc/tutorial.md +79 -0
- package/.claude/commands/sparc/workflow-manager.md +54 -0
- package/.claude/commands/sparc.md +166 -0
- package/.claude/commands/stream-chain/pipeline.md +121 -0
- package/.claude/commands/stream-chain/run.md +70 -0
- package/.claude/commands/swarm/README.md +15 -0
- package/.claude/commands/swarm/analysis.md +95 -0
- package/.claude/commands/swarm/development.md +96 -0
- package/.claude/commands/swarm/examples.md +168 -0
- package/.claude/commands/swarm/maintenance.md +102 -0
- package/.claude/commands/swarm/optimization.md +117 -0
- package/.claude/commands/swarm/research.md +136 -0
- package/.claude/commands/swarm/swarm-analysis.md +8 -0
- package/.claude/commands/swarm/swarm-background.md +8 -0
- package/.claude/commands/swarm/swarm-init.md +19 -0
- package/.claude/commands/swarm/swarm-modes.md +8 -0
- package/.claude/commands/swarm/swarm-monitor.md +8 -0
- package/.claude/commands/swarm/swarm-spawn.md +19 -0
- package/.claude/commands/swarm/swarm-status.md +8 -0
- package/.claude/commands/swarm/swarm-strategies.md +8 -0
- package/.claude/commands/swarm/swarm.md +27 -0
- package/.claude/commands/swarm/testing.md +131 -0
- package/.claude/commands/training/README.md +9 -0
- package/.claude/commands/training/model-update.md +25 -0
- package/.claude/commands/training/neural-patterns.md +74 -0
- package/.claude/commands/training/neural-train.md +25 -0
- package/.claude/commands/training/pattern-learn.md +25 -0
- package/.claude/commands/training/specialization.md +63 -0
- package/.claude/commands/truth/start.md +143 -0
- package/.claude/commands/verify/check.md +50 -0
- package/.claude/commands/verify/start.md +128 -0
- package/.claude/commands/workflows/README.md +9 -0
- package/.claude/commands/workflows/development.md +78 -0
- package/.claude/commands/workflows/research.md +63 -0
- package/.claude/commands/workflows/workflow-create.md +25 -0
- package/.claude/commands/workflows/workflow-execute.md +25 -0
- package/.claude/commands/workflows/workflow-export.md +25 -0
- package/.claude/config/v3-dependency-optimization.json +266 -0
- package/.claude/config/v3-performance-targets.json +251 -0
- package/.claude/helpers/README.md +97 -0
- package/.claude/helpers/adr-compliance.sh +186 -0
- package/.claude/helpers/aggressive-microcompact.mjs +36 -0
- package/.claude/helpers/auto-commit.sh +178 -0
- package/.claude/helpers/auto-memory-hook.mjs +564 -0
- package/.claude/helpers/checkpoint-manager.sh +251 -0
- package/.claude/helpers/context-persistence-hook.mjs +1979 -0
- package/.claude/helpers/daemon-manager.sh +252 -0
- package/.claude/helpers/ddd-tracker.sh +144 -0
- package/.claude/helpers/github-safe.js +106 -0
- package/.claude/helpers/github-setup.sh +28 -0
- package/.claude/helpers/guidance-hook.sh +13 -0
- package/.claude/helpers/guidance-hooks.sh +102 -0
- package/.claude/helpers/health-monitor.sh +108 -0
- package/.claude/helpers/hook-handler.cjs +269 -0
- package/.claude/helpers/intelligence.cjs +230 -0
- package/.claude/helpers/learning-hooks.sh +329 -0
- package/.claude/helpers/learning-optimizer.sh +127 -0
- package/.claude/helpers/learning-service.mjs +1144 -0
- package/.claude/helpers/memory.cjs +84 -0
- package/.claude/helpers/memory.js +83 -0
- package/.claude/helpers/metrics-db.mjs +488 -0
- package/.claude/helpers/patch-aggressive-prune.mjs +184 -0
- package/.claude/helpers/pattern-consolidator.sh +86 -0
- package/.claude/helpers/perf-worker.sh +160 -0
- package/.claude/helpers/post-commit +16 -0
- package/.claude/helpers/pre-commit +26 -0
- package/.claude/helpers/quick-start.sh +19 -0
- package/.claude/helpers/router.cjs +62 -0
- package/.claude/helpers/router.js +66 -0
- package/.claude/helpers/security-scanner.sh +127 -0
- package/.claude/helpers/session.cjs +125 -0
- package/.claude/helpers/session.js +135 -0
- package/.claude/helpers/setup-mcp.sh +18 -0
- package/.claude/helpers/standard-checkpoint-hooks.sh +189 -0
- package/.claude/helpers/statusline-hook.sh +21 -0
- package/.claude/helpers/statusline.cjs +878 -0
- package/.claude/helpers/statusline.js +352 -0
- package/.claude/helpers/swarm-comms.sh +353 -0
- package/.claude/helpers/swarm-hooks.sh +761 -0
- package/.claude/helpers/swarm-monitor.sh +211 -0
- package/.claude/helpers/sync-v3-metrics.sh +245 -0
- package/.claude/helpers/update-v3-progress.sh +166 -0
- package/.claude/helpers/v3-quick-status.sh +58 -0
- package/.claude/helpers/v3.sh +111 -0
- package/.claude/helpers/validate-v3-config.sh +216 -0
- package/.claude/helpers/worker-manager.sh +170 -0
- package/.claude/mcp.json +13 -0
- package/.claude/scheduled_tasks.lock +1 -0
- package/.claude/settings.json +285 -0
- package/.claude/settings.json.bak +526 -0
- package/.claude/skills/agentdb-advanced/SKILL.md +550 -0
- package/.claude/skills/agentdb-learning/SKILL.md +545 -0
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -0
- package/.claude/skills/agentdb-optimization/SKILL.md +509 -0
- package/.claude/skills/agentdb-vector-search/SKILL.md +339 -0
- package/.claude/skills/agentic-jujutsu/SKILL.md +645 -0
- package/.claude/skills/browser/SKILL.md +204 -0
- package/.claude/skills/dual-mode/README.md +71 -0
- package/.claude/skills/dual-mode/dual-collect.md +103 -0
- package/.claude/skills/dual-mode/dual-coordinate.md +85 -0
- package/.claude/skills/dual-mode/dual-spawn.md +81 -0
- package/.claude/skills/flow-nexus-neural/SKILL.md +727 -0
- package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -0
- package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -0
- package/.claude/skills/github-code-review/SKILL.md +1125 -0
- package/.claude/skills/github-multi-repo/SKILL.md +862 -0
- package/.claude/skills/github-project-management/SKILL.md +1263 -0
- package/.claude/skills/github-release-management/SKILL.md +1064 -0
- package/.claude/skills/github-workflow-automation/SKILL.md +1047 -0
- package/.claude/skills/hive-mind-advanced/SKILL.md +709 -0
- package/.claude/skills/hooks-automation/SKILL.md +1201 -0
- package/.claude/skills/pair-programming/SKILL.md +1202 -0
- package/.claude/skills/performance-analysis/SKILL.md +560 -0
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -0
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -0
- package/.claude/skills/skill-builder/SKILL.md +910 -0
- package/.claude/skills/sparc-methodology/SKILL.md +1106 -0
- package/.claude/skills/stream-chain/SKILL.md +560 -0
- package/.claude/skills/swarm-advanced/SKILL.md +970 -0
- package/.claude/skills/swarm-orchestration/SKILL.md +179 -0
- package/.claude/skills/v3-cli-modernization/SKILL.md +872 -0
- package/.claude/skills/v3-core-implementation/SKILL.md +797 -0
- package/.claude/skills/v3-ddd-architecture/SKILL.md +442 -0
- package/.claude/skills/v3-integration-deep/SKILL.md +241 -0
- package/.claude/skills/v3-mcp-optimization/SKILL.md +777 -0
- package/.claude/skills/v3-memory-unification/SKILL.md +174 -0
- package/.claude/skills/v3-performance-optimization/SKILL.md +390 -0
- package/.claude/skills/v3-security-overhaul/SKILL.md +82 -0
- package/.claude/skills/v3-swarm-coordination/SKILL.md +340 -0
- package/.claude/skills/verification-quality/SKILL.md +691 -0
- package/.claude/skills/worker-benchmarks/SKILL.md +129 -0
- package/.claude/skills/worker-integration/SKILL.md +147 -0
- package/.claude/statusline-command.sh +176 -0
- package/.claude/statusline.mjs +109 -0
- package/.claude/statusline.sh +431 -0
- package/.claude-plugin/README.md +720 -0
- package/.claude-plugin/docs/INSTALLATION.md +261 -0
- package/.claude-plugin/docs/PLUGIN_SUMMARY.md +361 -0
- package/.claude-plugin/docs/QUICKSTART.md +361 -0
- package/.claude-plugin/docs/STRUCTURE.md +128 -0
- package/.claude-plugin/hooks/hooks.json +75 -0
- package/.claude-plugin/marketplace.json +170 -0
- package/.claude-plugin/plugin.json +71 -0
- package/.claude-plugin/scripts/install.sh +234 -0
- package/.claude-plugin/scripts/ruflo-hook.sh +33 -0
- package/.claude-plugin/scripts/uninstall.sh +36 -0
- package/.claude-plugin/scripts/verify.sh +108 -0
- package/LICENSE +21 -0
- package/README.md +410 -0
- package/bin/cli.js +11 -0
- package/bin/npx-repair.js +7 -0
- package/bin/npx-safe-launch.js +9 -0
- package/package.json +159 -0
- package/v3/@claude-flow/cli/README.md +410 -0
- package/v3/@claude-flow/cli/bin/cli.js +233 -0
- package/v3/@claude-flow/cli/bin/mcp-server.js +224 -0
- package/v3/@claude-flow/cli/bin/preinstall.cjs +2 -0
- package/v3/@claude-flow/cli/dist/src/appliance/gguf-engine.d.ts +91 -0
- package/v3/@claude-flow/cli/dist/src/appliance/gguf-engine.js +425 -0
- package/v3/@claude-flow/cli/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/v3/@claude-flow/cli/dist/src/appliance/ruvllm-bridge.js +292 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-builder.js +329 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-distribution.js +370 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-format.js +393 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-runner.js +237 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/v3/@claude-flow/cli/dist/src/appliance/rvfa-signing.js +347 -0
- package/v3/@claude-flow/cli/dist/src/autopilot-state.d.ts +77 -0
- package/v3/@claude-flow/cli/dist/src/autopilot-state.js +271 -0
- package/v3/@claude-flow/cli/dist/src/benchmarks/pretrain/index.d.ts +58 -0
- package/v3/@claude-flow/cli/dist/src/benchmarks/pretrain/index.js +404 -0
- package/v3/@claude-flow/cli/dist/src/commands/agent-wasm.d.ts +14 -0
- package/v3/@claude-flow/cli/dist/src/commands/agent-wasm.js +333 -0
- package/v3/@claude-flow/cli/dist/src/commands/agent.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/agent.js +927 -0
- package/v3/@claude-flow/cli/dist/src/commands/analyze.d.ts +19 -0
- package/v3/@claude-flow/cli/dist/src/commands/analyze.js +2048 -0
- package/v3/@claude-flow/cli/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/commands/appliance-advanced.js +215 -0
- package/v3/@claude-flow/cli/dist/src/commands/appliance.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/appliance.js +404 -0
- package/v3/@claude-flow/cli/dist/src/commands/autopilot.d.ts +15 -0
- package/v3/@claude-flow/cli/dist/src/commands/autopilot.js +362 -0
- package/v3/@claude-flow/cli/dist/src/commands/benchmark.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/benchmark.js +460 -0
- package/v3/@claude-flow/cli/dist/src/commands/claims.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/claims.js +620 -0
- package/v3/@claude-flow/cli/dist/src/commands/cleanup.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/commands/cleanup.js +250 -0
- package/v3/@claude-flow/cli/dist/src/commands/completions.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/completions.js +539 -0
- package/v3/@claude-flow/cli/dist/src/commands/config.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/config.js +430 -0
- package/v3/@claude-flow/cli/dist/src/commands/daemon.d.ts +28 -0
- package/v3/@claude-flow/cli/dist/src/commands/daemon.js +1093 -0
- package/v3/@claude-flow/cli/dist/src/commands/deployment.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/deployment.js +672 -0
- package/v3/@claude-flow/cli/dist/src/commands/doctor.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/doctor.js +885 -0
- package/v3/@claude-flow/cli/dist/src/commands/embeddings.d.ts +18 -0
- package/v3/@claude-flow/cli/dist/src/commands/embeddings.js +1623 -0
- package/v3/@claude-flow/cli/dist/src/commands/guidance.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/guidance.js +556 -0
- package/v3/@claude-flow/cli/dist/src/commands/hive-mind.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/hive-mind.js +1297 -0
- package/v3/@claude-flow/cli/dist/src/commands/hooks.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/hooks.js +4499 -0
- package/v3/@claude-flow/cli/dist/src/commands/index.d.ts +118 -0
- package/v3/@claude-flow/cli/dist/src/commands/index.js +344 -0
- package/v3/@claude-flow/cli/dist/src/commands/init.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/init.js +997 -0
- package/v3/@claude-flow/cli/dist/src/commands/issues.d.ts +21 -0
- package/v3/@claude-flow/cli/dist/src/commands/issues.js +567 -0
- package/v3/@claude-flow/cli/dist/src/commands/mcp.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/mcp.js +718 -0
- package/v3/@claude-flow/cli/dist/src/commands/memory.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/memory.js +1456 -0
- package/v3/@claude-flow/cli/dist/src/commands/migrate.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/migrate.js +742 -0
- package/v3/@claude-flow/cli/dist/src/commands/neural.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/neural.js +1531 -0
- package/v3/@claude-flow/cli/dist/src/commands/performance.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/performance.js +583 -0
- package/v3/@claude-flow/cli/dist/src/commands/plugins.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/plugins.js +826 -0
- package/v3/@claude-flow/cli/dist/src/commands/process.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/process.js +694 -0
- package/v3/@claude-flow/cli/dist/src/commands/progress.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/progress.js +259 -0
- package/v3/@claude-flow/cli/dist/src/commands/providers.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/providers.js +502 -0
- package/v3/@claude-flow/cli/dist/src/commands/route.d.ts +16 -0
- package/v3/@claude-flow/cli/dist/src/commands/route.js +813 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/backup.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/backup.js +747 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/benchmark.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/benchmark.js +490 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/import.d.ts +18 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/import.js +373 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/index.d.ts +29 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/index.js +129 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/init.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/init.js +467 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/migrate.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/migrate.js +498 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/optimize.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/optimize.js +505 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/pg-utils.d.ts +14 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/pg-utils.js +41 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/setup.d.ts +18 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/setup.js +765 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/status.d.ts +11 -0
- package/v3/@claude-flow/cli/dist/src/commands/ruvector/status.js +479 -0
- package/v3/@claude-flow/cli/dist/src/commands/security.d.ts +10 -0
- package/v3/@claude-flow/cli/dist/src/commands/security.js +920 -0
- package/v3/@claude-flow/cli/dist/src/commands/session.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/session.js +757 -0
- package/v3/@claude-flow/cli/dist/src/commands/start.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/start.js +418 -0
- package/v3/@claude-flow/cli/dist/src/commands/status.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/status.js +591 -0
- package/v3/@claude-flow/cli/dist/src/commands/swarm.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/swarm.js +887 -0
- package/v3/@claude-flow/cli/dist/src/commands/task.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/task.js +675 -0
- package/v3/@claude-flow/cli/dist/src/commands/transfer-store.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/commands/transfer-store.js +428 -0
- package/v3/@claude-flow/cli/dist/src/commands/update.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/update.js +276 -0
- package/v3/@claude-flow/cli/dist/src/commands/verify.d.ts +19 -0
- package/v3/@claude-flow/cli/dist/src/commands/verify.js +261 -0
- package/v3/@claude-flow/cli/dist/src/commands/workflow.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/commands/workflow.js +617 -0
- package/v3/@claude-flow/cli/dist/src/config-adapter.d.ts +15 -0
- package/v3/@claude-flow/cli/dist/src/config-adapter.js +186 -0
- package/v3/@claude-flow/cli/dist/src/encryption/vault.d.ts +94 -0
- package/v3/@claude-flow/cli/dist/src/encryption/vault.js +172 -0
- package/v3/@claude-flow/cli/dist/src/fs-secure.d.ts +67 -0
- package/v3/@claude-flow/cli/dist/src/fs-secure.js +74 -0
- package/v3/@claude-flow/cli/dist/src/index.d.ts +81 -0
- package/v3/@claude-flow/cli/dist/src/index.js +538 -0
- package/v3/@claude-flow/cli/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
- package/v3/@claude-flow/cli/dist/src/infrastructure/in-memory-repositories.js +264 -0
- package/v3/@claude-flow/cli/dist/src/init/claudemd-generator.d.ts +16 -0
- package/v3/@claude-flow/cli/dist/src/init/claudemd-generator.js +363 -0
- package/v3/@claude-flow/cli/dist/src/init/executor.d.ts +41 -0
- package/v3/@claude-flow/cli/dist/src/init/executor.js +1904 -0
- package/v3/@claude-flow/cli/dist/src/init/helpers-generator.d.ts +60 -0
- package/v3/@claude-flow/cli/dist/src/init/helpers-generator.js +1185 -0
- package/v3/@claude-flow/cli/dist/src/init/index.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/init/index.js +15 -0
- package/v3/@claude-flow/cli/dist/src/init/mcp-generator.d.ts +26 -0
- package/v3/@claude-flow/cli/dist/src/init/mcp-generator.js +116 -0
- package/v3/@claude-flow/cli/dist/src/init/settings-generator.d.ts +14 -0
- package/v3/@claude-flow/cli/dist/src/init/settings-generator.js +456 -0
- package/v3/@claude-flow/cli/dist/src/init/statusline-generator.d.ts +28 -0
- package/v3/@claude-flow/cli/dist/src/init/statusline-generator.js +937 -0
- package/v3/@claude-flow/cli/dist/src/init/types.d.ts +308 -0
- package/v3/@claude-flow/cli/dist/src/init/types.js +263 -0
- package/v3/@claude-flow/cli/dist/src/log-filters.d.ts +22 -0
- package/v3/@claude-flow/cli/dist/src/log-filters.js +36 -0
- package/v3/@claude-flow/cli/dist/src/mcp-client.d.ts +92 -0
- package/v3/@claude-flow/cli/dist/src/mcp-client.js +287 -0
- package/v3/@claude-flow/cli/dist/src/mcp-server.d.ts +163 -0
- package/v3/@claude-flow/cli/dist/src/mcp-server.js +732 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-execute-core.d.ts +92 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-execute-core.js +328 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-tools.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-tools.js +716 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agentdb-tools.d.ts +33 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agentdb-tools.js +867 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/analyze-tools.js +346 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/auto-install.d.ts +83 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/auto-install.js +131 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/autopilot-tools.d.ts +12 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/autopilot-tools.js +231 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-session-tools.d.ts +23 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-session-tools.js +324 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-tools.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/browser-tools.js +757 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/claims-tools.d.ts +12 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/claims-tools.js +863 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/config-tools.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/config-tools.js +411 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/coordination-tools.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/coordination-tools.js +729 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/daa-tools.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/daa-tools.js +534 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/embeddings-tools.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/embeddings-tools.js +904 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/github-tools.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/github-tools.js +659 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/guidance-tools.d.ts +15 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/guidance-tools.js +639 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/hive-mind-tools.js +953 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.d.ts +46 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.js +3939 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/index.d.ts +27 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/index.js +26 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/managed-agent-tools.d.ts +22 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/managed-agent-tools.js +357 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/memory-tools.d.ts +14 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/memory-tools.js +1240 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/neural-tools.d.ts +16 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/neural-tools.js +793 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/performance-tools.d.ts +16 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/performance-tools.js +675 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/progress-tools.d.ts +14 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/progress-tools.js +348 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/request-tracker.d.ts +17 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/request-tracker.js +27 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/ruvllm-tools.js +339 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/security-tools.d.ts +18 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/security-tools.js +556 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/session-tools.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/session-tools.js +517 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/swarm-tools.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/swarm-tools.js +388 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/system-tools.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/system-tools.js +674 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/task-tools.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/task-tools.js +487 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/terminal-tools.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/terminal-tools.js +306 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/transfer-tools.d.ts +14 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/transfer-tools.js +447 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/types.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/types.js +8 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/validate-input.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/validate-input.js +9 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/wasm-agent-tools.js +291 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/workflow-tools.js +884 -0
- package/v3/@claude-flow/cli/dist/src/memory/ewc-consolidation.d.ts +295 -0
- package/v3/@claude-flow/cli/dist/src/memory/ewc-consolidation.js +601 -0
- package/v3/@claude-flow/cli/dist/src/memory/intelligence.d.ts +357 -0
- package/v3/@claude-flow/cli/dist/src/memory/intelligence.js +1200 -0
- package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.d.ts +492 -0
- package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.js +2101 -0
- package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.d.ts +420 -0
- package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.js +2376 -0
- 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.d.ts +60 -0
- package/v3/@claude-flow/cli/dist/src/memory/rabitq-index.js +242 -0
- package/v3/@claude-flow/cli/dist/src/memory/sona-optimizer.d.ts +267 -0
- package/v3/@claude-flow/cli/dist/src/memory/sona-optimizer.js +779 -0
- package/v3/@claude-flow/cli/dist/src/output.d.ts +9 -0
- package/v3/@claude-flow/cli/dist/src/output.js +9 -0
- package/v3/@claude-flow/cli/dist/src/parser.d.ts +69 -0
- package/v3/@claude-flow/cli/dist/src/parser.js +473 -0
- package/v3/@claude-flow/cli/dist/src/plugins/manager.d.ts +133 -0
- package/v3/@claude-flow/cli/dist/src/plugins/manager.js +402 -0
- package/v3/@claude-flow/cli/dist/src/plugins/store/discovery.d.ts +91 -0
- package/v3/@claude-flow/cli/dist/src/plugins/store/discovery.js +1202 -0
- package/v3/@claude-flow/cli/dist/src/plugins/store/index.d.ts +76 -0
- package/v3/@claude-flow/cli/dist/src/plugins/store/index.js +141 -0
- package/v3/@claude-flow/cli/dist/src/plugins/store/search.d.ts +46 -0
- package/v3/@claude-flow/cli/dist/src/plugins/store/search.js +230 -0
- package/v3/@claude-flow/cli/dist/src/plugins/store/types.d.ts +274 -0
- package/v3/@claude-flow/cli/dist/src/plugins/store/types.js +7 -0
- package/v3/@claude-flow/cli/dist/src/plugins/tests/demo-plugin-store.d.ts +7 -0
- package/v3/@claude-flow/cli/dist/src/plugins/tests/demo-plugin-store.js +126 -0
- package/v3/@claude-flow/cli/dist/src/plugins/tests/standalone-test.d.ts +12 -0
- package/v3/@claude-flow/cli/dist/src/plugins/tests/standalone-test.js +188 -0
- package/v3/@claude-flow/cli/dist/src/plugins/tests/test-plugin-store.d.ts +7 -0
- package/v3/@claude-flow/cli/dist/src/plugins/tests/test-plugin-store.js +206 -0
- package/v3/@claude-flow/cli/dist/src/production/circuit-breaker.d.ts +101 -0
- package/v3/@claude-flow/cli/dist/src/production/circuit-breaker.js +241 -0
- package/v3/@claude-flow/cli/dist/src/production/error-handler.d.ts +92 -0
- package/v3/@claude-flow/cli/dist/src/production/error-handler.js +299 -0
- package/v3/@claude-flow/cli/dist/src/production/index.d.ts +23 -0
- package/v3/@claude-flow/cli/dist/src/production/index.js +18 -0
- package/v3/@claude-flow/cli/dist/src/production/monitoring.d.ts +161 -0
- package/v3/@claude-flow/cli/dist/src/production/monitoring.js +356 -0
- package/v3/@claude-flow/cli/dist/src/production/rate-limiter.d.ts +80 -0
- package/v3/@claude-flow/cli/dist/src/production/rate-limiter.js +201 -0
- package/v3/@claude-flow/cli/dist/src/production/retry.d.ts +48 -0
- package/v3/@claude-flow/cli/dist/src/production/retry.js +179 -0
- package/v3/@claude-flow/cli/dist/src/prompt.d.ts +44 -0
- package/v3/@claude-flow/cli/dist/src/prompt.js +501 -0
- package/v3/@claude-flow/cli/dist/src/runtime/headless.d.ts +60 -0
- package/v3/@claude-flow/cli/dist/src/runtime/headless.js +284 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/agent-wasm.d.ts +193 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/agent-wasm.js +354 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/ast-analyzer.d.ts +67 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/ast-analyzer.js +277 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/coverage-router.d.ts +160 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/coverage-router.js +531 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/coverage-tools.d.ts +33 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/coverage-tools.js +157 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/diff-classifier.d.ts +175 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/diff-classifier.js +699 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/diskann-backend.d.ts +78 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/diskann-backend.js +310 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/enhanced-model-router.d.ts +146 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/enhanced-model-router.js +529 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/graph-analyzer.d.ts +187 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/graph-analyzer.js +929 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/graph-backend.d.ts +79 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/graph-backend.js +220 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/index.d.ts +38 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/index.js +82 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/lora-adapter.d.ts +240 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/lora-adapter.js +550 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/model-router.d.ts +241 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/model-router.js +608 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/q-learning-router.d.ts +211 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/q-learning-router.js +681 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/ruvllm-wasm.js +367 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/semantic-router.d.ts +77 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/semantic-router.js +178 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/vector-db.d.ts +73 -0
- package/v3/@claude-flow/cli/dist/src/ruvector/vector-db.js +264 -0
- package/v3/@claude-flow/cli/dist/src/services/agentic-flow-bridge.d.ts +50 -0
- package/v3/@claude-flow/cli/dist/src/services/agentic-flow-bridge.js +95 -0
- package/v3/@claude-flow/cli/dist/src/services/claim-service.d.ts +204 -0
- package/v3/@claude-flow/cli/dist/src/services/claim-service.js +818 -0
- package/v3/@claude-flow/cli/dist/src/services/config-file-manager.d.ts +37 -0
- package/v3/@claude-flow/cli/dist/src/services/config-file-manager.js +233 -0
- package/v3/@claude-flow/cli/dist/src/services/container-worker-pool.d.ts +197 -0
- package/v3/@claude-flow/cli/dist/src/services/container-worker-pool.js +583 -0
- package/v3/@claude-flow/cli/dist/src/services/headless-worker-executor.d.ts +310 -0
- package/v3/@claude-flow/cli/dist/src/services/headless-worker-executor.js +1058 -0
- package/v3/@claude-flow/cli/dist/src/services/index.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/services/index.js +11 -0
- package/v3/@claude-flow/cli/dist/src/services/registry-api.d.ts +58 -0
- package/v3/@claude-flow/cli/dist/src/services/registry-api.js +146 -0
- package/v3/@claude-flow/cli/dist/src/services/ruvector-training.d.ts +222 -0
- package/v3/@claude-flow/cli/dist/src/services/ruvector-training.js +688 -0
- package/v3/@claude-flow/cli/dist/src/services/worker-daemon.d.ts +323 -0
- package/v3/@claude-flow/cli/dist/src/services/worker-daemon.js +1323 -0
- package/v3/@claude-flow/cli/dist/src/services/worker-queue.d.ts +194 -0
- package/v3/@claude-flow/cli/dist/src/services/worker-queue.js +513 -0
- package/v3/@claude-flow/cli/dist/src/suggest.d.ts +53 -0
- package/v3/@claude-flow/cli/dist/src/suggest.js +200 -0
- package/v3/@claude-flow/cli/dist/src/transfer/anonymization/index.d.ts +25 -0
- package/v3/@claude-flow/cli/dist/src/transfer/anonymization/index.js +175 -0
- package/v3/@claude-flow/cli/dist/src/transfer/deploy-seraphine.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/transfer/deploy-seraphine.js +205 -0
- package/v3/@claude-flow/cli/dist/src/transfer/export.d.ts +25 -0
- package/v3/@claude-flow/cli/dist/src/transfer/export.js +113 -0
- package/v3/@claude-flow/cli/dist/src/transfer/index.d.ts +12 -0
- package/v3/@claude-flow/cli/dist/src/transfer/index.js +31 -0
- package/v3/@claude-flow/cli/dist/src/transfer/ipfs/client.d.ts +109 -0
- package/v3/@claude-flow/cli/dist/src/transfer/ipfs/client.js +307 -0
- package/v3/@claude-flow/cli/dist/src/transfer/ipfs/upload.d.ts +95 -0
- package/v3/@claude-flow/cli/dist/src/transfer/ipfs/upload.js +413 -0
- package/v3/@claude-flow/cli/dist/src/transfer/models/seraphine.d.ts +72 -0
- package/v3/@claude-flow/cli/dist/src/transfer/models/seraphine.js +373 -0
- package/v3/@claude-flow/cli/dist/src/transfer/serialization/cfp.d.ts +49 -0
- package/v3/@claude-flow/cli/dist/src/transfer/serialization/cfp.js +183 -0
- package/v3/@claude-flow/cli/dist/src/transfer/storage/gcs.d.ts +82 -0
- package/v3/@claude-flow/cli/dist/src/transfer/storage/gcs.js +272 -0
- package/v3/@claude-flow/cli/dist/src/transfer/storage/index.d.ts +6 -0
- package/v3/@claude-flow/cli/dist/src/transfer/storage/index.js +6 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/discovery.d.ts +84 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/discovery.js +382 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/download.d.ts +70 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/download.js +334 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/index.d.ts +84 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/index.js +153 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/publish.d.ts +76 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/publish.js +294 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/registry.d.ts +58 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/registry.js +285 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/search.d.ts +54 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/search.js +232 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/tests/standalone-test.d.ts +12 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/tests/standalone-test.js +190 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/types.d.ts +193 -0
- package/v3/@claude-flow/cli/dist/src/transfer/store/types.js +6 -0
- package/v3/@claude-flow/cli/dist/src/transfer/test-seraphine.d.ts +6 -0
- package/v3/@claude-flow/cli/dist/src/transfer/test-seraphine.js +105 -0
- package/v3/@claude-flow/cli/dist/src/transfer/tests/test-store.d.ts +7 -0
- package/v3/@claude-flow/cli/dist/src/transfer/tests/test-store.js +214 -0
- package/v3/@claude-flow/cli/dist/src/transfer/types.d.ts +245 -0
- package/v3/@claude-flow/cli/dist/src/transfer/types.js +6 -0
- package/v3/@claude-flow/cli/dist/src/types.d.ts +13 -0
- package/v3/@claude-flow/cli/dist/src/types.js +13 -0
- package/v3/@claude-flow/cli/dist/src/update/checker.d.ts +34 -0
- package/v3/@claude-flow/cli/dist/src/update/checker.js +191 -0
- package/v3/@claude-flow/cli/dist/src/update/executor.d.ts +33 -0
- package/v3/@claude-flow/cli/dist/src/update/executor.js +217 -0
- package/v3/@claude-flow/cli/dist/src/update/index.d.ts +33 -0
- package/v3/@claude-flow/cli/dist/src/update/index.js +64 -0
- package/v3/@claude-flow/cli/dist/src/update/rate-limiter.d.ts +20 -0
- package/v3/@claude-flow/cli/dist/src/update/rate-limiter.js +96 -0
- package/v3/@claude-flow/cli/dist/src/update/validator.d.ts +17 -0
- package/v3/@claude-flow/cli/dist/src/update/validator.js +123 -0
- package/v3/@claude-flow/cli/package.json +133 -0
- package/v3/@claude-flow/guidance/README.md +1195 -0
- package/v3/@claude-flow/guidance/package.json +198 -0
- package/v3/@claude-flow/shared/README.md +323 -0
- package/v3/@claude-flow/shared/package.json +43 -0
- package/v3/README.md +493 -0
|
@@ -0,0 +1,1240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory MCP Tools for CLI - V3 with sql.js/HNSW Backend
|
|
3
|
+
*
|
|
4
|
+
* UPGRADED: Now uses the advanced sql.js + HNSW backend for:
|
|
5
|
+
* - 150x-12,500x faster semantic search
|
|
6
|
+
* - Vector embeddings with cosine similarity
|
|
7
|
+
* - Persistent SQLite storage (WASM)
|
|
8
|
+
* - Backward compatible with legacy JSON storage (auto-migrates)
|
|
9
|
+
*
|
|
10
|
+
* @module v3/cli/mcp-tools/memory-tools
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'fs';
|
|
13
|
+
import { homedir } from 'os';
|
|
14
|
+
import { join, resolve } from 'path';
|
|
15
|
+
import { createHash } from 'crypto';
|
|
16
|
+
import { validateIdentifier } from './validate-input.js';
|
|
17
|
+
// #1604: Align with memory-initializer.ts — single source of truth is .swarm/memory.db
|
|
18
|
+
const MEMORY_DIR = '.swarm';
|
|
19
|
+
const LEGACY_MEMORY_FILE = 'store.json';
|
|
20
|
+
const LEGACY_MEMORY_DIR = '.claude-flow/memory';
|
|
21
|
+
const MIGRATION_MARKER = '.migrated-to-sqlite';
|
|
22
|
+
function getMemoryDir() {
|
|
23
|
+
return resolve(MEMORY_DIR);
|
|
24
|
+
}
|
|
25
|
+
function getLegacyPath() {
|
|
26
|
+
return resolve(join(MEMORY_DIR, LEGACY_MEMORY_FILE));
|
|
27
|
+
}
|
|
28
|
+
function getMigrationMarkerPath() {
|
|
29
|
+
return resolve(join(MEMORY_DIR, MIGRATION_MARKER));
|
|
30
|
+
}
|
|
31
|
+
function ensureMemoryDir() {
|
|
32
|
+
const dir = getMemoryDir();
|
|
33
|
+
if (!existsSync(dir)) {
|
|
34
|
+
mkdirSync(dir, { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// D-2: Input bounds for memory parameters
|
|
38
|
+
const MAX_KEY_LENGTH = 1024;
|
|
39
|
+
const MAX_VALUE_SIZE = 1024 * 1024; // 1MB
|
|
40
|
+
const MAX_QUERY_LENGTH = 4096;
|
|
41
|
+
// #1425 — single source of truth for the dangerous-character set rejected by
|
|
42
|
+
// validateMemoryInput. Imported by sanitizeMemoryKey so write-side sanitization
|
|
43
|
+
// and read-side rejection can never drift apart (the symmetry bug behind #1884).
|
|
44
|
+
const DANGEROUS_KEY_CHARS = /[;&|`$(){}[\]<>!#\\\0]|\.\.[/\\]/g;
|
|
45
|
+
const DANGEROUS_KEY_PATTERN = /[;&|`$(){}[\]<>!#\\\0]|\.\.[/\\]/;
|
|
46
|
+
function validateMemoryInput(key, value, query, namespace) {
|
|
47
|
+
if (key && key.length > MAX_KEY_LENGTH) {
|
|
48
|
+
throw new Error(`Key exceeds maximum length of ${MAX_KEY_LENGTH} characters`);
|
|
49
|
+
}
|
|
50
|
+
if (value && value.length > MAX_VALUE_SIZE) {
|
|
51
|
+
throw new Error(`Value exceeds maximum size of ${MAX_VALUE_SIZE} bytes`);
|
|
52
|
+
}
|
|
53
|
+
if (query && query.length > MAX_QUERY_LENGTH) {
|
|
54
|
+
throw new Error(`Query exceeds maximum length of ${MAX_QUERY_LENGTH} characters`);
|
|
55
|
+
}
|
|
56
|
+
// Reject path traversal and shell metacharacters in keys/namespaces (#1425)
|
|
57
|
+
if (key && DANGEROUS_KEY_PATTERN.test(key)) {
|
|
58
|
+
throw new Error('Key contains disallowed characters');
|
|
59
|
+
}
|
|
60
|
+
if (namespace && DANGEROUS_KEY_PATTERN.test(namespace)) {
|
|
61
|
+
throw new Error('Namespace contains disallowed characters');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// #1884 — sanitize a key produced from arbitrary input (markdown headings,
|
|
65
|
+
// frontmatter names, file names) so it survives validateMemoryInput on the
|
|
66
|
+
// read/delete path. Replaces every dangerous char with `_`. Truncates to
|
|
67
|
+
// MAX_KEY_LENGTH so the bound check in validateMemoryInput also passes.
|
|
68
|
+
// Keep this in sync with DANGEROUS_KEY_PATTERN — they share DANGEROUS_KEY_CHARS.
|
|
69
|
+
function sanitizeMemoryKey(key) {
|
|
70
|
+
const safe = key.replace(DANGEROUS_KEY_CHARS, '_');
|
|
71
|
+
return safe.length > MAX_KEY_LENGTH ? safe.slice(0, MAX_KEY_LENGTH) : safe;
|
|
72
|
+
}
|
|
73
|
+
// #1937 — minimal glob → RegExp helper for memory_import_claude exclusion
|
|
74
|
+
// patterns. Anchored. Supports the three operators the issue's voice-fidelity
|
|
75
|
+
// workflow needs:
|
|
76
|
+
// `**` — any chars including path separators
|
|
77
|
+
// `*` — any chars except path separators
|
|
78
|
+
// `?` — exactly one char except a path separator
|
|
79
|
+
// Everything else is regex-escaped. Used to match absolute file paths.
|
|
80
|
+
function globToRegex(pattern) {
|
|
81
|
+
// Tokenize so we can replace `**` before `*` without overlap.
|
|
82
|
+
let out = '';
|
|
83
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
84
|
+
const c = pattern[i];
|
|
85
|
+
if (c === '*' && pattern[i + 1] === '*') {
|
|
86
|
+
out += '.*';
|
|
87
|
+
i++;
|
|
88
|
+
}
|
|
89
|
+
else if (c === '*') {
|
|
90
|
+
out += '[^/\\\\]*';
|
|
91
|
+
}
|
|
92
|
+
else if (c === '?') {
|
|
93
|
+
out += '[^/\\\\]';
|
|
94
|
+
}
|
|
95
|
+
else if (/[.+^$|(){}\[\]\\]/.test(c)) {
|
|
96
|
+
out += '\\' + c;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
out += c;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return new RegExp('^' + out + '$');
|
|
103
|
+
}
|
|
104
|
+
// #1883 — resolve the Claude-Code project memory directory for the *current*
|
|
105
|
+
// project. Claude Code hashes the project path differently per host OS, and
|
|
106
|
+
// our previous logic only POSIX-slash-replaced cwd, which breaks for:
|
|
107
|
+
// - WSL bridges where cwd is `/mnt/<drive>/...` but Claude Code is on Windows
|
|
108
|
+
// - paths containing spaces (Claude Code replaces spaces with dashes)
|
|
109
|
+
// - any leading slash on POSIX (Claude Code strips it)
|
|
110
|
+
// Strategy: try several candidate hashes and return the first one with a
|
|
111
|
+
// memory dir that exists. An explicit `projectPathOverride` short-circuits
|
|
112
|
+
// the heuristics for callers that know the canonical project path.
|
|
113
|
+
function resolveProjectMemoryDir(claudeProjectsDir, projectPathOverride) {
|
|
114
|
+
const candidates = new Set();
|
|
115
|
+
const sources = [];
|
|
116
|
+
if (projectPathOverride && projectPathOverride.length > 0) {
|
|
117
|
+
sources.push(projectPathOverride);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
sources.push(process.cwd());
|
|
121
|
+
}
|
|
122
|
+
for (const source of sources) {
|
|
123
|
+
// Candidate 1: legacy POSIX hash — what shipped before #1883
|
|
124
|
+
candidates.add(source.replace(/\//g, '-'));
|
|
125
|
+
// Candidate 2: WSL `/mnt/<drive>/...` translated to Claude-Code Windows hash
|
|
126
|
+
// e.g. `/mnt/c/Users/x/Project Name` → `C--Users-x-Project-Name`
|
|
127
|
+
const wsl = source.match(/^\/mnt\/([a-z])(\/.*)?$/i);
|
|
128
|
+
if (wsl) {
|
|
129
|
+
const drive = wsl[1].toUpperCase();
|
|
130
|
+
const rest = (wsl[2] ?? '').replace(/\//g, '-').replace(/ /g, '-');
|
|
131
|
+
candidates.add(`${drive}-${rest}`);
|
|
132
|
+
}
|
|
133
|
+
// Candidate 3: POSIX hash with leading dash stripped (Claude Code on macOS/Linux)
|
|
134
|
+
const stripped = source.replace(/\//g, '-').replace(/^-+/, '');
|
|
135
|
+
candidates.add(stripped);
|
|
136
|
+
// Candidate 4: spaces replaced with dashes (Claude Code's space rule)
|
|
137
|
+
candidates.add(source.replace(/\//g, '-').replace(/ /g, '-'));
|
|
138
|
+
// Candidate 5 (#1939): native Win32 path on a Win32 Claude Code install.
|
|
139
|
+
// `C:\Users\tobia\OneDrive\Desktop\Claude Stuff` →
|
|
140
|
+
// `C--Users-tobia-OneDrive-Desktop-Claude-Stuff`. Claude Code's on-disk
|
|
141
|
+
// slug replaces drive-colon AND backslashes AND whitespace with `-`.
|
|
142
|
+
// The earlier candidates only handled forward slashes, so a Win32+Win32
|
|
143
|
+
// setup never matched.
|
|
144
|
+
if (/^[A-Za-z]:[\\/]/.test(source)) {
|
|
145
|
+
candidates.add(source.replace(/[:\\/]/g, '-').replace(/\s+/g, '-'));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
for (const projectHash of candidates) {
|
|
149
|
+
const memDir = join(claudeProjectsDir, projectHash, 'memory');
|
|
150
|
+
if (existsSync(memDir))
|
|
151
|
+
return { memDir, projectHash };
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check if legacy JSON store exists in old .claude-flow/memory/ location
|
|
157
|
+
*/
|
|
158
|
+
function hasLegacyStore() {
|
|
159
|
+
const legacyPath = resolve(join(LEGACY_MEMORY_DIR, LEGACY_MEMORY_FILE));
|
|
160
|
+
const migrationMarker = resolve(join(LEGACY_MEMORY_DIR, MIGRATION_MARKER));
|
|
161
|
+
return existsSync(legacyPath) && !existsSync(migrationMarker);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Load legacy JSON store for migration
|
|
165
|
+
*/
|
|
166
|
+
function loadLegacyStore() {
|
|
167
|
+
try {
|
|
168
|
+
const legacyPath = resolve(join(LEGACY_MEMORY_DIR, LEGACY_MEMORY_FILE));
|
|
169
|
+
if (existsSync(legacyPath)) {
|
|
170
|
+
const data = readFileSync(legacyPath, 'utf-8');
|
|
171
|
+
return JSON.parse(data);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Return null on error
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Mark migration as complete
|
|
181
|
+
*/
|
|
182
|
+
function markMigrationComplete() {
|
|
183
|
+
const legacyDir = resolve(LEGACY_MEMORY_DIR);
|
|
184
|
+
if (!existsSync(legacyDir))
|
|
185
|
+
mkdirSync(legacyDir, { recursive: true });
|
|
186
|
+
writeFileSync(resolve(join(LEGACY_MEMORY_DIR, MIGRATION_MARKER)), JSON.stringify({
|
|
187
|
+
migratedAt: new Date().toISOString(),
|
|
188
|
+
version: '3.0.0',
|
|
189
|
+
}), 'utf-8');
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Lazy-load memory initializer functions to avoid circular deps
|
|
193
|
+
*/
|
|
194
|
+
async function getMemoryFunctions() {
|
|
195
|
+
const { storeEntry, searchEntries, listEntries, getEntry, deleteEntry, initializeMemoryDatabase, checkMemoryInitialization, } = await import('../memory/memory-initializer.js');
|
|
196
|
+
return {
|
|
197
|
+
storeEntry,
|
|
198
|
+
searchEntries,
|
|
199
|
+
listEntries,
|
|
200
|
+
getEntry,
|
|
201
|
+
deleteEntry,
|
|
202
|
+
initializeMemoryDatabase,
|
|
203
|
+
checkMemoryInitialization,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Ensure memory database is initialized and migrate legacy data if needed.
|
|
208
|
+
* #1606: Wrapped in try/catch to prevent process-level crashes that kill
|
|
209
|
+
* the stdio MCP transport on Windows/Codex.
|
|
210
|
+
*/
|
|
211
|
+
async function ensureInitialized() {
|
|
212
|
+
try {
|
|
213
|
+
const { initializeMemoryDatabase, checkMemoryInitialization, storeEntry } = await getMemoryFunctions();
|
|
214
|
+
// Check if already initialized
|
|
215
|
+
const status = await checkMemoryInitialization();
|
|
216
|
+
if (!status.initialized) {
|
|
217
|
+
await initializeMemoryDatabase({ force: false, verbose: false });
|
|
218
|
+
}
|
|
219
|
+
// Migrate legacy JSON data if exists (from old .claude-flow/memory/ location)
|
|
220
|
+
if (hasLegacyStore()) {
|
|
221
|
+
const legacyStore = loadLegacyStore();
|
|
222
|
+
if (legacyStore && Object.keys(legacyStore.entries).length > 0) {
|
|
223
|
+
console.error('[MCP Memory] Migrating legacy JSON store to sql.js...');
|
|
224
|
+
let migrated = 0;
|
|
225
|
+
for (const [key, entry] of Object.entries(legacyStore.entries)) {
|
|
226
|
+
try {
|
|
227
|
+
const value = typeof entry.value === 'string' ? entry.value : JSON.stringify(entry.value);
|
|
228
|
+
await storeEntry({
|
|
229
|
+
key,
|
|
230
|
+
value,
|
|
231
|
+
namespace: 'default',
|
|
232
|
+
generateEmbeddingFlag: true,
|
|
233
|
+
});
|
|
234
|
+
migrated++;
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
console.error(`[MCP Memory] Failed to migrate key "${key}":`, e);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
console.error(`[MCP Memory] Migrated ${migrated}/${Object.keys(legacyStore.entries).length} entries`);
|
|
241
|
+
markMigrationComplete();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
console.error('[MCP Memory] Initialization failed:', error instanceof Error ? error.message : error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
export const memoryTools = [
|
|
250
|
+
{
|
|
251
|
+
name: 'memory_store',
|
|
252
|
+
description: 'Persistent key-value store with vector embedding — survives across sessions and is searchable by meaning, not just by file path. Use when native Write is wrong because the data is not a file (e.g. a learned pattern, a decision, a budget config) AND you need to recall it later by semantic query, not by path. Defaults to namespace="default"; pass --upsert=true to update an existing key.',
|
|
253
|
+
category: 'memory',
|
|
254
|
+
inputSchema: {
|
|
255
|
+
type: 'object',
|
|
256
|
+
properties: {
|
|
257
|
+
key: { type: 'string', description: 'Memory key (unique within namespace)' },
|
|
258
|
+
value: { description: 'Value to store (string or object)' },
|
|
259
|
+
namespace: { type: 'string', description: 'Namespace for organization (default: "default")' },
|
|
260
|
+
tags: {
|
|
261
|
+
type: 'array',
|
|
262
|
+
items: { type: 'string' },
|
|
263
|
+
description: 'Optional tags for filtering',
|
|
264
|
+
},
|
|
265
|
+
ttl: { type: 'number', description: 'Time-to-live in seconds (optional)' },
|
|
266
|
+
upsert: { type: 'boolean', description: 'If true, update existing key instead of failing (default: false)' },
|
|
267
|
+
},
|
|
268
|
+
required: ['key', 'value'],
|
|
269
|
+
},
|
|
270
|
+
handler: async (input) => {
|
|
271
|
+
await ensureInitialized();
|
|
272
|
+
const { storeEntry } = await getMemoryFunctions();
|
|
273
|
+
const key = input.key;
|
|
274
|
+
const namespace = input.namespace || 'default';
|
|
275
|
+
const rawValue = input.value;
|
|
276
|
+
const value = typeof rawValue === 'string' ? rawValue : (rawValue !== undefined ? JSON.stringify(rawValue) : '');
|
|
277
|
+
const tags = input.tags || [];
|
|
278
|
+
const ttl = input.ttl;
|
|
279
|
+
const upsert = input.upsert || false;
|
|
280
|
+
if (!value) {
|
|
281
|
+
return {
|
|
282
|
+
success: false,
|
|
283
|
+
key,
|
|
284
|
+
stored: false,
|
|
285
|
+
hasEmbedding: false,
|
|
286
|
+
error: 'Value is required and cannot be empty',
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
validateMemoryInput(key, value, undefined, namespace);
|
|
290
|
+
const startTime = performance.now();
|
|
291
|
+
try {
|
|
292
|
+
const result = await storeEntry({
|
|
293
|
+
key,
|
|
294
|
+
value,
|
|
295
|
+
namespace,
|
|
296
|
+
generateEmbeddingFlag: true,
|
|
297
|
+
tags,
|
|
298
|
+
ttl,
|
|
299
|
+
upsert,
|
|
300
|
+
});
|
|
301
|
+
const duration = performance.now() - startTime;
|
|
302
|
+
return {
|
|
303
|
+
success: result.success,
|
|
304
|
+
key,
|
|
305
|
+
namespace,
|
|
306
|
+
stored: result.success,
|
|
307
|
+
storedAt: new Date().toISOString(),
|
|
308
|
+
hasEmbedding: !!result.embedding,
|
|
309
|
+
embeddingDimensions: result.embedding?.dimensions || null,
|
|
310
|
+
backend: 'sql.js + HNSW',
|
|
311
|
+
storeTime: `${duration.toFixed(2)}ms`,
|
|
312
|
+
error: result.error,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
return {
|
|
317
|
+
success: false,
|
|
318
|
+
key,
|
|
319
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
name: 'memory_retrieve',
|
|
326
|
+
description: 'Read back a value previously stored via memory_store, by exact (namespace, key) — lossless, includes metadata. Use when native Read is wrong because the value is not a file (it lives in the .swarm/memory.db SQLite store) AND you know the exact key. For semantic lookup by meaning, use memory_search.',
|
|
327
|
+
category: 'memory',
|
|
328
|
+
inputSchema: {
|
|
329
|
+
type: 'object',
|
|
330
|
+
properties: {
|
|
331
|
+
key: { type: 'string', description: 'Memory key' },
|
|
332
|
+
namespace: { type: 'string', description: 'Namespace (default: "default")' },
|
|
333
|
+
},
|
|
334
|
+
required: ['key'],
|
|
335
|
+
},
|
|
336
|
+
handler: async (input) => {
|
|
337
|
+
await ensureInitialized();
|
|
338
|
+
const { getEntry } = await getMemoryFunctions();
|
|
339
|
+
const key = input.key;
|
|
340
|
+
const namespace = input.namespace || 'default';
|
|
341
|
+
validateMemoryInput(key, undefined, undefined, namespace);
|
|
342
|
+
try {
|
|
343
|
+
const result = await getEntry({ key, namespace });
|
|
344
|
+
if (result.found && result.entry) {
|
|
345
|
+
// Try to parse JSON value
|
|
346
|
+
let value = result.entry.content;
|
|
347
|
+
try {
|
|
348
|
+
value = JSON.parse(result.entry.content);
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
// Keep as string
|
|
352
|
+
}
|
|
353
|
+
return {
|
|
354
|
+
key,
|
|
355
|
+
namespace,
|
|
356
|
+
value,
|
|
357
|
+
tags: result.entry.tags,
|
|
358
|
+
storedAt: result.entry.createdAt,
|
|
359
|
+
updatedAt: result.entry.updatedAt,
|
|
360
|
+
accessCount: result.entry.accessCount,
|
|
361
|
+
hasEmbedding: result.entry.hasEmbedding,
|
|
362
|
+
found: true,
|
|
363
|
+
backend: 'sql.js + HNSW',
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
return {
|
|
367
|
+
key,
|
|
368
|
+
namespace,
|
|
369
|
+
value: null,
|
|
370
|
+
found: false,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
return {
|
|
375
|
+
key,
|
|
376
|
+
namespace,
|
|
377
|
+
value: null,
|
|
378
|
+
found: false,
|
|
379
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
name: 'memory_search',
|
|
386
|
+
description: 'Find stored memories by meaning (vector similarity), not by literal text — finds "JWT auth pattern" when you query "token-based login flow". Use when native Grep is wrong because Grep matches characters and you need to find conceptually-related entries across past sessions. Backed by HNSW index over ONNX embeddings; returns top-k with similarity scores. Pair with smart=true for query expansion + MMR diversity.',
|
|
387
|
+
category: 'memory',
|
|
388
|
+
inputSchema: {
|
|
389
|
+
type: 'object',
|
|
390
|
+
properties: {
|
|
391
|
+
query: { type: 'string', description: 'Search query (semantic similarity)' },
|
|
392
|
+
namespace: { type: 'string', description: 'Namespace to search (default: "default")' },
|
|
393
|
+
limit: { type: 'number', description: 'Maximum results (default: 10)' },
|
|
394
|
+
threshold: { type: 'number', description: 'Minimum similarity threshold 0-1 (default: 0.3)' },
|
|
395
|
+
smart: { type: 'boolean', description: 'Enable SmartRetrieval pipeline — query expansion, RRF fusion, recency boost, MMR diversity (default: false)' },
|
|
396
|
+
},
|
|
397
|
+
required: ['query'],
|
|
398
|
+
},
|
|
399
|
+
handler: async (input) => {
|
|
400
|
+
await ensureInitialized();
|
|
401
|
+
const { searchEntries } = await getMemoryFunctions();
|
|
402
|
+
const query = input.query;
|
|
403
|
+
const namespace = input.namespace || 'default';
|
|
404
|
+
const limit = input.limit ?? 10;
|
|
405
|
+
const threshold = input.threshold ?? 0.3;
|
|
406
|
+
validateMemoryInput(undefined, undefined, query);
|
|
407
|
+
const startTime = performance.now();
|
|
408
|
+
try {
|
|
409
|
+
// #1846: feature-detect smartSearch on the resolved memory package.
|
|
410
|
+
// The export landed in @claude-flow/memory@>3.0.0-alpha.14 — older
|
|
411
|
+
// installs pin to a build that exposes search/store/retrieve but
|
|
412
|
+
// not smartSearch. Throwing `is not a function` is hostile; instead
|
|
413
|
+
// detect at runtime and gracefully fall through to plain semantic
|
|
414
|
+
// search with an explicit fallback note.
|
|
415
|
+
let smartFallbackReason;
|
|
416
|
+
if (input.smart) {
|
|
417
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
418
|
+
let memMod;
|
|
419
|
+
try {
|
|
420
|
+
memMod = await import('@claude-flow/memory');
|
|
421
|
+
}
|
|
422
|
+
catch (err) {
|
|
423
|
+
smartFallbackReason = `@claude-flow/memory failed to load: ${err.message}`;
|
|
424
|
+
}
|
|
425
|
+
const smartSearch = memMod && typeof memMod.smartSearch === 'function'
|
|
426
|
+
? memMod.smartSearch
|
|
427
|
+
: undefined;
|
|
428
|
+
if (smartSearch) {
|
|
429
|
+
// SmartRetrieval pipeline (ADR-090)
|
|
430
|
+
const rawSearch = async (req) => {
|
|
431
|
+
const r = await searchEntries({
|
|
432
|
+
query: req.query,
|
|
433
|
+
namespace: req.namespace || namespace,
|
|
434
|
+
limit: req.limit || limit * 3,
|
|
435
|
+
threshold: req.threshold ?? threshold,
|
|
436
|
+
});
|
|
437
|
+
return {
|
|
438
|
+
results: r.results.map(e => ({
|
|
439
|
+
id: e.id,
|
|
440
|
+
key: e.key,
|
|
441
|
+
content: e.content,
|
|
442
|
+
score: e.score,
|
|
443
|
+
namespace: e.namespace,
|
|
444
|
+
})),
|
|
445
|
+
};
|
|
446
|
+
};
|
|
447
|
+
const smartResult = await smartSearch(rawSearch, {
|
|
448
|
+
query,
|
|
449
|
+
namespace,
|
|
450
|
+
limit,
|
|
451
|
+
threshold,
|
|
452
|
+
});
|
|
453
|
+
const duration = performance.now() - startTime;
|
|
454
|
+
const results = smartResult.results.map((r) => {
|
|
455
|
+
let value = r.content;
|
|
456
|
+
try {
|
|
457
|
+
value = JSON.parse(r.content);
|
|
458
|
+
}
|
|
459
|
+
catch { /* keep as string */ }
|
|
460
|
+
return {
|
|
461
|
+
key: r.key,
|
|
462
|
+
namespace: r.namespace,
|
|
463
|
+
value,
|
|
464
|
+
similarity: r.score,
|
|
465
|
+
};
|
|
466
|
+
});
|
|
467
|
+
return {
|
|
468
|
+
query,
|
|
469
|
+
results,
|
|
470
|
+
total: results.length,
|
|
471
|
+
searchTime: `${duration.toFixed(2)}ms`,
|
|
472
|
+
backend: 'SmartRetrieval (RRF + MMR + Recency)',
|
|
473
|
+
stats: smartResult.stats,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
// smart=true but smartSearch unavailable on installed package.
|
|
477
|
+
// Fall through to plain search with an explicit warning.
|
|
478
|
+
smartFallbackReason = smartFallbackReason
|
|
479
|
+
?? 'smartSearch is not exported by the installed @claude-flow/memory build (likely a release lag — see #1846). Falling back to standard semantic search.';
|
|
480
|
+
}
|
|
481
|
+
// Original non-smart path (unchanged) — also reached when smart was
|
|
482
|
+
// requested but unavailable. We attach `smartFallback` to the
|
|
483
|
+
// response so callers can see the degradation explicitly.
|
|
484
|
+
const result = await searchEntries({
|
|
485
|
+
query,
|
|
486
|
+
namespace,
|
|
487
|
+
limit,
|
|
488
|
+
threshold,
|
|
489
|
+
});
|
|
490
|
+
const duration = performance.now() - startTime;
|
|
491
|
+
// Parse JSON values in results
|
|
492
|
+
const results = result.results.map(r => {
|
|
493
|
+
let value = r.content;
|
|
494
|
+
try {
|
|
495
|
+
value = JSON.parse(r.content);
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
// Keep as string
|
|
499
|
+
}
|
|
500
|
+
return {
|
|
501
|
+
key: r.key,
|
|
502
|
+
namespace: r.namespace,
|
|
503
|
+
value,
|
|
504
|
+
similarity: r.score,
|
|
505
|
+
};
|
|
506
|
+
});
|
|
507
|
+
return {
|
|
508
|
+
query,
|
|
509
|
+
results,
|
|
510
|
+
total: results.length,
|
|
511
|
+
searchTime: `${duration.toFixed(2)}ms`,
|
|
512
|
+
backend: 'HNSW + sql.js',
|
|
513
|
+
...(smartFallbackReason ? { smartFallback: smartFallbackReason } : {}),
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
catch (error) {
|
|
517
|
+
return {
|
|
518
|
+
query,
|
|
519
|
+
results: [],
|
|
520
|
+
total: 0,
|
|
521
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
name: 'memory_delete',
|
|
528
|
+
description: 'Remove a stored memory entry by exact (namespace, key). Use when a previously stored decision is invalidated or contains stale data. No native equivalent — Write to a file does not affect the .swarm/memory.db SQLite store.',
|
|
529
|
+
category: 'memory',
|
|
530
|
+
inputSchema: {
|
|
531
|
+
type: 'object',
|
|
532
|
+
properties: {
|
|
533
|
+
key: { type: 'string', description: 'Memory key' },
|
|
534
|
+
namespace: { type: 'string', description: 'Namespace (default: "default")' },
|
|
535
|
+
},
|
|
536
|
+
required: ['key'],
|
|
537
|
+
},
|
|
538
|
+
handler: async (input) => {
|
|
539
|
+
await ensureInitialized();
|
|
540
|
+
const { deleteEntry } = await getMemoryFunctions();
|
|
541
|
+
const key = input.key;
|
|
542
|
+
const namespace = input.namespace || 'default';
|
|
543
|
+
validateMemoryInput(key, undefined, undefined, namespace);
|
|
544
|
+
try {
|
|
545
|
+
const result = await deleteEntry({ key, namespace });
|
|
546
|
+
return {
|
|
547
|
+
success: result.deleted,
|
|
548
|
+
key,
|
|
549
|
+
namespace,
|
|
550
|
+
deleted: result.deleted,
|
|
551
|
+
hnswIndexInvalidated: result.deleted,
|
|
552
|
+
backend: 'sql.js + HNSW',
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
catch (error) {
|
|
556
|
+
return {
|
|
557
|
+
success: false,
|
|
558
|
+
key,
|
|
559
|
+
namespace,
|
|
560
|
+
deleted: false,
|
|
561
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
},
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
name: 'memory_list',
|
|
568
|
+
description: 'Enumerate stored memory entries (optionally filtered by namespace/tags) without semantic search. Use when native Glob is wrong because the entries are not files (they live in .swarm/memory.db). For inspection / audit / "what is in my memory" — pair with memory_search for retrieval-by-meaning.',
|
|
569
|
+
category: 'memory',
|
|
570
|
+
inputSchema: {
|
|
571
|
+
type: 'object',
|
|
572
|
+
properties: {
|
|
573
|
+
namespace: { type: 'string', description: 'Filter by namespace' },
|
|
574
|
+
limit: { type: 'number', description: 'Maximum results (default: 50)' },
|
|
575
|
+
offset: { type: 'number', description: 'Offset for pagination (default: 0)' },
|
|
576
|
+
},
|
|
577
|
+
},
|
|
578
|
+
handler: async (input) => {
|
|
579
|
+
await ensureInitialized();
|
|
580
|
+
const { listEntries } = await getMemoryFunctions();
|
|
581
|
+
const namespace = input.namespace;
|
|
582
|
+
const limit = input.limit || 50;
|
|
583
|
+
const offset = input.offset || 0;
|
|
584
|
+
if (namespace) {
|
|
585
|
+
const vNs = validateIdentifier(namespace, 'namespace');
|
|
586
|
+
if (!vNs.valid)
|
|
587
|
+
throw new Error(vNs.error);
|
|
588
|
+
}
|
|
589
|
+
try {
|
|
590
|
+
const result = await listEntries({
|
|
591
|
+
namespace,
|
|
592
|
+
limit,
|
|
593
|
+
offset,
|
|
594
|
+
});
|
|
595
|
+
const entries = result.entries.map(e => ({
|
|
596
|
+
key: e.key,
|
|
597
|
+
namespace: e.namespace,
|
|
598
|
+
storedAt: e.createdAt,
|
|
599
|
+
updatedAt: e.updatedAt,
|
|
600
|
+
accessCount: e.accessCount,
|
|
601
|
+
hasEmbedding: e.hasEmbedding,
|
|
602
|
+
size: e.size,
|
|
603
|
+
}));
|
|
604
|
+
return {
|
|
605
|
+
entries,
|
|
606
|
+
total: result.total,
|
|
607
|
+
limit,
|
|
608
|
+
offset,
|
|
609
|
+
backend: 'sql.js + HNSW',
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
catch (error) {
|
|
613
|
+
return {
|
|
614
|
+
entries: [],
|
|
615
|
+
total: 0,
|
|
616
|
+
limit,
|
|
617
|
+
offset,
|
|
618
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
},
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
name: 'memory_stats',
|
|
625
|
+
description: 'Get memory storage statistics including HNSW index status Use when native Read/Write is wrong because you need (a) cross-session retrieval by semantic similarity (vector embeddings) not by file path, (b) namespacing across projects without managing directory layout, or (c) the .swarm/memory.db audit trail. For one-shot file I/O, native Read/Write is fine.',
|
|
626
|
+
category: 'memory',
|
|
627
|
+
inputSchema: {
|
|
628
|
+
type: 'object',
|
|
629
|
+
properties: {},
|
|
630
|
+
},
|
|
631
|
+
handler: async () => {
|
|
632
|
+
await ensureInitialized();
|
|
633
|
+
const { checkMemoryInitialization, listEntries } = await getMemoryFunctions();
|
|
634
|
+
try {
|
|
635
|
+
const status = await checkMemoryInitialization();
|
|
636
|
+
const allEntries = await listEntries({ limit: 100000 });
|
|
637
|
+
// Count by namespace
|
|
638
|
+
const namespaces = {};
|
|
639
|
+
let withEmbeddings = 0;
|
|
640
|
+
for (const entry of allEntries.entries) {
|
|
641
|
+
namespaces[entry.namespace] = (namespaces[entry.namespace] || 0) + 1;
|
|
642
|
+
if (entry.hasEmbedding)
|
|
643
|
+
withEmbeddings++;
|
|
644
|
+
}
|
|
645
|
+
return {
|
|
646
|
+
initialized: status.initialized,
|
|
647
|
+
totalEntries: allEntries.total,
|
|
648
|
+
entriesWithEmbeddings: withEmbeddings,
|
|
649
|
+
embeddingCoverage: allEntries.total > 0
|
|
650
|
+
? `${((withEmbeddings / allEntries.total) * 100).toFixed(1)}%`
|
|
651
|
+
: '0%',
|
|
652
|
+
namespaces,
|
|
653
|
+
backend: 'sql.js + HNSW',
|
|
654
|
+
version: status.version || '3.0.0',
|
|
655
|
+
features: status.features || {
|
|
656
|
+
vectorEmbeddings: true,
|
|
657
|
+
hnswIndex: true,
|
|
658
|
+
semanticSearch: true,
|
|
659
|
+
},
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
catch (error) {
|
|
663
|
+
return {
|
|
664
|
+
initialized: false,
|
|
665
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
},
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
name: 'memory_migrate',
|
|
672
|
+
description: 'Manually trigger migration from legacy JSON store to sql.js Use when native Read/Write is wrong because you need (a) cross-session retrieval by semantic similarity (vector embeddings) not by file path, (b) namespacing across projects without managing directory layout, or (c) the .swarm/memory.db audit trail. For one-shot file I/O, native Read/Write is fine.',
|
|
673
|
+
category: 'memory',
|
|
674
|
+
inputSchema: {
|
|
675
|
+
type: 'object',
|
|
676
|
+
properties: {
|
|
677
|
+
force: { type: 'boolean', description: 'Force re-migration even if already done' },
|
|
678
|
+
},
|
|
679
|
+
},
|
|
680
|
+
handler: async (input) => {
|
|
681
|
+
const force = input.force;
|
|
682
|
+
// Remove migration marker if forcing
|
|
683
|
+
if (force) {
|
|
684
|
+
const markerPath = getMigrationMarkerPath();
|
|
685
|
+
if (existsSync(markerPath)) {
|
|
686
|
+
unlinkSync(markerPath);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
// Check for legacy data
|
|
690
|
+
const legacyStore = loadLegacyStore();
|
|
691
|
+
if (!legacyStore || Object.keys(legacyStore.entries).length === 0) {
|
|
692
|
+
return {
|
|
693
|
+
success: true,
|
|
694
|
+
message: 'No legacy data to migrate',
|
|
695
|
+
migrated: 0,
|
|
696
|
+
};
|
|
697
|
+
}
|
|
698
|
+
// Run migration via ensureInitialized
|
|
699
|
+
await ensureInitialized();
|
|
700
|
+
return {
|
|
701
|
+
success: true,
|
|
702
|
+
message: 'Migration completed',
|
|
703
|
+
migrated: Object.keys(legacyStore.entries).length,
|
|
704
|
+
backend: 'sql.js + HNSW',
|
|
705
|
+
};
|
|
706
|
+
},
|
|
707
|
+
},
|
|
708
|
+
// ===== Claude Code Memory Bridge Tools =====
|
|
709
|
+
{
|
|
710
|
+
name: 'memory_import_claude',
|
|
711
|
+
description: 'Import Claude Code auto-memory files into AgentDB with ONNX vector embeddings. Reads ~/.claude/projects/*/memory/*.md files, parses YAML frontmatter, splits into sections, and stores with 384-dim embeddings for semantic search. Use allProjects=true to import from ALL Claude projects. Pass projectPath to override cwd-based detection (#1883 — required when Ruflo runs in WSL but Claude Code is on Windows). Pass excludeFilePatterns (glob list) or excludeFiles (absolute path list) to skip voice-load-bearing, PII, or persona-restricted files (#1937). Use when native Read/Write is wrong because you need (a) cross-session retrieval by semantic similarity (vector embeddings) not by file path, (b) namespacing across projects without managing directory layout, or (c) the .swarm/memory.db audit trail. For one-shot file I/O, native Read/Write is fine.',
|
|
712
|
+
category: 'memory',
|
|
713
|
+
inputSchema: {
|
|
714
|
+
type: 'object',
|
|
715
|
+
properties: {
|
|
716
|
+
allProjects: { type: 'boolean', description: 'Import from all Claude projects (default: current project only)' },
|
|
717
|
+
namespace: { type: 'string', description: 'Target namespace (default: "claude-memories")' },
|
|
718
|
+
projectPath: { type: 'string', description: '#1883 — explicit project path to hash, used when cwd does not match Claude Code\'s view (e.g. WSL bridge to Windows host). Pass the canonical project root as Claude Code sees it.' },
|
|
719
|
+
excludeFilePatterns: {
|
|
720
|
+
type: 'array',
|
|
721
|
+
items: { type: 'string' },
|
|
722
|
+
description: '#1937 — glob patterns matched against the absolute file path. Files matching ANY pattern are skipped. Supports `*` (any chars within a path segment), `**` (any chars including separators), and `?` (single char). Examples: `**/voice-*.md`, `**/persona-*.md`. Combine with excludeFiles for explicit paths.',
|
|
723
|
+
},
|
|
724
|
+
excludeFiles: {
|
|
725
|
+
type: 'array',
|
|
726
|
+
items: { type: 'string' },
|
|
727
|
+
description: '#1937 — absolute file paths to skip verbatim. Faster than a pattern when the list is known ahead of time (operator captured baselines). Combine with excludeFilePatterns.',
|
|
728
|
+
},
|
|
729
|
+
},
|
|
730
|
+
},
|
|
731
|
+
handler: async (input) => {
|
|
732
|
+
await ensureInitialized();
|
|
733
|
+
const { storeEntry } = await getMemoryFunctions();
|
|
734
|
+
const ns = input.namespace || 'claude-memories';
|
|
735
|
+
if (input.namespace) {
|
|
736
|
+
const vNs = validateIdentifier(ns, 'namespace');
|
|
737
|
+
if (!vNs.valid)
|
|
738
|
+
return { success: false, imported: 0, error: vNs.error };
|
|
739
|
+
}
|
|
740
|
+
const allProjects = input.allProjects;
|
|
741
|
+
const projectPathOverride = input.projectPath;
|
|
742
|
+
const claudeProjectsDir = join(homedir(), '.claude', 'projects');
|
|
743
|
+
// #1937 — voice-fidelity / persona-restricted exclusion.
|
|
744
|
+
const excludeFilePatterns = Array.isArray(input.excludeFilePatterns) ? input.excludeFilePatterns : [];
|
|
745
|
+
const excludeFilesList = Array.isArray(input.excludeFiles) ? new Set(input.excludeFiles) : new Set();
|
|
746
|
+
const excludeRegexes = excludeFilePatterns.map(globToRegex);
|
|
747
|
+
const isExcluded = (absPath) => {
|
|
748
|
+
if (excludeFilesList.has(absPath))
|
|
749
|
+
return true;
|
|
750
|
+
return excludeRegexes.some(re => re.test(absPath));
|
|
751
|
+
};
|
|
752
|
+
// Find memory files
|
|
753
|
+
const memoryFiles = [];
|
|
754
|
+
let excludedByPattern = 0;
|
|
755
|
+
if (allProjects) {
|
|
756
|
+
// Scan all projects
|
|
757
|
+
if (existsSync(claudeProjectsDir)) {
|
|
758
|
+
try {
|
|
759
|
+
for (const project of readdirSync(claudeProjectsDir, { withFileTypes: true })) {
|
|
760
|
+
if (!project.isDirectory())
|
|
761
|
+
continue;
|
|
762
|
+
const memDir = join(claudeProjectsDir, project.name, 'memory');
|
|
763
|
+
if (!existsSync(memDir))
|
|
764
|
+
continue;
|
|
765
|
+
for (const file of readdirSync(memDir).filter((f) => f.endsWith('.md'))) {
|
|
766
|
+
const absPath = join(memDir, file);
|
|
767
|
+
if (isExcluded(absPath)) {
|
|
768
|
+
excludedByPattern++;
|
|
769
|
+
continue;
|
|
770
|
+
}
|
|
771
|
+
memoryFiles.push({ path: absPath, project: project.name, file });
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
catch { /* scan error */ }
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
else {
|
|
779
|
+
// #1883 — current project: try multiple candidate hashes (POSIX, WSL-translated,
|
|
780
|
+
// leading-dash-stripped, space-replaced). Caller can pass projectPath to override.
|
|
781
|
+
const resolved = resolveProjectMemoryDir(claudeProjectsDir, projectPathOverride);
|
|
782
|
+
if (resolved) {
|
|
783
|
+
try {
|
|
784
|
+
for (const file of readdirSync(resolved.memDir).filter((f) => f.endsWith('.md'))) {
|
|
785
|
+
const absPath = join(resolved.memDir, file);
|
|
786
|
+
if (isExcluded(absPath)) {
|
|
787
|
+
excludedByPattern++;
|
|
788
|
+
continue;
|
|
789
|
+
}
|
|
790
|
+
memoryFiles.push({ path: absPath, project: resolved.projectHash, file });
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
catch { /* scan error */ }
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
if (memoryFiles.length === 0) {
|
|
797
|
+
return { success: true, imported: 0, message: 'No Claude memory files found' };
|
|
798
|
+
}
|
|
799
|
+
let imported = 0;
|
|
800
|
+
let skipped = 0;
|
|
801
|
+
// #1791.8 — Claude Code's `~/.claude/projects/` accumulates historical
|
|
802
|
+
// project_id directories (truncated forms, sandbox cwds, renamed
|
|
803
|
+
// workspaces) that all contain copies of the same memory files. The
|
|
804
|
+
// previous import indexed each copy under a different `project_id`
|
|
805
|
+
// prefix, producing 5–8x duplication on long-lived homes. Dedupe by
|
|
806
|
+
// file content hash so the same memory is imported once even if it
|
|
807
|
+
// appears under several project directories.
|
|
808
|
+
const seenContentHashes = new Set();
|
|
809
|
+
let duplicatesSkipped = 0;
|
|
810
|
+
const projects = new Set();
|
|
811
|
+
for (const memFile of memoryFiles) {
|
|
812
|
+
projects.add(memFile.project);
|
|
813
|
+
try {
|
|
814
|
+
const content = readFileSync(memFile.path, 'utf-8');
|
|
815
|
+
// #1791.8 — Skip if we've already imported this exact content under
|
|
816
|
+
// a different project_id directory.
|
|
817
|
+
const contentHash = createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
818
|
+
if (seenContentHashes.has(contentHash)) {
|
|
819
|
+
duplicatesSkipped++;
|
|
820
|
+
continue;
|
|
821
|
+
}
|
|
822
|
+
seenContentHashes.add(contentHash);
|
|
823
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
824
|
+
let name = memFile.file.replace('.md', '');
|
|
825
|
+
let body = content;
|
|
826
|
+
if (frontmatterMatch) {
|
|
827
|
+
const yaml = frontmatterMatch[1];
|
|
828
|
+
body = frontmatterMatch[2].trim();
|
|
829
|
+
const nameMatch = yaml.match(/^name:\s*(.+)$/m);
|
|
830
|
+
if (nameMatch)
|
|
831
|
+
name = nameMatch[1].trim();
|
|
832
|
+
}
|
|
833
|
+
// Split into sections for granular search
|
|
834
|
+
const sections = body.split(/^(?=## )/m).filter(s => s.trim().length > 20);
|
|
835
|
+
if (sections.length === 0 && body.length > 10) {
|
|
836
|
+
// #1884 — sanitize key so memory_delete can later remove it. Without
|
|
837
|
+
// this, dangerous chars from frontmatter `name` strand the key.
|
|
838
|
+
const key = sanitizeMemoryKey(`claude:${memFile.project}:${name}`);
|
|
839
|
+
await storeEntry({ key, value: body.slice(0, 4096), namespace: ns, generateEmbeddingFlag: true });
|
|
840
|
+
imported++;
|
|
841
|
+
}
|
|
842
|
+
else {
|
|
843
|
+
for (const section of sections) {
|
|
844
|
+
const titleMatch = section.match(/^##\s+(.+)/);
|
|
845
|
+
const sectionTitle = titleMatch ? titleMatch[1].trim() : name;
|
|
846
|
+
const sectionBody = section.replace(/^##\s+.+\n/, '').trim();
|
|
847
|
+
if (sectionBody.length < 10)
|
|
848
|
+
continue;
|
|
849
|
+
// #1884 — sanitize so any dangerous chars in the heading don't
|
|
850
|
+
// produce keys memory_delete will reject.
|
|
851
|
+
const key = sanitizeMemoryKey(`claude:${memFile.project}:${name}:${sectionTitle.slice(0, 50)}`);
|
|
852
|
+
await storeEntry({ key, value: sectionBody.slice(0, 4096), namespace: ns, generateEmbeddingFlag: true });
|
|
853
|
+
imported++;
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
catch {
|
|
858
|
+
skipped++;
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
return {
|
|
862
|
+
success: true,
|
|
863
|
+
imported,
|
|
864
|
+
skipped,
|
|
865
|
+
duplicatesSkipped,
|
|
866
|
+
excludedByPattern,
|
|
867
|
+
files: memoryFiles.length,
|
|
868
|
+
projects: projects.size,
|
|
869
|
+
namespace: ns,
|
|
870
|
+
embedding: 'ONNX all-MiniLM-L6-v2 (384-dim)',
|
|
871
|
+
};
|
|
872
|
+
},
|
|
873
|
+
},
|
|
874
|
+
{
|
|
875
|
+
name: 'memory_bridge_status',
|
|
876
|
+
description: 'Show Claude Code memory bridge status — AgentDB vectors, SONA learning, intelligence patterns, and connection health. Use when native Read/Write is wrong because you need (a) cross-session retrieval by semantic similarity (vector embeddings) not by file path, (b) namespacing across projects without managing directory layout, or (c) the .swarm/memory.db audit trail. For one-shot file I/O, native Read/Write is fine.',
|
|
877
|
+
category: 'memory',
|
|
878
|
+
inputSchema: { type: 'object', properties: {} },
|
|
879
|
+
handler: async () => {
|
|
880
|
+
await ensureInitialized();
|
|
881
|
+
// Count Claude memory files
|
|
882
|
+
const claudeProjectsDir = join(homedir(), '.claude', 'projects');
|
|
883
|
+
let claudeFiles = 0;
|
|
884
|
+
let claudeProjects = 0;
|
|
885
|
+
if (existsSync(claudeProjectsDir)) {
|
|
886
|
+
try {
|
|
887
|
+
for (const project of readdirSync(claudeProjectsDir, { withFileTypes: true })) {
|
|
888
|
+
if (!project.isDirectory())
|
|
889
|
+
continue;
|
|
890
|
+
const memDir = join(claudeProjectsDir, project.name, 'memory');
|
|
891
|
+
if (!existsSync(memDir))
|
|
892
|
+
continue;
|
|
893
|
+
const files = readdirSync(memDir).filter((f) => f.endsWith('.md'));
|
|
894
|
+
if (files.length > 0) {
|
|
895
|
+
claudeProjects++;
|
|
896
|
+
claudeFiles += files.length;
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
catch { /* ignore */ }
|
|
901
|
+
}
|
|
902
|
+
// AgentDB status
|
|
903
|
+
// #1940: previously used `allEntries.entries.length` for the totals,
|
|
904
|
+
// but `listEntries({})` returns the first 20 entries with a separate
|
|
905
|
+
// `total` field for the full row count. So `memory_bridge_status`
|
|
906
|
+
// reported `totalEntries: 0`...20 even when the DB had hundreds of
|
|
907
|
+
// rows. Use `.total` for the count, and surface the namespaces with
|
|
908
|
+
// entries so the report matches what's actually in the store.
|
|
909
|
+
let agentdbEntries = 0;
|
|
910
|
+
let claudeMemoryEntries = 0;
|
|
911
|
+
const namespaceCounts = {};
|
|
912
|
+
try {
|
|
913
|
+
const { listEntries } = await getMemoryFunctions();
|
|
914
|
+
const allEntries = await listEntries({});
|
|
915
|
+
agentdbEntries = allEntries?.total
|
|
916
|
+
?? allEntries?.entries?.length ?? 0;
|
|
917
|
+
const claudeEntries = await listEntries({ namespace: 'claude-memories' });
|
|
918
|
+
claudeMemoryEntries = claudeEntries?.total
|
|
919
|
+
?? claudeEntries?.entries?.length ?? 0;
|
|
920
|
+
// Per-namespace counts for the namespaces the reporter referenced
|
|
921
|
+
// (#1940). Best-effort — a namespace with 0 entries is omitted.
|
|
922
|
+
for (const ns of ['default', 'patterns', 'claude-memories', 'auto-memory', 'tasks', 'feedback', 'pretrain']) {
|
|
923
|
+
try {
|
|
924
|
+
const r = await listEntries({ namespace: ns });
|
|
925
|
+
const t = r?.total ?? r?.entries?.length ?? 0;
|
|
926
|
+
if (t > 0)
|
|
927
|
+
namespaceCounts[ns] = t;
|
|
928
|
+
}
|
|
929
|
+
catch { /* skip per-namespace failure */ }
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
catch { /* ignore */ }
|
|
933
|
+
// Intelligence status
|
|
934
|
+
let intelligence = { sonaEnabled: false, patternsLearned: 0, trajectoriesRecorded: 0 };
|
|
935
|
+
try {
|
|
936
|
+
const int = await import('../memory/intelligence.js');
|
|
937
|
+
const stats = int.getIntelligenceStats?.();
|
|
938
|
+
if (stats)
|
|
939
|
+
intelligence = { sonaEnabled: stats.sonaEnabled, patternsLearned: stats.patternsLearned, trajectoriesRecorded: stats.trajectoriesRecorded };
|
|
940
|
+
}
|
|
941
|
+
catch { /* not initialized */ }
|
|
942
|
+
return {
|
|
943
|
+
claudeCode: { memoryFiles: claudeFiles, projects: claudeProjects },
|
|
944
|
+
agentdb: { totalEntries: agentdbEntries, claudeMemoryEntries, namespaces: namespaceCounts, backend: 'sql.js + ONNX' },
|
|
945
|
+
intelligence,
|
|
946
|
+
// #1940: report 'connected' whenever ANY namespace has imported
|
|
947
|
+
// content, not just `claude-memories` — the bridge can be in active
|
|
948
|
+
// use from other import paths (e.g. plugin namespaces, task memory).
|
|
949
|
+
bridge: { status: agentdbEntries > 0 ? 'connected' : 'not-synced', embedding: 'all-MiniLM-L6-v2 (384-dim)' },
|
|
950
|
+
};
|
|
951
|
+
},
|
|
952
|
+
},
|
|
953
|
+
{
|
|
954
|
+
name: 'memory_search_unified',
|
|
955
|
+
description: 'Search across both Claude Code memories and AgentDB entries using semantic vector similarity. Returns merged, deduplicated results from all namespaces. Use when native Read/Write is wrong because you need (a) cross-session retrieval by semantic similarity (vector embeddings) not by file path, (b) namespacing across projects without managing directory layout, or (c) the .swarm/memory.db audit trail. For one-shot file I/O, native Read/Write is fine.',
|
|
956
|
+
category: 'memory',
|
|
957
|
+
inputSchema: {
|
|
958
|
+
type: 'object',
|
|
959
|
+
properties: {
|
|
960
|
+
query: { type: 'string', description: 'Search query (natural language)' },
|
|
961
|
+
limit: { type: 'number', description: 'Max results (default: 10)' },
|
|
962
|
+
namespace: { type: 'string', description: 'Filter to namespace (omit for all)' },
|
|
963
|
+
},
|
|
964
|
+
required: ['query'],
|
|
965
|
+
},
|
|
966
|
+
handler: async (input) => {
|
|
967
|
+
await ensureInitialized();
|
|
968
|
+
const { searchEntries } = await getMemoryFunctions();
|
|
969
|
+
validateMemoryInput(undefined, undefined, input.query);
|
|
970
|
+
const query = input.query;
|
|
971
|
+
const limit = input.limit ?? 10;
|
|
972
|
+
const ns = input.namespace;
|
|
973
|
+
if (ns) {
|
|
974
|
+
const vNs = validateIdentifier(ns, 'namespace');
|
|
975
|
+
if (!vNs.valid)
|
|
976
|
+
return { success: false, query, results: [], total: 0, error: vNs.error };
|
|
977
|
+
}
|
|
978
|
+
// Search all namespaces unless filtered
|
|
979
|
+
const namespaces = ns ? [ns] : ['default', 'claude-memories', 'auto-memory', 'patterns', 'tasks', 'feedback'];
|
|
980
|
+
const allResults = [];
|
|
981
|
+
for (const searchNs of namespaces) {
|
|
982
|
+
try {
|
|
983
|
+
const r = await searchEntries({ query, namespace: searchNs, limit: limit * 2 });
|
|
984
|
+
if (r?.results) {
|
|
985
|
+
for (const entry of r.results) {
|
|
986
|
+
allResults.push({
|
|
987
|
+
key: entry.key || entry.id || '',
|
|
988
|
+
content: (entry.content || entry.value || '').toString().slice(0, 200),
|
|
989
|
+
score: entry.score || 0,
|
|
990
|
+
namespace: searchNs,
|
|
991
|
+
source: searchNs === 'claude-memories' ? 'claude-code' : searchNs === 'auto-memory' ? 'auto-memory' : 'agentdb',
|
|
992
|
+
});
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
catch { /* namespace may not exist */ }
|
|
997
|
+
}
|
|
998
|
+
// Sort by score, deduplicate by key, take top N
|
|
999
|
+
allResults.sort((a, b) => b.score - a.score);
|
|
1000
|
+
const seen = new Set();
|
|
1001
|
+
const deduplicated = allResults.filter(r => {
|
|
1002
|
+
if (seen.has(r.key))
|
|
1003
|
+
return false;
|
|
1004
|
+
seen.add(r.key);
|
|
1005
|
+
return true;
|
|
1006
|
+
}).slice(0, limit);
|
|
1007
|
+
return {
|
|
1008
|
+
success: true,
|
|
1009
|
+
query,
|
|
1010
|
+
results: deduplicated,
|
|
1011
|
+
total: deduplicated.length,
|
|
1012
|
+
searchedNamespaces: namespaces,
|
|
1013
|
+
searchTime: Date.now(),
|
|
1014
|
+
};
|
|
1015
|
+
},
|
|
1016
|
+
},
|
|
1017
|
+
{
|
|
1018
|
+
// #1916: `ruflo status memory` (the detailed view) referenced an
|
|
1019
|
+
// unregistered `memory_detailed-stats` tool. memory_stats returns a
|
|
1020
|
+
// different shape; this returns what the CLI renders.
|
|
1021
|
+
name: 'memory_detailed-stats',
|
|
1022
|
+
description: 'Detailed memory-store report — backend, entry count, total bytes, per-namespace counts, and (placeholder) perf metrics. Use when native Read/Glob is wrong because the data lives in .swarm/memory.db, not files, and you want an aggregate health view. For a quick count use memory_stats; for "what is in memory" use memory_list.',
|
|
1023
|
+
category: 'memory',
|
|
1024
|
+
inputSchema: { type: 'object', properties: {} },
|
|
1025
|
+
handler: async () => {
|
|
1026
|
+
await ensureInitialized();
|
|
1027
|
+
const { listEntries } = await getMemoryFunctions();
|
|
1028
|
+
const all = await listEntries({ limit: 100000 });
|
|
1029
|
+
const nsCounts = {};
|
|
1030
|
+
let bytes = 0;
|
|
1031
|
+
for (const e of all.entries) {
|
|
1032
|
+
nsCounts[e.namespace] = (nsCounts[e.namespace] || 0) + 1;
|
|
1033
|
+
bytes += e.size || 0;
|
|
1034
|
+
}
|
|
1035
|
+
return {
|
|
1036
|
+
backend: 'sql.js + HNSW',
|
|
1037
|
+
entries: all.total ?? all.entries.length,
|
|
1038
|
+
size: bytes,
|
|
1039
|
+
namespaces: Object.entries(nsCounts).map(([name, entries]) => ({ name, entries })),
|
|
1040
|
+
performance: { avgSearchTime: 0, avgWriteTime: 0, cacheHitRate: 0, hnswEnabled: true },
|
|
1041
|
+
note: 'perf metrics are placeholders; HNSW is always enabled in the sql.js backend',
|
|
1042
|
+
};
|
|
1043
|
+
},
|
|
1044
|
+
},
|
|
1045
|
+
{
|
|
1046
|
+
// #1916: `ruflo memory cleanup` referenced an unregistered `memory_cleanup`
|
|
1047
|
+
// tool. Removes entries whose TTL has expired. Defaults to a dry run —
|
|
1048
|
+
// pass dryRun:false to actually delete.
|
|
1049
|
+
name: 'memory_cleanup',
|
|
1050
|
+
description: 'Prune memory entries whose TTL has expired (dry run by default; pass dryRun:false to delete). Use when native rm is wrong because the entries are rows in .swarm/memory.db, not files. For removing a specific known key use memory_delete. Stale/low-quality pruning is delegated to the agentdb consolidation curator (#1916 follow-up).',
|
|
1051
|
+
category: 'memory',
|
|
1052
|
+
inputSchema: {
|
|
1053
|
+
type: 'object',
|
|
1054
|
+
properties: {
|
|
1055
|
+
dryRun: { type: 'boolean', description: 'Only report candidates, do not delete (default true)' },
|
|
1056
|
+
namespace: { type: 'string', description: 'Limit cleanup to one namespace' },
|
|
1057
|
+
},
|
|
1058
|
+
},
|
|
1059
|
+
handler: async (input) => {
|
|
1060
|
+
await ensureInitialized();
|
|
1061
|
+
const { listEntries, deleteEntry } = await getMemoryFunctions();
|
|
1062
|
+
const dryRun = input.dryRun !== false; // default true
|
|
1063
|
+
const namespace = input.namespace ? String(input.namespace) : undefined;
|
|
1064
|
+
if (namespace) {
|
|
1065
|
+
const v = validateIdentifier(namespace, 'namespace');
|
|
1066
|
+
if (!v.valid)
|
|
1067
|
+
throw new Error(v.error);
|
|
1068
|
+
}
|
|
1069
|
+
const all = await listEntries({ limit: 100000, namespace });
|
|
1070
|
+
const now = Date.now();
|
|
1071
|
+
const expired = all.entries.filter(e => {
|
|
1072
|
+
const exp = e.expiresAt;
|
|
1073
|
+
if (!exp)
|
|
1074
|
+
return false;
|
|
1075
|
+
const t = typeof exp === 'number' ? exp : Date.parse(String(exp));
|
|
1076
|
+
return Number.isFinite(t) && t < now;
|
|
1077
|
+
});
|
|
1078
|
+
let freedBytes = 0;
|
|
1079
|
+
let deleted = 0;
|
|
1080
|
+
if (!dryRun) {
|
|
1081
|
+
for (const e of expired) {
|
|
1082
|
+
try {
|
|
1083
|
+
await deleteEntry({ key: e.key, namespace: e.namespace });
|
|
1084
|
+
freedBytes += e.size || 0;
|
|
1085
|
+
deleted++;
|
|
1086
|
+
}
|
|
1087
|
+
catch { /* ignore individual delete errors */ }
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
else {
|
|
1091
|
+
freedBytes = expired.reduce((s, e) => s + (e.size || 0), 0);
|
|
1092
|
+
}
|
|
1093
|
+
return {
|
|
1094
|
+
dryRun,
|
|
1095
|
+
candidates: { expired: expired.length, stale: 0, lowQuality: 0, total: expired.length },
|
|
1096
|
+
deleted: { entries: dryRun ? 0 : deleted, vectors: 0, patterns: 0 },
|
|
1097
|
+
freed: { bytes: freedBytes },
|
|
1098
|
+
note: dryRun ? 'dry run — re-run with dryRun:false to delete' : undefined,
|
|
1099
|
+
};
|
|
1100
|
+
},
|
|
1101
|
+
},
|
|
1102
|
+
{
|
|
1103
|
+
// #1916: `ruflo memory compress` referenced an unregistered tool. The
|
|
1104
|
+
// sql.js backend has no on-disk compression; this reports current sizes.
|
|
1105
|
+
name: 'memory_compress',
|
|
1106
|
+
description: 'Report memory-store size breakdown (the sql.js backend has no on-disk compression — entries are already stored compactly; quantized embeddings via RaBitQ are configured elsewhere). Use when native du is wrong because the data is in .swarm/memory.db. For pruning expired entries use memory_cleanup.',
|
|
1107
|
+
category: 'memory',
|
|
1108
|
+
inputSchema: { type: 'object', properties: {} },
|
|
1109
|
+
handler: async () => {
|
|
1110
|
+
await ensureInitialized();
|
|
1111
|
+
const { listEntries } = await getMemoryFunctions();
|
|
1112
|
+
const all = await listEntries({ limit: 100000 });
|
|
1113
|
+
const bytes = all.entries.reduce((s, e) => s + (e.size || 0), 0);
|
|
1114
|
+
const human = `${bytes}B`;
|
|
1115
|
+
const sizes = { totalSize: human, vectorsSize: 'n/a', textSize: human, patternsSize: 'n/a', indexSize: 'n/a' };
|
|
1116
|
+
return {
|
|
1117
|
+
before: sizes,
|
|
1118
|
+
after: sizes,
|
|
1119
|
+
compression: { ratio: 1, savedBytes: 0, method: 'none' },
|
|
1120
|
+
note: 'sql.js backend has no on-disk compression; nothing to compress. (RaBitQ embedding quantization is a separate feature.)',
|
|
1121
|
+
};
|
|
1122
|
+
},
|
|
1123
|
+
},
|
|
1124
|
+
{
|
|
1125
|
+
// #1916: `ruflo memory export -o <file>` referenced an unregistered tool.
|
|
1126
|
+
// Dumps entry metadata (and values when the backend returns them) to JSON.
|
|
1127
|
+
name: 'memory_export',
|
|
1128
|
+
description: 'Export memory entries to a JSON file (keys, namespaces, timestamps, and values when available). Use when native Write is wrong because the data is rows in .swarm/memory.db, not a file you can copy. For ingesting an export elsewhere use memory_import. (CSV output and embedding-vector export are follow-ups.)',
|
|
1129
|
+
category: 'memory',
|
|
1130
|
+
inputSchema: {
|
|
1131
|
+
type: 'object',
|
|
1132
|
+
properties: {
|
|
1133
|
+
outputPath: { type: 'string', description: 'File path to write the JSON export to' },
|
|
1134
|
+
format: { type: 'string', enum: ['json', 'csv'], description: 'Export format (csv falls back to json today)' },
|
|
1135
|
+
namespace: { type: 'string', description: 'Limit export to one namespace' },
|
|
1136
|
+
includeVectors: { type: 'boolean', description: 'Include embedding vectors (advisory — not exported yet)' },
|
|
1137
|
+
},
|
|
1138
|
+
required: ['outputPath'],
|
|
1139
|
+
},
|
|
1140
|
+
handler: async (input) => {
|
|
1141
|
+
await ensureInitialized();
|
|
1142
|
+
const { listEntries } = await getMemoryFunctions();
|
|
1143
|
+
const outputPath = String(input.outputPath ?? '');
|
|
1144
|
+
if (!outputPath)
|
|
1145
|
+
return { error: 'outputPath is required' };
|
|
1146
|
+
const namespace = input.namespace ? String(input.namespace) : undefined;
|
|
1147
|
+
if (namespace) {
|
|
1148
|
+
const v = validateIdentifier(namespace, 'namespace');
|
|
1149
|
+
if (!v.valid)
|
|
1150
|
+
throw new Error(v.error);
|
|
1151
|
+
}
|
|
1152
|
+
const all = await listEntries({ limit: 100000, namespace });
|
|
1153
|
+
const payload = {
|
|
1154
|
+
schema: 'ruflo-memory-export/v1',
|
|
1155
|
+
exportedAt: new Date().toISOString(),
|
|
1156
|
+
namespace: namespace ?? null,
|
|
1157
|
+
count: all.entries.length,
|
|
1158
|
+
entries: all.entries.map(e => ({
|
|
1159
|
+
key: e.key, namespace: e.namespace, value: e.value ?? null,
|
|
1160
|
+
createdAt: e.createdAt, updatedAt: e.updatedAt, accessCount: e.accessCount, hasEmbedding: e.hasEmbedding, size: e.size,
|
|
1161
|
+
})),
|
|
1162
|
+
};
|
|
1163
|
+
try {
|
|
1164
|
+
writeFileSync(outputPath, JSON.stringify(payload, null, 2), 'utf-8');
|
|
1165
|
+
}
|
|
1166
|
+
catch (e) {
|
|
1167
|
+
return { error: `Could not write ${outputPath}: ${e.message}` };
|
|
1168
|
+
}
|
|
1169
|
+
const vectorsWithEmb = all.entries.filter(e => e.hasEmbedding).length;
|
|
1170
|
+
return {
|
|
1171
|
+
outputPath,
|
|
1172
|
+
format: input.format || 'json',
|
|
1173
|
+
exported: { entries: all.entries.length, vectors: vectorsWithEmb, patterns: 0 },
|
|
1174
|
+
fileSize: `${Buffer.byteLength(JSON.stringify(payload))}B`,
|
|
1175
|
+
note: input.format === 'csv' ? 'CSV not implemented yet — wrote JSON' : undefined,
|
|
1176
|
+
};
|
|
1177
|
+
},
|
|
1178
|
+
},
|
|
1179
|
+
{
|
|
1180
|
+
// #1916: `ruflo memory import <file>` referenced an unregistered tool.
|
|
1181
|
+
// Reads a ruflo-memory-export JSON and re-stores each entry.
|
|
1182
|
+
name: 'memory_import',
|
|
1183
|
+
description: 'Import memory entries from a JSON export file (produced by memory_export) into .swarm/memory.db, re-embedding values. Use when native Read is wrong because the data must be re-stored as memory rows (with new embeddings), not just read. For importing Claude Code\'s own memory files use memory_import_claude. Pair with memory_export on the source.',
|
|
1184
|
+
category: 'memory',
|
|
1185
|
+
inputSchema: {
|
|
1186
|
+
type: 'object',
|
|
1187
|
+
properties: {
|
|
1188
|
+
inputPath: { type: 'string', description: 'Path to the JSON export file' },
|
|
1189
|
+
merge: { type: 'boolean', description: 'Merge into existing entries (upsert) vs. fail on conflict (default true)' },
|
|
1190
|
+
namespace: { type: 'string', description: 'Override the namespace for all imported entries' },
|
|
1191
|
+
},
|
|
1192
|
+
required: ['inputPath'],
|
|
1193
|
+
},
|
|
1194
|
+
handler: async (input) => {
|
|
1195
|
+
await ensureInitialized();
|
|
1196
|
+
const { storeEntry } = await getMemoryFunctions();
|
|
1197
|
+
const t0 = Date.now();
|
|
1198
|
+
const inputPath = String(input.inputPath ?? '');
|
|
1199
|
+
if (!inputPath || !existsSync(inputPath))
|
|
1200
|
+
return { error: `File not found: ${inputPath || '(empty)'}` };
|
|
1201
|
+
let doc;
|
|
1202
|
+
try {
|
|
1203
|
+
doc = JSON.parse(readFileSync(inputPath, 'utf-8'));
|
|
1204
|
+
}
|
|
1205
|
+
catch (e) {
|
|
1206
|
+
return { error: `Invalid export JSON: ${e.message}` };
|
|
1207
|
+
}
|
|
1208
|
+
const entries = Array.isArray(doc.entries) ? doc.entries : [];
|
|
1209
|
+
const nsOverride = input.namespace ? String(input.namespace) : undefined;
|
|
1210
|
+
if (nsOverride) {
|
|
1211
|
+
const v = validateIdentifier(nsOverride, 'namespace');
|
|
1212
|
+
if (!v.valid)
|
|
1213
|
+
throw new Error(v.error);
|
|
1214
|
+
}
|
|
1215
|
+
let imported = 0;
|
|
1216
|
+
let skipped = 0;
|
|
1217
|
+
for (const e of entries) {
|
|
1218
|
+
if (!e || typeof e.key !== 'string') {
|
|
1219
|
+
skipped++;
|
|
1220
|
+
continue;
|
|
1221
|
+
}
|
|
1222
|
+
const value = typeof e.value === 'string' ? e.value : JSON.stringify(e.value ?? null);
|
|
1223
|
+
try {
|
|
1224
|
+
await storeEntry({ key: e.key, value, namespace: nsOverride ?? e.namespace ?? 'default', upsert: input.merge !== false });
|
|
1225
|
+
imported++;
|
|
1226
|
+
}
|
|
1227
|
+
catch {
|
|
1228
|
+
skipped++;
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
return {
|
|
1232
|
+
inputPath,
|
|
1233
|
+
imported: { entries: imported, vectors: 0, patterns: 0 },
|
|
1234
|
+
skipped,
|
|
1235
|
+
duration: Date.now() - t0,
|
|
1236
|
+
};
|
|
1237
|
+
},
|
|
1238
|
+
},
|
|
1239
|
+
];
|
|
1240
|
+
//# sourceMappingURL=memory-tools.js.map
|