superlocalmemory 4.1.0 → 4.1.3

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 (47) hide show
  1. package/.claude-plugin/marketplace.json +29 -1
  2. package/CHANGELOG.md +107 -0
  3. package/README.md +37 -72
  4. package/ide/configs/codex-mcp.toml +3 -1
  5. package/package.json +4 -3
  6. package/plugin/.claude-plugin/plugin.json +1 -1
  7. package/plugin/.mcp.json +1 -3
  8. package/plugin/CLAUDE.md +3 -3
  9. package/plugin/agents/slm-governance-advisor.md +1 -1
  10. package/plugin/agents/slm-loop-runner.md +1 -1
  11. package/plugin/agents/slm-memory-advisor.md +1 -1
  12. package/plugin/agents/slm-optimize-advisor.md +1 -1
  13. package/plugin/requirements.txt +1 -1
  14. package/plugin/scripts/slm-launch +100 -31
  15. package/plugin/skills/slm-cache/SKILL.md +1 -1
  16. package/plugin/skills/slm-compress/SKILL.md +1 -1
  17. package/plugin/skills/slm-governance/SKILL.md +1 -1
  18. package/plugin/skills/slm-graph/SKILL.md +1 -1
  19. package/plugin/skills/slm-loop/SKILL.md +1 -1
  20. package/plugin/skills/slm-mesh/SKILL.md +1 -1
  21. package/plugin/skills/slm-profile/SKILL.md +1 -1
  22. package/plugin/skills/slm-recall/SKILL.md +1 -1
  23. package/plugin/skills/slm-remember/SKILL.md +1 -1
  24. package/plugin/skills/slm-scope/SKILL.md +1 -1
  25. package/plugin/skills/slm-session/SKILL.md +1 -1
  26. package/plugin/skills/slm-status/SKILL.md +1 -1
  27. package/plugin-src/rules/AGENTS.md +1 -1
  28. package/plugin-src/skills/slm-cache/SKILL.md +1 -1
  29. package/plugin-src/skills/slm-compress/SKILL.md +1 -1
  30. package/plugin-src/skills/slm-governance/SKILL.md +1 -1
  31. package/plugin-src/skills/slm-graph/SKILL.md +1 -1
  32. package/plugin-src/skills/slm-loop/SKILL.md +1 -1
  33. package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
  34. package/plugin-src/skills/slm-profile/SKILL.md +1 -1
  35. package/plugin-src/skills/slm-recall/SKILL.md +1 -1
  36. package/plugin-src/skills/slm-remember/SKILL.md +1 -1
  37. package/plugin-src/skills/slm-scope/SKILL.md +1 -1
  38. package/plugin-src/skills/slm-session/SKILL.md +1 -1
  39. package/plugin-src/skills/slm-status/SKILL.md +1 -1
  40. package/pyproject.toml +1 -1
  41. package/src/superlocalmemory/__init__.py +1 -1
  42. package/src/superlocalmemory/cli/commands.py +94 -0
  43. package/src/superlocalmemory/server/recall_health.py +87 -10
  44. package/src/superlocalmemory/server/unified_daemon.py +55 -2
  45. package/src/superlocalmemory/storage/_migration_internals.py +23 -2
  46. package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +60 -36
  47. package/src/superlocalmemory/storage/schema.py +23 -0
@@ -10,8 +10,36 @@
10
10
  "name": "Qualixar"
11
11
  },
12
12
  "description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server. 34-tool code profile with graph intelligence.",
13
+ "homepage": "https://github.com/qualixar/superlocalmemory",
14
+ "keywords": [
15
+ "memory",
16
+ "mcp",
17
+ "agents",
18
+ "local-first",
19
+ "context-compression"
20
+ ],
21
+ "license": "AGPL-3.0-or-later",
13
22
  "name": "superlocalmemory",
14
- "source": "./plugin"
23
+ "source": "./plugin",
24
+ "version": "4.1.3"
25
+ },
26
+ {
27
+ "author": {
28
+ "name": "Qualixar"
29
+ },
30
+ "description": "Local-first agent memory with auditable hybrid retrieval — the Codex build, with Codex-shaped rules, hooks and launcher.",
31
+ "homepage": "https://github.com/qualixar/superlocalmemory",
32
+ "keywords": [
33
+ "memory",
34
+ "mcp",
35
+ "agents",
36
+ "local-first",
37
+ "context-compression"
38
+ ],
39
+ "license": "AGPL-3.0-or-later",
40
+ "name": "superlocalmemory-codex",
41
+ "source": "./codex-plugin",
42
+ "version": "4.1.3"
15
43
  }
16
44
  ]
17
45
  }
package/CHANGELOG.md CHANGED
@@ -5,6 +5,113 @@ All notable changes to SuperLocalMemory will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [4.1.3] — Your install, your tools, your memories
9
+
10
+ ### Fixed
11
+ - **Installing the plugin could point your editor at a different, empty set of
12
+ memories.** Its server configuration pinned a data directory of its own, so on
13
+ a machine already using SLM the editor read somewhere else entirely — measured
14
+ here, that directory held 28 KB while the real one held 611 MB and 5,370
15
+ memories. Nothing failed and nothing warned; it simply looked like everything
16
+ was gone. The plugin no longer says where your memories live.
17
+ - **Installing the plugin could take away tools you had turned on.** Three of the
18
+ four editor builds forced a narrower tool set — 31 tools, without the eight for
19
+ coordinating between sessions. If you had deliberately enabled more, installing
20
+ something removed them. No build states an opinion about this any more.
21
+ - **Installing the plugin could give you a second copy of SuperLocalMemory.** Two
22
+ launchers preferred a private environment of their own over the one you already
23
+ had from `pip`, `pipx` or `npm`. So a machine that had ever created one kept
24
+ using it — including after you upgraded properly — and two copies read the same
25
+ memories, with whichever started first deciding which one answered. Both now
26
+ use what you already have, in either install order, and fall back to their own
27
+ only on a machine with none. When a leftover copy is found beside a real
28
+ install, it is named, with both version numbers, instead of being used quietly.
29
+ - **The plugin would not start at all outside Claude Code.** The path it built
30
+ came from a setting only Claude Code provides, so on Codex and Antigravity it
31
+ pointed nowhere and the server never came up — with no error explaining why.
32
+ - **Codex reported itself as Claude Code.** The catalogue offered one build, the
33
+ Claude Code one, so Codex installed that and every memory written from Codex was
34
+ filed under the wrong tool. Codex now has its own entry and its own build,
35
+ with the Codex-shaped rules, hooks and launcher that were never being delivered.
36
+
37
+ ### Changed
38
+ - **Antigravity is supported.** It had no plugin at all. It now has the same
39
+ twelve skills, four sub-agents, command and hooks as every other editor.
40
+
41
+ ## [4.1.2] — The monitor that was watching nothing
42
+
43
+ ### Fixed
44
+ - **A killed embedding worker was never brought back, and nothing said so.** The
45
+ worker is stopped on an idle timeout roughly every hour, by design, and a
46
+ background monitor exists to revive it. That monitor decided whether anything
47
+ was wrong by looking at a probe search: results with no meaning-score meant a
48
+ broken embedder. But it explicitly did not count *no results at all* — and no
49
+ results is what a dead embedder produces, because the meaning channel returns
50
+ nothing and the probe phrase appears in nobody's memories. So the one symptom
51
+ that should have started a repair was read as proof that none was needed, and
52
+ because a clean verdict is silent, it left no trace. Observed on a machine that
53
+ sat for over an hour, across two restarts, with searching by meaning switched
54
+ off, no explanation in the log, and a manual restart the only cure. The monitor
55
+ now asks the embedder directly, which is a question a search cannot answer.
56
+ - **There was no way to tell a quiet monitor from a dead one.** A check that
57
+ finds nothing wrong writes nothing, which is right — a monitor that narrates
58
+ every success is one whose warnings get skimmed past. But it left "is it even
59
+ running?" unanswerable except by waiting for something to break. The time of
60
+ the last check is now reported, so it can be looked at instead of inferred.
61
+ - **A failing repair would not say what it was failing.** When a completed
62
+ upgrade step stops holding, the report named the step and not the condition —
63
+ and that step checks five separate things. Anyone who hit it had to come back
64
+ and ask which. It now says which.
65
+ - **One drifted row could make the whole store unreachable.** Any failed upgrade
66
+ step made every request return "service unavailable". That is right when a
67
+ table is missing. It is wrong for the checks that guard *data* rather than
68
+ structure — ordinary use can undo those, a single background pass being
69
+ enough — and it left people restarting a daemon to fix something a restart
70
+ could not fix. Structural failures still refuse; a data check that drifted now
71
+ reports itself and keeps serving while it is repaired. Anything that does not
72
+ say which kind it is still refuses, so nothing became more permissive by
73
+ accident.
74
+
75
+ ### Changed
76
+ - **The plugin now installs and lists everywhere it should.** It is the main way
77
+ to get SLM, and it was only half-delivered:
78
+ - **Codex could not see it at all.** Codex reads `.codex-plugin/plugin.json` to
79
+ register a plugin and that file did not exist, so twelve skills, the hooks,
80
+ the launcher and the server config were all installed and none of it appeared
81
+ under Plugins. There was nothing to enable.
82
+ - **Codex was also missing two thirds of the product.** It shipped skills and
83
+ neither the four sub-agents nor the slash command. Both come from the same
84
+ single source as the Claude Code copies now, so they cannot drift.
85
+ - **Antigravity had no plugin at all.** It has one now, with the same skills,
86
+ agents, commands and hooks as every other surface.
87
+ - **VS Code was missing the slash command.**
88
+ - **Every release looked like no release.** The marketplace entry carried no
89
+ version, so a client had nothing to compare and an installed plugin never
90
+ appeared out of date. This reverses a rule of our own making; the version is
91
+ now stated, and one script owns every place that states it.
92
+ - **`slm doctor` now says whether your skills are as new as your install.** The
93
+ skills, agents and commands are delivered by your editor, not by `pip`, so
94
+ upgrading the package leaves them untouched — and nothing had ever mentioned
95
+ that. This release changed 76 files across them. Doctor now reports the plugin
96
+ version beside the package version and names the command that updates it.
97
+
98
+ ## [4.1.1] — A store older than its own indexes
99
+
100
+ ### Fixed
101
+ - **A store from an early version could not be opened at all, and there was no
102
+ way out of it.** Starting up creates the indexes, one of which is on a column
103
+ that arrives with a migration scheduled to run *after* the engine is up. On a
104
+ store old enough to predate that column, the index could not be created, so
105
+ startup failed — and the migration that would have added the column could not
106
+ run, because it runs after a startup that never finished. `slm db migrate` did
107
+ not help either: it reports nothing failed and skips that class of migration by
108
+ design. Any store in that state was stuck on the version it was already on.
109
+ The column is now added before the index that needs it, so those stores open
110
+ and finish upgrading on their own. Measured on a real 637 MB store: it went
111
+ from refusing to start to a complete upgrade in 19 seconds, with all 7,707
112
+ memories, 2,590 records and 848,945 connections unchanged and the integrity
113
+ check clean.
114
+
8
115
  ## [4.1.0] — Every door asks the same question
9
116
 
10
117
  ### Fixed
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  </picture>
6
6
  </p>
7
7
 
8
- <h1 align="center">SuperLocalMemory V4.1.0</h1>
8
+ <h1 align="center">SuperLocalMemory V4.1.3</h1>
9
9
 
10
10
  <h2 align="center">Rent the LLM. Own the memory.</h2>
11
11
 
@@ -27,12 +27,12 @@ guarantee here is stated as a falsifiable invariant, tested under an adversarial
27
27
  negative control, and shipped with the harness that regenerates the evidence:
28
28
  <code>python benchmark/run_all.py --trials 200 --output-dir results/</code>. What each experiment
29
29
  does <em>not</em> exercise is stated too.</p>
30
- <p align="center"><code>v4.1.0</code> — one control plane: <strong>SLM-Mesh</strong> peer coordination · multi-scope memory (personal / shared / global) · profiles · Cache · Compress · 7-layer retrieval · code graph · Entity Explorer · skill evolution · Modes A/B/C · GDPR retention &amp; audit chain · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
30
+ <p align="center"><code>v4.1.3</code> — one control plane: <strong>SLM-Mesh</strong> peer coordination · multi-scope memory (personal / shared / global) · profiles · Cache · Compress · 7-layer retrieval · code graph · Entity Explorer · skill evolution · Modes A/B/C · GDPR retention &amp; audit chain · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
31
31
  Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</code> to your config &nbsp;·&nbsp; Skill: zero-config</p>
32
32
  <p align="center"><strong>Four public arXiv preprints</strong> · V4: <a href="https://arxiv.org/abs/2608.08253">arXiv:2608.08253</a> · companion archive: <a href="https://zenodo.org/records/21853302">Zenodo 21853302</a> (<a href="https://doi.org/10.5281/zenodo.21853302">DOI 10.5281/zenodo.21853302</a>) · prior preprints: <a href="https://arxiv.org/abs/2603.02240">2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">2604.04514</a>.</p>
33
33
 
34
34
  <p align="center">
35
- <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.1.0-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.1.0 — Current Release"/></a>
35
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.1.3-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.1.3 — Current Release"/></a>
36
36
  <a href="https://arxiv.org/abs/2608.08253"><img src="https://img.shields.io/badge/arXiv-2608.08253-b31b1b?style=for-the-badge&logo=arxiv&logoColor=white" alt="SuperLocalMemory 4.0 paper on arXiv:2608.08253"/></a>
37
37
  <a href="https://zenodo.org/records/21853302"><img src="https://img.shields.io/badge/Zenodo-10.5281%2Fzenodo.21853302-1682D4?style=for-the-badge&logo=zenodo&logoColor=white" alt="V4 paper on Zenodo: 10.5281/zenodo.21853302"/></a>
38
38
  <a href="https://arxiv.org/abs/2603.14588"><img src="https://img.shields.io/badge/arXiv-2603.14588-b31b1b?style=for-the-badge&logo=arxiv&logoColor=white" alt="arXiv Paper"/></a>
@@ -62,11 +62,7 @@ SuperLocalMemory V4 combines conventional dense and lexical retrieval with graph
62
62
 
63
63
  **Memory with a sense of time.** SLM does not only store *what* an agent learned — it records *when*. Every fact carries ingestion timing and provenance; recall runs a dedicated temporal candidate channel alongside semantic, lexical, and associative retrieval; scenes and entity timelines reconstruct sequence; and the lifecycle lets neglected memory decay and self-archive instead of growing without bound. Time is a first-class ranking and lifecycle signal rather than a timestamp column an agent never reads — which is what lets a long-lived agent reason about how its context changed, not only what it currently holds.
64
64
 
65
- **What V4.0.7 ships.** Three things that existed but could not be used. `slm summary` gives you a readable layer over your own memories — `day` for what you recorded today, `project` for a directory, `session` for one session — each stating how much of the underlying data it could actually see, with `--json` listing the exact memories it came from. Memories that mention a function, method or file are now linked to that code, with a short description of what they point at and a marker once the code has changed; expanding a memory in the dashboard shows it. Both need no language model, so they work in the fully local mode. The code↔memory bridge behind the second one had never run at all: the setup flag was written and never read, the build discarded it, its settings had no loader, and the method it was written against was an unimplemented placeholder. Linking runs during background maintenance, never when a memory is saved. See [reviewed corrections](docs/reviewed-corrections.md) for the correction lifecycle and [MCP tools](docs/mcp-tools.md) for host-facing commands.
66
-
67
- **Fixed in V4.0.7.** Version numbers disagreed across the project — the pip requirement pins, npm lockfile, editor plugin manifest, citation metadata and lockfile all still named the previous release, so installing from `requirements.txt` fetched the wrong version; one script now sets all fifteen. Stale-memory checks reported "nothing is stale" when code linking was simply switched off, and pointed at a setting that did not exist. `slm gdpr` was missing from `slm help`. Consolidation, handed something that was neither a database handle nor a path, created a file named after the object instead of refusing it.
68
-
69
- **Carried forward from V4.0.5 and V4.0.6.** A correction is a review-gated lifecycle, not an in-place edit: SLM creates an immutable successor, keeps it out of current recall until an authenticated reviewer applies it, and preserves the predecessor for time-aware history. Every candidate path — cached context, pins, bridge and scene expansion — uses hard current-truth admission and abstains if that truth cannot be read. `slm brain`, MCP, HTTP and the Living Brain share one observation-only BrainTruth snapshot; feedback, external Bounded Loops evidence and receipt claims are shown honestly but never silently alter recall, ranking or model routing. The Living Brain leads with how many questions your memory has answered rather than a raw event count, and says so plainly where nothing has been measured yet. The knowledge graph opens reliably, with a default of 50 nodes and its details panel reachable on narrow screens. The optional adaptive ranker stays off unless an operator sets `SLM_RANKING` (`v1`, `v2`, or `v2-ensemble`) — that gate prevents feedback and observation data from changing ranking without an explicit decision, and does not disable the normal retrieval channels.
65
+ **What changed in this release.** See the [CHANGELOG](CHANGELOG.md) every release is written up there, in plain language, newest first.
70
66
 
71
67
  - **[SLM-Mesh](#slm-mesh-cross-session--cross-machine-coordination)** — authenticated cross-session and cross-machine peer coordination (messages, locks, shared state, inbox/outbox, optional discovery). Coordination only — not automatic replicated memory.
72
68
  - **Multi-scope memory & profiles** — workspaces (profiles) plus `personal` / `shared` / `global` scopes; cross-profile recall is default-deny.
@@ -300,7 +296,7 @@ retrieved at runtime rather than copied into those files.
300
296
  **Score Contract v2:** `relevance_score` is query-relative relevance;
301
297
  `ranking_score` is internal ranking utility; `memory_confidence` belongs to the
302
298
  stored assertion; and `trust_score` is an evidence-policy signal. Legacy
303
- `score` and `confidence` remain aliases for one compatibility release. V3.8.0 is
299
+ `score` and `confidence` remain aliases for one compatibility release. It is
304
300
  explicitly uncalibrated: `calibration_status` is `uncalibrated` and
305
301
  `answer_confidence` is `null`. See
306
302
  [the retrieval score contract](docs/retrieval-score-contract.md).
@@ -314,9 +310,9 @@ can run without a cloud LLM:
314
310
 
315
311
  Auto-capture hooks are installed explicitly with `slm hooks install` (Claude
316
312
  Code) or `slm hooks install --agent codex` (Codex). Hook latency and capture
317
- quality must be evaluated for the target client and workload; V3.8.0 publishes no universal p99 claim.
313
+ quality must be evaluated for the target client and workload; SLM publishes no universal p99 claim.
318
314
 
319
- **Multi-scope memory (v3.6.15, opt-in):** keep memories `personal` (default), `shared` with named profiles, or `global` across the machine. Off by default — recall only ever returns your own facts until you turn sharing on, per call or in config. See **[docs/shared-memory.md](docs/shared-memory.md)**.
315
+ **Multi-scope memory (opt-in):** keep memories `personal` (default), `shared` with named profiles, or `global` across the machine. Off by default — recall only ever returns your own facts until you turn sharing on, per call or in config. See **[docs/shared-memory.md](docs/shared-memory.md)**.
320
316
 
321
317
  <a id="multilingual-embedding-support"></a>
322
318
 
@@ -422,7 +418,7 @@ and the Claude Code plugin update path.
422
418
 
423
419
  SLM supports two MCP transports:
424
420
 
425
- **HTTP (recommended, v3.6.7+):**
421
+ **HTTP (recommended):**
426
422
  ```json
427
423
  { "mcpServers": { "superlocalmemory": { "type": "http", "url": "http://127.0.0.1:8765/mcp/" } } }
428
424
  ```
@@ -461,77 +457,46 @@ Per-IDE configs available for Claude Code, Cursor, Windsurf, VS Code Copilot, Co
461
457
 
462
458
  ---
463
459
 
464
- ## Claude Code Plugin
460
+ ## Editor plugins
465
461
 
466
- Install directly in Claude Code no system-level npm/pip needed. This is how you
467
- get the **skills, agents, hooks, commands, and rules** (the MCP server is
468
- bootstrapped automatically). It is a two-step flow — add the marketplace once,
469
- then install:
462
+ The plugin is how most people should install SLM. It brings the MCP server, the
463
+ skills, the sub-agents, the slash commands and the hooks in one step, and keeps
464
+ them at the same version as the package.
470
465
 
471
- ```bash
472
- # 1. Add the Qualixar marketplace (one-time — the repo IS the marketplace)
473
- /plugin marketplace add qualixar/superlocalmemory
474
-
475
- # 2. Install the plugin
476
- /plugin install superlocalmemory@qualixar
477
- ```
466
+ **Four surfaces, one source.** Everything below is generated from `plugin-src/`,
467
+ so no surface can quietly fall behind another:
478
468
 
479
- - Self-bootstraps a Python venv, installs all deps in an isolated `SLM_DATA_DIR`
480
- - Registers the 34-tool `code` MCP surface — the 18-tool `core` memory surface plus code-graph, portable-evidence, bounded-loop and usefulness-report tools
481
- - Ships the SLM skills / agents / hooks / commands / rules
482
- - Additive does not replace an existing SLM install
483
- - `slm connect claude-code` detects an existing plugin install and links them
469
+ | Editor | Install | Skills | Agents | Commands | Hooks |
470
+ |---|---|---:|---:|---:|---:|
471
+ | **Claude Code** | `claude plugin marketplace add qualixar/superlocalmemory` then `claude plugin install superlocalmemory@qualixar` | 12 | 4 | 1 | yes |
472
+ | **Codex** | copy `codex-plugin/` into your Codex plugins directory | 12 | 4 | 1 | yes |
473
+ | **VS Code / Copilot** | copy `copilot-plugin/.github/` into your repository | 12 | 4 | as prompts | yes |
474
+ | **Antigravity** | copy `antigravity-plugin/` into your plugins directory | 12 | 4 | 1 | yes |
484
475
 
485
- > **Plugin vs Python/npm:** `python -m pip install superlocalmemory` inside an
486
- > activated virtual environment, or `npm i -g superlocalmemory`,
487
- > give you the `slm` CLI + the MCP server (the *tools*). The **skills/agents/hooks/
488
- > commands** come only through the plugin above. Use the plugin for Claude Code; use
489
- > pip/npm for the CLI or other IDEs.
476
+ ### What you get
490
477
 
491
- To update later: `/plugin marketplace update qualixar` then `/plugin install superlocalmemory@qualixar`.
478
+ - **Skills** `slm-remember`, `slm-recall`, `slm-session`, `slm-graph`,
479
+ `slm-mesh`, `slm-scope`, `slm-profile`, `slm-governance`, `slm-cache`,
480
+ `slm-compress`, `slm-status`, `slm-loop`.
481
+ - **Sub-agents** — a memory advisor, a governance advisor, a context-optimization
482
+ advisor, and a loop runner, each scoped to the tools it actually needs.
483
+ - **Commands** — `/slm-loop`, to run a task as a gate-verified bounded loop.
484
+ - **Hooks** — session start and end, so context loads and commits without being
485
+ asked.
492
486
 
493
- ## Codex add-on
494
-
495
- For Codex, install the SLM-owned skills, two focused subagents, and four
496
- lifecycle hooks explicitly:
497
-
498
- ```bash
499
- slm codex install
500
- ```
487
+ ### Keeping it current
501
488
 
502
- This adds only SLM-owned files under `~/.agents/skills`, `~/.codex/agents`, and
503
- `~/.codex/hooks.json`; it does not replace another agent's hooks or rewrite
504
- `~/.codex/config.toml`. Codex requires review and trust for new command hooks:
505
- open `/hooks` after installation. MCP wiring remains a separate explicit step:
489
+ `pipx upgrade superlocalmemory` upgrades the **package**. It does not
490
+ upgrade the plugin those are separate channels, and the plugin is delivered by
491
+ your editor. `slm doctor` reports both versions side by side and names the
492
+ command that updates the one that is behind.
506
493
 
507
494
  ```bash
508
- slm connect codex
495
+ claude plugin marketplace update qualixar
496
+ claude plugin update superlocalmemory@qualixar
509
497
  ```
510
498
 
511
- `slm connect codex` semantically merges the `superlocalmemory` MCP server into
512
- `~/.codex/config.toml`, preserving unrelated configuration keys and writing
513
- atomically. TOML serializers can normalize whitespace and comments, so it is
514
- not a byte-preserving operation; use it only when you want the MCP server
515
- configured. Check the result with `slm codex status`; undo SLM-owned add-ons
516
- with `slm codex remove`.
517
-
518
- ## GitHub Copilot integration
519
-
520
- The shipped installer configures the SuperLocalMemory MCP server and additive
521
- agent instructions for VS Code with GitHub Copilot:
522
-
523
- ```bash
524
- slm connect vscode-copilot --here
525
- ```
526
-
527
- Run it from the project root. It semantically merges the SLM server into
528
- `.vscode/mcp.json` and adds SLM-owned guidance inside
529
- `.github/copilot-instructions.md`, preserving unrelated servers and existing
530
- instructions. The generated `copilot-plugin/` source bundle is maintained for
531
- parity checks, but v3.8.1 does not claim that `slm connect` installs its prompt,
532
- agent, or hook files.
533
-
534
- ---
499
+ For the other three, replace the directory from the tag you are on.
535
500
 
536
501
  ## Privacy controls and operating modes
537
502
 
@@ -8,4 +8,6 @@
8
8
  [mcp_servers.superlocalmemory]
9
9
  command = "slm"
10
10
  args = ["mcp"]
11
- env = { SLM_MCP_PROFILE = "code", SLM_AGENT_ID = "codex" }
11
+ # Agent id only. Pinning a profile here would remove tools you had enabled;
12
+ # unset resolves to the full tool set.
13
+ env = { SLM_AGENT_ID = "codex" }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superlocalmemory",
3
- "version": "4.1.0",
3
+ "version": "4.1.3",
4
4
  "description": "Local-first agent memory with MCP and an agent-native CLI. Documented clients include Claude Code, Cursor, and Windsurf.",
5
5
  "keywords": [
6
6
  "ai-memory",
@@ -52,10 +52,11 @@
52
52
  "check:copilot-plugin": "node scripts/build-copilot-plugin.mjs --check",
53
53
  "build:codex-plugin": "node scripts/build-codex-plugin.mjs",
54
54
  "check:codex-plugin": "node scripts/build-codex-plugin.mjs --check",
55
- "prepack": "node scripts/build-plugin.mjs && node scripts/build-copilot-plugin.mjs && node scripts/build-codex-plugin.mjs && node scripts/prepack.js",
55
+ "prepack": "node scripts/build-plugin.mjs && node scripts/build-copilot-plugin.mjs && node scripts/build-codex-plugin.mjs && node scripts/build-antigravity-plugin.mjs && node scripts/prepack.js",
56
56
  "postinstall": "node scripts/postinstall.js",
57
57
  "preuninstall": "node scripts/preuninstall.js",
58
- "test": "node scripts/run-ui-tests.mjs"
58
+ "test": "node scripts/run-ui-tests.mjs",
59
+ "build:antigravity-plugin": "node scripts/build-antigravity-plugin.mjs"
59
60
  },
60
61
  "engines": {
61
62
  "node": ">=18.0.0",
@@ -15,5 +15,5 @@
15
15
  "mcpServers": "./.mcp.json",
16
16
  "name": "superlocalmemory",
17
17
  "repository": "https://github.com/qualixar/superlocalmemory",
18
- "version": "4.1.0"
18
+ "version": "4.1.3"
19
19
  }
package/plugin/.mcp.json CHANGED
@@ -4,9 +4,7 @@
4
4
  "command": "${CLAUDE_PLUGIN_ROOT}/scripts/slm-launch",
5
5
  "args": [],
6
6
  "env": {
7
- "SLM_MCP_PROFILE": "code",
8
- "SLM_AGENT_ID": "claude_code",
9
- "SLM_DATA_DIR": "${CLAUDE_PLUGIN_DATA}"
7
+ "SLM_AGENT_ID": "claude_code"
10
8
  }
11
9
  }
12
10
  }
package/plugin/CLAUDE.md CHANGED
@@ -1,4 +1,4 @@
1
- <!-- BEGIN SuperLocalMemory v4.1.0 -->
1
+ <!-- BEGIN SuperLocalMemory v4.1.3 -->
2
2
 
3
3
  ## SuperLocalMemory (SLM) — Agent Rules
4
4
 
@@ -39,6 +39,6 @@ slm-recall · slm-remember · slm-session · slm-status · slm-cache · slm-comp
39
39
  ### Subagents
40
40
  slm-memory-advisor (memory decisions, session hygiene, scope/profile guidance) · slm-optimize-advisor (context compression + KV cache) · slm-governance-advisor (scope/roles/compliance/GDPR)
41
41
 
42
- <!-- END SuperLocalMemory v4.1.0 -->
42
+ <!-- END SuperLocalMemory v4.1.3 -->
43
43
 
44
- SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later
@@ -77,4 +77,4 @@ slm-scope · slm-governance · slm-profile · slm-remember · slm-recall
77
77
  # What NOT to do
78
78
  Never session_init twice; never forget without dry-run preview; never store secrets; never bypass role checks; never claim an erasure succeeded without verifying via recall.
79
79
 
80
- SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
80
+ SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later
@@ -68,4 +68,4 @@ assessment. The gate is the authority.
68
68
 
69
69
  ---
70
70
 
71
- SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
71
+ SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later
@@ -46,4 +46,4 @@ slm-recall · slm-remember · slm-session · slm-scope · slm-profile · slm-gov
46
46
  # What NOT to do
47
47
  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; never bypass scope or governance restrictions.
48
48
 
49
- SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
49
+ SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later
@@ -41,4 +41,4 @@ slm-compress · slm-cache · slm-status · slm-profile
41
41
  # What NOT to do
42
42
  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 %; never carry ccr_ids across profile switches.
43
43
 
44
- SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later
@@ -1 +1 @@
1
- superlocalmemory==4.1.0
1
+ superlocalmemory==4.1.3
@@ -1,62 +1,131 @@
1
1
  #!/usr/bin/env bash
2
- # slm-launch — WP-F SuperLocalMemory MCP launcher (POSIX)
2
+ # slm-launch — SuperLocalMemory MCP launcher (POSIX)
3
3
  #
4
4
  # Cross-platform counterpart: slm-launch.bat (Windows)
5
- # Referenced by plugin/.mcp.json as the MCP server command.
5
+ # Referenced by .mcp.json as the MCP server command.
6
6
  #
7
- # Resolves the correct slm binary for POSIX and joins the namespace daemon
8
- # before opening the MCP stdio transport. This preserves one writer for all
9
- # parallel Claude sessions that share CLAUDE_PLUGIN_DATA.
7
+ # WHAT THIS RESOLVES, AND WHY THE DEFAULT CHANGED
10
8
  #
11
- # On Windows, Claude Code invokes slm-launch.bat instead (same-stem, .bat extension).
9
+ # It used to default to a venv the plugin owns:
10
+ # "${CLAUDE_PLUGIN_DATA}/venv/bin/slm". So anyone who already had SuperLocalMemory
11
+ # — from pip, pipx or npm — got a SECOND installation the moment they installed
12
+ # the plugin, on its own schedule, upgraded separately, and easy to leave behind
13
+ # a release. Installing a plugin should not fork your installation.
12
14
  #
13
- # Environment:
14
- # CLAUDE_PLUGIN_DATA persistent data dir where the plugin venv lives
15
- # SLM_DATA_DIR — optional; SLM data dir (default: ~/.superlocalmemory)
16
- # SLM_LAUNCHER — optional; which slm binary to use:
17
- # plugin (default) the plugin venv binary
18
- # system — the system `slm` on PATH
19
- # <path> — an explicit slm binary (leading ~ expanded)
15
+ # It was also Claude-Code-only. ${CLAUDE_PLUGIN_DATA} is set by Claude Code and
16
+ # by nothing else, so on Codex or Antigravity the path collapsed to
17
+ # "/venv/bin/slm" and the server simply did not start.
18
+ #
19
+ # The default is now: USE THE SLM THAT IS ALREADY INSTALLED. A plugin-owned venv
20
+ # is the fallback for a machine that has none, not the first choice.
21
+ #
22
+ # Environment (all optional):
23
+ # SLM_LAUNCHER auto (default) — prefer an installed slm, else the plugin venv
24
+ # system — require the slm on PATH
25
+ # plugin — require the plugin's own venv
26
+ # <path> — an explicit slm binary (leading ~ expanded)
27
+ # SLM_DATA_DIR SLM data dir (default: ~/.superlocalmemory)
28
+ # CLAUDE_PLUGIN_DATA where a plugin-owned venv lives, when there is one
29
+ #
30
+ # Deliberately NOT set here: the MCP profile. Which tools a host exposes is the
31
+ # user's decision, and a plugin that narrows it takes away tools they configured.
20
32
 
21
33
  _SLM_DATA="${SLM_DATA_DIR:-$HOME/.superlocalmemory}"
34
+ _PLUGIN_BIN="${CLAUDE_PLUGIN_DATA:+${CLAUDE_PLUGIN_DATA}/venv/bin/slm}"
22
35
 
23
- # If a system daemon is already running (its pidfile points at a live process),
24
- # there is no need to boot the plugin's own venv daemon — we can open an MCP
25
- # writer against the daemon that is already up. This skips a redundant, slow
26
- # venv bootstrap on every session start.
36
+ # Is a daemon already up for this data dir? If so we join it rather than boot a
37
+ # second one one writer for every session that shares the store.
27
38
  _daemon_running=0
28
39
  if [ -f "${_SLM_DATA}/daemon.pid" ] \
29
40
  && kill -0 "$(cat "${_SLM_DATA}/daemon.pid" 2>/dev/null)" 2>/dev/null; then
30
41
  _daemon_running=1
31
42
  fi
32
43
 
33
- case "${SLM_LAUNCHER:-plugin}" in
34
- plugin)
35
- SLM_BIN="${CLAUDE_PLUGIN_DATA}/venv/bin/slm"
36
- # Only bootstrap the owned daemon when one is not already running.
37
- if [ "${_daemon_running}" -eq 0 ]; then
38
- if ! "${SLM_BIN}" serve start >&2; then
44
+ # Expand a leading ~ WITHOUT eval — eval on an environment value is a
45
+ # command-injection foot-gun. Only tilde expansion; pass expanded paths for vars.
46
+ _expand_tilde() {
47
+ case "$1" in
48
+ "~"*) printf '%s' "${HOME}${1#\~}" ;;
49
+ *) printf '%s' "$1" ;;
50
+ esac
51
+ }
52
+
53
+ # Start a daemon with the chosen binary unless one is already serving.
54
+ _ensure_daemon() {
55
+ [ "${_daemon_running}" -eq 1 ] && return 0
56
+ "$1" serve start >&2
57
+ }
58
+
59
+ case "${SLM_LAUNCHER:-auto}" in
60
+ auto)
61
+ # 1. An slm already on PATH — the pip, pipx or npm install the user has.
62
+ # This is the common case and the one that must not be forked.
63
+ if command -v slm >/dev/null 2>&1; then
64
+ # Both orderings end up here, and both must converge on ONE
65
+ # environment:
66
+ # installed first, plugin second -> nothing was ever forked;
67
+ # plugin first, installed second -> the plugin venv is now the
68
+ # older copy and must stop being used.
69
+ # They already share one store, because this launcher sets no
70
+ # SLM_DATA_DIR and both resolve ~/.superlocalmemory. What is left to
71
+ # go wrong is two DIFFERENT VERSIONS serving that one store: whoever
72
+ # starts the daemon first decides which code the other one talks to.
73
+ # So when a leftover plugin venv is found beside a real install, say
74
+ # so, with both versions named. Silent duplication is how a store
75
+ # ends up served by a release nobody thinks they are running.
76
+ if [ -n "${_PLUGIN_BIN}" ] && [ -x "${_PLUGIN_BIN}" ]; then
77
+ _sys_v="$(slm --version 2>/dev/null | awk '{print $NF}')"
78
+ _plg_v="$("${_PLUGIN_BIN}" --version 2>/dev/null | awk '{print $NF}')"
79
+ if [ -n "${_plg_v}" ] && [ "${_sys_v}" != "${_plg_v}" ]; then
80
+ echo "SLM plugin: using the installed slm ${_sys_v:-?} and IGNORING a leftover plugin venv at ${_PLUGIN_BIN} (${_plg_v})." >&2
81
+ echo " One store, one version. Remove the venv to stop it drifting: rm -rf \"${CLAUDE_PLUGIN_DATA}/venv\"" >&2
82
+ fi
83
+ fi
84
+ _ensure_daemon "$(command -v slm)" || \
85
+ echo "SLM plugin: daemon did not start; continuing as a direct MCP writer." >&2
86
+ exec slm mcp
87
+ fi
88
+ # 2. No system install. Use the plugin's own venv if this host gave us
89
+ # somewhere to keep one.
90
+ if [ -n "${_PLUGIN_BIN}" ] && [ -x "${_PLUGIN_BIN}" ]; then
91
+ if ! _ensure_daemon "${_PLUGIN_BIN}"; then
39
92
  echo "SLM plugin: unable to start the owned daemon; refusing a direct MCP writer." >&2
40
93
  exit 1
41
94
  fi
95
+ exec "${_PLUGIN_BIN}" mcp
42
96
  fi
43
- exec "${SLM_BIN}" mcp
97
+ # 3. Neither. Say which two things were looked for, so the fix is obvious.
98
+ echo "SLM plugin: no SuperLocalMemory found." >&2
99
+ echo " Looked for: 'slm' on PATH, and ${_PLUGIN_BIN:-a plugin venv (this host sets no plugin data dir)}." >&2
100
+ echo " Install it with: pipx install superlocalmemory" >&2
101
+ exit 1
44
102
  ;;
45
103
  system)
104
+ if ! command -v slm >/dev/null 2>&1; then
105
+ echo "SLM_LAUNCHER=system but no 'slm' on PATH." >&2
106
+ exit 1
107
+ fi
108
+ _ensure_daemon "$(command -v slm)" || true
46
109
  exec slm mcp
47
110
  ;;
111
+ plugin)
112
+ if [ -z "${_PLUGIN_BIN}" ]; then
113
+ echo "SLM_LAUNCHER=plugin but this host sets no CLAUDE_PLUGIN_DATA." >&2
114
+ exit 1
115
+ fi
116
+ if ! _ensure_daemon "${_PLUGIN_BIN}"; then
117
+ echo "SLM plugin: unable to start the owned daemon; refusing a direct MCP writer." >&2
118
+ exit 1
119
+ fi
120
+ exec "${_PLUGIN_BIN}" mcp
121
+ ;;
48
122
  *)
49
- # Explicit binary path. Expand a leading ~ to $HOME WITHOUT eval — eval
50
- # on an environment value is a command-injection foot-gun. Only tilde
51
- # expansion is supported here; pass an already-expanded path for $VARs.
52
- case "${SLM_LAUNCHER}" in
53
- "~"*) _SLM_BIN="${HOME}${SLM_LAUNCHER#\~}" ;;
54
- *) _SLM_BIN="${SLM_LAUNCHER}" ;;
55
- esac
123
+ _SLM_BIN="$(_expand_tilde "${SLM_LAUNCHER}")"
56
124
  if [ ! -x "${_SLM_BIN}" ]; then
57
125
  echo "SLM_LAUNCHER is not an executable slm binary: ${_SLM_BIN}" >&2
58
126
  exit 1
59
127
  fi
128
+ _ensure_daemon "${_SLM_BIN}" || true
60
129
  exec "${_SLM_BIN}" mcp
61
130
  ;;
62
131
  esac
@@ -145,4 +145,4 @@ These subcommands control daemon-level cache settings. They do not read or write
145
145
 
146
146
  ---
147
147
 
148
- SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
148
+ SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later
@@ -147,4 +147,4 @@ Content over 1 MB (1 000 000 bytes UTF-8) is processed but `reversible` is force
147
147
 
148
148
  ---
149
149
 
150
- SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
150
+ SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later
@@ -245,4 +245,4 @@ Before running any destructive operation (`forget`, `compact_memories`):
245
245
 
246
246
  ---
247
247
 
248
- *SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later*
248
+ *SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later*
@@ -312,4 +312,4 @@ profile. See `slm-profile` for the full profile switching workflow.
312
312
 
313
313
  ---
314
314
 
315
- SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
315
+ SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later