superlocalmemory 2.8.6 → 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 (431) hide show
  1. package/LICENSE +9 -1
  2. package/NOTICE +63 -0
  3. package/README.md +165 -480
  4. package/bin/slm +17 -449
  5. package/bin/slm-npm +1 -1
  6. package/conftest.py +5 -0
  7. package/docs/api-reference.md +284 -0
  8. package/docs/architecture.md +149 -0
  9. package/docs/auto-memory.md +150 -0
  10. package/docs/cli-reference.md +276 -0
  11. package/docs/compliance.md +191 -0
  12. package/docs/configuration.md +182 -0
  13. package/docs/getting-started.md +102 -0
  14. package/docs/ide-setup.md +261 -0
  15. package/docs/mcp-tools.md +220 -0
  16. package/docs/migration-from-v2.md +170 -0
  17. package/docs/profiles.md +173 -0
  18. package/docs/troubleshooting.md +310 -0
  19. package/{configs → ide/configs}/antigravity-mcp.json +3 -3
  20. package/ide/configs/chatgpt-desktop-mcp.json +16 -0
  21. package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
  22. package/{configs → ide/configs}/codex-mcp.toml +4 -4
  23. package/{configs → ide/configs}/continue-mcp.yaml +4 -3
  24. package/{configs → ide/configs}/continue-skills.yaml +6 -6
  25. package/ide/configs/cursor-mcp.json +15 -0
  26. package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
  27. package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
  28. package/{configs → ide/configs}/opencode-mcp.json +2 -2
  29. package/{configs → ide/configs}/perplexity-mcp.json +2 -2
  30. package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
  31. package/{configs → ide/configs}/windsurf-mcp.json +3 -3
  32. package/{configs → ide/configs}/zed-mcp.json +2 -2
  33. package/{hooks → ide/hooks}/context-hook.js +9 -20
  34. package/ide/hooks/memory-list-skill.js +70 -0
  35. package/ide/hooks/memory-profile-skill.js +101 -0
  36. package/ide/hooks/memory-recall-skill.js +62 -0
  37. package/ide/hooks/memory-remember-skill.js +68 -0
  38. package/ide/hooks/memory-reset-skill.js +160 -0
  39. package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
  40. package/ide/integrations/langchain/README.md +106 -0
  41. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
  42. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
  43. package/ide/integrations/langchain/pyproject.toml +38 -0
  44. package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
  45. package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
  46. package/ide/integrations/langchain/tests/test_security.py +117 -0
  47. package/ide/integrations/llamaindex/README.md +81 -0
  48. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
  49. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
  50. package/ide/integrations/llamaindex/pyproject.toml +43 -0
  51. package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
  52. package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
  53. package/ide/integrations/llamaindex/tests/test_security.py +241 -0
  54. package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
  55. package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
  56. package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
  57. package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
  58. package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
  59. package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
  60. package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
  61. package/package.json +13 -22
  62. package/pyproject.toml +85 -0
  63. package/scripts/build-dmg.sh +417 -0
  64. package/scripts/install-skills.ps1 +334 -0
  65. package/scripts/postinstall.js +2 -2
  66. package/scripts/start-dashboard.ps1 +52 -0
  67. package/scripts/start-dashboard.sh +41 -0
  68. package/scripts/sync-wiki.ps1 +127 -0
  69. package/scripts/sync-wiki.sh +82 -0
  70. package/scripts/test-dmg.sh +161 -0
  71. package/scripts/test-npm-package.ps1 +252 -0
  72. package/scripts/test-npm-package.sh +207 -0
  73. package/scripts/verify-install.ps1 +294 -0
  74. package/scripts/verify-install.sh +266 -0
  75. package/src/superlocalmemory/__init__.py +0 -0
  76. package/src/superlocalmemory/attribution/__init__.py +9 -0
  77. package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
  78. package/src/superlocalmemory/attribution/signer.py +153 -0
  79. package/src/superlocalmemory/attribution/watermark.py +189 -0
  80. package/src/superlocalmemory/cli/__init__.py +5 -0
  81. package/src/superlocalmemory/cli/commands.py +245 -0
  82. package/src/superlocalmemory/cli/main.py +89 -0
  83. package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
  84. package/src/superlocalmemory/cli/post_install.py +99 -0
  85. package/src/superlocalmemory/cli/setup_wizard.py +129 -0
  86. package/src/superlocalmemory/compliance/__init__.py +0 -0
  87. package/src/superlocalmemory/compliance/abac.py +204 -0
  88. package/src/superlocalmemory/compliance/audit.py +314 -0
  89. package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
  90. package/src/superlocalmemory/compliance/gdpr.py +294 -0
  91. package/src/superlocalmemory/compliance/lifecycle.py +158 -0
  92. package/src/superlocalmemory/compliance/retention.py +232 -0
  93. package/src/superlocalmemory/compliance/scheduler.py +148 -0
  94. package/src/superlocalmemory/core/__init__.py +0 -0
  95. package/src/superlocalmemory/core/config.py +391 -0
  96. package/src/superlocalmemory/core/embeddings.py +293 -0
  97. package/src/superlocalmemory/core/engine.py +701 -0
  98. package/src/superlocalmemory/core/hooks.py +65 -0
  99. package/src/superlocalmemory/core/maintenance.py +172 -0
  100. package/src/superlocalmemory/core/modes.py +140 -0
  101. package/src/superlocalmemory/core/profiles.py +234 -0
  102. package/src/superlocalmemory/core/registry.py +117 -0
  103. package/src/superlocalmemory/dynamics/__init__.py +0 -0
  104. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
  105. package/src/superlocalmemory/encoding/__init__.py +0 -0
  106. package/src/superlocalmemory/encoding/consolidator.py +485 -0
  107. package/src/superlocalmemory/encoding/emotional.py +125 -0
  108. package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
  109. package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
  110. package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
  111. package/src/superlocalmemory/encoding/foresight.py +91 -0
  112. package/src/superlocalmemory/encoding/graph_builder.py +302 -0
  113. package/src/superlocalmemory/encoding/observation_builder.py +160 -0
  114. package/src/superlocalmemory/encoding/scene_builder.py +183 -0
  115. package/src/superlocalmemory/encoding/signal_inference.py +90 -0
  116. package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
  117. package/src/superlocalmemory/encoding/type_router.py +235 -0
  118. package/src/superlocalmemory/hooks/__init__.py +3 -0
  119. package/src/superlocalmemory/hooks/auto_capture.py +111 -0
  120. package/src/superlocalmemory/hooks/auto_recall.py +93 -0
  121. package/src/superlocalmemory/hooks/ide_connector.py +204 -0
  122. package/src/superlocalmemory/hooks/rules_engine.py +99 -0
  123. package/src/superlocalmemory/infra/__init__.py +3 -0
  124. package/src/superlocalmemory/infra/auth_middleware.py +82 -0
  125. package/src/superlocalmemory/infra/backup.py +317 -0
  126. package/src/superlocalmemory/infra/cache_manager.py +267 -0
  127. package/src/superlocalmemory/infra/event_bus.py +381 -0
  128. package/src/superlocalmemory/infra/rate_limiter.py +135 -0
  129. package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
  130. package/src/superlocalmemory/learning/__init__.py +0 -0
  131. package/src/superlocalmemory/learning/adaptive.py +172 -0
  132. package/src/superlocalmemory/learning/behavioral.py +490 -0
  133. package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
  134. package/src/superlocalmemory/learning/bootstrap.py +298 -0
  135. package/src/superlocalmemory/learning/cross_project.py +399 -0
  136. package/src/superlocalmemory/learning/database.py +376 -0
  137. package/src/superlocalmemory/learning/engagement.py +323 -0
  138. package/src/superlocalmemory/learning/features.py +138 -0
  139. package/src/superlocalmemory/learning/feedback.py +316 -0
  140. package/src/superlocalmemory/learning/outcomes.py +255 -0
  141. package/src/superlocalmemory/learning/project_context.py +366 -0
  142. package/src/superlocalmemory/learning/ranker.py +155 -0
  143. package/src/superlocalmemory/learning/source_quality.py +303 -0
  144. package/src/superlocalmemory/learning/workflows.py +309 -0
  145. package/src/superlocalmemory/llm/__init__.py +0 -0
  146. package/src/superlocalmemory/llm/backbone.py +316 -0
  147. package/src/superlocalmemory/math/__init__.py +0 -0
  148. package/src/superlocalmemory/math/fisher.py +356 -0
  149. package/src/superlocalmemory/math/langevin.py +398 -0
  150. package/src/superlocalmemory/math/sheaf.py +257 -0
  151. package/src/superlocalmemory/mcp/__init__.py +0 -0
  152. package/src/superlocalmemory/mcp/resources.py +245 -0
  153. package/src/superlocalmemory/mcp/server.py +61 -0
  154. package/src/superlocalmemory/mcp/tools.py +18 -0
  155. package/src/superlocalmemory/mcp/tools_core.py +305 -0
  156. package/src/superlocalmemory/mcp/tools_v28.py +223 -0
  157. package/src/superlocalmemory/mcp/tools_v3.py +286 -0
  158. package/src/superlocalmemory/retrieval/__init__.py +0 -0
  159. package/src/superlocalmemory/retrieval/agentic.py +295 -0
  160. package/src/superlocalmemory/retrieval/ann_index.py +223 -0
  161. package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
  162. package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
  163. package/src/superlocalmemory/retrieval/engine.py +390 -0
  164. package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
  165. package/src/superlocalmemory/retrieval/fusion.py +78 -0
  166. package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
  167. package/src/superlocalmemory/retrieval/reranker.py +154 -0
  168. package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
  169. package/src/superlocalmemory/retrieval/strategy.py +96 -0
  170. package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
  171. package/src/superlocalmemory/server/__init__.py +1 -0
  172. package/src/superlocalmemory/server/api.py +248 -0
  173. package/src/superlocalmemory/server/routes/__init__.py +4 -0
  174. package/src/superlocalmemory/server/routes/agents.py +107 -0
  175. package/src/superlocalmemory/server/routes/backup.py +91 -0
  176. package/src/superlocalmemory/server/routes/behavioral.py +127 -0
  177. package/src/superlocalmemory/server/routes/compliance.py +160 -0
  178. package/src/superlocalmemory/server/routes/data_io.py +188 -0
  179. package/src/superlocalmemory/server/routes/events.py +183 -0
  180. package/src/superlocalmemory/server/routes/helpers.py +85 -0
  181. package/src/superlocalmemory/server/routes/learning.py +273 -0
  182. package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
  183. package/src/superlocalmemory/server/routes/memories.py +399 -0
  184. package/src/superlocalmemory/server/routes/profiles.py +219 -0
  185. package/src/superlocalmemory/server/routes/stats.py +346 -0
  186. package/src/superlocalmemory/server/routes/v3_api.py +365 -0
  187. package/src/superlocalmemory/server/routes/ws.py +82 -0
  188. package/src/superlocalmemory/server/security_middleware.py +57 -0
  189. package/src/superlocalmemory/server/ui.py +245 -0
  190. package/src/superlocalmemory/storage/__init__.py +0 -0
  191. package/src/superlocalmemory/storage/access_control.py +182 -0
  192. package/src/superlocalmemory/storage/database.py +594 -0
  193. package/src/superlocalmemory/storage/migrations.py +303 -0
  194. package/src/superlocalmemory/storage/models.py +406 -0
  195. package/src/superlocalmemory/storage/schema.py +726 -0
  196. package/src/superlocalmemory/storage/v2_migrator.py +317 -0
  197. package/src/superlocalmemory/trust/__init__.py +0 -0
  198. package/src/superlocalmemory/trust/gate.py +130 -0
  199. package/src/superlocalmemory/trust/provenance.py +124 -0
  200. package/src/superlocalmemory/trust/scorer.py +347 -0
  201. package/src/superlocalmemory/trust/signals.py +153 -0
  202. package/ui/index.html +278 -5
  203. package/ui/js/auto-settings.js +70 -0
  204. package/ui/js/dashboard.js +90 -0
  205. package/ui/js/fact-detail.js +92 -0
  206. package/ui/js/feedback.js +2 -2
  207. package/ui/js/ide-status.js +102 -0
  208. package/ui/js/math-health.js +98 -0
  209. package/ui/js/recall-lab.js +127 -0
  210. package/ui/js/settings.js +2 -2
  211. package/ui/js/trust-dashboard.js +73 -0
  212. package/api_server.py +0 -724
  213. package/bin/aider-smart +0 -72
  214. package/bin/superlocalmemoryv2-learning +0 -4
  215. package/bin/superlocalmemoryv2-list +0 -3
  216. package/bin/superlocalmemoryv2-patterns +0 -4
  217. package/bin/superlocalmemoryv2-profile +0 -3
  218. package/bin/superlocalmemoryv2-recall +0 -3
  219. package/bin/superlocalmemoryv2-remember +0 -3
  220. package/bin/superlocalmemoryv2-reset +0 -3
  221. package/bin/superlocalmemoryv2-status +0 -3
  222. package/configs/chatgpt-desktop-mcp.json +0 -16
  223. package/configs/cursor-mcp.json +0 -15
  224. package/hooks/memory-list-skill.js +0 -139
  225. package/hooks/memory-profile-skill.js +0 -273
  226. package/hooks/memory-recall-skill.js +0 -114
  227. package/hooks/memory-remember-skill.js +0 -127
  228. package/hooks/memory-reset-skill.js +0 -274
  229. package/mcp_server.py +0 -1808
  230. package/requirements-core.txt +0 -22
  231. package/requirements-learning.txt +0 -12
  232. package/requirements.txt +0 -12
  233. package/src/agent_registry.py +0 -411
  234. package/src/auth_middleware.py +0 -61
  235. package/src/auto_backup.py +0 -459
  236. package/src/behavioral/__init__.py +0 -49
  237. package/src/behavioral/behavioral_listener.py +0 -203
  238. package/src/behavioral/behavioral_patterns.py +0 -275
  239. package/src/behavioral/cross_project_transfer.py +0 -206
  240. package/src/behavioral/outcome_inference.py +0 -194
  241. package/src/behavioral/outcome_tracker.py +0 -193
  242. package/src/behavioral/tests/__init__.py +0 -4
  243. package/src/behavioral/tests/test_behavioral_integration.py +0 -108
  244. package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
  245. package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
  246. package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
  247. package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
  248. package/src/behavioral/tests/test_outcome_inference.py +0 -107
  249. package/src/behavioral/tests/test_outcome_tracker.py +0 -96
  250. package/src/cache_manager.py +0 -518
  251. package/src/compliance/__init__.py +0 -48
  252. package/src/compliance/abac_engine.py +0 -149
  253. package/src/compliance/abac_middleware.py +0 -116
  254. package/src/compliance/audit_db.py +0 -215
  255. package/src/compliance/audit_logger.py +0 -148
  256. package/src/compliance/retention_manager.py +0 -289
  257. package/src/compliance/retention_scheduler.py +0 -186
  258. package/src/compliance/tests/__init__.py +0 -4
  259. package/src/compliance/tests/test_abac_enforcement.py +0 -95
  260. package/src/compliance/tests/test_abac_engine.py +0 -124
  261. package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
  262. package/src/compliance/tests/test_audit_db.py +0 -123
  263. package/src/compliance/tests/test_audit_logger.py +0 -98
  264. package/src/compliance/tests/test_mcp_audit.py +0 -128
  265. package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
  266. package/src/compliance/tests/test_retention_manager.py +0 -131
  267. package/src/compliance/tests/test_retention_scheduler.py +0 -99
  268. package/src/compression/__init__.py +0 -25
  269. package/src/compression/cli.py +0 -150
  270. package/src/compression/cold_storage.py +0 -217
  271. package/src/compression/config.py +0 -72
  272. package/src/compression/orchestrator.py +0 -133
  273. package/src/compression/tier2_compressor.py +0 -228
  274. package/src/compression/tier3_compressor.py +0 -153
  275. package/src/compression/tier_classifier.py +0 -148
  276. package/src/db_connection_manager.py +0 -536
  277. package/src/embedding_engine.py +0 -63
  278. package/src/embeddings/__init__.py +0 -47
  279. package/src/embeddings/cache.py +0 -70
  280. package/src/embeddings/cli.py +0 -113
  281. package/src/embeddings/constants.py +0 -47
  282. package/src/embeddings/database.py +0 -91
  283. package/src/embeddings/engine.py +0 -247
  284. package/src/embeddings/model_loader.py +0 -145
  285. package/src/event_bus.py +0 -562
  286. package/src/graph/__init__.py +0 -36
  287. package/src/graph/build_helpers.py +0 -74
  288. package/src/graph/cli.py +0 -87
  289. package/src/graph/cluster_builder.py +0 -188
  290. package/src/graph/cluster_summary.py +0 -148
  291. package/src/graph/constants.py +0 -47
  292. package/src/graph/edge_builder.py +0 -162
  293. package/src/graph/entity_extractor.py +0 -95
  294. package/src/graph/graph_core.py +0 -226
  295. package/src/graph/graph_search.py +0 -231
  296. package/src/graph/hierarchical.py +0 -207
  297. package/src/graph/schema.py +0 -99
  298. package/src/graph_engine.py +0 -52
  299. package/src/hnsw_index.py +0 -628
  300. package/src/hybrid_search.py +0 -46
  301. package/src/learning/__init__.py +0 -217
  302. package/src/learning/adaptive_ranker.py +0 -682
  303. package/src/learning/bootstrap/__init__.py +0 -69
  304. package/src/learning/bootstrap/constants.py +0 -93
  305. package/src/learning/bootstrap/db_queries.py +0 -316
  306. package/src/learning/bootstrap/sampling.py +0 -82
  307. package/src/learning/bootstrap/text_utils.py +0 -71
  308. package/src/learning/cross_project_aggregator.py +0 -857
  309. package/src/learning/db/__init__.py +0 -40
  310. package/src/learning/db/constants.py +0 -44
  311. package/src/learning/db/schema.py +0 -279
  312. package/src/learning/engagement_tracker.py +0 -628
  313. package/src/learning/feature_extractor.py +0 -708
  314. package/src/learning/feedback_collector.py +0 -806
  315. package/src/learning/learning_db.py +0 -915
  316. package/src/learning/project_context_manager.py +0 -572
  317. package/src/learning/ranking/__init__.py +0 -33
  318. package/src/learning/ranking/constants.py +0 -84
  319. package/src/learning/ranking/helpers.py +0 -278
  320. package/src/learning/source_quality_scorer.py +0 -676
  321. package/src/learning/synthetic_bootstrap.py +0 -755
  322. package/src/learning/tests/test_adaptive_ranker.py +0 -325
  323. package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
  324. package/src/learning/tests/test_aggregator.py +0 -306
  325. package/src/learning/tests/test_auto_retrain_v28.py +0 -35
  326. package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
  327. package/src/learning/tests/test_feature_extractor_v28.py +0 -93
  328. package/src/learning/tests/test_feedback_collector.py +0 -294
  329. package/src/learning/tests/test_learning_db.py +0 -602
  330. package/src/learning/tests/test_learning_db_v28.py +0 -110
  331. package/src/learning/tests/test_learning_init_v28.py +0 -48
  332. package/src/learning/tests/test_outcome_signals.py +0 -48
  333. package/src/learning/tests/test_project_context.py +0 -292
  334. package/src/learning/tests/test_schema_migration.py +0 -319
  335. package/src/learning/tests/test_signal_inference.py +0 -397
  336. package/src/learning/tests/test_source_quality.py +0 -351
  337. package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
  338. package/src/learning/tests/test_workflow_miner.py +0 -318
  339. package/src/learning/workflow_pattern_miner.py +0 -655
  340. package/src/lifecycle/__init__.py +0 -54
  341. package/src/lifecycle/bounded_growth.py +0 -239
  342. package/src/lifecycle/compaction_engine.py +0 -226
  343. package/src/lifecycle/lifecycle_engine.py +0 -355
  344. package/src/lifecycle/lifecycle_evaluator.py +0 -257
  345. package/src/lifecycle/lifecycle_scheduler.py +0 -130
  346. package/src/lifecycle/retention_policy.py +0 -285
  347. package/src/lifecycle/tests/test_bounded_growth.py +0 -193
  348. package/src/lifecycle/tests/test_compaction.py +0 -179
  349. package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
  350. package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
  351. package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
  352. package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
  353. package/src/lifecycle/tests/test_mcp_compact.py +0 -149
  354. package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
  355. package/src/lifecycle/tests/test_retention_policy.py +0 -162
  356. package/src/mcp_tools_v28.py +0 -281
  357. package/src/memory/__init__.py +0 -36
  358. package/src/memory/cli.py +0 -205
  359. package/src/memory/constants.py +0 -39
  360. package/src/memory/helpers.py +0 -28
  361. package/src/memory/schema.py +0 -166
  362. package/src/memory-profiles.py +0 -595
  363. package/src/memory-reset.py +0 -491
  364. package/src/memory_compression.py +0 -989
  365. package/src/memory_store_v2.py +0 -1155
  366. package/src/migrate_v1_to_v2.py +0 -629
  367. package/src/pattern_learner.py +0 -34
  368. package/src/patterns/__init__.py +0 -24
  369. package/src/patterns/analyzers.py +0 -251
  370. package/src/patterns/learner.py +0 -271
  371. package/src/patterns/scoring.py +0 -171
  372. package/src/patterns/store.py +0 -225
  373. package/src/patterns/terminology.py +0 -140
  374. package/src/provenance_tracker.py +0 -312
  375. package/src/qualixar_attribution.py +0 -139
  376. package/src/qualixar_watermark.py +0 -78
  377. package/src/query_optimizer.py +0 -511
  378. package/src/rate_limiter.py +0 -83
  379. package/src/search/__init__.py +0 -20
  380. package/src/search/cli.py +0 -77
  381. package/src/search/constants.py +0 -26
  382. package/src/search/engine.py +0 -241
  383. package/src/search/fusion.py +0 -122
  384. package/src/search/index_loader.py +0 -114
  385. package/src/search/methods.py +0 -162
  386. package/src/search_engine_v2.py +0 -401
  387. package/src/setup_validator.py +0 -482
  388. package/src/subscription_manager.py +0 -391
  389. package/src/tree/__init__.py +0 -59
  390. package/src/tree/builder.py +0 -185
  391. package/src/tree/nodes.py +0 -202
  392. package/src/tree/queries.py +0 -257
  393. package/src/tree/schema.py +0 -80
  394. package/src/tree_manager.py +0 -19
  395. package/src/trust/__init__.py +0 -45
  396. package/src/trust/constants.py +0 -66
  397. package/src/trust/queries.py +0 -157
  398. package/src/trust/schema.py +0 -95
  399. package/src/trust/scorer.py +0 -299
  400. package/src/trust/signals.py +0 -95
  401. package/src/trust_scorer.py +0 -44
  402. package/ui/app.js +0 -1588
  403. package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
  404. package/ui/js/graph-cytoscape.js +0 -1168
  405. package/ui/js/graph-d3-backup.js +0 -32
  406. package/ui/js/graph.js +0 -32
  407. package/ui_server.py +0 -286
  408. /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
  409. /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
  410. /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
  411. /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
  412. /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
  413. /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
  414. /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
  415. /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
  416. /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
  417. /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
  418. /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
  419. /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
  420. /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
  421. /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
  422. /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
  423. /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
  424. /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
  425. /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
  426. /package/{completions → ide/completions}/slm.bash +0 -0
  427. /package/{completions → ide/completions}/slm.zsh +0 -0
  428. /package/{configs → ide/configs}/cody-commands.json +0 -0
  429. /package/{install-skills.sh → scripts/install-skills.sh} +0 -0
  430. /package/{install.ps1 → scripts/install.ps1} +0 -0
  431. /package/{install.sh → scripts/install.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
- ]