superlocalmemory 2.8.6 → 3.0.1

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 +62 -48
  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
package/bin/slm CHANGED
@@ -1,452 +1,20 @@
1
- #!/bin/bash
2
- # slm - Universal CLI wrapper for SuperLocalMemory V2
3
- # Simple commands that work in any terminal or script
4
- #
5
- # Copyright (c) 2026 Varun Pratap Bhardwaj
6
- # Licensed under MIT License
7
- #
8
- # This is a CONVENIENCE wrapper. Original commands still work:
9
- # superlocalmemoryv2-remember, superlocalmemoryv2-recall, etc.
10
-
11
- set -e
12
-
13
- SLM_DIR="${SL_MEMORY_PATH:-${HOME}/.claude-memory}"
14
-
15
- # Check if SuperLocalMemory is installed
16
- if [ ! -d "$SLM_DIR" ]; then
17
- echo "Error: SuperLocalMemory V2 not installed at $SLM_DIR"
18
- echo "Please run: ./install.sh"
1
+ #!/usr/bin/env bash
2
+ # SuperLocalMemory V3 CLI
3
+ # Part of Qualixar | https://superlocalmemory.com
4
+
5
+ # Find Python
6
+ PYTHON=""
7
+ for cmd in python3 python; do
8
+ if command -v "$cmd" &>/dev/null; then
9
+ PYTHON="$cmd"
10
+ break
11
+ fi
12
+ done
13
+
14
+ if [ -z "$PYTHON" ]; then
15
+ echo "Error: Python 3 not found. Install Python 3.10+ from python.org"
19
16
  exit 1
20
17
  fi
21
18
 
22
- # Main command dispatcher
23
- case "$1" in
24
- remember|save|store)
25
- shift
26
- # Calls existing command - no duplicate logic
27
- "$SLM_DIR/bin/superlocalmemoryv2-remember" "$@"
28
- ;;
29
-
30
- recall|search|find)
31
- shift
32
- # Calls existing command - no duplicate logic
33
- "$SLM_DIR/bin/superlocalmemoryv2-recall" "$@"
34
- ;;
35
-
36
- list|ls)
37
- shift
38
- # Convert positional number to --limit flag
39
- # e.g., "slm list 5" becomes "--limit 5"
40
- if [ -n "$1" ] && [[ "$1" =~ ^[0-9]+$ ]]; then
41
- "$SLM_DIR/bin/superlocalmemoryv2-list" --limit "$1"
42
- else
43
- "$SLM_DIR/bin/superlocalmemoryv2-list" "$@"
44
- fi
45
- ;;
46
-
47
- status|info|stats)
48
- # Calls existing command - no duplicate logic
49
- "$SLM_DIR/bin/superlocalmemoryv2-status"
50
- ;;
51
-
52
- profile)
53
- shift
54
- # Calls existing command - no duplicate logic
55
- "$SLM_DIR/bin/superlocalmemoryv2-profile" "$@"
56
- ;;
57
-
58
- switch-profile)
59
- shift
60
- # Convenience alias: "slm switch-profile <name>" -> "slm profile switch <name>"
61
- "$SLM_DIR/bin/superlocalmemoryv2-profile" switch "$@"
62
- ;;
63
-
64
- list-profiles)
65
- # Convenience alias: "slm list-profiles" -> "slm profile list"
66
- "$SLM_DIR/bin/superlocalmemoryv2-profile" list
67
- ;;
68
-
69
- create-profile)
70
- shift
71
- # Convenience alias: "slm create-profile <name>" -> "slm profile create <name>"
72
- "$SLM_DIR/bin/superlocalmemoryv2-profile" create "$@"
73
- ;;
74
-
75
- reset)
76
- shift
77
- # Calls existing command - no duplicate logic
78
- "$SLM_DIR/bin/superlocalmemoryv2-reset" "$@"
79
- ;;
80
-
81
- ui|dashboard)
82
- PORT="${2:-8765}"
83
- echo "Starting SuperLocalMemory Web Dashboard..."
84
- echo "URL: http://localhost:$PORT"
85
- echo "API Docs: http://localhost:$PORT/api/docs"
86
- echo ""
87
- python3 "$SLM_DIR/ui_server.py" --port "$PORT"
88
- ;;
89
-
90
- serve|server)
91
- PORT="${2:-8417}"
92
- echo "Starting SuperLocalMemory MCP HTTP server..."
93
- echo "Endpoint: http://localhost:$PORT"
94
- echo ""
95
- echo "For ChatGPT/remote access:"
96
- echo " 1. In another terminal: ngrok http $PORT"
97
- echo " 2. Copy the HTTPS URL"
98
- echo " 3. Add to ChatGPT: Settings -> Apps & Connectors -> Developer Mode"
99
- echo ""
100
- exec python3 "$SLM_DIR/mcp_server.py" --transport http --port "$PORT"
101
- ;;
102
-
103
- context)
104
- # NEW: Get context for current directory/project
105
- project=$(basename "$PWD")
106
- "$SLM_DIR/bin/superlocalmemoryv2-recall" "$project" --limit 5
107
- ;;
108
-
109
- graph)
110
- shift
111
- subcommand="$1"
112
- shift
113
- case "$subcommand" in
114
- build)
115
- python3 "$SLM_DIR/graph_engine.py" build "$@"
116
- ;;
117
- stats)
118
- python3 "$SLM_DIR/graph_engine.py" stats "$@"
119
- ;;
120
- *)
121
- echo "Usage: slm graph {build|stats}"
122
- exit 1
123
- ;;
124
- esac
125
- ;;
126
-
127
- patterns)
128
- shift
129
- subcommand="$1"
130
- shift
131
- case "$subcommand" in
132
- update)
133
- python3 "$SLM_DIR/pattern_learner.py" update "$@"
134
- ;;
135
- list)
136
- python3 "$SLM_DIR/pattern_learner.py" list "$@"
137
- ;;
138
- context)
139
- python3 "$SLM_DIR/pattern_learner.py" context "$@"
140
- ;;
141
- correct)
142
- # slm patterns correct <id> <new_value>
143
- pattern_id="$1"
144
- new_value="$2"
145
- if [ -z "$pattern_id" ] || [ -z "$new_value" ]; then
146
- echo "Usage: slm patterns correct <pattern_id> <new_value>"
147
- exit 1
148
- fi
149
- python3 -c "
150
- import sys
151
- sys.path.insert(0, '${SLM_DIR}')
152
- sys.path.insert(0, '$(dirname "${SLM_DIR}")/Documents/AGENTIC_Official/SuperLocalMemoryV2-repo/src')
153
- try:
154
- from learning import get_learning_db
155
- ldb = get_learning_db()
156
- if ldb:
157
- conn = ldb._get_connection()
158
- cursor = conn.cursor()
159
- cursor.execute('SELECT * FROM transferable_patterns WHERE id = ?', (int(sys.argv[1]),))
160
- p = cursor.fetchone()
161
- conn.close()
162
- if p:
163
- ldb.upsert_transferable_pattern(
164
- pattern_type=p['pattern_type'], key=p['key'],
165
- value=sys.argv[2], confidence=1.0,
166
- evidence_count=p['evidence_count']+1,
167
- profiles_seen=p['profiles_seen'],
168
- contradictions=[f\"Corrected from '{p['value']}' to '{sys.argv[2]}'\"],
169
- )
170
- print(f\"Pattern '{p['key']}' corrected: '{p['value']}' -> '{sys.argv[2]}'\")
171
- else:
172
- print(f'Pattern #{sys.argv[1]} not found')
173
- else:
174
- print('Learning database not available')
175
- except ImportError:
176
- print('Learning features not available')
177
- except Exception as e:
178
- print(f'Error: {e}')
179
- " "$pattern_id" "$new_value"
180
- ;;
181
- *)
182
- echo "Usage: slm patterns {update|list|context|correct}"
183
- exit 1
184
- ;;
185
- esac
186
- ;;
187
-
188
- useful)
189
- shift
190
- # Mark memory IDs as useful (v2.7 learning feedback)
191
- if [ -z "$1" ]; then
192
- echo "Usage: slm useful <memory_id> [memory_id...]"
193
- echo " Mark recalled memories as useful to improve future ranking"
194
- exit 1
195
- fi
196
- python3 -c "
197
- import sys
198
- sys.path.insert(0, '${SLM_DIR}')
199
- sys.path.insert(0, '$(dirname \"${SLM_DIR}\")/Documents/AGENTIC_Official/SuperLocalMemoryV2-repo/src')
200
- try:
201
- from learning.feedback_collector import FeedbackCollector
202
- fc = FeedbackCollector()
203
- ids = [int(x) for x in sys.argv[1:]]
204
- fc.record_cli_useful(ids, query='cli-feedback')
205
- print(f'Marked {len(ids)} memor{\"y\" if len(ids)==1 else \"ies\"} as useful')
206
- except ImportError:
207
- print('Learning features not available. Install: pip3 install lightgbm scipy')
208
- except Exception as e:
209
- print(f'Error: {e}')
210
- " "$@"
211
- ;;
212
-
213
- learning)
214
- shift
215
- subcommand="${1:-status}"
216
- shift 2>/dev/null || true
217
- case "$subcommand" in
218
- status)
219
- python3 -c "
220
- import sys, json
221
- sys.path.insert(0, '${SLM_DIR}')
222
- sys.path.insert(0, '$(dirname \"${SLM_DIR}\")/Documents/AGENTIC_Official/SuperLocalMemoryV2-repo/src')
223
- try:
224
- from learning import get_status
225
- status = get_status()
226
- print('SuperLocalMemory v2.7 — Learning System Status')
227
- print('=' * 50)
228
- deps = status['dependencies']
229
- print(f'LightGBM: {\"installed (\" + deps[\"lightgbm\"][\"version\"] + \")\" if deps[\"lightgbm\"][\"installed\"] else \"not installed\"}')
230
- print(f'SciPy: {\"installed (\" + deps[\"scipy\"][\"version\"] + \")\" if deps[\"scipy\"][\"installed\"] else \"not installed\"}')
231
- print(f'ML Ranking: {\"available\" if status[\"ml_ranking_available\"] else \"unavailable\"}')
232
- print(f'Full Learning: {\"available\" if status[\"learning_available\"] else \"unavailable\"}')
233
- if status.get('learning_db_stats'):
234
- s = status['learning_db_stats']
235
- print(f'')
236
- print(f'Feedback signals: {s[\"feedback_count\"]}')
237
- print(f'Unique queries: {s[\"unique_queries\"]}')
238
- print(f'Patterns learned: {s[\"transferable_patterns\"]} ({s[\"high_confidence_patterns\"]} high confidence)')
239
- print(f'Workflow patterns: {s[\"workflow_patterns\"]}')
240
- print(f'Sources tracked: {s[\"tracked_sources\"]}')
241
- print(f'Models trained: {s[\"models_trained\"]}')
242
- print(f'Learning DB size: {s[\"db_size_kb\"]} KB')
243
- except ImportError:
244
- print('Learning features not available. Install: pip3 install lightgbm scipy')
245
- except Exception as e:
246
- print(f'Error: {e}')
247
- "
248
- ;;
249
- retrain)
250
- python3 -c "
251
- import sys
252
- sys.path.insert(0, '${SLM_DIR}')
253
- sys.path.insert(0, '$(dirname \"${SLM_DIR}\")/Documents/AGENTIC_Official/SuperLocalMemoryV2-repo/src')
254
- try:
255
- from learning import get_adaptive_ranker
256
- ranker = get_adaptive_ranker()
257
- if ranker:
258
- result = ranker.train(force=True)
259
- if result:
260
- print(f'Model retrained successfully')
261
- else:
262
- print('Insufficient data for training (need 200+ feedback signals)')
263
- else:
264
- print('Adaptive ranker not available')
265
- except ImportError:
266
- print('Learning features not available. Install: pip3 install lightgbm scipy')
267
- except Exception as e:
268
- print(f'Error: {e}')
269
- "
270
- ;;
271
- reset)
272
- python3 -c "
273
- import sys
274
- sys.path.insert(0, '${SLM_DIR}')
275
- sys.path.insert(0, '$(dirname \"${SLM_DIR}\")/Documents/AGENTIC_Official/SuperLocalMemoryV2-repo/src')
276
- try:
277
- from learning import get_learning_db
278
- ldb = get_learning_db()
279
- if ldb:
280
- ldb.reset()
281
- print('All learning data reset. Memories in memory.db preserved.')
282
- else:
283
- print('Learning database not available')
284
- except ImportError:
285
- print('Learning features not available')
286
- except Exception as e:
287
- print(f'Error: {e}')
288
- "
289
- ;;
290
- *)
291
- echo "Usage: slm learning {status|retrain|reset}"
292
- exit 1
293
- ;;
294
- esac
295
- ;;
296
-
297
- engagement)
298
- python3 -c "
299
- import sys
300
- sys.path.insert(0, '${SLM_DIR}')
301
- sys.path.insert(0, '$(dirname \"${SLM_DIR}\")/Documents/AGENTIC_Official/SuperLocalMemoryV2-repo/src')
302
- try:
303
- from learning.engagement_tracker import EngagementTracker
304
- tracker = EngagementTracker()
305
- print(tracker.format_for_cli())
306
- except ImportError:
307
- print('Learning features not available. Install: pip3 install lightgbm scipy')
308
- except Exception as e:
309
- print(f'Error: {e}')
310
- "
311
- ;;
312
-
313
- attribution)
314
- python3 -c "
315
- import sys
316
- sys.path.insert(0, '${SLM_DIR}')
317
- try:
318
- from memory_store_v2 import MemoryStoreV2
319
- store = MemoryStoreV2()
320
- attr = store.get_attribution()
321
- print('SuperLocalMemory — Attribution')
322
- print('=' * 45)
323
- print(f\"Creator: {attr.get('creator_name', 'Varun Pratap Bhardwaj')}\")
324
- print(f\"Role: {attr.get('creator_role', 'Solution Architect')}\")
325
- print(f\"Platform: {attr.get('platform', 'Qualixar')}\")
326
- print(f\"License: {attr.get('license', 'MIT')}\")
327
- print(f\"Website: {attr.get('website', 'https://superlocalmemory.com')}\")
328
- print(f\"Author: {attr.get('author_website', 'https://varunpratap.com')}\")
329
- print('=' * 45)
330
- try:
331
- from qualixar_attribution import QualixarSigner
332
- from qualixar_watermark import encode_watermark
333
- print('Layer 1 (Visible): Active')
334
- print('Layer 2 (Cryptographic): Active')
335
- print('Layer 3 (Steganographic): Active')
336
- except ImportError:
337
- print('Layer 1 (Visible): Active')
338
- print('Layer 2 (Cryptographic): Not available')
339
- print('Layer 3 (Steganographic): Not available')
340
- except Exception as e:
341
- print(f'Error: {e}')
342
- "
343
- ;;
344
-
345
- help|--help|-h)
346
- cat <<EOF
347
- SuperLocalMemory V2 - Universal CLI
348
-
349
- SIMPLE COMMANDS:
350
- slm remember <content> Save to memory
351
- slm recall <query> Search memories
352
- slm list [N] List N recent memories (default 10)
353
- slm status System status and statistics
354
- slm context Project context for current directory
355
-
356
- PROFILE MANAGEMENT:
357
- slm profile list List all profiles
358
- slm profile create <name> Create new profile
359
- slm profile switch <name> Switch to profile
360
- slm profile delete <name> Delete profile
361
- slm profile current Show current profile
362
- slm switch-profile <name> Shortcut for profile switch
363
- slm list-profiles Shortcut for profile list
364
- slm create-profile <name> Shortcut for profile create
365
-
366
- KNOWLEDGE GRAPH:
367
- slm graph build Build/rebuild knowledge graph
368
- slm graph stats Show graph statistics
369
-
370
- PATTERN LEARNING:
371
- slm patterns update Learn patterns from memories
372
- slm patterns list [threshold] List learned patterns
373
- slm patterns context [threshold] Get coding identity context
374
- slm patterns correct <id> <value> Correct a learned pattern
375
-
376
- LEARNING (v2.7):
377
- slm useful <id> [id...] Mark memories as useful (ranking feedback)
378
- slm learning status Learning system status
379
- slm learning retrain Force model retrain
380
- slm learning reset Delete all learning data (memories preserved)
381
- slm engagement Show engagement metrics
382
-
383
- WEB DASHBOARD:
384
- slm ui [PORT] Start web dashboard (default port 8765)
385
- Opens at http://localhost:PORT
386
-
387
- HTTP SERVER (MCP):
388
- slm serve [PORT] Start MCP HTTP server (default port 8417)
389
- For ChatGPT/remote: ngrok http PORT
390
-
391
- ATTRIBUTION:
392
- slm attribution Show creator attribution and provenance status
393
-
394
- ADVANCED:
395
- slm reset soft Soft reset (clear memories)
396
- slm reset hard --confirm Hard reset (nuclear option)
397
-
398
- ORIGINAL COMMANDS (still work):
399
- superlocalmemoryv2-remember <content>
400
- superlocalmemoryv2-recall <query>
401
- superlocalmemoryv2-list [N]
402
- superlocalmemoryv2-status
403
- superlocalmemoryv2-profile <command>
404
- superlocalmemoryv2-reset <type>
405
-
406
- EXAMPLES:
407
- slm remember "Use FastAPI for REST APIs" --tags python,backend
408
- slm recall "FastAPI patterns" --limit 5
409
- slm context
410
- slm graph build
411
- slm patterns update
412
- slm status
413
-
414
- DOCUMENTATION:
415
- README: https://github.com/varun369/SuperLocalMemoryV2
416
- Docs: ~/.claude-memory/docs/
417
-
418
- VERSION: 2.7.0
419
- EOF
420
- ;;
421
-
422
- version|--version|-v)
423
- echo "SuperLocalMemory V2 - Universal CLI"
424
- echo "Version: 2.7.0"
425
- echo "Database: $SLM_DIR/memory.db"
426
- ;;
427
-
428
- *)
429
- echo "SuperLocalMemory V2 - Universal CLI"
430
- echo ""
431
- echo "Usage: slm <command> [args]"
432
- echo ""
433
- echo "Commands:"
434
- echo " remember - Save to memory"
435
- echo " recall - Search memories"
436
- echo " list - List recent memories"
437
- echo " status - System status"
438
- echo " context - Project context"
439
- echo " ui - Start web dashboard"
440
- echo " serve - Start MCP HTTP server"
441
- echo " profile - Manage profiles"
442
- echo " graph - Knowledge graph operations"
443
- echo " patterns - Pattern learning"
444
- echo " useful - Mark memories as useful"
445
- echo " learning - Learning system management"
446
- echo " engagement - Show engagement metrics"
447
- echo " help - Show detailed help"
448
- echo ""
449
- echo "Run 'slm help' for more information"
450
- exit 1
451
- ;;
452
- esac
19
+ # Run V3 CLI
20
+ exec "$PYTHON" -m superlocalmemory.cli.main "$@"
package/bin/slm-npm CHANGED
@@ -1,14 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * SuperLocalMemory V2 - NPM Global CLI Wrapper
4
- *
5
- * Copyright (c) 2026 Varun Pratap Bhardwaj
6
- * Solution Architect & Original Creator
3
+ * SuperLocalMemory V3 - NPM Global CLI Wrapper
7
4
  *
5
+ * Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
8
6
  * Licensed under MIT License (see LICENSE file)
9
- * Repository: https://github.com/varun369/SuperLocalMemoryV2
10
- *
11
- * ATTRIBUTION REQUIRED: This notice must be preserved in all copies.
7
+ * Repository: https://github.com/qualixar/superlocalmemory
12
8
  */
13
9
 
14
10
  const { spawnSync } = require('child_process');
@@ -16,58 +12,76 @@ const path = require('path');
16
12
  const os = require('os');
17
13
  const fs = require('fs');
18
14
 
19
- // Installation directory (SL_MEMORY_PATH overrides default)
20
- const SLM_DIR = process.env.SL_MEMORY_PATH || path.join(os.homedir(), '.claude-memory');
15
+ // V3 package root (where src/superlocalmemory/ lives)
16
+ const PKG_ROOT = path.join(__dirname, '..');
17
+ const SRC_DIR = path.join(PKG_ROOT, 'src');
18
+ const CLI_MODULE = 'superlocalmemory.cli.main';
21
19
 
22
- // Check if SuperLocalMemory is installed
23
- if (!fs.existsSync(SLM_DIR)) {
24
- console.error('Error: SuperLocalMemory V2 not installed at ' + SLM_DIR);
25
- console.error('Installation should have run automatically via postinstall script.');
26
- console.error('Please run manually:');
20
+ // Find Python 3 binary (robust multi-fallback detection)
21
+ function findPython() {
22
+ const candidates = [
23
+ 'python3',
24
+ 'python',
25
+ '/opt/homebrew/bin/python3',
26
+ '/usr/local/bin/python3',
27
+ '/usr/bin/python3',
28
+ ];
27
29
 
30
+ // On Windows, also check common locations
28
31
  if (os.platform() === 'win32') {
29
- console.error(' powershell -ExecutionPolicy Bypass -File "' + path.join(__dirname, '..', 'install.ps1') + '"');
30
- } else {
31
- console.error(' bash "' + path.join(__dirname, '..', 'install.sh') + '"');
32
+ candidates.push(
33
+ 'py -3',
34
+ path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python312', 'python.exe'),
35
+ path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Python', 'Python311', 'python.exe'),
36
+ );
32
37
  }
33
- process.exit(1);
34
- }
35
38
 
36
- // Platform-specific slm script path
37
- let slmScript;
38
- if (os.platform() === 'win32') {
39
- slmScript = path.join(SLM_DIR, 'bin', 'slm.cmd');
40
- if (!fs.existsSync(slmScript)) {
41
- slmScript = path.join(SLM_DIR, 'bin', 'slm');
39
+ for (const candidate of candidates) {
40
+ try {
41
+ const parts = candidate.split(' ');
42
+ const result = spawnSync(parts[0], [...parts.slice(1), '--version'], {
43
+ stdio: 'pipe',
44
+ timeout: 5000,
45
+ });
46
+ if (result.status === 0) {
47
+ const version = (result.stdout || '').toString().trim();
48
+ if (version.includes('3.')) {
49
+ return candidate;
50
+ }
51
+ }
52
+ } catch (e) {
53
+ // Try next candidate
54
+ }
42
55
  }
43
- } else {
44
- slmScript = path.join(SLM_DIR, 'bin', 'slm');
56
+ return null;
45
57
  }
46
58
 
47
- // Check if slm script exists
48
- if (!fs.existsSync(slmScript)) {
49
- console.error('Error: SLM CLI not found at ' + slmScript);
50
- console.error('Installation may be incomplete. Please run install script manually.');
59
+ // Ensure ~/.superlocalmemory/ exists
60
+ const SLM_HOME = process.env.SL_MEMORY_PATH || path.join(os.homedir(), '.superlocalmemory');
61
+ if (!fs.existsSync(SLM_HOME)) {
62
+ fs.mkdirSync(SLM_HOME, { recursive: true });
63
+ }
64
+
65
+ // Find Python
66
+ const python = findPython();
67
+ if (!python) {
68
+ console.error('Error: Python 3.11+ not found.');
69
+ console.error('Install Python from https://python.org/downloads/');
51
70
  process.exit(1);
52
71
  }
53
72
 
54
- // Pass all arguments to the real slm command
73
+ // Launch V3 CLI via Python module
55
74
  const args = process.argv.slice(2);
75
+ const pythonParts = python.split(' ');
76
+ const result = spawnSync(pythonParts[0], [
77
+ ...pythonParts.slice(1),
78
+ '-m', CLI_MODULE, ...args
79
+ ], {
80
+ stdio: 'inherit',
81
+ env: {
82
+ ...process.env,
83
+ PYTHONPATH: SRC_DIR + (process.env.PYTHONPATH ? path.delimiter + process.env.PYTHONPATH : ''),
84
+ },
85
+ });
56
86
 
57
- // Use spawnSync for secure execution (no shell injection risk)
58
- let result;
59
- if (os.platform() === 'win32') {
60
- // Windows: Use cmd or PowerShell
61
- result = spawnSync(slmScript, args, {
62
- stdio: 'inherit',
63
- shell: true
64
- });
65
- } else {
66
- // Mac/Linux: Direct bash execution
67
- result = spawnSync('bash', [slmScript, ...args], {
68
- stdio: 'inherit'
69
- });
70
- }
71
-
72
- // Exit with the same code as the child process
73
87
  process.exit(result.status || 0);
package/conftest.py ADDED
@@ -0,0 +1,5 @@
1
+ """Root conftest — ensures src/ is on PYTHONPATH for test discovery."""
2
+ import sys
3
+ from pathlib import Path
4
+
5
+ sys.path.insert(0, str(Path(__file__).parent / "src"))