superlocalmemory 2.8.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +9 -1
  3. package/NOTICE +63 -0
  4. package/README.md +165 -480
  5. package/bin/slm +17 -449
  6. package/bin/slm-npm +2 -2
  7. package/bin/slm.bat +4 -2
  8. package/conftest.py +5 -0
  9. package/docs/api-reference.md +284 -0
  10. package/docs/architecture.md +149 -0
  11. package/docs/auto-memory.md +150 -0
  12. package/docs/cli-reference.md +276 -0
  13. package/docs/compliance.md +191 -0
  14. package/docs/configuration.md +182 -0
  15. package/docs/getting-started.md +102 -0
  16. package/docs/ide-setup.md +261 -0
  17. package/docs/mcp-tools.md +220 -0
  18. package/docs/migration-from-v2.md +170 -0
  19. package/docs/profiles.md +173 -0
  20. package/docs/troubleshooting.md +310 -0
  21. package/{configs → ide/configs}/antigravity-mcp.json +3 -3
  22. package/ide/configs/chatgpt-desktop-mcp.json +16 -0
  23. package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
  24. package/{configs → ide/configs}/codex-mcp.toml +4 -4
  25. package/{configs → ide/configs}/continue-mcp.yaml +4 -3
  26. package/{configs → ide/configs}/continue-skills.yaml +6 -6
  27. package/ide/configs/cursor-mcp.json +15 -0
  28. package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
  29. package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
  30. package/{configs → ide/configs}/opencode-mcp.json +2 -2
  31. package/{configs → ide/configs}/perplexity-mcp.json +2 -2
  32. package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
  33. package/{configs → ide/configs}/windsurf-mcp.json +3 -3
  34. package/{configs → ide/configs}/zed-mcp.json +2 -2
  35. package/{hooks → ide/hooks}/context-hook.js +9 -20
  36. package/ide/hooks/memory-list-skill.js +70 -0
  37. package/ide/hooks/memory-profile-skill.js +101 -0
  38. package/ide/hooks/memory-recall-skill.js +62 -0
  39. package/ide/hooks/memory-remember-skill.js +68 -0
  40. package/ide/hooks/memory-reset-skill.js +160 -0
  41. package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
  42. package/ide/integrations/langchain/README.md +106 -0
  43. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
  44. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
  45. package/ide/integrations/langchain/pyproject.toml +38 -0
  46. package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
  47. package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
  48. package/ide/integrations/langchain/tests/test_security.py +117 -0
  49. package/ide/integrations/llamaindex/README.md +81 -0
  50. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
  51. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
  52. package/ide/integrations/llamaindex/pyproject.toml +43 -0
  53. package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
  54. package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
  55. package/ide/integrations/llamaindex/tests/test_security.py +241 -0
  56. package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
  57. package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
  58. package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
  59. package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
  60. package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
  61. package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
  62. package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
  63. package/package.json +13 -22
  64. package/pyproject.toml +85 -0
  65. package/scripts/build-dmg.sh +417 -0
  66. package/scripts/install-skills.ps1 +334 -0
  67. package/{install.ps1 → scripts/install.ps1} +36 -4
  68. package/{install.sh → scripts/install.sh} +14 -13
  69. package/scripts/postinstall.js +2 -2
  70. package/scripts/start-dashboard.ps1 +52 -0
  71. package/scripts/start-dashboard.sh +41 -0
  72. package/scripts/sync-wiki.ps1 +127 -0
  73. package/scripts/sync-wiki.sh +82 -0
  74. package/scripts/test-dmg.sh +161 -0
  75. package/scripts/test-npm-package.ps1 +252 -0
  76. package/scripts/test-npm-package.sh +207 -0
  77. package/scripts/verify-install.ps1 +294 -0
  78. package/scripts/verify-install.sh +266 -0
  79. package/src/superlocalmemory/__init__.py +0 -0
  80. package/src/superlocalmemory/attribution/__init__.py +9 -0
  81. package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
  82. package/src/superlocalmemory/attribution/signer.py +153 -0
  83. package/src/superlocalmemory/attribution/watermark.py +189 -0
  84. package/src/superlocalmemory/cli/__init__.py +5 -0
  85. package/src/superlocalmemory/cli/commands.py +245 -0
  86. package/src/superlocalmemory/cli/main.py +89 -0
  87. package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
  88. package/src/superlocalmemory/cli/post_install.py +99 -0
  89. package/src/superlocalmemory/cli/setup_wizard.py +129 -0
  90. package/src/superlocalmemory/compliance/__init__.py +0 -0
  91. package/src/superlocalmemory/compliance/abac.py +204 -0
  92. package/src/superlocalmemory/compliance/audit.py +314 -0
  93. package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
  94. package/src/superlocalmemory/compliance/gdpr.py +294 -0
  95. package/src/superlocalmemory/compliance/lifecycle.py +158 -0
  96. package/src/superlocalmemory/compliance/retention.py +232 -0
  97. package/src/superlocalmemory/compliance/scheduler.py +148 -0
  98. package/src/superlocalmemory/core/__init__.py +0 -0
  99. package/src/superlocalmemory/core/config.py +391 -0
  100. package/src/superlocalmemory/core/embeddings.py +293 -0
  101. package/src/superlocalmemory/core/engine.py +701 -0
  102. package/src/superlocalmemory/core/hooks.py +65 -0
  103. package/src/superlocalmemory/core/maintenance.py +172 -0
  104. package/src/superlocalmemory/core/modes.py +140 -0
  105. package/src/superlocalmemory/core/profiles.py +234 -0
  106. package/src/superlocalmemory/core/registry.py +117 -0
  107. package/src/superlocalmemory/dynamics/__init__.py +0 -0
  108. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
  109. package/src/superlocalmemory/encoding/__init__.py +0 -0
  110. package/src/superlocalmemory/encoding/consolidator.py +485 -0
  111. package/src/superlocalmemory/encoding/emotional.py +125 -0
  112. package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
  113. package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
  114. package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
  115. package/src/superlocalmemory/encoding/foresight.py +91 -0
  116. package/src/superlocalmemory/encoding/graph_builder.py +302 -0
  117. package/src/superlocalmemory/encoding/observation_builder.py +160 -0
  118. package/src/superlocalmemory/encoding/scene_builder.py +183 -0
  119. package/src/superlocalmemory/encoding/signal_inference.py +90 -0
  120. package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
  121. package/src/superlocalmemory/encoding/type_router.py +235 -0
  122. package/src/superlocalmemory/hooks/__init__.py +3 -0
  123. package/src/superlocalmemory/hooks/auto_capture.py +111 -0
  124. package/src/superlocalmemory/hooks/auto_recall.py +93 -0
  125. package/src/superlocalmemory/hooks/ide_connector.py +204 -0
  126. package/src/superlocalmemory/hooks/rules_engine.py +99 -0
  127. package/src/superlocalmemory/infra/__init__.py +3 -0
  128. package/src/superlocalmemory/infra/auth_middleware.py +82 -0
  129. package/src/superlocalmemory/infra/backup.py +317 -0
  130. package/src/superlocalmemory/infra/cache_manager.py +267 -0
  131. package/src/superlocalmemory/infra/event_bus.py +381 -0
  132. package/src/superlocalmemory/infra/rate_limiter.py +135 -0
  133. package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
  134. package/src/superlocalmemory/learning/__init__.py +0 -0
  135. package/src/superlocalmemory/learning/adaptive.py +172 -0
  136. package/src/superlocalmemory/learning/behavioral.py +490 -0
  137. package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
  138. package/src/superlocalmemory/learning/bootstrap.py +298 -0
  139. package/src/superlocalmemory/learning/cross_project.py +399 -0
  140. package/src/superlocalmemory/learning/database.py +376 -0
  141. package/src/superlocalmemory/learning/engagement.py +323 -0
  142. package/src/superlocalmemory/learning/features.py +138 -0
  143. package/src/superlocalmemory/learning/feedback.py +316 -0
  144. package/src/superlocalmemory/learning/outcomes.py +255 -0
  145. package/src/superlocalmemory/learning/project_context.py +366 -0
  146. package/src/superlocalmemory/learning/ranker.py +155 -0
  147. package/src/superlocalmemory/learning/source_quality.py +303 -0
  148. package/src/superlocalmemory/learning/workflows.py +309 -0
  149. package/src/superlocalmemory/llm/__init__.py +0 -0
  150. package/src/superlocalmemory/llm/backbone.py +316 -0
  151. package/src/superlocalmemory/math/__init__.py +0 -0
  152. package/src/superlocalmemory/math/fisher.py +356 -0
  153. package/src/superlocalmemory/math/langevin.py +398 -0
  154. package/src/superlocalmemory/math/sheaf.py +257 -0
  155. package/src/superlocalmemory/mcp/__init__.py +0 -0
  156. package/src/superlocalmemory/mcp/resources.py +245 -0
  157. package/src/superlocalmemory/mcp/server.py +61 -0
  158. package/src/superlocalmemory/mcp/tools.py +18 -0
  159. package/src/superlocalmemory/mcp/tools_core.py +305 -0
  160. package/src/superlocalmemory/mcp/tools_v28.py +223 -0
  161. package/src/superlocalmemory/mcp/tools_v3.py +286 -0
  162. package/src/superlocalmemory/retrieval/__init__.py +0 -0
  163. package/src/superlocalmemory/retrieval/agentic.py +295 -0
  164. package/src/superlocalmemory/retrieval/ann_index.py +223 -0
  165. package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
  166. package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
  167. package/src/superlocalmemory/retrieval/engine.py +390 -0
  168. package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
  169. package/src/superlocalmemory/retrieval/fusion.py +78 -0
  170. package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
  171. package/src/superlocalmemory/retrieval/reranker.py +154 -0
  172. package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
  173. package/src/superlocalmemory/retrieval/strategy.py +96 -0
  174. package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
  175. package/src/superlocalmemory/server/__init__.py +1 -0
  176. package/src/superlocalmemory/server/api.py +248 -0
  177. package/src/superlocalmemory/server/routes/__init__.py +4 -0
  178. package/src/superlocalmemory/server/routes/agents.py +107 -0
  179. package/src/superlocalmemory/server/routes/backup.py +91 -0
  180. package/src/superlocalmemory/server/routes/behavioral.py +127 -0
  181. package/src/superlocalmemory/server/routes/compliance.py +160 -0
  182. package/src/superlocalmemory/server/routes/data_io.py +188 -0
  183. package/src/superlocalmemory/server/routes/events.py +183 -0
  184. package/src/superlocalmemory/server/routes/helpers.py +85 -0
  185. package/src/superlocalmemory/server/routes/learning.py +273 -0
  186. package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
  187. package/src/superlocalmemory/server/routes/memories.py +399 -0
  188. package/src/superlocalmemory/server/routes/profiles.py +219 -0
  189. package/src/superlocalmemory/server/routes/stats.py +346 -0
  190. package/src/superlocalmemory/server/routes/v3_api.py +365 -0
  191. package/src/superlocalmemory/server/routes/ws.py +82 -0
  192. package/src/superlocalmemory/server/security_middleware.py +57 -0
  193. package/src/superlocalmemory/server/ui.py +245 -0
  194. package/src/superlocalmemory/storage/__init__.py +0 -0
  195. package/src/superlocalmemory/storage/access_control.py +182 -0
  196. package/src/superlocalmemory/storage/database.py +594 -0
  197. package/src/superlocalmemory/storage/migrations.py +303 -0
  198. package/src/superlocalmemory/storage/models.py +406 -0
  199. package/src/superlocalmemory/storage/schema.py +726 -0
  200. package/src/superlocalmemory/storage/v2_migrator.py +317 -0
  201. package/src/superlocalmemory/trust/__init__.py +0 -0
  202. package/src/superlocalmemory/trust/gate.py +130 -0
  203. package/src/superlocalmemory/trust/provenance.py +124 -0
  204. package/src/superlocalmemory/trust/scorer.py +347 -0
  205. package/src/superlocalmemory/trust/signals.py +153 -0
  206. package/ui/index.html +278 -5
  207. package/ui/js/auto-settings.js +70 -0
  208. package/ui/js/dashboard.js +90 -0
  209. package/ui/js/fact-detail.js +92 -0
  210. package/ui/js/feedback.js +2 -2
  211. package/ui/js/ide-status.js +102 -0
  212. package/ui/js/math-health.js +98 -0
  213. package/ui/js/recall-lab.js +127 -0
  214. package/ui/js/settings.js +2 -2
  215. package/ui/js/trust-dashboard.js +73 -0
  216. package/api_server.py +0 -724
  217. package/bin/aider-smart +0 -72
  218. package/bin/superlocalmemoryv2-learning +0 -4
  219. package/bin/superlocalmemoryv2-list +0 -3
  220. package/bin/superlocalmemoryv2-patterns +0 -4
  221. package/bin/superlocalmemoryv2-profile +0 -3
  222. package/bin/superlocalmemoryv2-recall +0 -3
  223. package/bin/superlocalmemoryv2-remember +0 -3
  224. package/bin/superlocalmemoryv2-reset +0 -3
  225. package/bin/superlocalmemoryv2-status +0 -3
  226. package/configs/chatgpt-desktop-mcp.json +0 -16
  227. package/configs/cursor-mcp.json +0 -15
  228. package/docs/SECURITY-QUICK-REFERENCE.md +0 -214
  229. package/hooks/memory-list-skill.js +0 -139
  230. package/hooks/memory-profile-skill.js +0 -273
  231. package/hooks/memory-recall-skill.js +0 -114
  232. package/hooks/memory-remember-skill.js +0 -127
  233. package/hooks/memory-reset-skill.js +0 -274
  234. package/mcp_server.py +0 -1800
  235. package/requirements-core.txt +0 -22
  236. package/requirements-learning.txt +0 -12
  237. package/requirements.txt +0 -12
  238. package/src/agent_registry.py +0 -411
  239. package/src/auth_middleware.py +0 -61
  240. package/src/auto_backup.py +0 -459
  241. package/src/behavioral/__init__.py +0 -49
  242. package/src/behavioral/behavioral_listener.py +0 -203
  243. package/src/behavioral/behavioral_patterns.py +0 -275
  244. package/src/behavioral/cross_project_transfer.py +0 -206
  245. package/src/behavioral/outcome_inference.py +0 -194
  246. package/src/behavioral/outcome_tracker.py +0 -193
  247. package/src/behavioral/tests/__init__.py +0 -4
  248. package/src/behavioral/tests/test_behavioral_integration.py +0 -108
  249. package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
  250. package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
  251. package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
  252. package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
  253. package/src/behavioral/tests/test_outcome_inference.py +0 -107
  254. package/src/behavioral/tests/test_outcome_tracker.py +0 -96
  255. package/src/cache_manager.py +0 -518
  256. package/src/compliance/__init__.py +0 -48
  257. package/src/compliance/abac_engine.py +0 -149
  258. package/src/compliance/abac_middleware.py +0 -116
  259. package/src/compliance/audit_db.py +0 -215
  260. package/src/compliance/audit_logger.py +0 -148
  261. package/src/compliance/retention_manager.py +0 -289
  262. package/src/compliance/retention_scheduler.py +0 -186
  263. package/src/compliance/tests/__init__.py +0 -4
  264. package/src/compliance/tests/test_abac_enforcement.py +0 -95
  265. package/src/compliance/tests/test_abac_engine.py +0 -124
  266. package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
  267. package/src/compliance/tests/test_audit_db.py +0 -123
  268. package/src/compliance/tests/test_audit_logger.py +0 -98
  269. package/src/compliance/tests/test_mcp_audit.py +0 -128
  270. package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
  271. package/src/compliance/tests/test_retention_manager.py +0 -131
  272. package/src/compliance/tests/test_retention_scheduler.py +0 -99
  273. package/src/compression/__init__.py +0 -25
  274. package/src/compression/cli.py +0 -150
  275. package/src/compression/cold_storage.py +0 -217
  276. package/src/compression/config.py +0 -72
  277. package/src/compression/orchestrator.py +0 -133
  278. package/src/compression/tier2_compressor.py +0 -228
  279. package/src/compression/tier3_compressor.py +0 -153
  280. package/src/compression/tier_classifier.py +0 -148
  281. package/src/db_connection_manager.py +0 -536
  282. package/src/embedding_engine.py +0 -63
  283. package/src/embeddings/__init__.py +0 -47
  284. package/src/embeddings/cache.py +0 -70
  285. package/src/embeddings/cli.py +0 -113
  286. package/src/embeddings/constants.py +0 -47
  287. package/src/embeddings/database.py +0 -91
  288. package/src/embeddings/engine.py +0 -247
  289. package/src/embeddings/model_loader.py +0 -145
  290. package/src/event_bus.py +0 -562
  291. package/src/graph/__init__.py +0 -36
  292. package/src/graph/build_helpers.py +0 -74
  293. package/src/graph/cli.py +0 -87
  294. package/src/graph/cluster_builder.py +0 -188
  295. package/src/graph/cluster_summary.py +0 -148
  296. package/src/graph/constants.py +0 -47
  297. package/src/graph/edge_builder.py +0 -162
  298. package/src/graph/entity_extractor.py +0 -95
  299. package/src/graph/graph_core.py +0 -226
  300. package/src/graph/graph_search.py +0 -231
  301. package/src/graph/hierarchical.py +0 -207
  302. package/src/graph/schema.py +0 -99
  303. package/src/graph_engine.py +0 -52
  304. package/src/hnsw_index.py +0 -628
  305. package/src/hybrid_search.py +0 -46
  306. package/src/learning/__init__.py +0 -217
  307. package/src/learning/adaptive_ranker.py +0 -682
  308. package/src/learning/bootstrap/__init__.py +0 -69
  309. package/src/learning/bootstrap/constants.py +0 -93
  310. package/src/learning/bootstrap/db_queries.py +0 -316
  311. package/src/learning/bootstrap/sampling.py +0 -82
  312. package/src/learning/bootstrap/text_utils.py +0 -71
  313. package/src/learning/cross_project_aggregator.py +0 -857
  314. package/src/learning/db/__init__.py +0 -40
  315. package/src/learning/db/constants.py +0 -44
  316. package/src/learning/db/schema.py +0 -279
  317. package/src/learning/engagement_tracker.py +0 -628
  318. package/src/learning/feature_extractor.py +0 -708
  319. package/src/learning/feedback_collector.py +0 -806
  320. package/src/learning/learning_db.py +0 -915
  321. package/src/learning/project_context_manager.py +0 -572
  322. package/src/learning/ranking/__init__.py +0 -33
  323. package/src/learning/ranking/constants.py +0 -84
  324. package/src/learning/ranking/helpers.py +0 -278
  325. package/src/learning/source_quality_scorer.py +0 -676
  326. package/src/learning/synthetic_bootstrap.py +0 -755
  327. package/src/learning/tests/test_adaptive_ranker.py +0 -325
  328. package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
  329. package/src/learning/tests/test_aggregator.py +0 -306
  330. package/src/learning/tests/test_auto_retrain_v28.py +0 -35
  331. package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
  332. package/src/learning/tests/test_feature_extractor_v28.py +0 -93
  333. package/src/learning/tests/test_feedback_collector.py +0 -294
  334. package/src/learning/tests/test_learning_db.py +0 -602
  335. package/src/learning/tests/test_learning_db_v28.py +0 -110
  336. package/src/learning/tests/test_learning_init_v28.py +0 -48
  337. package/src/learning/tests/test_outcome_signals.py +0 -48
  338. package/src/learning/tests/test_project_context.py +0 -292
  339. package/src/learning/tests/test_schema_migration.py +0 -319
  340. package/src/learning/tests/test_signal_inference.py +0 -397
  341. package/src/learning/tests/test_source_quality.py +0 -351
  342. package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
  343. package/src/learning/tests/test_workflow_miner.py +0 -318
  344. package/src/learning/workflow_pattern_miner.py +0 -655
  345. package/src/lifecycle/__init__.py +0 -54
  346. package/src/lifecycle/bounded_growth.py +0 -239
  347. package/src/lifecycle/compaction_engine.py +0 -226
  348. package/src/lifecycle/lifecycle_engine.py +0 -355
  349. package/src/lifecycle/lifecycle_evaluator.py +0 -257
  350. package/src/lifecycle/lifecycle_scheduler.py +0 -130
  351. package/src/lifecycle/retention_policy.py +0 -285
  352. package/src/lifecycle/tests/test_bounded_growth.py +0 -193
  353. package/src/lifecycle/tests/test_compaction.py +0 -179
  354. package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
  355. package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
  356. package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
  357. package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
  358. package/src/lifecycle/tests/test_mcp_compact.py +0 -149
  359. package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
  360. package/src/lifecycle/tests/test_retention_policy.py +0 -162
  361. package/src/mcp_tools_v28.py +0 -281
  362. package/src/memory/__init__.py +0 -36
  363. package/src/memory/cli.py +0 -205
  364. package/src/memory/constants.py +0 -39
  365. package/src/memory/helpers.py +0 -28
  366. package/src/memory/schema.py +0 -166
  367. package/src/memory-profiles.py +0 -595
  368. package/src/memory-reset.py +0 -491
  369. package/src/memory_compression.py +0 -989
  370. package/src/memory_store_v2.py +0 -1155
  371. package/src/migrate_v1_to_v2.py +0 -629
  372. package/src/pattern_learner.py +0 -34
  373. package/src/patterns/__init__.py +0 -24
  374. package/src/patterns/analyzers.py +0 -251
  375. package/src/patterns/learner.py +0 -271
  376. package/src/patterns/scoring.py +0 -171
  377. package/src/patterns/store.py +0 -225
  378. package/src/patterns/terminology.py +0 -140
  379. package/src/provenance_tracker.py +0 -312
  380. package/src/qualixar_attribution.py +0 -139
  381. package/src/qualixar_watermark.py +0 -78
  382. package/src/query_optimizer.py +0 -511
  383. package/src/rate_limiter.py +0 -83
  384. package/src/search/__init__.py +0 -20
  385. package/src/search/cli.py +0 -77
  386. package/src/search/constants.py +0 -26
  387. package/src/search/engine.py +0 -241
  388. package/src/search/fusion.py +0 -122
  389. package/src/search/index_loader.py +0 -114
  390. package/src/search/methods.py +0 -162
  391. package/src/search_engine_v2.py +0 -401
  392. package/src/setup_validator.py +0 -482
  393. package/src/subscription_manager.py +0 -391
  394. package/src/tree/__init__.py +0 -59
  395. package/src/tree/builder.py +0 -185
  396. package/src/tree/nodes.py +0 -202
  397. package/src/tree/queries.py +0 -257
  398. package/src/tree/schema.py +0 -80
  399. package/src/tree_manager.py +0 -19
  400. package/src/trust/__init__.py +0 -45
  401. package/src/trust/constants.py +0 -66
  402. package/src/trust/queries.py +0 -157
  403. package/src/trust/schema.py +0 -95
  404. package/src/trust/scorer.py +0 -299
  405. package/src/trust/signals.py +0 -95
  406. package/src/trust_scorer.py +0 -44
  407. package/ui/app.js +0 -1588
  408. package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
  409. package/ui/js/graph-cytoscape.js +0 -1168
  410. package/ui/js/graph-d3-backup.js +0 -32
  411. package/ui/js/graph.js +0 -32
  412. package/ui_server.py +0 -266
  413. /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
  414. /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
  415. /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
  416. /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
  417. /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
  418. /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
  419. /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
  420. /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
  421. /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
  422. /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
  423. /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
  424. /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
  425. /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
  426. /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
  427. /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
  428. /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
  429. /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
  430. /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
  431. /package/{completions → ide/completions}/slm.bash +0 -0
  432. /package/{completions → ide/completions}/slm.zsh +0 -0
  433. /package/{configs → ide/configs}/cody-commands.json +0 -0
  434. /package/{install-skills.sh → scripts/install-skills.sh} +0 -0
@@ -1,629 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """
5
- SuperLocalMemory V1 to V2 Migration Script
6
-
7
- Safely migrates the memory database from V1 schema to V2 architecture.
8
- This script is idempotent - safe to re-run if interrupted.
9
-
10
- Usage:
11
- python ~/.claude-memory/migrate_v1_to_v2.py
12
-
13
- Features:
14
- - Adds new columns to memories table
15
- - Creates new tables for tree, graph, patterns, and archive
16
- - Creates all required indexes
17
- - Migrates existing memories to tree structure
18
- - Handles rollback on failure
19
- - Prints progress messages
20
- """
21
-
22
- import sqlite3
23
- import json
24
- from pathlib import Path
25
- from datetime import datetime
26
- import sys
27
- import traceback
28
- from typing import Tuple, Dict, Any
29
-
30
- DB_PATH = Path.home() / '.claude-memory' / 'memory.db'
31
- BACKUP_PATH = Path.home() / '.claude-memory' / 'backups' / f'pre-v2-{datetime.now().strftime("%Y%m%d-%H%M%S")}.db'
32
-
33
-
34
- def create_backup() -> None:
35
- """Create a backup of the database before migration."""
36
- print("=" * 60)
37
- print("CREATING BACKUP")
38
- print("=" * 60)
39
-
40
- BACKUP_PATH.parent.mkdir(parents=True, exist_ok=True)
41
-
42
- if DB_PATH.exists():
43
- import shutil
44
- shutil.copy2(DB_PATH, BACKUP_PATH)
45
- print(f"✓ Backup created: {BACKUP_PATH}")
46
- print(f" Size: {BACKUP_PATH.stat().st_size / 1024:.1f} KB")
47
- else:
48
- print("! Database does not exist yet - no backup needed")
49
-
50
- print()
51
-
52
-
53
- def check_schema_version(conn: sqlite3.Connection) -> bool:
54
- """Check if migration has already been completed."""
55
- cursor = conn.cursor()
56
-
57
- try:
58
- cursor.execute("""
59
- SELECT value FROM system_metadata WHERE key = 'schema_version'
60
- """)
61
- result = cursor.fetchone()
62
- if result and result[0] == '2.0.0':
63
- return True
64
- except sqlite3.OperationalError:
65
- # Table doesn't exist yet
66
- pass
67
-
68
- return False
69
-
70
-
71
- def add_new_columns(conn: sqlite3.Connection) -> None:
72
- """Add new columns to the memories table."""
73
- print("=" * 60)
74
- print("ADDING NEW COLUMNS TO MEMORIES TABLE")
75
- print("=" * 60)
76
-
77
- cursor = conn.cursor()
78
-
79
- new_columns = [
80
- ('parent_id', 'INTEGER'),
81
- ('tree_path', 'TEXT'),
82
- ('depth', 'INTEGER DEFAULT 0'),
83
- ('category', 'TEXT'),
84
- ('cluster_id', 'INTEGER'),
85
- ('last_accessed', 'TIMESTAMP'),
86
- ('access_count', 'INTEGER DEFAULT 0'),
87
- ('tier', 'INTEGER DEFAULT 1')
88
- ]
89
-
90
- for col_name, col_type in new_columns:
91
- try:
92
- cursor.execute(f'ALTER TABLE memories ADD COLUMN {col_name} {col_type}')
93
- print(f"✓ Added column: {col_name}")
94
- except sqlite3.OperationalError as e:
95
- if 'duplicate column' in str(e).lower():
96
- print(f"- Column already exists: {col_name}")
97
- else:
98
- raise
99
-
100
- print()
101
-
102
-
103
- def create_new_tables(conn: sqlite3.Connection) -> None:
104
- """Create all new tables for V2 architecture."""
105
- print("=" * 60)
106
- print("CREATING NEW TABLES")
107
- print("=" * 60)
108
-
109
- cursor = conn.cursor()
110
-
111
- tables = {
112
- 'memory_tree': '''
113
- CREATE TABLE IF NOT EXISTS memory_tree (
114
- id INTEGER PRIMARY KEY AUTOINCREMENT,
115
- node_type TEXT NOT NULL,
116
- name TEXT NOT NULL,
117
- description TEXT,
118
- parent_id INTEGER,
119
- tree_path TEXT NOT NULL,
120
- depth INTEGER DEFAULT 0,
121
- memory_count INTEGER DEFAULT 0,
122
- total_size INTEGER DEFAULT 0,
123
- last_updated TIMESTAMP,
124
- memory_id INTEGER,
125
- FOREIGN KEY (parent_id) REFERENCES memory_tree(id) ON DELETE CASCADE,
126
- FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
127
- )
128
- ''',
129
-
130
- 'graph_nodes': '''
131
- CREATE TABLE IF NOT EXISTS graph_nodes (
132
- id INTEGER PRIMARY KEY AUTOINCREMENT,
133
- memory_id INTEGER UNIQUE NOT NULL,
134
- entities TEXT,
135
- embedding_vector TEXT,
136
- FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
137
- )
138
- ''',
139
-
140
- 'graph_edges': '''
141
- CREATE TABLE IF NOT EXISTS graph_edges (
142
- id INTEGER PRIMARY KEY AUTOINCREMENT,
143
- source_memory_id INTEGER NOT NULL,
144
- target_memory_id INTEGER NOT NULL,
145
- relationship_type TEXT,
146
- weight REAL DEFAULT 1.0,
147
- shared_entities TEXT,
148
- similarity_score REAL,
149
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
150
- FOREIGN KEY (source_memory_id) REFERENCES memories(id) ON DELETE CASCADE,
151
- FOREIGN KEY (target_memory_id) REFERENCES memories(id) ON DELETE CASCADE,
152
- UNIQUE(source_memory_id, target_memory_id)
153
- )
154
- ''',
155
-
156
- 'graph_clusters': '''
157
- CREATE TABLE IF NOT EXISTS graph_clusters (
158
- id INTEGER PRIMARY KEY AUTOINCREMENT,
159
- name TEXT NOT NULL,
160
- description TEXT,
161
- member_count INTEGER DEFAULT 0,
162
- avg_importance REAL,
163
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
164
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
165
- )
166
- ''',
167
-
168
- 'identity_patterns': '''
169
- CREATE TABLE IF NOT EXISTS identity_patterns (
170
- id INTEGER PRIMARY KEY AUTOINCREMENT,
171
- pattern_type TEXT NOT NULL,
172
- key TEXT NOT NULL,
173
- value TEXT NOT NULL,
174
- confidence REAL DEFAULT 0.5,
175
- evidence_count INTEGER DEFAULT 1,
176
- memory_ids TEXT,
177
- category TEXT,
178
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
179
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
180
- UNIQUE(pattern_type, key, category)
181
- )
182
- ''',
183
-
184
- 'pattern_examples': '''
185
- CREATE TABLE IF NOT EXISTS pattern_examples (
186
- id INTEGER PRIMARY KEY AUTOINCREMENT,
187
- pattern_id INTEGER NOT NULL,
188
- memory_id INTEGER NOT NULL,
189
- example_text TEXT,
190
- FOREIGN KEY (pattern_id) REFERENCES identity_patterns(id) ON DELETE CASCADE,
191
- FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
192
- )
193
- ''',
194
-
195
- 'memory_archive': '''
196
- CREATE TABLE IF NOT EXISTS memory_archive (
197
- id INTEGER PRIMARY KEY AUTOINCREMENT,
198
- memory_id INTEGER UNIQUE NOT NULL,
199
- full_content TEXT NOT NULL,
200
- archived_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
201
- FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
202
- )
203
- ''',
204
-
205
- 'system_metadata': '''
206
- CREATE TABLE IF NOT EXISTS system_metadata (
207
- key TEXT PRIMARY KEY,
208
- value TEXT,
209
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
210
- )
211
- '''
212
- }
213
-
214
- for table_name, create_sql in tables.items():
215
- try:
216
- cursor.execute(create_sql)
217
- print(f"✓ Created table: {table_name}")
218
- except sqlite3.OperationalError as e:
219
- if 'already exists' in str(e).lower():
220
- print(f"- Table already exists: {table_name}")
221
- else:
222
- raise
223
-
224
- print()
225
-
226
-
227
- def create_indexes(conn: sqlite3.Connection) -> None:
228
- """Create all indexes for performance optimization."""
229
- print("=" * 60)
230
- print("CREATING INDEXES")
231
- print("=" * 60)
232
-
233
- cursor = conn.cursor()
234
-
235
- indexes = [
236
- ('idx_project', 'memories', 'project_path'),
237
- ('idx_tags', 'memories', 'tags'),
238
- ('idx_category', 'memories', 'category'),
239
- ('idx_tree_path', 'memories', 'tree_path'),
240
- ('idx_cluster', 'memories', 'cluster_id'),
241
- ('idx_last_accessed', 'memories', 'last_accessed'),
242
- ('idx_tier', 'memories', 'tier'),
243
- ('idx_tree_path_layer2', 'memory_tree', 'tree_path'),
244
- ('idx_node_type', 'memory_tree', 'node_type'),
245
- ('idx_cluster_members', 'memories', 'cluster_id'),
246
- ('idx_graph_source', 'graph_edges', 'source_memory_id'),
247
- ('idx_graph_target', 'graph_edges', 'target_memory_id'),
248
- ('idx_pattern_type', 'identity_patterns', 'pattern_type'),
249
- ('idx_pattern_confidence', 'identity_patterns', 'confidence'),
250
- ('idx_archive_memory', 'memory_archive', 'memory_id')
251
- ]
252
-
253
- for idx_name, table, column in indexes:
254
- try:
255
- cursor.execute(f'CREATE INDEX IF NOT EXISTS {idx_name} ON {table}({column})')
256
- print(f"✓ Created index: {idx_name}")
257
- except sqlite3.OperationalError as e:
258
- print(f"- Index already exists: {idx_name}")
259
-
260
- print()
261
-
262
-
263
- def migrate_to_tree_structure(conn: sqlite3.Connection) -> None:
264
- """Migrate existing memories to tree structure."""
265
- print("=" * 60)
266
- print("MIGRATING MEMORIES TO TREE STRUCTURE")
267
- print("=" * 60)
268
-
269
- cursor = conn.cursor()
270
-
271
- # Check if root node already exists
272
- cursor.execute("SELECT id FROM memory_tree WHERE node_type = 'root'")
273
- root = cursor.fetchone()
274
-
275
- if root:
276
- root_id = root[0]
277
- print(f"- Root node already exists (id={root_id})")
278
- else:
279
- # Create root node
280
- cursor.execute('''
281
- INSERT INTO memory_tree (node_type, name, tree_path, depth, last_updated)
282
- VALUES ('root', 'All Projects', '1', 0, CURRENT_TIMESTAMP)
283
- ''')
284
- root_id = cursor.lastrowid
285
- print(f"✓ Created root node (id={root_id})")
286
-
287
- # Get all existing memories that haven't been migrated
288
- cursor.execute('''
289
- SELECT id, project_path, project_name, content
290
- FROM memories
291
- WHERE tree_path IS NULL OR tree_path = ''
292
- ''')
293
- memories = cursor.fetchall()
294
-
295
- if not memories:
296
- print("- No memories to migrate (all already in tree)")
297
- print()
298
- return
299
-
300
- print(f"Found {len(memories)} memories to migrate")
301
-
302
- project_nodes = {} # project_key -> node_id
303
-
304
- # Load existing project nodes
305
- cursor.execute("""
306
- SELECT id, name FROM memory_tree WHERE node_type = 'project'
307
- """)
308
- for node_id, name in cursor.fetchall():
309
- project_nodes[name] = node_id
310
-
311
- migrated_count = 0
312
-
313
- for memory_id, project_path, project_name, content in memories:
314
- # Determine project key
315
- if not project_name and not project_path:
316
- project_key = 'Uncategorized'
317
- else:
318
- project_key = project_name or Path(project_path).name if project_path else 'Uncategorized'
319
-
320
- # Create project node if doesn't exist
321
- if project_key not in project_nodes:
322
- cursor.execute('''
323
- INSERT INTO memory_tree (node_type, name, parent_id, tree_path, depth, last_updated)
324
- VALUES ('project', ?, ?, ?, 1, CURRENT_TIMESTAMP)
325
- ''', (project_key, root_id, f'1.{len(project_nodes) + 2}'))
326
-
327
- project_nodes[project_key] = cursor.lastrowid
328
- print(f" ✓ Created project node: {project_key}")
329
-
330
- # Link memory to project
331
- project_node_id = project_nodes[project_key]
332
- tree_path = f'1.{project_node_id}.{memory_id}'
333
-
334
- # Create memory node in tree
335
- cursor.execute('''
336
- INSERT INTO memory_tree (node_type, name, parent_id, tree_path, depth, memory_id, last_updated)
337
- VALUES ('memory', ?, ?, ?, 2, ?, CURRENT_TIMESTAMP)
338
- ''', (
339
- f"Memory #{memory_id}",
340
- project_node_id,
341
- tree_path,
342
- memory_id
343
- ))
344
-
345
- # Update memory with tree info
346
- cursor.execute('''
347
- UPDATE memories
348
- SET tree_path = ?, depth = 2, last_accessed = created_at
349
- WHERE id = ?
350
- ''', (tree_path, memory_id))
351
-
352
- migrated_count += 1
353
-
354
- # Update project node memory counts
355
- for project_key, project_node_id in project_nodes.items():
356
- cursor.execute('''
357
- SELECT COUNT(*), SUM(LENGTH(content))
358
- FROM memories m
359
- JOIN memory_tree mt ON mt.memory_id = m.id
360
- WHERE mt.parent_id = ?
361
- ''', (project_node_id,))
362
-
363
- count, total_size = cursor.fetchone()
364
- total_size = total_size or 0
365
-
366
- cursor.execute('''
367
- UPDATE memory_tree
368
- SET memory_count = ?, total_size = ?, last_updated = CURRENT_TIMESTAMP
369
- WHERE id = ?
370
- ''', (count, total_size, project_node_id))
371
-
372
- # Update root node count
373
- cursor.execute('''
374
- SELECT COUNT(*) FROM memories
375
- ''')
376
- total_memories = cursor.fetchone()[0]
377
-
378
- cursor.execute('''
379
- UPDATE memory_tree
380
- SET memory_count = ?, last_updated = CURRENT_TIMESTAMP
381
- WHERE id = ?
382
- ''', (total_memories, root_id))
383
-
384
- print(f"✓ Migrated {migrated_count} memories to {len(project_nodes)} projects")
385
- print()
386
-
387
-
388
- def update_metadata(conn: sqlite3.Connection) -> None:
389
- """Update system metadata with migration info."""
390
- print("=" * 60)
391
- print("UPDATING SYSTEM METADATA")
392
- print("=" * 60)
393
-
394
- cursor = conn.cursor()
395
-
396
- cursor.execute('''
397
- INSERT OR REPLACE INTO system_metadata (key, value, updated_at)
398
- VALUES ('schema_version', '2.0.0', CURRENT_TIMESTAMP)
399
- ''')
400
- print("✓ Set schema_version = 2.0.0")
401
-
402
- cursor.execute('''
403
- INSERT OR REPLACE INTO system_metadata (key, value, updated_at)
404
- VALUES ('migrated_at', ?, CURRENT_TIMESTAMP)
405
- ''', (datetime.now().isoformat(),))
406
- print(f"✓ Set migrated_at = {datetime.now().isoformat()}")
407
-
408
- # Count memories
409
- cursor.execute('SELECT COUNT(*) FROM memories')
410
- memory_count = cursor.fetchone()[0]
411
-
412
- cursor.execute('''
413
- INSERT OR REPLACE INTO system_metadata (key, value, updated_at)
414
- VALUES ('memory_count_at_migration', ?, CURRENT_TIMESTAMP)
415
- ''', (str(memory_count),))
416
- print(f"✓ Recorded memory_count_at_migration = {memory_count}")
417
-
418
- print()
419
-
420
-
421
- def verify_migration(conn: sqlite3.Connection) -> Tuple[bool, Dict[str, Any]]:
422
- """Verify that migration completed successfully."""
423
- print("=" * 60)
424
- print("VERIFYING MIGRATION")
425
- print("=" * 60)
426
-
427
- cursor = conn.cursor()
428
-
429
- checks = []
430
-
431
- # Check schema version
432
- cursor.execute("SELECT value FROM system_metadata WHERE key = 'schema_version'")
433
- version = cursor.fetchone()
434
- checks.append(("Schema version", version and version[0] == '2.0.0'))
435
-
436
- # Check memories table has new columns
437
- cursor.execute("PRAGMA table_info(memories)")
438
- columns = {row[1] for row in cursor.fetchall()}
439
- required_columns = {'parent_id', 'tree_path', 'depth', 'category', 'cluster_id',
440
- 'last_accessed', 'access_count', 'tier'}
441
- checks.append(("New columns added", required_columns.issubset(columns)))
442
-
443
- # Check new tables exist
444
- cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
445
- tables = {row[0] for row in cursor.fetchall()}
446
- required_tables = {'memory_tree', 'graph_nodes', 'graph_edges', 'graph_clusters',
447
- 'identity_patterns', 'pattern_examples', 'memory_archive', 'system_metadata'}
448
- checks.append(("New tables created", required_tables.issubset(tables)))
449
-
450
- # Check tree structure
451
- cursor.execute("SELECT COUNT(*) FROM memory_tree WHERE node_type = 'root'")
452
- root_count = cursor.fetchone()[0]
453
- checks.append(("Root node exists", root_count == 1))
454
-
455
- cursor.execute("SELECT COUNT(*) FROM memory_tree WHERE node_type = 'project'")
456
- project_count = cursor.fetchone()[0]
457
- checks.append(("Project nodes exist", project_count >= 0))
458
-
459
- cursor.execute("SELECT COUNT(*) FROM memories WHERE tree_path IS NOT NULL")
460
- migrated_count = cursor.fetchone()[0]
461
- cursor.execute("SELECT COUNT(*) FROM memories")
462
- total_count = cursor.fetchone()[0]
463
- checks.append(("All memories migrated", migrated_count == total_count))
464
-
465
- # Print results
466
- all_passed = True
467
- for check_name, passed in checks:
468
- status = "✓" if passed else "✗"
469
- print(f"{status} {check_name}")
470
- if not passed:
471
- all_passed = False
472
-
473
- print()
474
-
475
- if not all_passed:
476
- raise Exception("Migration verification failed! See errors above.")
477
-
478
- return True
479
-
480
-
481
- def print_summary(conn: sqlite3.Connection) -> None:
482
- """Print migration summary statistics."""
483
- print("=" * 60)
484
- print("MIGRATION SUMMARY")
485
- print("=" * 60)
486
-
487
- cursor = conn.cursor()
488
-
489
- cursor.execute("SELECT COUNT(*) FROM memories")
490
- memory_count = cursor.fetchone()[0]
491
-
492
- cursor.execute("SELECT COUNT(*) FROM memory_tree WHERE node_type = 'project'")
493
- project_count = cursor.fetchone()[0]
494
-
495
- cursor.execute("SELECT COUNT(*) FROM memory_tree WHERE node_type = 'memory'")
496
- tree_memory_count = cursor.fetchone()[0]
497
-
498
- cursor.execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name")
499
- tables = [row[0] for row in cursor.fetchall()]
500
-
501
- cursor.execute("SELECT name FROM sqlite_master WHERE type='index' ORDER BY name")
502
- indexes = [row[0] for row in cursor.fetchall()]
503
-
504
- print(f"Total memories: {memory_count}")
505
- print(f"Project nodes: {project_count}")
506
- print(f"Memory nodes in tree: {tree_memory_count}")
507
- print(f"Total tables: {len(tables)}")
508
- print(f"Total indexes: {len(indexes)}")
509
- print()
510
-
511
- print("Database tables:")
512
- for table in tables:
513
- if not table.startswith('sqlite_') and not table.endswith('_fts'):
514
- print(f" - {table}")
515
-
516
- print()
517
- print("=" * 60)
518
- print("✅ MIGRATION COMPLETED SUCCESSFULLY!")
519
- print("=" * 60)
520
- print()
521
-
522
-
523
- def migrate() -> None:
524
- """Main migration function."""
525
- print()
526
- print("╔" + "═" * 58 + "╗")
527
- print("║" + " " * 58 + "║")
528
- print("║" + " SuperLocalMemory V1 → V2 Migration".center(58) + "║")
529
- print("║" + " " * 58 + "║")
530
- print("╚" + "═" * 58 + "╝")
531
- print()
532
- print(f"Database: {DB_PATH}")
533
- print(f"Started: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
534
- print()
535
-
536
- if not DB_PATH.exists():
537
- print(f"ERROR: Database not found at {DB_PATH}")
538
- print("Please ensure SuperLocalMemory V1 is installed.")
539
- sys.exit(1)
540
-
541
- try:
542
- # Create backup first
543
- create_backup()
544
-
545
- # Open database connection
546
- conn = sqlite3.connect(DB_PATH)
547
- conn.execute("PRAGMA foreign_keys = ON")
548
-
549
- # Check if already migrated
550
- if check_schema_version(conn):
551
- print("=" * 60)
552
- print("ALREADY MIGRATED")
553
- print("=" * 60)
554
- print("Database is already at version 2.0.0")
555
- print("Migration is idempotent - re-running will update any missing components.")
556
- print()
557
-
558
- # Start transaction
559
- conn.execute("BEGIN")
560
-
561
- try:
562
- # Run migration steps
563
- add_new_columns(conn)
564
- create_new_tables(conn)
565
- create_indexes(conn)
566
- migrate_to_tree_structure(conn)
567
- update_metadata(conn)
568
-
569
- # Verify migration
570
- verify_migration(conn)
571
-
572
- # Commit transaction
573
- conn.commit()
574
-
575
- # Print summary
576
- print_summary(conn)
577
-
578
- except Exception as e:
579
- # Rollback on error
580
- conn.rollback()
581
- raise
582
-
583
- finally:
584
- conn.close()
585
-
586
- # Print next steps
587
- print("NEXT STEPS:")
588
- print("-" * 60)
589
- print("1. Build knowledge graph:")
590
- print(" python ~/.claude-memory/graph_engine.py --build")
591
- print()
592
- print("2. Learn identity patterns:")
593
- print(" python ~/.claude-memory/pattern_learner.py --analyze")
594
- print()
595
- print("3. Test CLI commands:")
596
- print(" /recall 'test query'")
597
- print()
598
- print("4. Start web UI (optional):")
599
- print(" cd ~/.claude-memory/ui && uvicorn server:app --port 5432")
600
- print()
601
- print("-" * 60)
602
- print()
603
- print(f"Backup saved to: {BACKUP_PATH}")
604
- print()
605
-
606
- except Exception as e:
607
- print()
608
- print("=" * 60)
609
- print("❌ MIGRATION FAILED")
610
- print("=" * 60)
611
- print(f"Error: {str(e)}")
612
- print()
613
- print("Stack trace:")
614
- traceback.print_exc()
615
- print()
616
- print("=" * 60)
617
- print("ROLLBACK INSTRUCTIONS")
618
- print("=" * 60)
619
- print("The database has been rolled back to its previous state.")
620
- print(f"A backup was created at: {BACKUP_PATH}")
621
- print()
622
- print("To restore from backup manually:")
623
- print(f" cp {BACKUP_PATH} {DB_PATH}")
624
- print()
625
- sys.exit(1)
626
-
627
-
628
- if __name__ == '__main__':
629
- migrate()
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """
5
- Pattern Learner - Legacy import compatibility shim.
6
-
7
- All implementation has moved to the `patterns` package.
8
- This file re-exports every public symbol so that existing imports
9
- like `from pattern_learner import PatternLearner` continue to work.
10
- """
11
-
12
- from patterns import ( # noqa: F401
13
- FrequencyAnalyzer,
14
- ContextAnalyzer,
15
- TerminologyLearner,
16
- ConfidenceScorer,
17
- PatternStore,
18
- PatternLearner,
19
- SKLEARN_AVAILABLE,
20
- MEMORY_DIR,
21
- DB_PATH,
22
- )
23
-
24
- __all__ = [
25
- 'FrequencyAnalyzer',
26
- 'ContextAnalyzer',
27
- 'TerminologyLearner',
28
- 'ConfidenceScorer',
29
- 'PatternStore',
30
- 'PatternLearner',
31
- 'SKLEARN_AVAILABLE',
32
- 'MEMORY_DIR',
33
- 'DB_PATH',
34
- ]
@@ -1,24 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """SuperLocalMemory V2 - Pattern Learning Package
4
-
5
- Re-exports all public classes for backward-compatible imports:
6
- from patterns import PatternLearner, FrequencyAnalyzer, ...
7
- """
8
- from .analyzers import FrequencyAnalyzer, ContextAnalyzer
9
- from .terminology import TerminologyLearner
10
- from .scoring import ConfidenceScorer
11
- from .store import PatternStore
12
- from .learner import PatternLearner, SKLEARN_AVAILABLE, MEMORY_DIR, DB_PATH
13
-
14
- __all__ = [
15
- 'FrequencyAnalyzer',
16
- 'ContextAnalyzer',
17
- 'TerminologyLearner',
18
- 'ConfidenceScorer',
19
- 'PatternStore',
20
- 'PatternLearner',
21
- 'SKLEARN_AVAILABLE',
22
- 'MEMORY_DIR',
23
- 'DB_PATH',
24
- ]