superlocalmemory 3.6.22 → 3.7.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 (303) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +275 -72
  3. package/bin/slm-npm +43 -89
  4. package/docs/pi-dev-integration.md +43 -0
  5. package/ide/configs/antigravity-mcp.json +2 -2
  6. package/ide/configs/chatgpt-desktop-mcp.json +1 -1
  7. package/ide/configs/claude-desktop-mcp.json +2 -2
  8. package/ide/configs/windsurf-mcp.json +2 -2
  9. package/ide/hooks/context-hook.js +6 -2
  10. package/ide/hooks/post-recall-hook.js +7 -3
  11. package/ide/hooks/tool-event-hook.sh +2 -1
  12. package/package.json +19 -10
  13. package/plugin/.claude-plugin/plugin.json +1 -1
  14. package/plugin/_GENERATED.md +1 -1
  15. package/plugin/agents/slm-memory-advisor.md +1 -1
  16. package/plugin/requirements.txt +1 -1
  17. package/plugin/skills/slm-session/SKILL.md +1 -1
  18. package/plugin-src/rules/AGENTS.md +1 -1
  19. package/pyproject.toml +40 -8
  20. package/scripts/postinstall-interactive.js +17 -94
  21. package/scripts/postinstall.js +185 -258
  22. package/scripts/preuninstall.js +9 -50
  23. package/src/superlocalmemory/__init__.py +2 -2
  24. package/src/superlocalmemory/attribution/mathematical_dna.py +1 -1
  25. package/src/superlocalmemory/attribution/signer.py +34 -19
  26. package/src/superlocalmemory/attribution/watermark.py +1 -1
  27. package/src/superlocalmemory/cli/_lazy_init.py +3 -5
  28. package/src/superlocalmemory/cli/commands.py +490 -195
  29. package/src/superlocalmemory/cli/context_commands.py +5 -4
  30. package/src/superlocalmemory/cli/daemon.py +282 -187
  31. package/src/superlocalmemory/cli/db_migrate.py +3 -1
  32. package/src/superlocalmemory/cli/diagnostics_cmd.py +28 -0
  33. package/src/superlocalmemory/cli/evidence_cmd.py +103 -0
  34. package/src/superlocalmemory/cli/ingest_cmd.py +7 -3
  35. package/src/superlocalmemory/cli/main.py +128 -31
  36. package/src/superlocalmemory/cli/pending_store.py +54 -38
  37. package/src/superlocalmemory/cli/scale_engine_cmd.py +37 -0
  38. package/src/superlocalmemory/cli/service_installer.py +57 -52
  39. package/src/superlocalmemory/cli/setup_wizard.py +142 -88
  40. package/src/superlocalmemory/cli/version_banner.py +2 -1
  41. package/src/superlocalmemory/code_graph/config.py +3 -1
  42. package/src/superlocalmemory/core/backend_orchestrator.py +81 -21
  43. package/src/superlocalmemory/core/config.py +65 -20
  44. package/src/superlocalmemory/core/consolidation_engine.py +9 -7
  45. package/src/superlocalmemory/core/context_cache.py +56 -8
  46. package/src/superlocalmemory/core/derivation_lineage.py +246 -0
  47. package/src/superlocalmemory/core/embedding_worker.py +32 -20
  48. package/src/superlocalmemory/core/embeddings.py +54 -18
  49. package/src/superlocalmemory/core/engine.py +150 -104
  50. package/src/superlocalmemory/core/engine_ingestion.py +513 -0
  51. package/src/superlocalmemory/core/engine_wiring.py +2 -0
  52. package/src/superlocalmemory/core/evidence_bundle.py +526 -0
  53. package/src/superlocalmemory/core/fact_consolidator.py +5 -11
  54. package/src/superlocalmemory/core/graph_analyzer.py +2 -2
  55. package/src/superlocalmemory/core/health_monitor.py +4 -2
  56. package/src/superlocalmemory/core/ingestion_command.py +636 -0
  57. package/src/superlocalmemory/core/injection.py +69 -18
  58. package/src/superlocalmemory/core/lifecycle_state.py +153 -0
  59. package/src/superlocalmemory/core/maintenance.py +23 -22
  60. package/src/superlocalmemory/core/maintenance_scheduler.py +51 -35
  61. package/src/superlocalmemory/core/mutations.py +143 -0
  62. package/src/superlocalmemory/core/platform_utils.py +7 -4
  63. package/src/superlocalmemory/core/ram_lock.py +16 -5
  64. package/src/superlocalmemory/core/rate_limit.py +1 -1
  65. package/src/superlocalmemory/core/recall_pipeline.py +60 -101
  66. package/src/superlocalmemory/core/recall_worker.py +76 -59
  67. package/src/superlocalmemory/core/registry.py +1 -1
  68. package/src/superlocalmemory/core/scale_engine.py +293 -0
  69. package/src/superlocalmemory/core/score_contract.py +62 -0
  70. package/src/superlocalmemory/core/security_primitives.py +3 -1
  71. package/src/superlocalmemory/core/slm_disabled.py +3 -5
  72. package/src/superlocalmemory/core/store_pipeline.py +172 -40
  73. package/src/superlocalmemory/core/tier_manager.py +32 -20
  74. package/src/superlocalmemory/core/worker_pool.py +13 -4
  75. package/src/superlocalmemory/dynamics/activation_guided_quantization.py +1 -1
  76. package/src/superlocalmemory/dynamics/eap_scheduler.py +10 -3
  77. package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +1 -1
  78. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +1 -1
  79. package/src/superlocalmemory/encoding/auto_linker.py +1 -1
  80. package/src/superlocalmemory/encoding/cognitive_consolidator.py +7 -16
  81. package/src/superlocalmemory/encoding/consolidator.py +22 -5
  82. package/src/superlocalmemory/encoding/fact_extractor.py +1 -1
  83. package/src/superlocalmemory/encoding/foresight.py +2 -0
  84. package/src/superlocalmemory/encoding/graph_builder.py +1 -1
  85. package/src/superlocalmemory/encoding/temporal_parser.py +2 -0
  86. package/src/superlocalmemory/evaluation/__init__.py +13 -0
  87. package/src/superlocalmemory/evaluation/calibration.py +308 -0
  88. package/src/superlocalmemory/evolution/skill_evolver.py +2 -1
  89. package/src/superlocalmemory/graph/cozo_backend.py +256 -23
  90. package/src/superlocalmemory/hooks/_outcome_common.py +21 -11
  91. package/src/superlocalmemory/hooks/antigravity_adapter.py +10 -31
  92. package/src/superlocalmemory/hooks/auto_invoker.py +25 -27
  93. package/src/superlocalmemory/hooks/auto_recall.py +31 -6
  94. package/src/superlocalmemory/hooks/auto_recall_hook.py +13 -33
  95. package/src/superlocalmemory/hooks/before_web_hook.py +9 -7
  96. package/src/superlocalmemory/hooks/claude_code_hooks.py +126 -39
  97. package/src/superlocalmemory/hooks/codex_assets.py +59 -0
  98. package/src/superlocalmemory/hooks/codex_hooks.py +186 -0
  99. package/src/superlocalmemory/hooks/context_payload.py +1 -1
  100. package/src/superlocalmemory/hooks/copilot_adapter.py +9 -24
  101. package/src/superlocalmemory/hooks/cursor_adapter.py +10 -32
  102. package/src/superlocalmemory/hooks/hook_daemon.py +4 -2
  103. package/src/superlocalmemory/hooks/hook_handlers.py +241 -55
  104. package/src/superlocalmemory/hooks/memory_protocol.py +5 -3
  105. package/src/superlocalmemory/hooks/post_tool_async_hook.py +4 -2
  106. package/src/superlocalmemory/hooks/session_registry.py +15 -8
  107. package/src/superlocalmemory/hooks/stop_outcome_hook.py +10 -6
  108. package/src/superlocalmemory/hooks/topic_shift_hook.py +42 -12
  109. package/src/superlocalmemory/hooks/user_prompt_hook.py +9 -14
  110. package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +19 -11
  111. package/src/superlocalmemory/infra/auth_middleware.py +38 -5
  112. package/src/superlocalmemory/infra/backup.py +7 -5
  113. package/src/superlocalmemory/infra/cloud_backup.py +18 -8
  114. package/src/superlocalmemory/infra/daemon_identity.py +248 -0
  115. package/src/superlocalmemory/infra/data_root.py +199 -0
  116. package/src/superlocalmemory/infra/event_bus.py +3 -1
  117. package/src/superlocalmemory/infra/local_diagnostics.py +327 -0
  118. package/src/superlocalmemory/infra/process_reaper.py +23 -0
  119. package/src/superlocalmemory/ingestion/adapter_manager.py +27 -9
  120. package/src/superlocalmemory/ingestion/base_adapter.py +25 -31
  121. package/src/superlocalmemory/ingestion/calendar_adapter.py +13 -4
  122. package/src/superlocalmemory/ingestion/credentials.py +14 -7
  123. package/src/superlocalmemory/ingestion/gmail_adapter.py +13 -4
  124. package/src/superlocalmemory/ingestion/transcript_adapter.py +7 -2
  125. package/src/superlocalmemory/learning/consolidation_quantization_worker.py +1 -1
  126. package/src/superlocalmemory/learning/ensemble.py +11 -0
  127. package/src/superlocalmemory/learning/entity_compiler.py +1 -1
  128. package/src/superlocalmemory/learning/feedback.py +1 -1
  129. package/src/superlocalmemory/learning/forgetting_scheduler.py +12 -7
  130. package/src/superlocalmemory/learning/quantization_scheduler.py +1 -1
  131. package/src/superlocalmemory/learning/ranker.py +4 -1
  132. package/src/superlocalmemory/learning/source_quality.py +1 -1
  133. package/src/superlocalmemory/learning/trigram_index.py +3 -2
  134. package/src/superlocalmemory/llm/backbone.py +13 -8
  135. package/src/superlocalmemory/math/ebbinghaus.py +1 -1
  136. package/src/superlocalmemory/math/fisher.py +1 -1
  137. package/src/superlocalmemory/math/fisher_quantized.py +1 -1
  138. package/src/superlocalmemory/math/hopfield.py +1 -1
  139. package/src/superlocalmemory/math/langevin.py +1 -1
  140. package/src/superlocalmemory/math/polar_quant.py +3 -4
  141. package/src/superlocalmemory/math/qjl.py +1 -1
  142. package/src/superlocalmemory/math/sheaf.py +1 -1
  143. package/src/superlocalmemory/math/turbo_quant.py +3 -2
  144. package/src/superlocalmemory/mcp/_daemon_proxy.py +12 -11
  145. package/src/superlocalmemory/mcp/_pool_adapter.py +27 -0
  146. package/src/superlocalmemory/mcp/http_transport.py +53 -0
  147. package/src/superlocalmemory/mcp/server.py +39 -13
  148. package/src/superlocalmemory/mcp/shared.py +69 -3
  149. package/src/superlocalmemory/mcp/tools_active.py +141 -31
  150. package/src/superlocalmemory/mcp/tools_core.py +128 -29
  151. package/src/superlocalmemory/mcp/tools_evolution.py +5 -7
  152. package/src/superlocalmemory/mcp/tools_learning.py +42 -2
  153. package/src/superlocalmemory/mcp/tools_mesh.py +7 -23
  154. package/src/superlocalmemory/mcp/tools_optimize.py +8 -1
  155. package/src/superlocalmemory/mcp/tools_v28.py +23 -2
  156. package/src/superlocalmemory/mcp/tools_v3.py +26 -1
  157. package/src/superlocalmemory/mcp/tools_v33.py +56 -17
  158. package/src/superlocalmemory/mesh/broker.py +2 -0
  159. package/src/superlocalmemory/mesh/remote_sync.py +50 -12
  160. package/src/superlocalmemory/optimize/cache/manager.py +77 -1
  161. package/src/superlocalmemory/optimize/cache/semantic.py +23 -3
  162. package/src/superlocalmemory/optimize/compress/ccr.py +4 -0
  163. package/src/superlocalmemory/optimize/compress/router.py +6 -1
  164. package/src/superlocalmemory/optimize/config/__init__.py +5 -0
  165. package/src/superlocalmemory/optimize/config/store.py +6 -4
  166. package/src/superlocalmemory/optimize/proxy/_helpers.py +15 -5
  167. package/src/superlocalmemory/optimize/proxy/capture.py +3 -2
  168. package/src/superlocalmemory/optimize/proxy/server.py +2 -2
  169. package/src/superlocalmemory/optimize/storage/db.py +14 -13
  170. package/src/superlocalmemory/retrieval/agentic.py +1 -1
  171. package/src/superlocalmemory/retrieval/ann_index.py +1 -1
  172. package/src/superlocalmemory/retrieval/bm25_channel.py +35 -11
  173. package/src/superlocalmemory/retrieval/bridge_discovery.py +73 -8
  174. package/src/superlocalmemory/retrieval/engine.py +169 -79
  175. package/src/superlocalmemory/retrieval/entity_channel.py +289 -67
  176. package/src/superlocalmemory/retrieval/forgetting_filter.py +1 -1
  177. package/src/superlocalmemory/retrieval/fusion.py +1 -1
  178. package/src/superlocalmemory/retrieval/hopfield_channel.py +118 -30
  179. package/src/superlocalmemory/retrieval/profile_channel.py +1 -1
  180. package/src/superlocalmemory/retrieval/quantization_aware_search.py +16 -10
  181. package/src/superlocalmemory/retrieval/reranker.py +56 -20
  182. package/src/superlocalmemory/retrieval/scope_policy.py +85 -0
  183. package/src/superlocalmemory/retrieval/semantic_channel.py +122 -14
  184. package/src/superlocalmemory/retrieval/spreading_activation.py +141 -25
  185. package/src/superlocalmemory/retrieval/strategy.py +1 -1
  186. package/src/superlocalmemory/retrieval/temporal_channel.py +30 -15
  187. package/src/superlocalmemory/retrieval/vector_store.py +1 -1
  188. package/src/superlocalmemory/server/api.py +10 -7
  189. package/src/superlocalmemory/server/bandit_loops.py +4 -2
  190. package/src/superlocalmemory/server/recall_serializer.py +24 -0
  191. package/src/superlocalmemory/server/route_mutations.py +84 -0
  192. package/src/superlocalmemory/server/routes/agents.py +8 -6
  193. package/src/superlocalmemory/server/routes/brain.py +14 -12
  194. package/src/superlocalmemory/server/routes/chat.py +29 -12
  195. package/src/superlocalmemory/server/routes/data_io.py +55 -24
  196. package/src/superlocalmemory/server/routes/helpers.py +29 -4
  197. package/src/superlocalmemory/server/routes/ingest.py +53 -36
  198. package/src/superlocalmemory/server/routes/memories.py +104 -43
  199. package/src/superlocalmemory/server/routes/mesh.py +31 -0
  200. package/src/superlocalmemory/server/routes/profiles.py +26 -4
  201. package/src/superlocalmemory/server/routes/tiers.py +43 -11
  202. package/src/superlocalmemory/server/routes/timeline.py +5 -1
  203. package/src/superlocalmemory/server/routes/v3_api.py +76 -21
  204. package/src/superlocalmemory/server/security_middleware.py +1 -1
  205. package/src/superlocalmemory/server/ui.py +6 -3
  206. package/src/superlocalmemory/server/unified_daemon.py +680 -293
  207. package/src/superlocalmemory/server/write_identity.py +147 -0
  208. package/src/superlocalmemory/storage/access_log.py +4 -3
  209. package/src/superlocalmemory/storage/database.py +118 -25
  210. package/src/superlocalmemory/storage/migration_runner.py +84 -1
  211. package/src/superlocalmemory/storage/migration_v33.py +1 -1
  212. package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +6 -60
  213. package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +120 -0
  214. package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +54 -0
  215. package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +52 -0
  216. package/src/superlocalmemory/storage/migrations/__init__.py +5 -0
  217. package/src/superlocalmemory/storage/models.py +16 -0
  218. package/src/superlocalmemory/storage/quantized_store.py +20 -3
  219. package/src/superlocalmemory/storage/v2_migrator.py +5 -3
  220. package/src/superlocalmemory/ui/favicon.svg +5 -0
  221. package/src/superlocalmemory/ui/index.html +1 -0
  222. package/src/superlocalmemory/ui/js/compliance.js +1 -1
  223. package/src/superlocalmemory/ui/js/core.js +49 -8
  224. package/src/superlocalmemory/ui/js/dashboard.js +23 -2
  225. package/src/superlocalmemory/ui/js/feedback.js +1 -1
  226. package/src/superlocalmemory/ui/js/graph-filters.js +1 -1
  227. package/src/superlocalmemory/ui/js/graph-ui.js +1 -1
  228. package/src/superlocalmemory/ui/js/lifecycle.js +1 -1
  229. package/src/superlocalmemory/ui/js/ng-mesh.js +15 -49
  230. package/src/superlocalmemory/ui/js/settings.js +4 -2
  231. package/src/superlocalmemory/vector/lancedb_backend.py +57 -9
  232. package/bin/slm +0 -59
  233. package/bin/slm.bat +0 -77
  234. package/bin/slm.cmd +0 -5
  235. package/ide/integrations/langchain/README.md +0 -106
  236. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +0 -9
  237. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +0 -201
  238. package/ide/integrations/langchain/pyproject.toml +0 -38
  239. package/ide/integrations/langchain/tests/__init__.py +0 -3
  240. package/ide/integrations/langchain/tests/test_chat_message_history.py +0 -215
  241. package/ide/integrations/langchain/tests/test_security.py +0 -117
  242. package/ide/integrations/llamaindex/README.md +0 -81
  243. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +0 -9
  244. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +0 -316
  245. package/ide/integrations/llamaindex/pyproject.toml +0 -43
  246. package/ide/integrations/llamaindex/tests/__init__.py +0 -3
  247. package/ide/integrations/llamaindex/tests/test_chat_store.py +0 -294
  248. package/ide/integrations/llamaindex/tests/test_security.py +0 -241
  249. package/plugin-src/.mcp.json +0 -12
  250. package/plugin-src/agents/slm-memory-advisor.md +0 -44
  251. package/plugin-src/agents/slm-optimize-advisor.md +0 -38
  252. package/plugin-src/hooks/.gitkeep +0 -0
  253. package/plugin-src/hooks/hooks.json +0 -23
  254. package/plugin-src/manifest.json +0 -25
  255. package/plugin-src/requirements.txt +0 -1
  256. package/plugin-src/rules/CLAUDE.md.fragment +0 -44
  257. package/plugin-src/scripts/ensure-venv.bat +0 -122
  258. package/plugin-src/scripts/ensure-venv.sh +0 -105
  259. package/plugin-src/scripts/slm-launch +0 -15
  260. package/plugin-src/scripts/slm-launch.bat +0 -17
  261. package/plugin-src/settings.json +0 -16
  262. package/plugin-src/skills/slm-cache/SKILL.md +0 -140
  263. package/plugin-src/skills/slm-compress/SKILL.md +0 -143
  264. package/plugin-src/skills/slm-graph/SKILL.md +0 -300
  265. package/plugin-src/skills/slm-recall/SKILL.md +0 -204
  266. package/plugin-src/skills/slm-remember/SKILL.md +0 -194
  267. package/plugin-src/skills/slm-session/SKILL.md +0 -207
  268. package/plugin-src/skills/slm-status/SKILL.md +0 -149
  269. package/scripts/__tests__/build-plugin.test.mjs +0 -613
  270. package/scripts/_savings_math.py +0 -270
  271. package/scripts/build-dmg.sh +0 -417
  272. package/scripts/build-plugin.js +0 -742
  273. package/scripts/build-slm-hook.ps1 +0 -40
  274. package/scripts/build-slm-hook.sh +0 -45
  275. package/scripts/build_entry.py +0 -452
  276. package/scripts/ci/stage5b_gate.sh +0 -50
  277. package/scripts/dogfood_savings.py +0 -490
  278. package/scripts/generate-thumbnails.py +0 -218
  279. package/scripts/install-skills.ps1 +0 -4
  280. package/scripts/install-skills.sh +0 -5
  281. package/scripts/install.ps1 +0 -701
  282. package/scripts/install.sh +0 -1015
  283. package/scripts/postinstall_binary.js +0 -287
  284. package/scripts/prepack.js +0 -33
  285. package/scripts/release_manifest.py +0 -273
  286. package/scripts/slm-hook.spec +0 -56
  287. package/scripts/start-dashboard.ps1 +0 -52
  288. package/scripts/start-dashboard.sh +0 -41
  289. package/scripts/sync-wiki.ps1 +0 -127
  290. package/scripts/sync-wiki.sh +0 -82
  291. package/scripts/test-dmg.sh +0 -161
  292. package/scripts/test-npm-package.ps1 +0 -252
  293. package/scripts/test-npm-package.sh +0 -207
  294. package/scripts/verify-install.ps1 +0 -294
  295. package/scripts/verify-install.sh +0 -266
  296. package/scripts/verify-v27.ps1 +0 -301
  297. package/scripts/verify-v27.sh +0 -233
  298. package/src/superlocalmemory.egg-info/PKG-INFO +0 -513
  299. package/src/superlocalmemory.egg-info/SOURCES.txt +0 -529
  300. package/src/superlocalmemory.egg-info/dependency_links.txt +0 -1
  301. package/src/superlocalmemory.egg-info/entry_points.txt +0 -2
  302. package/src/superlocalmemory.egg-info/requires.txt +0 -71
  303. package/src/superlocalmemory.egg-info/top_level.txt +0 -1
@@ -1,1015 +0,0 @@
1
- #!/bin/bash
2
- # ============================================================================
3
- # SuperLocalMemory V3 Installation Script
4
- # Copyright (c) 2026 Varun Pratap Bhardwaj
5
- # Licensed under MIT License
6
- # Repository: https://github.com/qualixar/superlocalmemory
7
- # ============================================================================
8
-
9
- set -e
10
-
11
- INSTALL_DIR="${SL_MEMORY_PATH:-${HOME}/.superlocalmemory}"
12
- REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
13
-
14
- # Parse command line arguments
15
- NON_INTERACTIVE=false
16
-
17
- # Auto-detect non-interactive environment (Docker, CI/CD, pipes)
18
- if [ ! -t 0 ] || [ ! -t 1 ]; then
19
- NON_INTERACTIVE=true
20
- fi
21
-
22
- for arg in "$@"; do
23
- case $arg in
24
- --non-interactive|--auto|--yes|-y)
25
- NON_INTERACTIVE=true
26
- shift
27
- ;;
28
- --help|-h)
29
- echo "Usage: $0 [OPTIONS]"
30
- echo ""
31
- echo "Options:"
32
- echo " --non-interactive, --auto, --yes, -y"
33
- echo " Skip interactive prompts (for scripts/automation)"
34
- echo " --help, -h Show this help message"
35
- echo ""
36
- echo "Note: Non-interactive mode is auto-detected when running in"
37
- echo " Docker, CI/CD, or piped environments."
38
- echo ""
39
- exit 0
40
- ;;
41
- esac
42
- done
43
-
44
- # Print banner
45
- echo ""
46
- echo "╔══════════════════════════════════════════════════════════════╗"
47
- echo "║ SuperLocalMemory V3 - Installation ║"
48
- echo "║ by Varun Pratap Bhardwaj ║"
49
- echo "║ https://github.com/qualixar/superlocalmemory ║"
50
- echo "╚══════════════════════════════════════════════════════════════╝"
51
- echo ""
52
-
53
- # Show mode if non-interactive
54
- if [ "$NON_INTERACTIVE" = true ]; then
55
- echo "🤖 Running in non-interactive mode (auto-detected)"
56
- echo " Skipping optional prompts, using defaults"
57
- echo ""
58
- fi
59
-
60
- # Check Python version — install if missing (non-tech user friendly)
61
- echo "Checking Python version..."
62
-
63
- install_python() {
64
- echo ""
65
- echo "Python 3 not found. Attempting automatic installation..."
66
- if [ "$(uname)" = "Darwin" ]; then
67
- # macOS: try Homebrew first, then Xcode CLI tools
68
- if command -v brew &> /dev/null; then
69
- echo "Installing Python via Homebrew..."
70
- brew install python3 && return 0
71
- fi
72
- # Try installing Xcode Command Line Tools (includes Python 3)
73
- echo "Installing Xcode Command Line Tools (includes Python 3)..."
74
- echo "A system dialog may appear — click 'Install' to continue."
75
- xcode-select --install 2>/dev/null
76
- # Wait for user to complete the install dialog
77
- echo "Waiting for Xcode CLI tools installation to complete..."
78
- echo "Press Enter after the installation finishes."
79
- if [ "$NON_INTERACTIVE" = false ]; then
80
- read -r
81
- else
82
- # In non-interactive mode, wait and retry
83
- sleep 30
84
- fi
85
- if command -v python3 &> /dev/null; then
86
- return 0
87
- fi
88
- # Last resort: direct Python.org installer
89
- echo ""
90
- echo "Automatic installation could not complete."
91
- echo "Please install Python 3.10+ from: https://www.python.org/downloads/"
92
- echo "Then re-run this installer."
93
- return 1
94
- elif [ -f /etc/debian_version ]; then
95
- # Debian/Ubuntu
96
- echo "Installing Python via apt..."
97
- sudo apt-get update -qq && sudo apt-get install -y python3 python3-pip && return 0
98
- elif [ -f /etc/redhat-release ]; then
99
- # RHEL/CentOS/Fedora
100
- echo "Installing Python via dnf..."
101
- sudo dnf install -y python3 python3-pip && return 0
102
- elif [ -f /etc/arch-release ]; then
103
- # Arch Linux
104
- sudo pacman -S --noconfirm python python-pip && return 0
105
- fi
106
- echo "Could not auto-install Python. Please install Python 3.8+ manually."
107
- echo " macOS: brew install python3"
108
- echo " Ubuntu: sudo apt install python3 python3-pip"
109
- echo " Fedora: sudo dnf install python3 python3-pip"
110
- return 1
111
- }
112
-
113
- if ! command -v python3 &> /dev/null; then
114
- install_python || exit 1
115
- fi
116
-
117
- PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
118
- PYTHON_MAJOR=$(python3 -c 'import sys; print(sys.version_info.major)')
119
- PYTHON_MINOR=$(python3 -c 'import sys; print(sys.version_info.minor)')
120
-
121
- if [ "$PYTHON_MAJOR" -lt 3 ] || ([ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 8 ]); then
122
- echo "Python $PYTHON_VERSION found but 3.8+ required."
123
- install_python || exit 1
124
- # Re-check after install
125
- PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
126
- PYTHON_MAJOR=$(python3 -c 'import sys; print(sys.version_info.major)')
127
- PYTHON_MINOR=$(python3 -c 'import sys; print(sys.version_info.minor)')
128
- if [ "$PYTHON_MAJOR" -lt 3 ] || ([ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 8 ]); then
129
- echo "✗ Error: Python 3.8+ still not available after install attempt"
130
- exit 1
131
- fi
132
- fi
133
- echo "✓ Python $PYTHON_VERSION"
134
-
135
- # Ensure pip3 is available
136
- if ! command -v pip3 &> /dev/null; then
137
- echo "Installing pip..."
138
- python3 -m ensurepip --upgrade 2>/dev/null || python3 -c "import urllib.request; urllib.request.urlretrieve('https://bootstrap.pypa.io/get-pip.py', '/tmp/get-pip.py')" && python3 /tmp/get-pip.py 2>/dev/null || true
139
- fi
140
-
141
- # Create installation directory
142
- echo ""
143
- echo "Creating installation directory..."
144
- mkdir -p "${INSTALL_DIR}"
145
- echo "✓ Directory: ${INSTALL_DIR}"
146
-
147
- # Create universal symlink for non-Claude users
148
- UNIVERSAL_LINK="${HOME}/.superlocalmemory"
149
- if [ ! -e "${UNIVERSAL_LINK}" ]; then
150
- ln -s "${INSTALL_DIR}" "${UNIVERSAL_LINK}" 2>/dev/null && \
151
- echo "✓ Universal link created: ~/.superlocalmemory → ~/.superlocalmemory" || true
152
- fi
153
-
154
- # Copy source files
155
- echo ""
156
- echo "Copying source files..."
157
- cp -r "${REPO_DIR}/src/"* "${INSTALL_DIR}/"
158
- echo "✓ Source files copied"
159
-
160
- # Copy learning modules explicitly (v2.7+ — ensures nested dir is handled)
161
- if [ -d "${REPO_DIR}/src/learning" ]; then
162
- mkdir -p "${INSTALL_DIR}/learning"
163
- cp -r "${REPO_DIR}/src/learning/"* "${INSTALL_DIR}/learning/"
164
- echo "✓ Learning modules copied"
165
- fi
166
-
167
- # Copy lifecycle modules (v2.8+)
168
- if [ -d "${REPO_DIR}/src/lifecycle" ]; then
169
- mkdir -p "${INSTALL_DIR}/lifecycle"
170
- cp -r "${REPO_DIR}/src/lifecycle/"* "${INSTALL_DIR}/lifecycle/"
171
- echo "✓ Lifecycle modules copied"
172
- fi
173
-
174
- # Copy behavioral modules (v2.8+)
175
- if [ -d "${REPO_DIR}/src/behavioral" ]; then
176
- mkdir -p "${INSTALL_DIR}/behavioral"
177
- cp -r "${REPO_DIR}/src/behavioral/"* "${INSTALL_DIR}/behavioral/"
178
- echo "✓ Behavioral modules copied"
179
- fi
180
-
181
- # Copy compliance modules (v2.8+)
182
- if [ -d "${REPO_DIR}/src/compliance" ]; then
183
- mkdir -p "${INSTALL_DIR}/compliance"
184
- cp -r "${REPO_DIR}/src/compliance/"* "${INSTALL_DIR}/compliance/"
185
- echo "✓ Compliance modules copied"
186
- fi
187
-
188
- # Copy hooks
189
- echo "Copying hooks..."
190
- mkdir -p "${INSTALL_DIR}/hooks"
191
- if [ -d "${REPO_DIR}/hooks" ] && [ "$(ls -A ${REPO_DIR}/hooks)" ]; then
192
- cp -r "${REPO_DIR}/hooks/"* "${INSTALL_DIR}/hooks/"
193
- echo "✓ Hooks copied"
194
- else
195
- echo "○ No hooks to copy"
196
- fi
197
-
198
- # Copy CLI wrappers
199
- echo "Copying CLI wrappers..."
200
- mkdir -p "${INSTALL_DIR}/bin"
201
- cp -r "${REPO_DIR}/bin/"* "${INSTALL_DIR}/bin/"
202
- chmod +x "${INSTALL_DIR}/bin/"*
203
- echo "✓ CLI wrappers installed"
204
-
205
- # Copy API server
206
- if [ -f "${REPO_DIR}/api_server.py" ]; then
207
- cp "${REPO_DIR}/api_server.py" "${INSTALL_DIR}/"
208
- echo "✓ API server copied"
209
- fi
210
-
211
- # Copy UI server + dashboard files
212
- if [ -f "${REPO_DIR}/ui_server.py" ]; then
213
- cp "${REPO_DIR}/ui_server.py" "${INSTALL_DIR}/"
214
- echo "✓ UI server copied"
215
- fi
216
-
217
- if [ -f "${REPO_DIR}/security_middleware.py" ]; then
218
- cp "${REPO_DIR}/security_middleware.py" "${INSTALL_DIR}/"
219
- echo "✓ Security middleware copied"
220
- fi
221
-
222
- if [ -d "${REPO_DIR}/ui" ]; then
223
- mkdir -p "${INSTALL_DIR}/ui/js"
224
- cp "${REPO_DIR}/ui/index.html" "${INSTALL_DIR}/ui/" 2>/dev/null || true
225
- cp "${REPO_DIR}/ui/js/"*.js "${INSTALL_DIR}/ui/js/" 2>/dev/null || true
226
- echo "✓ Dashboard UI copied"
227
- fi
228
-
229
- # Copy route modules (v2.5+ dashboard API)
230
- if [ -d "${REPO_DIR}/routes" ]; then
231
- mkdir -p "${INSTALL_DIR}/routes"
232
- cp "${REPO_DIR}/routes/"*.py "${INSTALL_DIR}/routes/"
233
- echo "✓ Dashboard routes copied"
234
- fi
235
-
236
- # Copy MCP server
237
- if [ -f "${REPO_DIR}/mcp_server.py" ]; then
238
- cp "${REPO_DIR}/mcp_server.py" "${INSTALL_DIR}/"
239
- echo "✓ MCP server copied"
240
- fi
241
-
242
- # Interactive mode selection (v3.4.55)
243
- if [ ! -f "${INSTALL_DIR}/current_mode" ] && [ "${NON_INTERACTIVE}" != "true" ]; then
244
- echo ""
245
- echo "┌─────────────────────────────────────────────┐"
246
- echo "│ SuperLocalMemory V3 — Setup │"
247
- echo "└─────────────────────────────────────────────┘"
248
- echo ""
249
- echo " Choose operating mode:"
250
- echo ""
251
- echo " [A] Zero-Cloud — Pure local, no API keys needed"
252
- echo " • Embedding: sentence-transformers (local)"
253
- echo " • LLM: none"
254
- echo " • Best for: privacy, air-gapped, EU AI Act"
255
- echo ""
256
- echo " [B] Local AI — Ollama-powered (recommended)"
257
- echo " • Embedding: ollama / nomic-embed-text"
258
- echo " • LLM: ollama / llama3.2"
259
- echo " • Best for: full offline AI, zero cost"
260
- echo ""
261
- echo " [C] Cloud Power — OpenRouter / OpenAI API"
262
- echo " • Embedding: text-embedding-3-large"
263
- echo " • LLM: claude-sonnet-4 / gpt-4.1-mini"
264
- echo " • Best for: max quality, API required"
265
- echo ""
266
- read -r -p " Enter mode [A/B/C] (default: B): " MODE_CHOICE
267
- MODE_CHOICE=${MODE_CHOICE:-b}
268
- case "${MODE_CHOICE,,}" in
269
- a) SELECTED_MODE="a" ;;
270
- c) SELECTED_MODE="c" ;;
271
- *) SELECTED_MODE="b" ;;
272
- esac
273
- echo ""
274
- echo " → Selected Mode ${SELECTED_MODE^^}"
275
- echo ""
276
- # Generate initial 3-mode config via Python
277
- python3 -c "
278
- from superlocalmemory.core.config import SLMConfig
279
- SLMConfig.migrate_to_3mode()
280
- SLMConfig.switch_mode('${SELECTED_MODE}')
281
- print('✓ Mode ${SELECTED_MODE^^} configured')
282
- print(' Config files created: mode_a.json, mode_b.json, mode_c.json')
283
- print(' Run slm mode a/b/c to switch modes later')
284
- "
285
- elif [ ! -f "${INSTALL_DIR}/config.json" ] && [ "${NON_INTERACTIVE}" = "true" ]; then
286
- echo "Creating default config (non-interactive, Mode B)..."
287
- python3 -c "
288
- from superlocalmemory.core.config import SLMConfig
289
- SLMConfig.migrate_to_3mode()
290
- print('✓ Default config created (Mode B)')
291
- "
292
- elif [ -f "${INSTALL_DIR}/config.json" ] && [ ! -f "${INSTALL_DIR}/current_mode" ]; then
293
- echo "Migrating existing config to 3-mode system..."
294
- python3 -c "
295
- from superlocalmemory.core.config import SLMConfig
296
- SLMConfig.migrate_to_3mode()
297
- print('✓ Config migrated — your settings preserved')
298
- "
299
- else
300
- echo "○ Config exists (keeping existing)"
301
- fi
302
-
303
- # Create necessary directories
304
- echo ""
305
- echo "Creating directories..."
306
- mkdir -p "${INSTALL_DIR}/backups"
307
- mkdir -p "${INSTALL_DIR}/profiles"
308
- mkdir -p "${INSTALL_DIR}/vectors"
309
- mkdir -p "${INSTALL_DIR}/cold-storage"
310
- mkdir -p "${INSTALL_DIR}/jobs"
311
- mkdir -p "${INSTALL_DIR}/policies"
312
- echo "✓ Directories created"
313
-
314
- # Initialize audit database (v2.8+ — compliance engine)
315
- if [ ! -f "${INSTALL_DIR}/audit.db" ]; then
316
- python3 -c "
317
- import sqlite3
318
- audit_path = '${INSTALL_DIR}/audit.db'
319
- conn = sqlite3.connect(audit_path)
320
- cursor = conn.cursor()
321
- cursor.execute('''CREATE TABLE IF NOT EXISTS audit_events (
322
- id INTEGER PRIMARY KEY AUTOINCREMENT,
323
- event_type TEXT NOT NULL,
324
- actor TEXT,
325
- target TEXT,
326
- action TEXT,
327
- detail TEXT,
328
- hash TEXT,
329
- prev_hash TEXT,
330
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
331
- )''')
332
- cursor.execute('''CREATE TABLE IF NOT EXISTS retention_policies (
333
- id INTEGER PRIMARY KEY AUTOINCREMENT,
334
- policy_name TEXT UNIQUE NOT NULL,
335
- retention_days INTEGER,
336
- auto_delete INTEGER DEFAULT 0,
337
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
338
- )''')
339
- conn.commit()
340
- conn.close()
341
- print('Audit database ready')
342
- " 2>/dev/null && echo "✓ Audit database initialized (v2.8)" || echo "○ Audit database skipped (optional)"
343
- fi
344
-
345
- # Make Python scripts executable
346
- chmod +x "${INSTALL_DIR}/"*.py 2>/dev/null || true
347
-
348
- # Initialize database
349
- echo ""
350
- echo "Initializing database..."
351
- if python3 "${INSTALL_DIR}/setup_validator.py" --init > /dev/null 2>&1; then
352
- echo "✓ Database initialized"
353
- else
354
- # Fallback: create basic tables
355
- python3 -c "
356
- import sqlite3
357
- db_path = '${INSTALL_DIR}/memory.db'
358
- conn = sqlite3.connect(db_path)
359
- cursor = conn.cursor()
360
- cursor.execute('''CREATE TABLE IF NOT EXISTS memories (
361
- id INTEGER PRIMARY KEY AUTOINCREMENT,
362
- content TEXT NOT NULL,
363
- summary TEXT,
364
- project_path TEXT,
365
- project_name TEXT,
366
- tags TEXT DEFAULT '[]',
367
- category TEXT,
368
- parent_id INTEGER,
369
- tree_path TEXT DEFAULT '/',
370
- depth INTEGER DEFAULT 0,
371
- memory_type TEXT DEFAULT 'session',
372
- importance INTEGER DEFAULT 5,
373
- content_hash TEXT,
374
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
375
- last_accessed TIMESTAMP,
376
- access_count INTEGER DEFAULT 0,
377
- compressed_at TIMESTAMP,
378
- tier INTEGER DEFAULT 1,
379
- cluster_id INTEGER
380
- )''')
381
- cursor.execute('CREATE TABLE IF NOT EXISTS graph_nodes (id INTEGER PRIMARY KEY, memory_id INTEGER UNIQUE, entities TEXT DEFAULT \"[]\", embedding_vector BLOB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)')
382
- cursor.execute('CREATE TABLE IF NOT EXISTS graph_edges (id INTEGER PRIMARY KEY, source_memory_id INTEGER, target_memory_id INTEGER, similarity REAL, relationship_type TEXT, shared_entities TEXT DEFAULT \"[]\", created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)')
383
- cursor.execute('CREATE TABLE IF NOT EXISTS graph_clusters (id INTEGER PRIMARY KEY, cluster_name TEXT, description TEXT, memory_count INTEGER DEFAULT 0, avg_importance REAL DEFAULT 5.0, top_entities TEXT DEFAULT \"[]\", created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)')
384
- cursor.execute('CREATE TABLE IF NOT EXISTS identity_patterns (id INTEGER PRIMARY KEY, pattern_type TEXT, pattern_key TEXT, pattern_value TEXT, confidence REAL DEFAULT 0.0, frequency INTEGER DEFAULT 1, last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)')
385
- cursor.execute('CREATE TABLE IF NOT EXISTS pattern_examples (id INTEGER PRIMARY KEY, pattern_id INTEGER, memory_id INTEGER, context TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)')
386
- cursor.execute('CREATE TABLE IF NOT EXISTS memory_tree (id INTEGER PRIMARY KEY, node_type TEXT, name TEXT, parent_id INTEGER, tree_path TEXT DEFAULT \"/\", depth INTEGER DEFAULT 0, memory_count INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)')
387
- cursor.execute('CREATE TABLE IF NOT EXISTS memory_archive (id INTEGER PRIMARY KEY, original_memory_id INTEGER, compressed_content TEXT, compression_type TEXT DEFAULT \"tier2\", original_size INTEGER, compressed_size INTEGER, archived_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)')
388
- cursor.execute('CREATE TABLE IF NOT EXISTS system_metadata (key TEXT PRIMARY KEY, value TEXT NOT NULL)')
389
- cursor.execute(\"INSERT OR REPLACE INTO system_metadata (key, value) VALUES ('product', 'SuperLocalMemory V2'), ('author', 'Varun Pratap Bhardwaj'), ('repository', 'https://github.com/qualixar/superlocalmemory'), ('license', 'MIT'), ('schema_version', '2.0.0')\")
390
- conn.commit()
391
- conn.close()
392
- print('Database ready')
393
- " && echo "✓ Database initialized (fallback)"
394
- fi
395
-
396
- # Run v2.8 schema migration (adds lifecycle columns to existing databases)
397
- echo ""
398
- echo "Running schema migration..."
399
- cd "$INSTALL_DIR"
400
- python3 -c "
401
- import sys
402
- sys.path.insert(0, '.')
403
- try:
404
- from memory_store_v2 import MemoryStoreV2
405
- MemoryStoreV2()
406
- print(' Schema migration complete')
407
- except Exception as e:
408
- print(f' Migration note: {e}')
409
- " 2>/dev/null || echo " Migration will run on first use"
410
-
411
- # Install core dependencies (required for graph & dashboard)
412
- echo ""
413
- echo "Installing SuperLocalMemory and all dependencies..."
414
- echo "⏳ Versions are pinned in pyproject.toml — same versions for every install path"
415
-
416
- # Detect pip installation method
417
- if pip3 install --help | grep -q "break-system-packages"; then
418
- PIP_FLAGS="--break-system-packages"
419
- else
420
- PIP_FLAGS=""
421
- fi
422
-
423
- # Find the repo root (parent of scripts/)
424
- PKG_ROOT="$(cd "${REPO_DIR}/.." && pwd)"
425
- if [ -f "${PKG_ROOT}/pyproject.toml" ]; then
426
- PROJ_ROOT="${PKG_ROOT}"
427
- elif [ -f "${REPO_DIR}/pyproject.toml" ]; then
428
- PROJ_ROOT="${REPO_DIR}"
429
- else
430
- PROJ_ROOT=""
431
- fi
432
-
433
- if [ -n "${PROJ_ROOT}" ]; then
434
- if pip3 install $PIP_FLAGS -q -e "${PROJ_ROOT}"; then
435
- echo "✓ SuperLocalMemory and all dependencies installed (pinned versions)"
436
- else
437
- echo "⚠️ Dependency installation failed."
438
- echo " Install manually: pip3 install -e ${PROJ_ROOT}"
439
- fi
440
- else
441
- echo "⚠️ pyproject.toml not found, cannot install dependencies"
442
- fi
443
-
444
- # Verify critical dependency versions (pip resolver can override pins)
445
- echo ""
446
- echo "Verifying critical dependency versions..."
447
- for pair in "sentence_transformers:5.3.0:sentence-transformers" "onnxruntime:1.24.4:onnxruntime"; do
448
- mod=$(echo "$pair" | cut -d: -f1)
449
- expected=$(echo "$pair" | cut -d: -f2)
450
- pipname=$(echo "$pair" | cut -d: -f3)
451
- actual=$(python3 -c "import $mod; print(getattr($mod,'__version__',''))" 2>/dev/null)
452
- if [ -n "$actual" ] && [ "$actual" != "$expected" ]; then
453
- echo "⚠️ $pipname is $actual, expected $expected. Fixing..."
454
- pip3 install $PIP_FLAGS -q "$pipname==$expected" 2>/dev/null
455
- echo "✓ $pipname==$expected installed"
456
- elif [ "$actual" = "$expected" ]; then
457
- echo "✓ $mod==$expected"
458
- fi
459
- done
460
-
461
- # Initialize knowledge graph and pattern learning
462
- echo ""
463
- echo "Initializing advanced features..."
464
-
465
- # Add sample memories if database is empty (for first-time users)
466
- MEMORY_COUNT=$(python3 -c "
467
- import sqlite3
468
- db_path = '${INSTALL_DIR}/memory.db'
469
- conn = sqlite3.connect(db_path)
470
- cursor = conn.cursor()
471
- cursor.execute('SELECT COUNT(*) FROM memories')
472
- print(cursor.fetchone()[0])
473
- conn.close()
474
- " 2>/dev/null || echo "0")
475
-
476
- if [ "$MEMORY_COUNT" -eq 0 ]; then
477
- echo "○ Adding sample memories for demonstration..."
478
- python3 "${INSTALL_DIR}/memory_store_v2.py" add "SuperLocalMemory V2 is a local-first, privacy-focused memory system for AI assistants. All data stays on your machine." --tags "supermemory,system,intro" --importance 8 > /dev/null 2>&1 || true
479
- python3 "${INSTALL_DIR}/memory_store_v2.py" add "Knowledge graph uses TF-IDF for entity extraction and Leiden clustering for community detection." --tags "architecture,graph" --importance 7 > /dev/null 2>&1 || true
480
- python3 "${INSTALL_DIR}/memory_store_v2.py" add "Pattern learning analyzes your coding preferences, style, and terminology to provide better context." --tags "architecture,patterns" --importance 7 > /dev/null 2>&1 || true
481
- fi
482
-
483
- # Build knowledge graph (Layer 3)
484
- echo "○ Building knowledge graph..."
485
- if python3 "${INSTALL_DIR}/graph_engine.py" build > /dev/null 2>&1; then
486
- echo " ✓ Knowledge graph initialized"
487
- else
488
- echo " ⚠️ Graph build skipped (dependencies not installed)"
489
- fi
490
-
491
- # Run pattern learning (Layer 4)
492
- echo "○ Learning patterns..."
493
- if python3 "${INSTALL_DIR}/pattern_learner.py" update > /dev/null 2>&1; then
494
- PATTERN_COUNT=$(python3 -c "
495
- import sqlite3
496
- db_path = '${INSTALL_DIR}/memory.db'
497
- conn = sqlite3.connect(db_path)
498
- cursor = conn.cursor()
499
- cursor.execute('SELECT COUNT(*) FROM identity_patterns')
500
- count = cursor.fetchone()[0]
501
- conn.close()
502
- print(count)
503
- " 2>/dev/null || echo "0")
504
- echo " ✓ Pattern learning complete ($PATTERN_COUNT patterns found)"
505
- else
506
- echo " ⚠️ Pattern learning skipped (dependencies not installed)"
507
- fi
508
-
509
- # Check optional dependencies
510
- echo ""
511
- echo "Checking optional dependencies..."
512
- python3 -c "import sklearn" 2>/dev/null && echo "✓ scikit-learn (Knowledge Graph)" || echo "○ scikit-learn not installed (optional)"
513
- python3 -c "import numpy" 2>/dev/null && echo "✓ numpy (Vector Operations)" || echo "○ numpy not installed (optional)"
514
- python3 -c "import igraph" 2>/dev/null && echo "✓ python-igraph (Clustering)" || echo "○ python-igraph not installed (optional)"
515
- python3 -c "import fastapi" 2>/dev/null && echo "✓ fastapi (UI Server)" || echo "○ fastapi not installed (optional)"
516
-
517
- # Auto-configure PATH
518
- echo ""
519
- echo "Configuring PATH..."
520
-
521
- # Detect user's default shell (not installer script's shell)
522
- USER_SHELL="${SHELL:-/bin/bash}"
523
- SHELL_CONFIG=""
524
-
525
- if [[ "$USER_SHELL" == *"zsh"* ]]; then
526
- SHELL_CONFIG="${HOME}/.zshrc"
527
- # Create .zshrc if it doesn't exist
528
- touch "${SHELL_CONFIG}" 2>/dev/null
529
- elif [[ "$USER_SHELL" == *"bash"* ]]; then
530
- # For bash, prefer .bash_profile on macOS, .bashrc on Linux
531
- if [[ "$(uname)" == "Darwin" ]] && [ -f "${HOME}/.bash_profile" ]; then
532
- SHELL_CONFIG="${HOME}/.bash_profile"
533
- else
534
- SHELL_CONFIG="${HOME}/.bashrc"
535
- touch "${SHELL_CONFIG}" 2>/dev/null
536
- fi
537
- else
538
- # Fallback: check which config exists
539
- if [ -f "${HOME}/.zshrc" ]; then
540
- SHELL_CONFIG="${HOME}/.zshrc"
541
- elif [ -f "${HOME}/.bash_profile" ]; then
542
- SHELL_CONFIG="${HOME}/.bash_profile"
543
- elif [ -f "${HOME}/.bashrc" ]; then
544
- SHELL_CONFIG="${HOME}/.bashrc"
545
- else
546
- # Default to zsh on modern macOS
547
- SHELL_CONFIG="${HOME}/.zshrc"
548
- touch "${SHELL_CONFIG}"
549
- fi
550
- fi
551
-
552
- # Check if PATH already configured
553
- PATH_EXPORT="export PATH=\"${INSTALL_DIR}/bin:\${PATH}\""
554
- if grep -Fq -- "${INSTALL_DIR}/bin" "${SHELL_CONFIG}" 2>/dev/null; then
555
- echo "○ PATH already configured in ${SHELL_CONFIG}"
556
- else
557
- # Add PATH export to shell config
558
- echo "" >> "${SHELL_CONFIG}"
559
- echo "# SuperLocalMemory V2 - Added by installer on $(date '+%Y-%m-%d')" >> "${SHELL_CONFIG}"
560
- echo "${PATH_EXPORT}" >> "${SHELL_CONFIG}"
561
- echo "✓ PATH configured in ${SHELL_CONFIG}"
562
- fi
563
-
564
- # Add to current session PATH
565
- export PATH="${INSTALL_DIR}/bin:${PATH}"
566
- echo "✓ Commands available in current session"
567
-
568
- # ============================================================================
569
- # UNIVERSAL INTEGRATION - Auto-detect and configure IDEs/CLI tools
570
- # ============================================================================
571
-
572
- echo ""
573
- echo "╔══════════════════════════════════════════════════════════════╗"
574
- echo "║ Universal Integration - Auto-Detection ║"
575
- echo "╚══════════════════════════════════════════════════════════════╝"
576
- echo ""
577
- echo "Detecting installed tools..."
578
- echo ""
579
-
580
- DETECTED_TOOLS=()
581
-
582
- # Function to configure MCP for an IDE
583
- configure_mcp() {
584
- local tool_name="$1"
585
- local config_source="$2"
586
- local config_dest="$3"
587
-
588
- # Replace {{INSTALL_DIR}} with actual path
589
- sed "s|{{INSTALL_DIR}}|${INSTALL_DIR}|g" "${config_source}" > /tmp/slm-config-$$.json
590
-
591
- # Create config directory if needed
592
- mkdir -p "$(dirname "${config_dest}")"
593
-
594
- # Backup existing config
595
- if [ -f "${config_dest}" ]; then
596
- cp "${config_dest}" "${config_dest}.backup.$(date +%Y%m%d-%H%M%S)"
597
- echo " ✓ Backed up existing ${tool_name} config"
598
- fi
599
-
600
- # Install config
601
- cp /tmp/slm-config-$$.json "${config_dest}"
602
- rm /tmp/slm-config-$$.json
603
-
604
- echo " ✓ ${tool_name} MCP configured"
605
- }
606
-
607
- # Copy MCP server to install directory
608
- if [ -f "${REPO_DIR}/mcp_server.py" ]; then
609
- cp "${REPO_DIR}/mcp_server.py" "${INSTALL_DIR}/"
610
- chmod +x "${INSTALL_DIR}/mcp_server.py"
611
- echo "✓ MCP Server installed"
612
- fi
613
-
614
- # Detect Claude Desktop
615
- if [ -d "${HOME}/Library/Application Support/Claude" ] || [ -d "${HOME}/.config/Claude" ]; then
616
- DETECTED_TOOLS+=("Claude Desktop")
617
-
618
- if [ -f "${REPO_DIR}/configs/claude-desktop-mcp.json" ]; then
619
- # Determine config path based on OS
620
- if [ -d "${HOME}/Library/Application Support/Claude" ]; then
621
- CONFIG_PATH="${HOME}/Library/Application Support/Claude/claude_desktop_config.json"
622
- else
623
- CONFIG_PATH="${HOME}/.config/Claude/claude_desktop_config.json"
624
- fi
625
-
626
- configure_mcp "Claude Desktop" \
627
- "${REPO_DIR}/configs/claude-desktop-mcp.json" \
628
- "${CONFIG_PATH}"
629
- fi
630
- fi
631
-
632
- # Detect Cursor
633
- if [ -d "${HOME}/.cursor" ] || command -v cursor &>/dev/null; then
634
- DETECTED_TOOLS+=("Cursor")
635
-
636
- if [ -f "${REPO_DIR}/configs/cursor-mcp.json" ]; then
637
- configure_mcp "Cursor" \
638
- "${REPO_DIR}/configs/cursor-mcp.json" \
639
- "${HOME}/.cursor/mcp_settings.json"
640
- fi
641
- fi
642
-
643
- # Detect Windsurf
644
- if [ -d "${HOME}/.windsurf" ] || command -v windsurf &>/dev/null; then
645
- DETECTED_TOOLS+=("Windsurf")
646
-
647
- if [ -f "${REPO_DIR}/configs/windsurf-mcp.json" ]; then
648
- configure_mcp "Windsurf" \
649
- "${REPO_DIR}/configs/windsurf-mcp.json" \
650
- "${HOME}/.windsurf/mcp_settings.json"
651
- fi
652
- fi
653
-
654
- # Detect VS Code with Continue
655
- if [ -d "${HOME}/.continue" ]; then
656
- DETECTED_TOOLS+=("Continue.dev")
657
-
658
- if [ -f "${REPO_DIR}/configs/continue-mcp.yaml" ]; then
659
- # For Continue, append to config if exists, otherwise create
660
- CONTINUE_CONFIG="${HOME}/.continue/config.yaml"
661
- mkdir -p "${HOME}/.continue"
662
-
663
- if [ -f "${CONTINUE_CONFIG}" ]; then
664
- echo " ○ Continue.dev config exists - manual merge recommended"
665
- echo " See: ${REPO_DIR}/configs/continue-mcp.yaml"
666
- else
667
- sed "s|{{INSTALL_DIR}}|${INSTALL_DIR}|g" "${REPO_DIR}/configs/continue-mcp.yaml" > "${CONTINUE_CONFIG}"
668
- echo " ✓ Continue.dev MCP configured"
669
- fi
670
- fi
671
- fi
672
-
673
- # Detect Zed Editor
674
- if [ -d "${HOME}/.config/zed" ] || command -v zed &>/dev/null; then
675
- DETECTED_TOOLS+=("Zed Editor")
676
-
677
- if [ -f "${REPO_DIR}/configs/zed-mcp.json" ]; then
678
- configure_mcp "Zed Editor" \
679
- "${REPO_DIR}/configs/zed-mcp.json" \
680
- "${HOME}/.config/zed/context_servers.json"
681
- fi
682
- fi
683
-
684
- # Detect OpenCode
685
- if [ -d "${HOME}/.opencode" ]; then
686
- DETECTED_TOOLS+=("OpenCode")
687
-
688
- if [ -f "${REPO_DIR}/configs/opencode-mcp.json" ]; then
689
- configure_mcp "OpenCode" \
690
- "${REPO_DIR}/configs/opencode-mcp.json" \
691
- "${HOME}/.opencode/mcp.json"
692
- fi
693
- fi
694
-
695
- # Detect Antigravity (Gemini)
696
- if [ -d "${HOME}/.gemini/antigravity" ]; then
697
- DETECTED_TOOLS+=("Antigravity")
698
-
699
- if [ -f "${REPO_DIR}/configs/antigravity-mcp.json" ]; then
700
- configure_mcp "Antigravity" \
701
- "${REPO_DIR}/configs/antigravity-mcp.json" \
702
- "${HOME}/.gemini/antigravity/mcp_config.json"
703
- fi
704
- fi
705
-
706
- # Detect Perplexity
707
- if [ -d "${HOME}/.perplexity" ]; then
708
- DETECTED_TOOLS+=("Perplexity")
709
-
710
- if [ -f "${REPO_DIR}/configs/perplexity-mcp.json" ]; then
711
- configure_mcp "Perplexity" \
712
- "${REPO_DIR}/configs/perplexity-mcp.json" \
713
- "${HOME}/.perplexity/mcp.json"
714
- fi
715
- fi
716
-
717
- # Detect ChatGPT Desktop (requires HTTP transport, not stdio)
718
- if [ -d "${HOME}/Library/Application Support/ChatGPT" ] || [ -d "${HOME}/.config/ChatGPT" ]; then
719
- DETECTED_TOOLS+=("ChatGPT (manual)")
720
- echo " ○ ChatGPT Desktop detected - requires HTTP transport"
721
- echo " Run: slm serve (then expose via ngrok for ChatGPT)"
722
- echo " Guide: docs/MCP-MANUAL-SETUP.md#chatgpt-desktop-app"
723
- fi
724
-
725
- # Detect Cody (VS Code extension) - Works on macOS/Linux/Windows
726
- if [ -d "${HOME}/.vscode/extensions" ] || [ -d "${HOME}/.config/Code/User/extensions" ]; then
727
- EXTENSIONS_DIR="${HOME}/.vscode/extensions"
728
- [ -d "${HOME}/.config/Code/User/extensions" ] && EXTENSIONS_DIR="${HOME}/.config/Code/User/extensions"
729
-
730
- if ls "${EXTENSIONS_DIR}" 2>/dev/null | grep -q "sourcegraph.cody"; then
731
- DETECTED_TOOLS+=("Cody (manual)")
732
- echo " ○ Cody detected - manual setup required"
733
- echo " See: docs/MCP-MANUAL-SETUP.md#cody-vs-codejetbrains"
734
- fi
735
- fi
736
-
737
- # Detect OpenAI Codex CLI
738
- if [ -d "${HOME}/.codex" ] || command -v codex &>/dev/null; then
739
- DETECTED_TOOLS+=("Codex CLI")
740
-
741
- # Try native codex mcp add command first
742
- if command -v codex &>/dev/null; then
743
- if codex mcp add superlocalmemory-v2 --env "PYTHONPATH=${INSTALL_DIR}" -- python3 "${INSTALL_DIR}/mcp_server.py" 2>/dev/null; then
744
- echo " ✓ Codex CLI MCP configured (via codex mcp add)"
745
- else
746
- # Fallback: Write TOML config
747
- CODEX_CONFIG="${HOME}/.codex/config.toml"
748
- mkdir -p "${HOME}/.codex"
749
- if [ -f "${CODEX_CONFIG}" ] && grep -q "superlocalmemory-v2" "${CODEX_CONFIG}" 2>/dev/null; then
750
- echo " ○ Codex CLI already configured"
751
- else
752
- cp "${CODEX_CONFIG}" "${CODEX_CONFIG}.backup.$(date +%Y%m%d-%H%M%S)" 2>/dev/null || true
753
- cat >> "${CODEX_CONFIG}" <<TOML_EOF
754
-
755
- [mcp_servers.superlocalmemory-v2]
756
- command = "python3"
757
- args = ["${INSTALL_DIR}/mcp_server.py"]
758
-
759
- [mcp_servers.superlocalmemory-v2.env]
760
- PYTHONPATH = "${INSTALL_DIR}"
761
- TOML_EOF
762
- echo " ✓ Codex CLI MCP configured (TOML appended)"
763
- fi
764
- fi
765
- else
766
- # codex command not in PATH but .codex dir exists
767
- CODEX_CONFIG="${HOME}/.codex/config.toml"
768
- mkdir -p "${HOME}/.codex"
769
- if [ -f "${CODEX_CONFIG}" ] && grep -q "superlocalmemory-v2" "${CODEX_CONFIG}" 2>/dev/null; then
770
- echo " ○ Codex CLI already configured"
771
- else
772
- cp "${CODEX_CONFIG}" "${CODEX_CONFIG}.backup.$(date +%Y%m%d-%H%M%S)" 2>/dev/null || true
773
- cat >> "${CODEX_CONFIG}" <<TOML_EOF
774
-
775
- [mcp_servers.superlocalmemory-v2]
776
- command = "python3"
777
- args = ["${INSTALL_DIR}/mcp_server.py"]
778
-
779
- [mcp_servers.superlocalmemory-v2.env]
780
- PYTHONPATH = "${INSTALL_DIR}"
781
- TOML_EOF
782
- echo " ✓ Codex CLI MCP configured (TOML appended)"
783
- fi
784
- fi
785
- fi
786
-
787
- # Detect VS Code / GitHub Copilot
788
- if command -v code &>/dev/null || command -v code-insiders &>/dev/null; then
789
- DETECTED_TOOLS+=("VS Code/Copilot")
790
-
791
- if [ -f "${REPO_DIR}/configs/vscode-copilot-mcp.json" ]; then
792
- # VS Code user-level MCP config
793
- VSCODE_MCP="${HOME}/.vscode/mcp.json"
794
- mkdir -p "${HOME}/.vscode"
795
-
796
- if [ -f "${VSCODE_MCP}" ] && grep -q "superlocalmemory-v2" "${VSCODE_MCP}" 2>/dev/null; then
797
- echo " ○ VS Code/Copilot already configured"
798
- else
799
- if [ -f "${VSCODE_MCP}" ]; then
800
- cp "${VSCODE_MCP}" "${VSCODE_MCP}.backup.$(date +%Y%m%d-%H%M%S)"
801
- echo " ✓ Backed up existing VS Code MCP config"
802
- fi
803
- sed "s|{{INSTALL_DIR}}|${INSTALL_DIR}|g" "${REPO_DIR}/configs/vscode-copilot-mcp.json" > "${VSCODE_MCP}"
804
- echo " ✓ VS Code/Copilot MCP configured"
805
- fi
806
- fi
807
- fi
808
-
809
- # Detect Gemini CLI (separate from Antigravity)
810
- if command -v gemini &>/dev/null || [ -f "${HOME}/.gemini/settings.json" ]; then
811
- # Only add if not already detected as Antigravity
812
- if [[ ! " ${DETECTED_TOOLS[*]} " =~ " Antigravity " ]]; then
813
- DETECTED_TOOLS+=("Gemini CLI")
814
- else
815
- DETECTED_TOOLS+=("Gemini CLI")
816
- fi
817
-
818
- if [ -f "${REPO_DIR}/configs/gemini-cli-mcp.json" ]; then
819
- GEMINI_CONFIG="${HOME}/.gemini/settings.json"
820
- mkdir -p "${HOME}/.gemini"
821
-
822
- if [ -f "${GEMINI_CONFIG}" ] && grep -q "superlocalmemory-v2" "${GEMINI_CONFIG}" 2>/dev/null; then
823
- echo " ○ Gemini CLI already configured"
824
- else
825
- if [ -f "${GEMINI_CONFIG}" ]; then
826
- cp "${GEMINI_CONFIG}" "${GEMINI_CONFIG}.backup.$(date +%Y%m%d-%H%M%S)"
827
- echo " ✓ Backed up existing Gemini CLI config"
828
- fi
829
- sed "s|{{INSTALL_DIR}}|${INSTALL_DIR}|g" "${REPO_DIR}/configs/gemini-cli-mcp.json" > "${GEMINI_CONFIG}"
830
- echo " ✓ Gemini CLI MCP configured"
831
- fi
832
- fi
833
- fi
834
-
835
- # Detect JetBrains IDEs (manual setup required - GUI-based)
836
- if [ -d "${HOME}/Library/Application Support/JetBrains" ] || [ -d "${HOME}/.config/JetBrains" ]; then
837
- DETECTED_TOOLS+=("JetBrains (manual)")
838
- echo " ○ JetBrains IDE detected - manual setup via GUI"
839
- echo " Settings → AI Assistant → MCP Servers → Add"
840
- echo " Template: configs/jetbrains-mcp.json"
841
- fi
842
-
843
- # Install Universal Skills (SKILL.md for all detected tools)
844
- if [ -f "${REPO_DIR}/install-skills.sh" ]; then
845
- echo ""
846
- echo "Installing Universal Skills..."
847
- bash "${REPO_DIR}/install-skills.sh" --auto 2>/dev/null || echo " ○ Skills installation skipped (optional)"
848
- fi
849
-
850
- # Install MCP Python package if not present
851
- if ! python3 -c "import mcp" 2>/dev/null; then
852
- echo ""
853
- echo "Installing MCP SDK..."
854
- pip3 install mcp --quiet 2>/dev/null && echo "✓ MCP SDK installed" || echo "○ MCP SDK install failed (manual install: pip3 install mcp)"
855
- fi
856
-
857
- # Install bash completions
858
- if [ -d "/usr/local/etc/bash_completion.d" ] && [ -f "${REPO_DIR}/completions/slm.bash" ]; then
859
- sudo cp "${REPO_DIR}/completions/slm.bash" /usr/local/etc/bash_completion.d/slm 2>/dev/null && echo "✓ Bash completion installed" || true
860
- fi
861
-
862
- # Summary of detected tools
863
- echo ""
864
- if [ ${#DETECTED_TOOLS[@]} -gt 0 ]; then
865
- echo "✓ Detected and configured:"
866
- for tool in "${DETECTED_TOOLS[@]}"; do
867
- echo " • $tool"
868
- done
869
- echo ""
870
- echo "These tools now have native access to SuperLocalMemory!"
871
- echo "Restart them to use the new MCP integration."
872
- else
873
- echo "○ No additional tools detected"
874
- echo " MCP server is available if you install Cursor, Windsurf, etc."
875
- fi
876
-
877
- echo ""
878
- echo "Universal CLI commands also available:"
879
- echo " slm remember <content> - Simple command (anywhere)"
880
- echo " slm recall <query> - Search from any terminal"
881
- echo " slm status - Check system status"
882
- echo ""
883
-
884
- # Manual setup guide for other tools
885
- echo "╔══════════════════════════════════════════════════════════════╗"
886
- echo "║ Manual Setup for Other Apps ║"
887
- echo "╚══════════════════════════════════════════════════════════════╝"
888
- echo ""
889
- echo "Want to use SuperLocalMemory in other apps?"
890
- echo ""
891
- echo " • ChatGPT Desktop - Add via Settings → MCP"
892
- echo " • Perplexity - Add via Settings → Integrations"
893
- echo " • Zed Editor - Configure in settings.json"
894
- echo " • Cody - Configure in VS Code settings"
895
- echo " • Custom tools - See integration guide"
896
- echo ""
897
- echo "Full manual setup guide:"
898
- echo " docs/MCP-MANUAL-SETUP.md"
899
- echo " https://github.com/qualixar/superlocalmemory/blob/main/docs/MCP-MANUAL-SETUP.md"
900
- echo ""
901
-
902
- # Summary
903
- echo ""
904
- echo "╔══════════════════════════════════════════════════════════════╗"
905
- echo "║ Installation Complete! ║"
906
- echo "╚══════════════════════════════════════════════════════════════╝"
907
- echo ""
908
- echo "✓ Commands are now globally available!"
909
- echo ""
910
- echo " You can use them immediately:"
911
- echo ""
912
- echo "Available commands (two ways to use them):"
913
- echo ""
914
- echo "OPTION 1: Original commands (still work):"
915
- echo " superlocalmemoryv2-remember - Save a new memory"
916
- echo " superlocalmemoryv2-recall - Search memories"
917
- echo " superlocalmemoryv2-list - List recent memories"
918
- echo " superlocalmemoryv2-status - Check system status"
919
- echo ""
920
- echo "OPTION 2: New simple commands:"
921
- echo " slm remember <content> - Save (simpler syntax)"
922
- echo " slm recall <query> - Search"
923
- echo " slm list - List recent"
924
- echo " slm status - System status"
925
- echo ""
926
- echo "Quick start (try now):"
927
- echo " slm status"
928
- echo " slm remember 'My first memory'"
929
- echo " slm recall 'first'"
930
- echo ""
931
- echo "Learning System (v2.7+):"
932
- echo " slm learning status - Check learning system"
933
- echo " slm engagement - View engagement metrics"
934
- echo ""
935
- echo "Lifecycle & Compliance (v2.8+):"
936
- echo " slm lifecycle-status - View memory lifecycle states"
937
- echo " slm compact --dry-run - Preview lifecycle transitions"
938
- echo " slm behavioral-patterns - View learned patterns"
939
- echo ""
940
- # Optional: Offer to install optional features
941
- if [ "$NON_INTERACTIVE" = true ]; then
942
- INSTALL_CHOICE="N"
943
- echo ""
944
- echo "╔══════════════════════════════════════════════════════════════╗"
945
- echo "║ Non-Interactive Mode: Skipping Optional Features ║"
946
- echo "╚══════════════════════════════════════════════════════════════╝"
947
- echo ""
948
- echo "To install optional features later:"
949
- echo " Advanced Search: pip3 install -r ${REPO_DIR}/requirements-search.txt"
950
- echo " Web Dashboard: pip3 install -r ${REPO_DIR}/requirements-ui.txt"
951
- echo " Full Package: pip3 install -r ${REPO_DIR}/requirements-full.txt"
952
- echo ""
953
- else
954
- echo ""
955
- echo "╔══════════════════════════════════════════════════════════════╗"
956
- echo "║ Optional Features Available ║"
957
- echo "╚══════════════════════════════════════════════════════════════╝"
958
- echo ""
959
- echo "Core features already installed:"
960
- echo " ✓ Knowledge graph with Leiden clustering"
961
- echo " ✓ Pattern learning and identity profiles"
962
- echo " ✓ Web dashboard at http://localhost:8000"
963
- echo ""
964
- echo "Optional advanced search features:"
965
- echo ""
966
- echo " 1) Advanced Semantic Search (~1.5GB, 5-10 min)"
967
- echo " • Sentence transformers for better search quality"
968
- echo " • Vector similarity with HNSWLIB"
969
- echo " • Recommended for large memory databases (>500 items)"
970
- echo ""
971
- echo " N) Skip (install later)"
972
- echo ""
973
- echo -n "Choose option [1/N]: "
974
- read -r INSTALL_CHOICE
975
- fi
976
-
977
- case "$INSTALL_CHOICE" in
978
- 1)
979
- echo ""
980
- echo "Installing Advanced Search features..."
981
- echo "⏳ Downloading ~1.5GB (ML models)..."
982
- if pip3 install $PIP_FLAGS -r "${REPO_DIR}/requirements-search.txt"; then
983
- echo "✓ Advanced Search installed successfully"
984
- echo ""
985
- echo "Search now uses semantic embeddings for better quality!"
986
- else
987
- echo "⚠️ Installation failed. Install manually later:"
988
- echo " pip3 install -r ${REPO_DIR}/requirements-search.txt"
989
- fi
990
- ;;
991
- [Nn]|*)
992
- echo ""
993
- echo "Skipping advanced search."
994
- echo ""
995
- echo "To install later:"
996
- echo " pip3 install -r ${REPO_DIR}/requirements-search.txt"
997
- echo ""
998
- echo "Start Web Dashboard:"
999
- echo " python3 ${INSTALL_DIR}/ui_server.py"
1000
- echo " Then open: http://localhost:8000"
1001
- ;;
1002
- esac
1003
-
1004
- echo ""
1005
- echo "╔══════════════════════════════════════════════════════════════╗"
1006
- echo "║ ATTRIBUTION NOTICE (REQUIRED BY MIT LICENSE) ║"
1007
- echo "╠══════════════════════════════════════════════════════════════╣"
1008
- echo "║ Created by: Varun Pratap Bhardwaj ║"
1009
- echo "║ Role: Solution Architect & Original Creator ║"
1010
- echo "║ Repository: github.com/qualixar/superlocalmemory ║"
1011
- echo "║ License: MIT (attribution must be preserved) ║"
1012
- echo "║ ║"
1013
- echo "║ See ATTRIBUTION.md for full attribution requirements ║"
1014
- echo "╚══════════════════════════════════════════════════════════════╝"
1015
- echo ""