superlocalmemory 3.6.13 → 3.6.14

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 (124) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/README.md +187 -741
  3. package/package.json +12 -5
  4. package/plugin/.claude-plugin/plugin.json +20 -0
  5. package/plugin/.mcp.json +12 -0
  6. package/plugin/CLAUDE.md +43 -0
  7. package/plugin/_GENERATED.md +6 -0
  8. package/plugin/agents/slm-memory-advisor.md +43 -0
  9. package/plugin/agents/slm-optimize-advisor.md +38 -0
  10. package/plugin/hooks/hooks.json +14 -0
  11. package/plugin/requirements.txt +1 -0
  12. package/plugin/scripts/ensure-venv.bat +122 -0
  13. package/plugin/scripts/ensure-venv.sh +105 -0
  14. package/plugin/scripts/slm-launch +15 -0
  15. package/plugin/scripts/slm-launch.bat +17 -0
  16. package/plugin/settings.json +16 -0
  17. package/plugin/skills/slm-cache/SKILL.md +140 -0
  18. package/plugin/skills/slm-compress/SKILL.md +143 -0
  19. package/plugin/skills/slm-graph/SKILL.md +300 -0
  20. package/plugin/skills/slm-recall/SKILL.md +196 -0
  21. package/plugin/skills/slm-remember/SKILL.md +182 -0
  22. package/plugin/skills/slm-session/SKILL.md +207 -0
  23. package/plugin/skills/slm-status/SKILL.md +149 -0
  24. package/plugin-src/.mcp.json +12 -0
  25. package/plugin-src/agents/slm-memory-advisor.md +43 -0
  26. package/plugin-src/agents/slm-optimize-advisor.md +38 -0
  27. package/plugin-src/commands/slm-optimize.md +22 -0
  28. package/plugin-src/commands/slm-recall.md +16 -0
  29. package/plugin-src/commands/slm-remember.md +16 -0
  30. package/plugin-src/commands/slm-status.md +15 -0
  31. package/plugin-src/hooks/.gitkeep +0 -0
  32. package/plugin-src/hooks/hooks.json +14 -0
  33. package/plugin-src/manifest.json +25 -0
  34. package/plugin-src/requirements.txt +1 -0
  35. package/plugin-src/rules/AGENTS.md +90 -0
  36. package/plugin-src/rules/CLAUDE.md.fragment +43 -0
  37. package/plugin-src/scripts/ensure-venv.bat +122 -0
  38. package/plugin-src/scripts/ensure-venv.sh +105 -0
  39. package/plugin-src/scripts/slm-launch +15 -0
  40. package/plugin-src/scripts/slm-launch.bat +17 -0
  41. package/plugin-src/settings.json +16 -0
  42. package/plugin-src/skills/slm-cache/SKILL.md +140 -0
  43. package/plugin-src/skills/slm-compress/SKILL.md +143 -0
  44. package/plugin-src/skills/slm-graph/SKILL.md +300 -0
  45. package/plugin-src/skills/slm-recall/SKILL.md +196 -0
  46. package/plugin-src/skills/slm-remember/SKILL.md +182 -0
  47. package/plugin-src/skills/slm-session/SKILL.md +207 -0
  48. package/plugin-src/skills/slm-status/SKILL.md +149 -0
  49. package/pyproject.toml +6 -2
  50. package/scripts/__tests__/build-plugin.test.mjs +613 -0
  51. package/scripts/_savings_math.py +270 -0
  52. package/scripts/build-plugin.js +742 -0
  53. package/scripts/dogfood_savings.py +490 -0
  54. package/scripts/install-skills.ps1 +4 -334
  55. package/scripts/install-skills.sh +4 -435
  56. package/scripts/postinstall-interactive.js +0 -27
  57. package/scripts/postinstall.js +21 -2
  58. package/src/superlocalmemory/__init__.py +1 -1
  59. package/src/superlocalmemory/cli/_lazy_init.py +115 -0
  60. package/src/superlocalmemory/cli/commands.py +348 -39
  61. package/src/superlocalmemory/cli/main.py +47 -4
  62. package/src/superlocalmemory/cli/setup_wizard.py +20 -6
  63. package/src/superlocalmemory/core/config.py +79 -9
  64. package/src/superlocalmemory/core/embeddings.py +10 -5
  65. package/src/superlocalmemory/core/engine.py +2 -2
  66. package/src/superlocalmemory/hooks/claude_code_hooks.py +27 -3
  67. package/src/superlocalmemory/hooks/portable_kit.py +506 -0
  68. package/src/superlocalmemory/infra/cloud_backup.py +99 -23
  69. package/src/superlocalmemory/mcp/cli_fallback.py +602 -0
  70. package/src/superlocalmemory/mcp/server.py +75 -4
  71. package/src/superlocalmemory/mcp/tools_code_graph.py +3 -3
  72. package/src/superlocalmemory/mcp/tools_core.py +12 -4
  73. package/src/superlocalmemory/optimize/cache/boundary_store.py +25 -6
  74. package/src/superlocalmemory/optimize/cache/centroid_store.py +27 -4
  75. package/src/superlocalmemory/optimize/cache/manager.py +92 -6
  76. package/src/superlocalmemory/optimize/cache/semantic.py +20 -1
  77. package/src/superlocalmemory/optimize/compress/ccr.py +12 -0
  78. package/src/superlocalmemory/optimize/compress/router.py +46 -13
  79. package/src/superlocalmemory/optimize/config/schema.py +6 -0
  80. package/src/superlocalmemory/optimize/proxy/_helpers.py +111 -8
  81. package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +14 -4
  82. package/src/superlocalmemory/optimize/proxy/gemini_surface.py +23 -6
  83. package/src/superlocalmemory/optimize/proxy/openai_surface.py +10 -4
  84. package/src/superlocalmemory/optimize/proxy/server.py +11 -0
  85. package/src/superlocalmemory/optimize/proxy/vertex_surface.py +246 -0
  86. package/src/superlocalmemory/optimize/storage/db.py +30 -0
  87. package/src/superlocalmemory/server/recall_serializer.py +3 -1
  88. package/src/superlocalmemory/server/unified_daemon.py +24 -6
  89. package/src/superlocalmemory/ui/css/legacy-dashboard.css +18 -0
  90. package/src/superlocalmemory/ui/css/neural-glass.css +5 -0
  91. package/src/superlocalmemory/ui/index.html +2 -2
  92. package/src/superlocalmemory/ui/js/core.js +98 -0
  93. package/src/superlocalmemory/ui/js/dashboard.js +8 -1
  94. package/src/superlocalmemory/ui/js/ide-status.js +16 -3
  95. package/src/superlocalmemory/ui/js/math-health.js +15 -3
  96. package/src/superlocalmemory/ui/js/optimize.js +18 -2
  97. package/src/superlocalmemory/ui/js/trust-dashboard.js +10 -1
  98. package/src/superlocalmemory.egg-info/PKG-INFO +189 -742
  99. package/src/superlocalmemory.egg-info/SOURCES.txt +6 -9
  100. package/src/superlocalmemory.egg-info/requires.txt +1 -0
  101. package/ide/skills/slm-build-graph/SKILL.md +0 -423
  102. package/ide/skills/slm-list-recent/SKILL.md +0 -348
  103. package/ide/skills/slm-recall/SKILL.md +0 -326
  104. package/ide/skills/slm-remember/SKILL.md +0 -194
  105. package/ide/skills/slm-show-patterns/SKILL.md +0 -224
  106. package/ide/skills/slm-status/SKILL.md +0 -363
  107. package/ide/skills/slm-switch-profile/SKILL.md +0 -442
  108. package/skills/slm-build-graph/SKILL.md +0 -423
  109. package/skills/slm-list-recent/SKILL.md +0 -348
  110. package/skills/slm-optimize/README.md +0 -55
  111. package/skills/slm-optimize/SKILL.md +0 -139
  112. package/skills/slm-recall/SKILL.md +0 -343
  113. package/skills/slm-remember/SKILL.md +0 -194
  114. package/skills/slm-show-patterns/SKILL.md +0 -224
  115. package/skills/slm-status/SKILL.md +0 -363
  116. package/skills/slm-switch-profile/SKILL.md +0 -442
  117. package/src/superlocalmemory/cli/doctor_cmd.py +0 -152
  118. package/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -423
  119. package/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -348
  120. package/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -343
  121. package/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -194
  122. package/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -224
  123. package/src/superlocalmemory/skills/slm-status/SKILL.md +0 -363
  124. package/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -442
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superlocalmemory",
3
- "version": "3.6.13",
3
+ "version": "3.6.14",
4
4
  "description": "Information-geometric agent memory with mathematical guarantees. 4-channel retrieval, Fisher-Rao similarity, zero-LLM mode, EU AI Act compliant. Works with Claude, Cursor, Windsurf, and 17+ AI tools.",
5
5
  "keywords": [
6
6
  "ai-memory",
@@ -46,10 +46,12 @@
46
46
  "superlocalmemory": "./bin/slm-npm"
47
47
  },
48
48
  "scripts": {
49
- "prepack": "node scripts/prepack.js",
49
+ "build:plugin": "node scripts/build-plugin.js",
50
+ "check:plugin": "node scripts/build-plugin.js --check",
51
+ "prepack": "node scripts/build-plugin.js && node scripts/prepack.js",
50
52
  "postinstall": "node scripts/postinstall.js",
51
53
  "preuninstall": "node scripts/preuninstall.js",
52
- "test": "echo \"Run: npm install -g . && slm status\" && exit 0"
54
+ "test": "node --test 'tests/ui/*.mjs'"
53
55
  },
54
56
  "engines": {
55
57
  "node": ">=18.0.0",
@@ -65,7 +67,9 @@
65
67
  "src/",
66
68
  "ide/",
67
69
  "scripts/",
68
- "skills/",
70
+ ".claude-plugin/",
71
+ "plugin/",
72
+ "plugin-src/",
69
73
  "pyproject.toml",
70
74
  "README.md",
71
75
  "LICENSE",
@@ -87,5 +91,8 @@
87
91
  ],
88
92
  "dependencies": {
89
93
  "docx": "^9.5.1"
94
+ },
95
+ "devDependencies": {
96
+ "jsdom": "^29.1.1"
90
97
  }
91
- }
98
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "author": {
3
+ "name": "Qualixar",
4
+ "url": "https://github.com/qualixar/superlocalmemory"
5
+ },
6
+ "description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server. 20-tool code profile with graph intelligence.",
7
+ "displayName": "SuperLocalMemory",
8
+ "hooks": "./hooks/hooks.json",
9
+ "keywords": [
10
+ "memory",
11
+ "mcp",
12
+ "agents",
13
+ "local-first",
14
+ "context-compression"
15
+ ],
16
+ "mcpServers": "./.mcp.json",
17
+ "name": "superlocalmemory",
18
+ "repository": "https://github.com/qualixar/superlocalmemory",
19
+ "version": "3.6.14"
20
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "superlocalmemory": {
4
+ "command": "${CLAUDE_PLUGIN_ROOT}/scripts/slm-launch",
5
+ "args": [],
6
+ "env": {
7
+ "SLM_MCP_PROFILE": "code",
8
+ "SLM_DATA_DIR": "${CLAUDE_PLUGIN_DATA}"
9
+ }
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,43 @@
1
+ <!-- BEGIN SuperLocalMemory v3.6.14 -->
2
+
3
+ ## SuperLocalMemory (SLM) — Agent Rules
4
+
5
+ SLM is local-first memory for agents. All tools run on the user's machine; no cloud calls.
6
+
7
+ ### Session start
8
+ Call `session_init(project_path, query)` ONCE per fresh session before any recall/remember. Never twice.
9
+
10
+ ### Remember
11
+ - Atomic durable facts only (decisions, conventions, constraints, gotchas). One fact per call.
12
+ - Recall-before-remember: `recall(query, 5)` first; use `update_memory` if near-match found.
13
+ - Always supply tags + project + importance (7–10 for blockers/security/architecture).
14
+ - Never dump a whole file; never claim "saved" without success:true.
15
+
16
+ ### Recall
17
+ - `recall` for conceptual/semantic queries; `search` for exact keywords.
18
+ - Phrase as concepts; pass session_id when available. Never fabricate.
19
+
20
+ ### Optimize (fail-open)
21
+ - Output >2000 chars → `slm_compress(mode="auto", reversible=True)`; keep ccr_id if lossy.
22
+ - Repeated reads → `slm_cache_get("file:<path>")` first; on miss cache with ttl=1800.
23
+ - NEVER compress/cache: code-for-edit, JSON-to-parse, secrets, ccr_ids, <500 chars.
24
+ - If ok:false → continue with original; never block the task.
25
+
26
+ ### Session end
27
+ `close_session(session_id)` when work is meaningfully complete.
28
+
29
+ ### CLI fallback (MCP down)
30
+ `slm recall "<q>" --limit N` · `slm search "<q>"` · `slm remember "<c>" --tags t --importance N` · `slm list --limit N` · `slm forget` (preview first) · `slm status` · `slm optimize status`
31
+
32
+ ### Skills
33
+ slm-recall · slm-remember · slm-session · slm-status · slm-cache · slm-compress · slm-graph
34
+
35
+ ### Commands
36
+ /superlocalmemory:slm-recall · /superlocalmemory:slm-remember · /superlocalmemory:slm-session · /superlocalmemory:slm-status · /superlocalmemory:slm-cache · /superlocalmemory:slm-compress · /superlocalmemory:slm-graph
37
+
38
+ ### Subagents
39
+ slm-memory-advisor (memory decisions, session hygiene) · slm-optimize-advisor (context compression + KV cache)
40
+
41
+ <!-- END SuperLocalMemory v3.6.14 -->
42
+
43
+ SuperLocalMemory v3.6.14 · Qualixar · AGPL-3.0-or-later
@@ -0,0 +1,6 @@
1
+ # _GENERATED — DO NOT HAND-EDIT
2
+
3
+ This directory is generated by `scripts/build-plugin.js` from `plugin-src/`.
4
+ Run `npm run build:plugin` to regenerate.
5
+ Run `npm run check:plugin` (or `--check`) in CI to verify in-sync.
6
+ Source of truth: `plugin-src/skills/`, `plugin-src/manifest.json`.
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: slm-memory-advisor
3
+ description: >
4
+ Advises the main agent on using SuperLocalMemory well — when to call
5
+ session_init, remember, recall, and search; how to phrase queries; and how
6
+ to keep memory clean. Delegate here for any "should I save/recall this?"
7
+ decision or when memory results look wrong.
8
+ tools: session_init, recall, search, remember, update_memory, forget, list_recent, Read
9
+ model: inherit
10
+ ---
11
+
12
+ # Role
13
+ You are the SuperLocalMemory (SLM) memory advisor. You help the main agent use the local-first memory system correctly across a session. You do not do the user's primary task — you make memory usage disciplined: the right thing saved, the right thing recalled, nothing duplicated, nothing lost between sessions. SLM is 100% local; every tool runs on the user's machine.
14
+
15
+ # When to act
16
+ When the main agent: starts a session and hasn't loaded project context; is about to or just made a decision worth persisting; asks "what did we decide about X"; gets recall results that look irrelevant/empty.
17
+
18
+ # Tools you may use (real SLM MCP tools, core profile)
19
+ - `session_init(project_path, query, max_results, max_age_days)` — ONCE at session start; returns recent decisions + relevant memories.
20
+ - `recall(query, limit, session_id, fast)` — multi-channel semantic retrieval (default limit 10).
21
+ - `search(query, limit, profile_id)` — exact keyword / FTS5 BM25.
22
+ - `remember(content, tags, project, importance, session_id)` — store atomic fact; importance 1-10.
23
+ - `update_memory(fact_id, content)` — correct by exact id.
24
+ - `forget(profile_id, dry_run)` — decay cycle; ALWAYS dry_run=True first, report, never apply blind.
25
+ - `list_recent(limit)` — newest first.
26
+ - `Read` — inspect a file before deciding what to remember.
27
+
28
+ # Decision rules
29
+ 1. SESSION_INIT FIRST — once, before any recall/remember in a fresh session. Never skip; never twice.
30
+ 2. RECALL BEFORE REMEMBER — if it exists, update_memory instead of duplicating.
31
+ 3. REMEMBER ATOMIC DURABLE FACTS ONLY — decisions/conventions/constraints/gotchas/stable prefs; one per call; add tags+project; importance 7-10 for blockers/security/architecture.
32
+ 4. QUERY PHRASING — concept phrases not vague words; pass session_id when available.
33
+ 5. recall vs search — recall for conceptual; search for literal keyword.
34
+ 6. EMPTY/LOW results → broaden, try search, or list_recent; never fabricate.
35
+ 7. SESSION END — close_session(session_id) when work meaningfully complete.
36
+
37
+ # CLI fallback (MCP unavailable)
38
+ recall→`slm recall "<q>" --limit N` · search→`slm search "<q>"` · remember→`slm remember "<c>" --tags a,b --project p --importance N` · list→`slm list --limit N` · forget→`slm forget` (preview first) · status→`slm status`. session_init/close_session are daemon-implicit (no CLI verb) — skip on MCP-down.
39
+
40
+ # What NOT to do
41
+ Never session_init twice; never forget dry_run=False without reporting preview; never dump a whole file into remember; never invent a memory; never claim "saved" without success:true / clean CLI exit.
42
+
43
+ SuperLocalMemory v3.6.14 · Qualixar · AGPL-3.0-or-later
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: slm-optimize-advisor
3
+ description: >
4
+ Applies SuperLocalMemory's context-optimization rules — reversible
5
+ compression of large tool output and KV-caching of repeated reads/searches —
6
+ to stretch the context window with no proxy. Delegate here when context is
7
+ filling up or the same files/searches are read repeatedly. Strictly advisory
8
+ and fail-open: optimization must never block the primary task.
9
+ tools: slm_compress, slm_retrieve, slm_cache_set, slm_cache_get, slm_optimize_stats, Read, Bash
10
+ model: inherit
11
+ ---
12
+
13
+ # Role
14
+ You are the SLM optimize advisor. You reduce context-window pressure using Surface-B tools: reversible compression (CCR) and a per-agent KV cache. No proxy; full 1M window preserved on any plan. You apply the same rules as the slm-compress and slm-cache skills. You cannot cache the primary Claude turn (needs a proxy) — only content the agent routes through SLM.
15
+
16
+ # When to act
17
+ Tool/file read >~2000 chars; same file or bash/web search about to be re-read; user asks how much context saved; context tight with large outputs sitting in window.
18
+
19
+ # Tools (real SLM MCP tools, code profile)
20
+ slm_compress(content,mode,reversible,ttl_seconds)→compressed,lossy,ccr_id (mode normalize|auto|aggressive); slm_retrieve(ccr_id); slm_cache_set(key,value,ttl_seconds); slm_cache_get(key)→hit,value; slm_optimize_stats(); Read/Bash to fetch content.
21
+
22
+ # Decision rules (the 8 — apply automatically)
23
+ 1. CLAUDE.md >3000 chars → slm_compress(mode="normalize", reversible=False), use compressed IN CONTEXT ONLY; never modify the file.
24
+ 2. Tool output >2000 chars → slm_compress(mode="auto", reversible=True); work from compressed; keep ccr_id if lossy.
25
+ 3. Repeated file reads → slm_cache_get("file:<path>") first; on miss Read then slm_cache_set("file:<path>", ttl 1800); invalidate on Edit/Write.
26
+ 4. Repeated bash/web → slm_cache_set("bash:<cmd[:64]>", ttl 600); web ttl 3600.
27
+ 5. Retrieve original only when byte-identical needed.
28
+ 6. NEVER compress/cache: code for Edit/Write; JSON to parse; secrets/keys/tokens; ccr_ids; <500 chars.
29
+ 7. Stats → slm_optimize_stats() (KV this-session; proxy/compress daemon-persisted).
30
+ 8. FAIL-OPEN: ok:false → continue with original, no retry, don't surface unless asked. Never block the task.
31
+
32
+ # CLI fallback
33
+ stats→`slm optimize status`/`savings` · compress→`slm compress` · cache→`slm cache ...`. If CLI also fails, drop optimization silently (rule 8).
34
+
35
+ # What NOT to do
36
+ Never compress code-for-edit/JSON-to-parse/<500 chars; never store secrets/ccr_ids; never let optimize failure block/alter the task; never claim a specific savings %.
37
+
38
+ SuperLocalMemory v3.6.14 · Qualixar · AGPL-3.0-or-later
@@ -0,0 +1,14 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/scripts/ensure-venv.sh\""
9
+ }
10
+ ]
11
+ }
12
+ ]
13
+ }
14
+ }
@@ -0,0 +1 @@
1
+ superlocalmemory==3.6.14
@@ -0,0 +1,122 @@
1
+ @echo off
2
+ :: ensure-venv.bat — WP-F SuperLocalMemory plugin venv bootstrap (Windows)
3
+ ::
4
+ :: Windows equivalent of ensure-venv.sh. Called by Claude Code SessionStart hook
5
+ :: on Windows hosts. Idempotent: fast-path exits quickly when requirements.txt
6
+ :: is unchanged (sentinel file guards reinstall).
7
+ ::
8
+ :: Environment (set by Claude Code plugin runtime):
9
+ :: CLAUDE_PLUGIN_ROOT — plugin installation dir (ephemeral, contains scripts\ + requirements.txt)
10
+ :: CLAUDE_PLUGIN_DATA — persistent data dir (venv lives here, survives plugin updates)
11
+ ::
12
+ :: Exit codes: 0 = venv ready non-0 = failure (logged to stderr)
13
+ :: All informational output goes to stderr (stdout reserved for MCP stdio protocol).
14
+ ::
15
+ :: Requires: Python 3.11+ on PATH, pip, standard Windows cmd.exe
16
+
17
+ setlocal EnableDelayedExpansion
18
+
19
+ :: ---------------------------------------------------------------------------
20
+ :: Guard: required env vars must be set
21
+ :: ---------------------------------------------------------------------------
22
+ if not defined CLAUDE_PLUGIN_ROOT (
23
+ echo ERROR: CLAUDE_PLUGIN_ROOT must be set ^(plugin installation directory^) >&2
24
+ exit /b 1
25
+ )
26
+ if not defined CLAUDE_PLUGIN_DATA (
27
+ echo ERROR: CLAUDE_PLUGIN_DATA must be set ^(plugin persistent data directory^) >&2
28
+ exit /b 1
29
+ )
30
+
31
+ :: ---------------------------------------------------------------------------
32
+ :: Python >= 3.11 guard
33
+ :: ---------------------------------------------------------------------------
34
+ python -c "import sys; sys.exit(0 if sys.version_info >= (3, 11) else 1)" 2>nul
35
+ if errorlevel 1 (
36
+ for /f "tokens=*" %%v in ('python --version 2^>^&1') do set PY_VER=%%v
37
+ echo ERROR: SuperLocalMemory plugin requires Python ^>= 3.11, found: !PY_VER! >&2
38
+ echo Install Python 3.11+ and ensure it is first on PATH. >&2
39
+ exit /b 1
40
+ )
41
+
42
+ :: ---------------------------------------------------------------------------
43
+ :: Paths
44
+ :: ---------------------------------------------------------------------------
45
+ set "REQ=%CLAUDE_PLUGIN_ROOT%\requirements.txt"
46
+ set "VENV=%CLAUDE_PLUGIN_DATA%\venv"
47
+ set "VENV_SCRIPTS=%VENV%\Scripts"
48
+ set "SENTINEL=%CLAUDE_PLUGIN_DATA%\.venv-reqs.sha256"
49
+ set "VENV_TMP=%CLAUDE_PLUGIN_DATA%\venv.tmp"
50
+
51
+ :: ---------------------------------------------------------------------------
52
+ :: Compute sha256 of requirements.txt using PowerShell (built-in on Windows 10+)
53
+ :: Output: hex string of SHA256 hash
54
+ :: ---------------------------------------------------------------------------
55
+ for /f "usebackq tokens=*" %%h in (
56
+ `powershell -NoProfile -Command "(Get-FileHash -Algorithm SHA256 '%REQ%').Hash.ToLower()"`
57
+ ) do set "NEW_HASH=%%h"
58
+
59
+ if "!NEW_HASH!"=="" (
60
+ echo ERROR: Could not compute sha256 of requirements.txt >&2
61
+ exit /b 1
62
+ )
63
+
64
+ :: ---------------------------------------------------------------------------
65
+ :: Fast-path: venv Scripts\python.exe exists AND sentinel matches
66
+ :: ---------------------------------------------------------------------------
67
+ set "VENV_PYTHON=%VENV_SCRIPTS%\python.exe"
68
+ if exist "%VENV_PYTHON%" (
69
+ if exist "%SENTINEL%" (
70
+ set /p "CURRENT_HASH=" < "%SENTINEL%"
71
+ if "!CURRENT_HASH!"=="!NEW_HASH!" (
72
+ echo SLM plugin: venv up-to-date, skipping install. >&2
73
+ exit /b 0
74
+ )
75
+ )
76
+ )
77
+
78
+ :: ---------------------------------------------------------------------------
79
+ :: Rebuild venv atomically: install to venv.tmp, rename to venv, write sentinel LAST
80
+ :: ---------------------------------------------------------------------------
81
+ echo SLM plugin: bootstrapping Python venv at %VENV% ... >&2
82
+ echo requirements: %REQ% >&2
83
+
84
+ :: Clean up any partial previous attempt
85
+ if exist "%VENV_TMP%" rmdir /s /q "%VENV_TMP%"
86
+
87
+ :: Create fresh venv
88
+ python -m venv "%VENV_TMP%"
89
+ if errorlevel 1 (
90
+ echo ERROR: python -m venv failed >&2
91
+ exit /b 1
92
+ )
93
+
94
+ :: Upgrade pip first
95
+ "%VENV_TMP%\Scripts\pip.exe" install --upgrade pip --prefer-binary --quiet
96
+ if errorlevel 1 (
97
+ echo ERROR: pip upgrade failed >&2
98
+ exit /b 1
99
+ )
100
+
101
+ :: Install requirements
102
+ "%VENV_TMP%\Scripts\pip.exe" install --require-virtualenv --prefer-binary --quiet -r "%REQ%"
103
+ if errorlevel 1 (
104
+ echo ERROR: pip install requirements failed >&2
105
+ exit /b 1
106
+ )
107
+
108
+ echo SLM plugin: install complete, activating venv. >&2
109
+
110
+ :: Atomic swap: remove old venv (if any), rename tmp into place
111
+ if exist "%VENV%" rmdir /s /q "%VENV%"
112
+ move "%VENV_TMP%" "%VENV%"
113
+ if errorlevel 1 (
114
+ echo ERROR: Could not move venv.tmp to venv >&2
115
+ exit /b 1
116
+ )
117
+
118
+ :: Write sentinel LAST — guarantees that a crash before this line triggers rebuild
119
+ echo !NEW_HASH!>"%SENTINEL%"
120
+
121
+ echo SLM plugin: venv ready at %VENV%\Scripts\slm.exe >&2
122
+ exit /b 0
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env bash
2
+ # ensure-venv.sh — WP-06 SuperLocalMemory plugin venv bootstrap
3
+ #
4
+ # Called by Claude Code SessionStart hook. Idempotent: fast-path exits in <100ms
5
+ # on repeat invocations when requirements.txt is unchanged.
6
+ #
7
+ # Environment (set by Claude Code plugin runtime):
8
+ # CLAUDE_PLUGIN_ROOT — plugin installation dir (ephemeral, contains scripts/ + requirements.txt)
9
+ # CLAUDE_PLUGIN_DATA — persistent data dir (venv lives here, survives plugin updates)
10
+ #
11
+ # Exit codes: 0 = venv ready non-0 = failure (logged to stderr)
12
+ # All output goes to stderr only (stdout reserved for MCP stdio protocol).
13
+
14
+ set -euo pipefail
15
+
16
+ # ---------------------------------------------------------------------------
17
+ # :? guard — fail loudly if required env vars are unset or empty
18
+ # ---------------------------------------------------------------------------
19
+ : "${CLAUDE_PLUGIN_ROOT:?CLAUDE_PLUGIN_ROOT must be set (plugin installation directory)}"
20
+ : "${CLAUDE_PLUGIN_DATA:?CLAUDE_PLUGIN_DATA must be set (plugin persistent data directory)}"
21
+
22
+ # ---------------------------------------------------------------------------
23
+ # Redirect all output to stderr (MCP uses stdout for protocol messages)
24
+ # ---------------------------------------------------------------------------
25
+ exec 1>&2
26
+
27
+ # ---------------------------------------------------------------------------
28
+ # Python >= 3.11 guard
29
+ # ---------------------------------------------------------------------------
30
+ if ! python3 -c "import sys; sys.exit(0 if sys.version_info >= (3, 11) else 1)" 2>/dev/null; then
31
+ PY_VER=$(python3 --version 2>&1 || echo "unknown")
32
+ echo "ERROR: SuperLocalMemory plugin requires Python >= 3.11, found: ${PY_VER}" >&2
33
+ echo "Install Python 3.11+ and ensure it is first on PATH." >&2
34
+ exit 1
35
+ fi
36
+
37
+ # ---------------------------------------------------------------------------
38
+ # Paths
39
+ # ---------------------------------------------------------------------------
40
+ REQ="${CLAUDE_PLUGIN_ROOT}/requirements.txt"
41
+ VENV="${CLAUDE_PLUGIN_DATA}/venv"
42
+ SENTINEL="${CLAUDE_PLUGIN_DATA}/.venv-reqs.sha256"
43
+ VENV_TMP="${CLAUDE_PLUGIN_DATA}/venv.tmp"
44
+
45
+ # ---------------------------------------------------------------------------
46
+ # Compute sha256 of requirements.txt (cross-platform: prefer sha256sum, fall back to shasum -a 256)
47
+ # ---------------------------------------------------------------------------
48
+ hash_req() {
49
+ if command -v sha256sum >/dev/null 2>&1; then
50
+ sha256sum "${REQ}" | awk '{print $1}'
51
+ else
52
+ shasum -a 256 "${REQ}" | awk '{print $1}'
53
+ fi
54
+ }
55
+
56
+ NEW_HASH=$(hash_req)
57
+
58
+ # ---------------------------------------------------------------------------
59
+ # Fast-path: venv python exists AND sentinel matches current requirements hash
60
+ # venv/bin/python3 (or python) is always present after `python3 -m venv`;
61
+ # the sentinel guards against stale requirements.
62
+ # In production, superlocalmemory also installs venv/bin/slm; both checks pass.
63
+ # ---------------------------------------------------------------------------
64
+ VENV_PYTHON="${VENV}/bin/python3"
65
+ if [ ! -x "${VENV_PYTHON}" ]; then
66
+ VENV_PYTHON="${VENV}/bin/python"
67
+ fi
68
+ if [ -x "${VENV_PYTHON}" ] && [ -f "${SENTINEL}" ] && [ "$(cat "${SENTINEL}")" = "${NEW_HASH}" ]; then
69
+ echo "SLM plugin: venv up-to-date (sha256=${NEW_HASH:0:12}…), skipping install." >&2
70
+ exit 0
71
+ fi
72
+
73
+ # ---------------------------------------------------------------------------
74
+ # Rebuild venv atomically: install to venv.tmp, rename to venv, write sentinel LAST
75
+ # ---------------------------------------------------------------------------
76
+ echo "SLM plugin: bootstrapping Python venv at ${VENV} …" >&2
77
+ echo " requirements: ${REQ}" >&2
78
+ echo " python3: $(python3 --version 2>&1)" >&2
79
+
80
+ # Clean up any partial previous attempt
81
+ rm -rf "${VENV_TMP}"
82
+
83
+ # Create fresh venv
84
+ python3 -m venv "${VENV_TMP}"
85
+
86
+ # Upgrade pip first (prefer binary to avoid source builds)
87
+ "${VENV_TMP}/bin/pip" install --upgrade pip --prefer-binary --quiet
88
+
89
+ # Install requirements
90
+ "${VENV_TMP}/bin/pip" install \
91
+ --require-virtualenv \
92
+ --prefer-binary \
93
+ --quiet \
94
+ -r "${REQ}"
95
+
96
+ echo "SLM plugin: install complete, activating venv." >&2
97
+
98
+ # Atomic swap: remove old venv (if any), rename tmp into place
99
+ rm -rf "${VENV}"
100
+ mv "${VENV_TMP}" "${VENV}"
101
+
102
+ # Write sentinel LAST — guarantees that a crash before this line triggers rebuild
103
+ echo "${NEW_HASH}" > "${SENTINEL}"
104
+
105
+ echo "SLM plugin: venv ready at ${VENV}/bin/slm" >&2
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bash
2
+ # slm-launch — WP-F SuperLocalMemory MCP launcher (POSIX)
3
+ #
4
+ # Cross-platform counterpart: slm-launch.bat (Windows)
5
+ # Referenced by plugin/.mcp.json as the MCP server command.
6
+ #
7
+ # Resolves the correct venv binary for POSIX:
8
+ # ${CLAUDE_PLUGIN_DATA}/venv/bin/slm mcp
9
+ #
10
+ # On Windows, Claude Code invokes slm-launch.bat instead (same-stem, .bat extension).
11
+ #
12
+ # Environment:
13
+ # CLAUDE_PLUGIN_DATA — persistent data dir where venv lives
14
+
15
+ exec "${CLAUDE_PLUGIN_DATA}/venv/bin/slm" mcp
@@ -0,0 +1,17 @@
1
+ @echo off
2
+ :: slm-launch.bat — WP-F SuperLocalMemory MCP launcher (Windows)
3
+ ::
4
+ :: Cross-platform counterpart: slm-launch (POSIX bash)
5
+ :: Referenced by plugin/.mcp.json as the MCP server command (Windows picks .bat automatically).
6
+ ::
7
+ :: Resolves the correct venv binary for Windows:
8
+ :: %CLAUDE_PLUGIN_DATA%\venv\Scripts\slm.exe mcp
9
+ ::
10
+ :: On Windows, Python venv places entry points in Scripts\ (not bin\ like POSIX).
11
+ :: This launcher bridges the path difference so ONE .mcp.json command field works
12
+ :: cross-platform.
13
+ ::
14
+ :: Environment:
15
+ :: CLAUDE_PLUGIN_DATA — persistent data dir where venv lives
16
+
17
+ "%CLAUDE_PLUGIN_DATA%\venv\Scripts\slm.exe" mcp
@@ -0,0 +1,16 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "mcp__superlocalmemory__remember",
5
+ "mcp__superlocalmemory__recall",
6
+ "mcp__superlocalmemory__search",
7
+ "mcp__superlocalmemory__session_init",
8
+ "mcp__superlocalmemory__slm_compress",
9
+ "mcp__superlocalmemory__slm_retrieve",
10
+ "mcp__superlocalmemory__slm_cache_get",
11
+ "mcp__superlocalmemory__slm_cache_set",
12
+ "mcp__superlocalmemory__slm_optimize_stats",
13
+ "Bash(slm:*)"
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: slm-cache
3
+ description: KV cache for repeated reads — call slm_cache_get(key) first; on a miss do the expensive operation then slm_cache_set(key, value, ttl_seconds) to store it; on a hit use the returned value directly; always fail-open (hit:false on any error, never raises); saves tokens when the same file, query result, or tool output is read more than once in a session.
4
+ when_to_use: "cache file, avoid re-reading, repeated read, cache result, cache tool output, save re-read, reuse across session, cache check, cache hit, cache miss"
5
+ allowed-tools: slm_cache_set, slm_cache_get, Bash
6
+ ---
7
+
8
+ # slm-cache — KV Cache for Repeated Reads (Surface B)
9
+
10
+ ## Purpose
11
+
12
+ When the same file, query result, or expensive tool output is needed more than once in a session, fetching it again wastes tokens and time. `slm_cache_set` stores a result under a stable key; `slm_cache_get` retrieves it on subsequent calls. The cache is agent-scoped (automatically namespaced by tenant/agent ID), TTL-bounded, and fail-open.
13
+
14
+ This is an agent-routed cache — it caches results the agent explicitly routes through SLM. It cannot cache Claude conversation turns.
15
+
16
+ ## Tool: slm_cache_set
17
+
18
+ ```
19
+ slm_cache_set(
20
+ key: str, # required — cache key (max 512 chars)
21
+ value: str, # required — value to store (max 1 MB)
22
+ ttl_seconds: int = 86400, # time-to-live in seconds (default 24 h)
23
+ ) -> dict
24
+ ```
25
+
26
+ ### Return dict
27
+
28
+ | Key | Type | Meaning |
29
+ |-----|------|---------|
30
+ | `ok` | bool | `True` on success; `False` on validation error or internal error |
31
+ | `stored` | bool | `True` when the value was written to the cache |
32
+ | `note` | str \| None | Error detail or `None` on success |
33
+
34
+ Keys are SHA-256-hashed internally per agent so they do not collide across agents. The raw key string you supply is the only handle you need.
35
+
36
+ ## Tool: slm_cache_get
37
+
38
+ ```
39
+ slm_cache_get(
40
+ key: str, # required — same key used in slm_cache_set
41
+ ) -> dict
42
+ ```
43
+
44
+ ### Return dict
45
+
46
+ | Key | Type | Meaning |
47
+ |-----|------|---------|
48
+ | `ok` | bool | `True` on clean execution (including miss); `False` on internal error |
49
+ | `hit` | bool | `True` when the key exists and has not expired |
50
+ | `value` | str \| None | The stored value on a hit; `None` on miss |
51
+ | `note` | str \| None | Error detail or `None` |
52
+
53
+ A miss returns `{"ok": true, "hit": false, "value": null, "note": null}`. `ok: false` means something went wrong internally but the miss behaviour is the same — treat both as a cache miss and proceed with the real fetch.
54
+
55
+ ## Standard Pattern: Cache-Aside
56
+
57
+ Always check the cache first, then fill on miss:
58
+
59
+ ```python
60
+ # 1. Check cache
61
+ cached = await slm_cache_get(key="file:/absolute/path/to/config.json")
62
+
63
+ if cached["hit"]:
64
+ content = cached["value"]
65
+ else:
66
+ # 2. Expensive operation (file read, search, API call)
67
+ content = read_file("/absolute/path/to/config.json")
68
+
69
+ # 3. Store for the rest of the session
70
+ await slm_cache_set(
71
+ key="file:/absolute/path/to/config.json",
72
+ value=content,
73
+ ttl_seconds=3600, # 1 h — adjust to data volatility
74
+ )
75
+
76
+ # 4. Use content
77
+ ```
78
+
79
+ ## Key Naming Convention
80
+
81
+ Use a stable, human-readable prefix so keys are recognisable in stats and won't collide accidentally:
82
+
83
+ | Content type | Suggested prefix | Example |
84
+ |---|---|---|
85
+ | File read | `file:` | `file:/repo/src/config.py` |
86
+ | Search result | `search:` | `search:recall:session_init_context` |
87
+ | Tool output | `tool:` | `tool:build_code_graph:/repo` |
88
+ | External fetch | `url:` | `url:https://api.example.com/v1/data` |
89
+
90
+ Key length cap: 512 characters. Keys longer than that are rejected (`ok: false`).
91
+
92
+ ## When Caching Pays Off
93
+
94
+ **Cache when:**
95
+ - You will read the same file more than once in a session.
96
+ - A search or recall result is reused across multiple reasoning steps.
97
+ - An expensive MCP tool call (graph build, semantic search) produces output that is stable for the session duration.
98
+
99
+ **Do NOT cache:**
100
+ - Volatile data (live API responses that change minute-to-minute, current timestamps, streaming output).
101
+ - Secrets, credentials, tokens, or `ccr_id` values (CCR already handles its own storage).
102
+ - Data that must be fresh for correctness — a stale cache is worse than a cache miss.
103
+ - Intermediate scratchpad text you will discard.
104
+
105
+ ## Fail-Open Guarantee
106
+
107
+ Neither tool raises an exception. On any internal error:
108
+
109
+ - `slm_cache_get` returns `{"ok": false, "hit": false, "value": null, ...}` — treat as a miss and proceed with the real fetch.
110
+ - `slm_cache_set` returns `{"ok": false, "stored": false, ...}` — log the note if useful, but continue; the value is still available in memory this step.
111
+
112
+ Never block a task on a cache failure.
113
+
114
+ ## TTL Guidance
115
+
116
+ | Data type | Suggested TTL |
117
+ |---|---|
118
+ | Static config / generated file | 86400 s (24 h — the default) |
119
+ | Session-specific tool output | 3600 s (1 h) |
120
+ | Rapidly changing API data | Do not cache, or 60–300 s |
121
+
122
+ Set `ttl_seconds` to match how long the data remains valid. After expiry `slm_cache_get` returns a miss automatically.
123
+
124
+ ## Secondary CLI (fallback when MCP is unavailable)
125
+
126
+ The `slm cache` subcommand exists but has known pre-existing parse-test failures. Prefer the MCP tools above. If you must use CLI:
127
+
128
+ ```bash
129
+ slm cache status [--json] [--tenant default]
130
+ slm cache clear [--json] [--tenant default]
131
+ slm cache invalidate --tag <tag> [--json] [--tenant default]
132
+ slm cache ttl --set <seconds> [--semantic <seconds>] [--json] [--tenant default]
133
+ slm cache semantic on|off [--json] [--tenant default]
134
+ ```
135
+
136
+ These subcommands control daemon-level cache settings. They do not read or write individual cache entries — use the MCP tools for that.
137
+
138
+ ---
139
+
140
+ SuperLocalMemory v3.6.14 · Qualixar · AGPL-3.0-or-later