Releases: Sumit1993/mage-memory
Release list
v0.0.12
0.0.12 (2026-07-02)
Features
- 0.0.12: Claude-Code capture adapter (inline-capture instruction + boundary nudge) (#27) (d11dc25)
- 0.0.12: offer the npx skills install route alongside the plugin (init hint + README) (#34) (5a04601)
- 0.0.12: one .mage/ state home + redact config in metadata.json (ADR-0025) (#31) (ca01271)
- 0.0.12: organic grooming loop — portable core (mage stage/groom + .staging) (#25) (e1b3014)
- adopt: mage adopt onboarding dispatcher + dream scan-scope fix (fbe6ea5)
- autonomy: opt-in Operator/Approver/Overseer grooming autonomy ladder (ADR-0030) (#37) (5926e0e)
- cc-adapter: commandeer CC auto-memory — Gate-0 capture + MEMORY.md recall (ADR-0032/0033) (552756e)
- cc-adapter: Gate-0 PreToolUse capture hook + PostToolUse nudge (ADR-0032 Phase 3) (30d5cf5)
- cc-adapter: groom ingest of the capture inbox (ADR-0032 Phase 6) (997d439)
- cc-adapter: native CC memory -> mage note schema-map (ADR-0032 Phase 2) (0367c16)
- cc-adapter: wire the commandeer tier into connect/disconnect (ADR-0032 Phase 4) (016ccf8)
- digest->agent boundary capture (ADR-0029) — replace deterministic drafting (#36) (aad31f0)
- doctor: add recall+skills readiness checks and a setup summary (4e5491c)
- doctor: recall+skills readiness checks and a setup summary (81f179d)
- flatten: normalize harness frontmatter at the durable boundary (ADR-0035) (b5bbf93)
- flatten: Stop-hook working-tree sweep (ADR-0035 best-effort layer) (cad6545)
- index: emit MEMORY.md, the Claude Code adapter index twin (ADR-0032/0033, Phase 1) (df4760c)
- nudge: user-visible systemMessage + operator asks + weekly dream-health tick (5ce48d7)
- nudge: user-visible systemMessage + operator asks + weekly dream-health tick (2649ac4)
- nudge: warm, keeper-naming offer + agent-offered dream scan (44a25c9)
- provenance: stamp provenance at note creation (ADR-0031 Phase 1) (5915664)
- provenance: stamp provenance at note creation (ADR-0031 Phase 1) (#43) (1a526e5)
Bug Fixes
- 0.0.12: one shared hub-scope enumerator + fan-out hint for bare hub distill/promote (#33) (3344bae)
- cc-adapter: Gate-0 never falls through unscrubbed; POSIX-normalize paths (ADR-0032 review) (a9eae63)
- cc-adapter: Gate-0 spike refinements + autoMemoryDirectory ownership (ADR-0032 Phase 5) (06d4a7a)
- cc-adapter: harden inbox ingest — non-destructive cover, fail-soft, idempotent (ADR-0032 review) (c11ba34)
- cc-adapter: key inbox-ingest idempotency on capture identity, not session id (f1a04b1)
- doctor: skip the GitHub network probe under test (flaky 5s timeout) (0357e19)
- doctor: skip the GitHub network probe under test (flaky 5s timeout) (deabf0e)
- flatten: recover ALL mage fields from a CC-restamped note (no data loss) (6bcba13)
- integration: close stdin for live claude runs; gate capture test on the scrub (f1639f9)
- nudge: exempt compact from the backlog throttle (resume-then-compact) (cacb49c)
- nudge: exempt compact from the backlog throttle (resume→compact) (c767563)
- redact: clear Gate-2 false positives + add a non-bypass .redactignore allowlist (#26) (726b5bf)
- scan: accept unquoted YAML dates for last_reviewed (333c897)
- scan: accept unquoted YAML dates for last_reviewed (b2ea189)
- symmetric commandeer reconciliation + doctor drift + clean --json (ADR-0032 review) (41a59e3)
v0.0.11
v0.0.10 — coherence
A coherence release: one consistent vocabulary, a single grooming skill, a leaner command surface, and sturdier setup/repair. The roadmap is capped at 0.1.0.
Added
mage migrate— mage's first metadata migration (schemamage.v1tomage.v2). Readers are now lenient: they read v1, normalize it in memory, and never throw;mage migrateanddoctor --fixrewrite eagerly.mage connect --all-projects— from a hub, wire every registered project's code repo in one pass (repo-local each; absent repos skipped).- Hub-aware health:
mage doctorreports a per-project liveness rollup (registered, present, connected), andmage status <hub>expands to the member code repos. A bare parent directory sitting above connected repos now warns loudly instead of resolving to nothing. mage doctor --fixrepair-drift: refresh a drifted capture-hook block in place, detect a missing redaction pre-commit hook, and migrate a v1 schema — all fail-open, and it never wires a never-connected or disconnected repo.
Changed
mage:distillandmage:promoteare merged into one two-phasemage:groomskill (first-sight, then recurrence). Kept skills: learn, groom, graduate, optimize, guide.- Grooming at a hub fans out to every project (per-root, via
--dir). initandlinkauto-connect capture hooks by default (--no-connectto opt out; best-effort — a connect failure warns, never fails the command).linkrefreshes a hybridAGENTS.mdand guards against a project name that diverges from the hub registry.- Vocabulary reconciled across docs and code: the knowledge base is the umbrella term; the three shapes are in-repo, hybrid, and external; "vault" and "specs" are retired; the
--externalflag is removed (use--hub). - Plumbing commands are hidden from
--help(observe, index, ingest, distill, promote, redact); the human verbs stay visible. - Node 18 is no longer supported — the runtime floor is now Node 20 (Node 18 reached end-of-life 2025-04-30). Dependencies modernized: commander 15, ora 9, @inquirer/prompts 8, TypeScript 6.
- ADR-0023 ratifies the hub layout: a hub owns its own notes plus flat
projects/<name>/directories — scope separation, not duplication.
Fixed
resolveDocsRootnow resolves a hub-owned project directory directly, so grooming a hub's projects viamage <engine> --dir <hub>/projects/<name>/works even when the member code repo is absent on the machine. Caught by the pre-publish dogfood, where a hub-owned project's accumulated captures were otherwise unreachable by the grooming engine.
Removed
- The spec-driven-development (SDD) skills.
v0.0.9 — readiness
[0.0.9] - 2026-06-10
Readiness release — make the self-grooming loop observable and adoptable.
Added
mage dashboardgenerates a committableDashboard.mdand an Obsidian
Knowledge.baseso you can read your proposal queue, wings, notes, skills,
durability ladder, and health from inside your vault.mage dashboard --htmlbuilds a self-contained, offlinedashboard.html
cockpit — no server, gitignored, with an interactive force-directed knowledge
graph (zoom/pan, type-colored nodes, click-to-open).mage dashboard --open-with <file|obsidian|vscode>chooses what a node/row
click opens. Defaultfileis a relative link that opens the raw note from the
page's own origin — works in any browser/OS (incl. WSL), no app required;
obsidianandvscodeemit the respective deep-links.mage doctor --fixrepairs.gitignoreentries so capture sinks stay out of
commits, andmage doctor --reportproduces a redacted, content-free support
bundle you can paste into an issue.mage doctorchecks code-repo<->hub link integrity, and--fixheals a stale
hub back-reference after a code repo is moved (the forwardhub_pathand the
hub'scode_repo_pathdrift independently on a move;mage connectnever
repaired them — onlymage linkdid).mage doctornow distinguishes a never-connected KB from one that WAS capturing
and is now disconnected (capture history present but no hooks wired) — so a
silently-dropped connection is reported instead of looking like a fresh KB.- Brand assets: the graph-"m" mark and a social card under
assets/.
Changed
mage connectnow self-heals.gitignoreso capture sinks (.learnings/,
.metrics/) can never be committed.mage doctorgrows from an env-only check into full KB and connection health:
KB structure, a gitignore-leak guard, and hook-block and version-drift
detection.- Reaffirmed: mage sends nothing off your machine. The only improvement signal
is the local.metrics/accept-reject ladder — no telemetry, fully offline.
Fixed
- Capture now routes for external/hub knowledge bases.
resolveDocsRoot
(the resolver behind every capture, grooming, and dashboard run) read but
never honored a code repo'smode: "external"metadata, so work in a
member code repo never reached its hub and hub KBs silently produced no
.learnings/. It now followshub_pathto<hub>/projects/<project>/.
(A member repo must still be linked withmage linkand connected with
mage connectfor its sessions to capture.)
v0.0.8 — self-grooming
mage 0.0.8 closes the self-grooming loop: observe -> distill -> promote -> graduate -> optimize, all human-committed.
Recurrence (promote)
mage promote --jsonfolds the observed.learnings/into a per-(wing+keywords) recurrence tally that counts DISTINCT sessions and survives the raw-event purge. It surfaces note-candidates (a pattern recurring across >= K sessions with no covering note) and graduation-candidates (a covered, procedural note recurring >= M sessions).- A sensitivity dial (low / normal / high, in
metadata.json) scales the thresholds; every number lives in one seam.
The dream applier (the single writer)
mage dream --applyapplies one confirmed Proposal -- graduate (note -> Procedure skill), demote (skill -> note, archived), merge, split, reword -- enforcing four hard ceilings: never auto-commit, never touch a bespoke (non-generated) skill, never hard-delete (archive only), never write past a Gate-2 secret block.mage dream --rejectrecords a back-off.
Judgment skills
mage:promote(recurrence catch-net -> note / merge),mage:graduate(note -> skill),mage:optimize(reword or demote a skill on persistently-low context-match, bounded per pass).
Capture
- A new
assistant_msgobserve event captures the agent's final reply per turn (redacted) so a user correction carries its antecedent. Re-runmage connectto install the new Stop hook.
Notes
- 644 tests. Built in three verified stages via partitioned multi-agent workflows with adversarial review, which caught and fixed a never-hard-delete bypass, a reword YAML-injection, and a recurrence-fragmentation bug found in dogfood.
- Scope: dream's note-health (stale / superseded / dangling / orphans) remains a read-only detector; auto-applying consolidate / prune / supersede is a later increment.
- No npm change until published separately.
Governing decision: ADR-0019 (mage/decisions/0019-mage-promote-self-grooming.md).
v0.0.7 — distill
distill (ADR-0018): turn the captured .learnings/ scratch into durable notes.
Highlights
mage distill— a deterministic reader (--json) that groups un-distilled, CLOSED.learnings/events into candidate clusters across four lenses (user corrections first-class, then error→fix, repeated workflow, tool preference), salience-filtered and chunked at compact/session boundaries, under a per-session offset watermark (.metrics/distill.json) advanced only by an explicitmage distill --seen.mage:distillskill — drafts notes on first sight through the existingmage:learncapture pipeline (overlap-check → redaction → human-confirm → write). Recurrence and note→skill graduation remain deferred to a later release.- Redaction Gate 2 at the commit boundary —
mage redact --check --stagedplus an opt-in, blockingpre-commithook installed bymage connect(--no-git-hookto skip). Scoped to the knowledge base (themage/docs root), not the whole repo: application source — including a redaction tool's own secret-shaped test fixtures — is out of scope by design. Blocks a live secret, warns on PII, fails open whenmageis absent. - Feeders cut — mage works on its own
.learnings/only; foreign memory stores are no longer harvested.mage:learn --fromremains a generic doc importer. (Amends ADR-0005 / ADR-0013 §5.)
Notes
- 474 tests; build + typecheck green; dogfooded across in-repo, hub, and external topologies.
- No npm change until published separately.
Full design: mage/decisions/0018-mage-distill-observed-scratch-reader.md.
v0.0.6 — connect + read-only context-match metrics
mage 0.0.6 makes auto-capture opt-in and self-wiring, and lands the first read-only signal over captured sessions.
Added
mage connect/mage disconnect— wire (or remove) mage's capture hooks in Claude Code's.claude/settings.local.json(personal, gitignored;--usertargets~/.claude/settings.json). Each group is markedid:"mage:*"; the merge is idempotent read-modify-write, backs the file up to.bak, and refuses to touch malformed JSON. (ADR-0017)mage skills --metrics— read-only context-match report (--json,--quiet) over a gitignoredmage/.metrics/rollup, folded incrementally each turn by theStophook. Advisory only: it flagsreword-suggested/demote-suggested, it never acts. (ADR-0016)- A shared
resolveInteractivedual-mode helper acrossinit/link/unlink/connect/disconnect: non-TTY implies non-interactive (an explicit flag or a documented default, otherwise a clear error naming the flag — it never hangs).
Fixed
- Redaction: added a dedicated
anthropic-keydetector. Realisticsk-ant-...keys were only partially scrubbed by the generic high-entropy detector (the-/_in the key body split the run, leaking thesk-ant-...prefix). Surfaced by live dogfooding now thatconnectroutes capture automatically. - Capture: keyword derivation at capture drops pure-numerics and ADR/frontmatter boilerplate, so a skill's context-match keyword predicate is usable.
- Dev toolchain: vitest upgraded to 4.1.8 (clears GHSA-5xrq-8626-4rwp).
Notes
- Capture stays strictly opt-in — hooks are not bundled with the skills plugin;
mage connectis the consent gate. - Verified end to end: 383 unit tests, a command-level harness, and real hook-fired capture in this repo (a prompt, tool_use events including a real failure, and a skill_load). A single tool failure yields exactly one event (no PostToolUse/PostToolUseFailure double-fire).
Full changes: v0.0.5...v0.0.6
v0.0.5 — mage observe (hook-fired capture seam)
mage 0.0.5 — mage observe (hook-fired capture seam)
This release ships the keystone of the self-grooming loop: a deterministic, no-runtime mage observe command that host hooks invoke to capture work into a normalized, harness-neutral .learnings/*.jsonl schema. It implements ADR-0015 and is the foundation that connect / distill / promote / optimize all read.
Added — mage observe
A plumbing-tier command (invoked by host hooks, never typed by hand) that reads a Claude Code hook JSON on stdin, maps it to one event, scrubs free-text fields, and appends it — without ever blocking the host.
- Six normalized event types:
session_start,user_prompt,skill_load,tool_use,compact,session_end, behind a versioned, additive-only envelope (v,ts,session,type). - Salient-extract
tool_use— structured path extraction (file tools) plus a bounded per-tooldetail; no raw tool input/output is stored (capture insight, not copies). skill_loadvia the Skill tool — recognized as a load event; mage-recognized skills snapshotmatch+trigger_hashat load time (what context-match will read in 0.0.6).- Tool failures are captured —
PostToolUseFailuremaps totool_usewithok:falseand the error summary; inlineis_erroris also honored. .learnings/hygiene is internal — size-cap rotation and age-purge, withskill_loadretained longer than bulkytool_usevia a per-session sidecar.
Security — Gate-1 redaction
- Free-text fields (
user_prompt.text,tool_use.detail/error_summary,skill_load.args) are scrubbed through the sharedredact()engine before write. - Scrub-only, never-block; fail-closed on a redactor error (a sentinel, never the raw value) and fail-open on observe (any error exits 0, never breaks the host hook).
- Input is bounded before scrubbing so a multi-megabyte field can't run the detector ruleset unbounded on the hot path.
Fixed
mage --versionnow reads the package version dynamically instead of reporting a stale hardcoded0.0.2.
Quality
- 290 tests; typecheck and build green.
- Dogfooded against real Claude Code hook payloads: all six event types, zero secret leaks, fail-open on malformed/empty input, and tool-failure capture confirmed.
- Establishes a "dogfood before publish" release discipline.
Notes
- This release is git/GitHub
v0.0.5. On npm,0.0.4was never published, so the next npm publish moves the package from0.0.3to0.0.5. - Auto-capture wiring across host harnesses (
mage connect) and the read-only context-match metrics land in0.0.6.mage observeparses Claude Code payloads today; the.learnings/schema is deliberately harness-neutral so other harnesses become additive input adapters.
v0.0.4 — mage ingest
mage 0.0.4 — mage ingest (the engine behind mage:learn --from)
Adds mage ingest <dir>, a deterministic, read-only enumerator/classifier that the mage:learn --from skill calls to get a reliable manifest of ingestable sources, instead of globbing by hand. Distillation and adoption stay in the skill (ADR-0013); this tool never writes.
mage ingest <dir> [--json]
Classifies each source under a directory:
| kind | what it is |
|---|---|
skill |
a SKILL.md (adopt-in-place candidate) |
note |
a mage-shaped .md (has type / tags) |
prose |
a plain doc / README / .txt / .markdown |
transcript |
a .jsonl capture |
feeder-ecc |
an ECC instinct YAML (lower-confidence feeder) |
feeder-native |
MEMORY.md or a native-memory note (lower-confidence feeder) |
--json emits the manifest for the skill to consume. The walk is recursive, skips .git/node_modules/dist/.obsidian, never follows symlinks, and never writes.
Quality
20 ingest tests (classification, priority invariants, skip-dirs, symlink guard, graceful degradation); 209 tests total. TDD plus a TypeScript review pass.
Full changelog: v0.0.3...v0.0.4
v0.0.3 — skills as a Claude Code plugin + mage redact
mage 0.0.3 — skills as a Claude Code plugin + mage redact
Skills ship as a Claude Code plugin
mage's hand-authored skills now install as a Claude Code plugin, so they group under a clean mage: namespace instead of carrying a mage- prefix on every name:
/plugin marketplace add Sumit1993/mage-memory
/plugin install mage@mage
You get mage:learn (capture a durable note), mage:guide (how to use the knowledge base), and the mage:specify · mage:clarify · mage:plan · mage:tasks · mage:implement · mage:analyze · mage:constitution spec-driven-development workflow. mage init prints these install lines for you — it never runs slash commands. Per-wing mage-wing-* skills are still generated into .claude/skills/ + .agents/skills/ by mage skills.
The
mage:namespace is a Claude Code feature; agents that read.agents/skills/directly see bare names.
mage redact — two-gate redaction (ADR-0014)
A deterministic, no-model/no-network secret & PII scanner — the commit-boundary gate before a note or skill is written:
mage redact <file> # report secrets/PII (masked preview; never prints the raw value)
mage redact <file> --strip # emit redacted text to stdout15 detectors (AWS access/secret, GitHub classic + fine-grained PAT, GitLab, Stripe, OpenAI, Slack, Azure AccountKey, JWT, bearer, DB-URL credentials, key=value / "key": "value", SCREAMING_SNAKE env vars, high-entropy), all ReDoS-safe (~1 ms on 50 KB), masked previews that never leak the raw secret, idempotent redact(), and false-positive guards for git SHAs / UUIDs / prose. A live secret exits non-zero (block-by-default). Hardened across two adversarial security reviews.
Direction — toward 0.1.0
A design grill resequenced the roadmap toward a 0.1.0 horizon: the full self-grooming memory loop — capture, graduate proven notes into skills, optimize from real usage. Captured in ADR-0013 (procedure skills + the self-grooming loop) and ADR-0014 (two-gate redaction).
Install
npm i -g mage-memory # the `mage` CLI
# then, in Claude Code:
/plugin marketplace add Sumit1993/mage-memory
/plugin install mage@mageFull changelog: v0.0.2...v0.0.3