nexusmem 0.1.2 → 0.2.0
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 +126 -0
- package/README.md +302 -254
- package/dist/cli/index.js +989 -229
- package/dist/cli/index.js.map +1 -1
- package/package.json +4 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Notable changes per published version. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
|
|
4
|
+
this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
5
|
+
|
|
6
|
+
Tags were added retroactively on 2026-08-11 and point at the exact commits the npm tarballs were
|
|
7
|
+
built from, matched by publish timestamp: `v0.1.0` → `67a4776`, `v0.1.1` → `809e62c`,
|
|
8
|
+
`v0.1.2` → `b22a3b0`.
|
|
9
|
+
|
|
10
|
+
## [Unreleased]
|
|
11
|
+
|
|
12
|
+
## [0.2.0] — 2026-08-12
|
|
13
|
+
|
|
14
|
+
**Upgrade note.** Both new sources are on by default, so the first `sync` after upgrading an
|
|
15
|
+
existing project ingests the patches of its 200 most recent commits and starts recording the
|
|
16
|
+
repository in `~/.nexusmem/projects.json`. Set `sources.diff.enabled` to `false` in
|
|
17
|
+
`.nexusmem/config.json` if you would rather not, and `NEXUSMEM_HOME` relocates the user-scoped
|
|
18
|
+
directory. Nothing existing is rewritten or lost.
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- **Diff-level nodes.** Commit patches are now indexed, one node per changed file, so a question
|
|
23
|
+
about *what the change looked like* reaches the lines themselves rather than the commit message
|
|
24
|
+
and a `+41/-6` summary. New `code_diff` kind, `diff` source, `scan-diff` preview command, and a
|
|
25
|
+
`sources.diff` config block. Read by a second `git log --patch` walk with its own cursor: folding
|
|
26
|
+
it into the existing `--numstat` walk would put patch text and numstat rows in one field, where a
|
|
27
|
+
diff line reading `-1\t2\tfoo` is indistinguishable from a real file entry.
|
|
28
|
+
Bounded on purpose — 200 commits on a first sync, 20 files per commit, no merges (their patch
|
|
29
|
+
exists only in a combined format this parser does not read), and binaries, lockfiles and build
|
|
30
|
+
output skipped. Patches are redacted with the shape-matching rules only; the key/value rule that
|
|
31
|
+
serves prose would rewrite `const apiKey = process.env.SERVICE_API_KEY` into a redaction marker.
|
|
32
|
+
- **Cross-project recall.** `query --all-projects` (and `search_memory`'s `allProjects`) searches
|
|
33
|
+
every repository NexusMem has been run in on this machine, tagging each result with the repository
|
|
34
|
+
it came from. Databases stay per-repository — a shared global store was rejected for giving up the
|
|
35
|
+
property that deleting one repo's `.nexusmem/` removes that repo's memory and nothing else — so a
|
|
36
|
+
plain index at `~/.nexusmem/projects.json`, written by `init` and refreshed by `sync`, is what
|
|
37
|
+
makes the others findable. New `projects` command lists it; `--prune` forgets entries whose
|
|
38
|
+
database is gone. A stale or corrupt registry degrades the query, never fails it.
|
|
39
|
+
Ranking fuses each project's list by rank (RRF) instead of comparing raw BM25 costs, which are
|
|
40
|
+
computed against their own corpus and are not comparable across databases. The bias this leaves —
|
|
41
|
+
every project's rank-1 hit is worth the same, so recall favours breadth — is documented rather
|
|
42
|
+
than hidden.
|
|
43
|
+
- **Query-aware diff excerpts.** A packed summary is ~320 characters and a patch is thousands, so
|
|
44
|
+
the packer now picks the hunk whose tokens match the query and starts the excerpt at the changed
|
|
45
|
+
line. Found by dogfooding: "what flags are passed to every git invocation" retrieved the right
|
|
46
|
+
file and then spent the whole summary on a class definition seventy lines above the answer.
|
|
47
|
+
Matching splits identifiers on case and underscore boundaries, because `\bretry\b` does not match
|
|
48
|
+
`RETRY_DELAYS_MS` and a natural-language question otherwise never meets the code it is about.
|
|
49
|
+
- `CHANGELOG.md` now ships inside the npm tarball. npm's always-included list covers `package.json`,
|
|
50
|
+
`README` and `LICENSE` but not the changelog, so it previously reached GitHub readers only.
|
|
51
|
+
|
|
52
|
+
### Internal
|
|
53
|
+
|
|
54
|
+
- The test suite no longer writes to the developer's real `~/.nexusmem`. `sync` records the
|
|
55
|
+
repository it ingested in the project registry, and the suite syncs temporary repositories in
|
|
56
|
+
several places, so a green run left seven dead entries behind — found by running `nexusmem
|
|
57
|
+
projects` after the fact, not by any test. `tests/setup.ts` now points `NEXUSMEM_HOME` at a
|
|
58
|
+
throwaway directory for the whole suite, and one test fails if that guard is ever removed.
|
|
59
|
+
- `npm run smoke` drives the *packaged* artifact: build, pack, install into a throwaway directory,
|
|
60
|
+
then run the installed CLI, an end-to-end ingest/query against a fixture repository, and an
|
|
61
|
+
`initialize` handshake over real stdio. It also audits the manifest `npm publish` would send,
|
|
62
|
+
which is a different artifact from the tarball. Both defects that ever reached npm users passed a
|
|
63
|
+
green unit suite first; each is now pinned by a check verified to fail when the defect is
|
|
64
|
+
reintroduced. Runs in CI on Linux and Windows as its own job.
|
|
65
|
+
|
|
66
|
+
## [0.1.2] — 2026-08-10
|
|
67
|
+
|
|
68
|
+
### Fixed
|
|
69
|
+
|
|
70
|
+
- `nexusmem --version` printed `0.1.0` on 0.1.1. The version string in `src/cli/index.ts` was a
|
|
71
|
+
literal separate from `package.json`, and the 0.1.1 bump only touched the latter. `src/mcp/server.ts`
|
|
72
|
+
had the same problem in its `McpServer` constructor, so an MCP client's `initialize` handshake
|
|
73
|
+
would have reported the same stale version. Both now read the real version through
|
|
74
|
+
`readOwnVersion()` in `src/core/version.ts`, which resolves `package.json` via `import.meta.url`.
|
|
75
|
+
Found by running the published package end to end rather than trusting `npm publish --dry-run`
|
|
76
|
+
and the registry API, neither of which executes a `--version` flag.
|
|
77
|
+
|
|
78
|
+
The ingestion and retrieval pipeline was never affected — only the two places that report a version
|
|
79
|
+
independently of running a command.
|
|
80
|
+
|
|
81
|
+
## [0.1.1] — 2026-08-10
|
|
82
|
+
|
|
83
|
+
### Changed
|
|
84
|
+
|
|
85
|
+
- README rewritten for someone deciding whether to read the source: what it does, how retrieval
|
|
86
|
+
scores, what it costs, and where it breaks. `README.md` ships inside the package, so this is a
|
|
87
|
+
real change to what npm delivers — but no code changed between 0.1.0 and 0.1.1.
|
|
88
|
+
- Documented the ranking flaw the tool found in itself, and the fact that the conversation source
|
|
89
|
+
in the sample `status` output is opt-in rather than default.
|
|
90
|
+
- Dropped `&&` from the quickstart, which Windows PowerShell 5.1 cannot parse.
|
|
91
|
+
|
|
92
|
+
## [0.1.0] — 2026-08-10
|
|
93
|
+
|
|
94
|
+
First public release.
|
|
95
|
+
|
|
96
|
+
### Added
|
|
97
|
+
|
|
98
|
+
- **Collectors.** Git history (commit metadata and diff stats, not diff bodies), shell commands with
|
|
99
|
+
exit codes via an opt-in PowerShell hook, tracked markdown docs via `git ls-files -- '*.md'`, and
|
|
100
|
+
opt-in assistant transcripts.
|
|
101
|
+
- **Hybrid retrieval.** SQLite FTS5 BM25 and `sqlite-vec` KNN over 768-dim embeddings, fused with
|
|
102
|
+
reciprocal rank fusion, then ranked by relevance against signal and recency priors and packed into
|
|
103
|
+
an explicit token budget.
|
|
104
|
+
- **MCP server** over stdio (`nexusmem mcp`) exposing `search_memory`, `sync_project` and
|
|
105
|
+
`get_status`, for Claude Desktop, Cursor, Windsurf and other MCP clients.
|
|
106
|
+
- **CLI**: `init`, `sync`, `query`, `status`, `mcp`, and `hook install|remove|status`, plus four
|
|
107
|
+
dry-run previews — `scan-git`, `scan-shell`, `scan-docs`, `scan-conversation` — that write nothing
|
|
108
|
+
and print the nodes ingestion would create with their signal scores.
|
|
109
|
+
- Content-addressed node ids (`sha256(projectId + kind + naturalKey)`), so `sync` is idempotent and
|
|
110
|
+
two clones of one repository share a memory namespace.
|
|
111
|
+
- Everything stays on the machine: one SQLite database in WAL mode under `<repo>/.nexusmem/`.
|
|
112
|
+
|
|
113
|
+
### Notes
|
|
114
|
+
|
|
115
|
+
- Requires Node **>= 22**. `better-sqlite3` 12.11.1 publishes no prebuilt binary for Node 20 — its
|
|
116
|
+
prebuilds start at ABI 127 — so a lower floor would have been a promise the package could not keep.
|
|
117
|
+
Do not lower it without checking upstream prebuilds first.
|
|
118
|
+
- Not done at this release: diff bodies are not indexed, queries are scoped to a single project,
|
|
119
|
+
there is no local-model summarization pass, and the conversation collector has never been audited
|
|
120
|
+
for the stale-node bug that was found and fixed in the docs collector.
|
|
121
|
+
|
|
122
|
+
[Unreleased]: https://github.com/yaminbakoh4-dot/NexusMem/compare/v0.2.0...HEAD
|
|
123
|
+
[0.2.0]: https://github.com/yaminbakoh4-dot/NexusMem/compare/v0.1.2...v0.2.0
|
|
124
|
+
[0.1.2]: https://github.com/yaminbakoh4-dot/NexusMem/compare/v0.1.1...v0.1.2
|
|
125
|
+
[0.1.1]: https://github.com/yaminbakoh4-dot/NexusMem/compare/v0.1.0...v0.1.1
|
|
126
|
+
[0.1.0]: https://github.com/yaminbakoh4-dot/NexusMem/releases/tag/v0.1.0
|