nexusmem 0.10.3 → 0.10.5

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
@@ -11,6 +11,82 @@ built from, matched by publish timestamp: `v0.1.0` → `67a4776`, `v0.1.1` → `
11
11
 
12
12
  No unreleased changes yet.
13
13
 
14
+ ## [0.10.5] — 2026-09-11
15
+
16
+ Security release. Existing installs need action after upgrading — see "Action required" below.
17
+
18
+ ### Security
19
+
20
+ - Secret redaction missed keys whose secret word is part of a longer identifier: `DB_PASSWORD=x`,
21
+ `OPENAI_API_KEY=x`, `AUTH_TOKEN=x`, `CLIENT_SECRET=x` were kept verbatim (the rule's leading `\b`
22
+ never matches after `_`), as were values shorter than 8 characters or containing characters such
23
+ as `@ ! # $`. This affected `scan-shell` output, stored shell and conversation nodes, session
24
+ summaries, the FTS index, embeddings, and `search_memory` / `query` results.
25
+ - `shell_command` nodes stored the raw command in `meta.command`, so a typed secret was written to
26
+ `memory.db` even when the title showed it redacted, and was printed by `scan-shell --json` and
27
+ `precheck`. `meta.command` is now redacted; `meta.commandHash` keeps the raw command's hash so node
28
+ ids and project-id reconciliation are unchanged.
29
+ - The installed shell hooks appended every command raw to `~/.nexusmem/shell-history.jsonl`. Hooks now
30
+ pass each command to a NexusMem recorder over stdin; the recorder hashes and redacts it in memory
31
+ and writes only the redacted command. It writes no temp files and prints nothing, and it drops any
32
+ event it cannot process instead of writing it raw. Hooks installed by earlier versions keep writing
33
+ raw commands until reinstalled: `hook status` reports them as outdated, and `sync` redacts what they
34
+ write and warns.
35
+ - Redaction now also covers credentials in connection URIs (`postgres://user:pass@host`),
36
+ `Authorization:` headers and bearer tokens, secret-named options whose value is the next argument
37
+ (`--password x`), and `mysql -pX`, `sshpass -p`, `mongosh -p`, `redis-cli -a`, `curl -u user:pass`.
38
+
39
+ ### Added
40
+
41
+ - `nexusmem scrub-secrets [--all-projects] [--yes] [--no-embed]` removes secrets that earlier versions
42
+ already stored: shell, conversation, session-summary and code-diff rows, contradiction reasons, the
43
+ FTS index, embeddings, and the shell hook log. Dry run by default. `--yes` takes a backup of each
44
+ database first and prints its path, redacts rows in place (ids unchanged), drops and re-embeds
45
+ affected vectors, rebuilds the FTS index, runs `VACUUM`, and truncates the WAL. Safe to run
46
+ repeatedly. Existing `memory.db.backup-*` files are listed, never modified or deleted.
47
+
48
+ ### Action required
49
+
50
+ 1. Upgrade every NexusMem install (global CLI, MCP server configs, the post-commit hook's `nexusmem`),
51
+ then restart MCP clients and editors so no older version keeps writing.
52
+ 2. Run `nexusmem hook install` again in each shell you installed the hook for; `nexusmem hook status`
53
+ should say `installed`, not `OUTDATED`.
54
+ 3. Rotate any credential typed at a shell prompt or pasted into a captured conversation in the
55
+ affected forms. Scrubbing cannot recall copies already returned to an LLM, backed up, or synced.
56
+ 4. Run `nexusmem scrub-secrets --all-projects`, review, then re-run with `--yes`.
57
+ 5. Delete the `memory.db.backup-*` files NexusMem lists (they predate redaction) once you have
58
+ verified the scrubbed database.
59
+ 6. Do not use `nexusmem forget <secret>` for this: it stores the value itself in the database's
60
+ deny-list, and the shell hook captures a bare argument unredacted.
61
+
62
+ ### Known limitations
63
+
64
+ - NexusMem cannot change your shell's own history files (PSReadLine `ConsoleHost_history.txt`,
65
+ `~/.bash_history`, `~/.zsh_history`); they still contain whatever you typed.
66
+ - Not yet redacted: a token used as a URL username (`https://TOKEN@host`), `openssl -passin`,
67
+ `keytool -storepass`, `ssh-keygen -N`, secret-bearing keys without a secret word (`STRIPE_KEY`,
68
+ `DB_PW`), secrets passed as plain positional arguments, and commit messages, docs and GitHub
69
+ threads (never redacted).
70
+
71
+ ## [0.10.4] — 2026-09-07
72
+
73
+ ### Added
74
+
75
+ - Fresh-project syncs classify reconstructable Git commits and diffs, timestamped shell history,
76
+ and already-supported opt-in coding-agent history as `backfilled` only when a trustworthy source
77
+ timestamp predates NexusMem initialization. Trustworthily timestamped events between initialization
78
+ and sync time are `observed`. Tracked Markdown, untimestamped shell history, and other records that
79
+ cannot be classified remain `unknown`. Retrieval exposes this origin alongside the existing evidence
80
+ provenance.
81
+
82
+ ### Changed
83
+
84
+ - Historical shell entries no longer receive timestamps inferred from history-file mtimes.
85
+ Missing timestamp, cwd, exit code, and duration metadata remain null, and incomplete shell
86
+ evidence is excluded from failure-to-fix correlation.
87
+ - Schema V13 adds `nodes.capture_mode` and nullable `nodes.source_ts`. Existing approximate
88
+ shell timestamps and document mtimes migrate to a null `source_ts`; other existing event timestamps are retained.
89
+
14
90
  ## [0.10.3] — 2026-08-31
15
91
 
16
92
  ### Added
@@ -630,7 +706,11 @@ First public release.
630
706
  there is no local-model summarization pass, and the conversation collector has never been audited
631
707
  for the stale-node bug that was found and fixed in the docs collector.
632
708
 
633
- [Unreleased]: https://github.com/yaminbkk/NexusMem/compare/v0.10.1...HEAD
709
+ [Unreleased]: https://github.com/yaminbkk/NexusMem/compare/v0.10.5...HEAD
710
+ [0.10.5]: https://github.com/yaminbkk/NexusMem/compare/v0.10.4...v0.10.5
711
+ [0.10.4]: https://github.com/yaminbkk/NexusMem/compare/v0.10.3...v0.10.4
712
+ [0.10.3]: https://github.com/yaminbkk/NexusMem/compare/v0.10.2...v0.10.3
713
+ [0.10.2]: https://github.com/yaminbkk/NexusMem/compare/v0.10.1...v0.10.2
634
714
  [0.10.1]: https://github.com/yaminbkk/NexusMem/compare/v0.10.0...v0.10.1
635
715
  [0.10.0]: https://github.com/yaminbkk/NexusMem/compare/v0.9.1...v0.10.0
636
716
  [0.9.1]: https://github.com/yaminbkk/NexusMem/compare/v0.9.0...v0.9.1
package/README.md CHANGED
@@ -23,6 +23,8 @@ The shell history is the part worth caring about. Git tells an agent what shippe
23
23
  tells it what was attempted, in what order, and which commands exited non-zero. That information
24
24
  exists nowhere else, and it disappears when your terminal scrollback rolls over.
25
25
 
26
+ ![How NexusMem works: git commits, shell commands with their real exit codes, docs, and GitHub threads flow into a local SQLite index, which returns a ranked, token-budgeted slice of that history so your coding agent answers with a real citation instead of a guess](docs/how-it-works.svg)
27
+
26
28
  **Contents:** [Try it](#try-it) · [Exact shell capture](#optional-exact-shell-capture) ·
27
29
  [Failure → fix chains](#failure--fix-chains-opt-in) · [How retrieval works](#how-retrieval-works) ·
28
30
  [Session summaries](#session-summaries-optional-local-model) ·
@@ -423,6 +425,9 @@ node afterward. `--verify` is a label only; it does not boost ranking. Every nod
423
425
 
424
426
  `init`, `sync`, `query <text>` (add `--as-of <date>` for a bi-temporal read, see below), `status` (add
425
427
  `--share` for a plain-text summary worth pasting somewhere), `projects`, `mcp`, `forget <value>`,
428
+ `scrub-secrets` (re-redacts secrets that versions before 0.10.5 already stored — database rows, FTS
429
+ index, embeddings and the shell hook log; dry-run unless `--yes`, which backs each database up first;
430
+ `--all-projects` covers every registered repository),
426
431
  `stale` (add `--check-contradictions` for a local-SLM content check, see above), `mark-stale
427
432
  <nodeId> --supersedes <newNodeId>`, `review <nodeId> --verify|--reject` (record a human verdict on
428
433
  one node, see above), `precheck` (advisory — warns about staged files with an unresolved past
@@ -539,6 +544,11 @@ Tests are behavioral rather than snapshot-based, and several are regressions tie
539
544
  observed failures. `tests/git-errors.test.ts` injects a fake `spawn` to exercise the Windows
540
545
  process-spawn faults, which cannot be provoked on demand.
541
546
 
547
+ Bug fixes, test coverage, and small focused features are welcome — see
548
+ [CONTRIBUTING.md](CONTRIBUTING.md) for the workflow, or browse issues labeled
549
+ [`good first issue`](https://github.com/yaminbkk/nexusmem/labels/good%20first%20issue)
550
+ for something scoped and self-contained to start with.
551
+
542
552
  ## On how this was built
543
553
 
544
554
  This started as an experiment in whether a local context-memory engine for coding agents was viable,