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.
- package/.claude-plugin/marketplace.json +29 -1
- package/CHANGELOG.md +107 -0
- package/README.md +37 -72
- package/ide/configs/codex-mcp.toml +3 -1
- package/package.json +4 -3
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -3
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/scripts/slm-launch +100 -31
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/pyproject.toml +1 -1
- package/src/superlocalmemory/__init__.py +1 -1
- package/src/superlocalmemory/cli/commands.py +94 -0
- package/src/superlocalmemory/server/recall_health.py +87 -10
- package/src/superlocalmemory/server/unified_daemon.py +55 -2
- package/src/superlocalmemory/storage/_migration_internals.py +23 -2
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +60 -36
- 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.
|
|
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.
|
|
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 & 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> · MCP: add <code>slm_compress</code> to your config · 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.
|
|
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
|
|
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.
|
|
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;
|
|
313
|
+
quality must be evaluated for the target client and workload; SLM publishes no universal p99 claim.
|
|
318
314
|
|
|
319
|
-
**Multi-scope memory (
|
|
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
|
|
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
|
-
##
|
|
460
|
+
## Editor plugins
|
|
465
461
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
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
|
-
|
|
472
|
-
|
|
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
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
-
|
|
483
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
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
|
-
|
|
495
|
+
claude plugin marketplace update qualixar
|
|
496
|
+
claude plugin update superlocalmemory@qualixar
|
|
509
497
|
```
|
|
510
498
|
|
|
511
|
-
|
|
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
|
-
|
|
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.
|
|
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",
|
package/plugin/.mcp.json
CHANGED
package/plugin/CLAUDE.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- BEGIN SuperLocalMemory v4.1.
|
|
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.
|
|
42
|
+
<!-- END SuperLocalMemory v4.1.3 -->
|
|
43
43
|
|
|
44
|
-
SuperLocalMemory v4.1.
|
|
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.
|
|
80
|
+
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.
|
|
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.
|
|
44
|
+
SuperLocalMemory v4.1.3 · Qualixar · AGPL-3.0-or-later
|
package/plugin/requirements.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
superlocalmemory==4.1.
|
|
1
|
+
superlocalmemory==4.1.3
|
|
@@ -1,62 +1,131 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# slm-launch —
|
|
2
|
+
# slm-launch — SuperLocalMemory MCP launcher (POSIX)
|
|
3
3
|
#
|
|
4
4
|
# Cross-platform counterpart: slm-launch.bat (Windows)
|
|
5
|
-
# Referenced by
|
|
5
|
+
# Referenced by .mcp.json as the MCP server command.
|
|
6
6
|
#
|
|
7
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
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
|
-
#
|
|
24
|
-
#
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|