nexusmem 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -9,6 +9,38 @@ built from, matched by publish timestamp: `v0.1.0` → `67a4776`, `v0.1.1` → `
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [0.5.1] — 2026-08-17
13
+
14
+ ### Added
15
+
16
+ - **`nexusmem forget --export <path>` / `forget --import <path>`: carry a deny-list across a clone or
17
+ restore.** `.nexusmem/` is gitignored by design, so `deny_list` never traveled with `git clone`/
18
+ `git push` — confirmed live 2026-08-17 that a fresh clone of the exact same repo resurrected a value
19
+ already forgotten elsewhere, with zero deny-list protection, because git history (what a fresh `sync`
20
+ re-derives from) is fully portable while the deny-list that would have blocked it was not. `--export`
21
+ writes the active entries to a plaintext JSON file (loudly warned as exactly as sensitive as the
22
+ values it holds — never meant for git, moved through whatever secure channel the user already
23
+ trusts); `--import` re-applies each new entry through `forget` itself, so an imported value is
24
+ deleted from the new checkout's nodes too, not just blocked going forward. Same dry-run-by-default /
25
+ `--yes` convention as the rest of `forget`. See `docs/forget-mechanism.md`.
26
+
27
+ ## [0.5.0] — 2026-08-17
28
+
29
+ ### Added
30
+
31
+ - **`nexusmem forget <value>`: permanent, value-keyed deletion.** The finer-grained complement to
32
+ `sync --prune-source` (which only deletes at the whole-collector-source granularity): forgets one
33
+ exact string or `--regex` pattern, deleting every node it currently matches *and* writing a
34
+ standing deny-list entry so the value can never be re-ingested — closing the one gap an external
35
+ source-level review flagged as its most serious finding: the append-only shell-hook log (and a
36
+ full transcript re-read) are untouched by any prune, so `sync --rebuild` used to resurrect exactly
37
+ what had just been deleted. Every removal leaves a hash-only tombstone (never the forgotten
38
+ content itself — `body`/`title` are stored as sha256 only) and the whole operation writes one
39
+ `mutation_audit` row, whether or not anything matched. Dry-run by default, matching
40
+ `--prune-source`'s convention exactly; `--yes` confirms; `--list` shows active entries. Permanent
41
+ in v0 — no `--remove`, matching the existing irreversible framing of `--prune-source`/`--rebuild`.
42
+ See `docs/forget-mechanism.md`.
43
+
12
44
  ## [0.4.0] — 2026-08-16
13
45
 
14
46
  ### Added
@@ -320,7 +352,9 @@ First public release.
320
352
  there is no local-model summarization pass, and the conversation collector has never been audited
321
353
  for the stale-node bug that was found and fixed in the docs collector.
322
354
 
323
- [Unreleased]: https://github.com/yaminbkk/NexusMem/compare/v0.4.0...HEAD
355
+ [Unreleased]: https://github.com/yaminbkk/NexusMem/compare/v0.5.1...HEAD
356
+ [0.5.1]: https://github.com/yaminbkk/NexusMem/compare/v0.5.0...v0.5.1
357
+ [0.5.0]: https://github.com/yaminbkk/NexusMem/compare/v0.4.0...v0.5.0
324
358
  [0.4.0]: https://github.com/yaminbkk/NexusMem/compare/v0.3.3...v0.4.0
325
359
  [0.3.3]: https://github.com/yaminbkk/NexusMem/compare/v0.3.2...v0.3.3
326
360
  [0.3.2]: https://github.com/yaminbkk/NexusMem/compare/v0.3.1...v0.3.2
package/README.md CHANGED
@@ -318,10 +318,24 @@ optimizing, and it is somebody else's process.
318
318
  against this repo's own memory, switching to the joint cap moved the section that answered the
319
319
  question up in three of them (the rationale section for "why BM25 before vector search" went from
320
320
  rank 4 to rank 1) and displaced no query's correct top hit.
321
+ - **`forget` is per-repository, not global.** Its deny-list lives in the one `.nexusmem/memory.db` it
322
+ ran against (plus that repo's stale prior identities, same scope `--prune-source` already uses). A
323
+ value that leaked into shell history from several repositories needs `forget` run once per repo —
324
+ there is no shared, machine-wide deny-list across every project you have synced.
325
+ - **A deny-list doesn't survive a clone or restore on its own.** `.nexusmem/` is gitignored by design,
326
+ so `deny_list` never travels with `git clone`/`git push` — while git history itself, the thing a
327
+ fresh `sync` re-derives from, is fully portable and copied by every clone. A teammate's fresh
328
+ checkout, a new machine, or a restored backup starts with zero protection: the forgotten value comes
329
+ right back on the first sync. Confirmed live 2026-08-17, not just a theoretical read of the code.
330
+ `forget --export <path>` / `forget --import <path>` close this: export writes the active entries to
331
+ a plaintext JSON file you move through a channel you control (never git — the file is exactly as
332
+ sensitive as the value it holds), and import re-applies them in the new checkout, deleting any
333
+ copies that already synced back in. It is deliberately manual, not automatic on every `sync`.
321
334
 
322
335
  ## Commands
323
336
 
324
- `init`, `sync`, `query <text>`, `status`, `projects`, `mcp`, and `hook install|remove|status`.
337
+ `init`, `sync`, `query <text>`, `status`, `projects`, `mcp`, `forget <value>`, and
338
+ `hook install|remove|status`.
325
339
 
326
340
  There are also five dry-run previews (`scan-git`, `scan-diff`, `scan-shell`, `scan-docs`,
327
341
  `scan-conversation`)
@@ -334,6 +348,15 @@ transcript source in for one run without persisting it, `--no-embed` skips the v
334
348
  `--link-failures` builds the failure → fix chains described above, and `--rebuild` drops the
335
349
  project's nodes and re-ingests from scratch.
336
350
 
351
+ `sync --prune-source <name>` deletes an entire collector source (e.g. `shell:pwsh`); `forget <value>`
352
+ is the finer-grained complement — it deletes every node matching one exact string (or `--regex`
353
+ pattern) *and* writes a standing deny-list entry so the value can never be re-ingested, even by a
354
+ later `sync --rebuild` re-reading the append-only shell-hook log or a full transcript scan. Every
355
+ removal leaves a hash-only tombstone, never the forgotten content itself. Both are dry-run by
356
+ default; `--yes` confirms. `forget --list` shows active entries; `forget --export <path>` /
357
+ `forget --import <path>` carry them to another checkout of the same repo (see the limitation above).
358
+ See [`docs/forget-mechanism.md`](docs/forget-mechanism.md) for why this exists.
359
+
337
360
  ## Recall across projects
338
361
 
339
362
  `query --all-projects` searches every repository you have run NexusMem in, not just the current one,