memgineering 0.13.0 → 0.14.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 CHANGED
@@ -11,6 +11,98 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.14.0] — 2026-08-29
15
+
16
+ ### Added
17
+
18
+ - **A hosted brain's base files can finally be written.** `memgineering
19
+ base-write 01_BASE/USER.md --input <file|-|text>` fills or replaces the
20
+ body of a `01_BASE/` file on a hosted brain — the files `onboard` points
21
+ at, which until now could only be filled on a folder and left a hosted
22
+ brain reading as a blank form forever. The `memgineering:` block above
23
+ the body survives byte-for-byte, a body that would itself parse as
24
+ frontmatter is refused rather than stored as a note that invents its own
25
+ id, and replacing requires the revision a prior read handed you. On a
26
+ folder brain the verb refuses and names the file to open instead: there,
27
+ bodies belong to your own file tools, and that has not changed.
28
+ - **The write is in the ledger, and `undo` takes it back.** A base write
29
+ records the same row every other change does; `undo` restores the
30
+ replaced body, or deletes the file when the write is the one that
31
+ created it. The replaced prose waits OUTSIDE the ledger, for 90 days —
32
+ the ledger records hashes and a reverse patch, never a note's text, and
33
+ an append-only copy of deleted prose would be one nothing screens. After
34
+ 90 days the sweep takes it and that particular write can no longer be
35
+ reversed; the refusal says so plainly rather than calling it "expired".
36
+ The privacy page names this store and its window.
37
+ - **Boundaries screen base writes too**, with one exemption: a note that
38
+ declares `never_store` words may say its own words in its own body —
39
+ which is what a BOUNDARIES.md is for — and that write carries the
40
+ `declared` mark in the ledger, so a crossing the record cannot name is
41
+ not possible. Other notes' declared words still refuse there.
42
+ - **A draft leaves a ledger row the moment it exists.** `propose` (and the
43
+ hosted equivalent) now records that a draft was made, so a proposal that
44
+ expired unseen is visible in `log` instead of having never existed. The
45
+ row carries no patch and no hashes, because nothing changed: undoing it
46
+ is refused with the way out named — decide it, approve or reject. A bare
47
+ `undo` steps over a waiting draft rather than refusing because one is
48
+ pending, and `evidence` counts drafts on their own line instead of
49
+ inflating what changed.
50
+
51
+ ### Changed
52
+
53
+ - **`revise` against a hosted brain now answers with the boundary words the
54
+ note actually holds**, parsed from the bytes that landed rather than the
55
+ ones that were sent. `--never-store-add` uses that answer instead of
56
+ reading the note back, so widening a boundary costs one round trip fewer
57
+ while the check that catches a server storing something other than what
58
+ it accepted stays exactly as strong. A server too old to answer that way
59
+ is detected by the absence and read back as before.
60
+ - `revise --json` against such a server therefore carries a `never_store`
61
+ field.
62
+
63
+ ### Fixed
64
+
65
+ - **The `undo` line printed after a `--local` write now says `--local`.**
66
+ It printed `--vault` or nothing, so on a machine signed in to a hosted
67
+ brain the suggested undo acted on the cloud brain — a suggestion that
68
+ failed when followed, on the exact machine `--local` exists for. Both
69
+ flags print when both were passed.
70
+ - The refusal a folder brain gives `base-write` names the file to edit in
71
+ full; an earlier form truncated long paths, cutting off the one thing
72
+ the message exists to say.
73
+
74
+ ### Agent guidance
75
+
76
+ - The `memgineering-writing` skill changed: onboarding branches on where
77
+ the brain lives (file tools on a folder, `base-write` on a hosted
78
+ brain), the line claiming no route can edit a base file's body is gone,
79
+ and the `propose` section says a draft leaves a ledger row and is closed
80
+ by deciding. **Restart your agent session after upgrading** so the new
81
+ guidance is what gets injected.
82
+
83
+ ### Note for older clients
84
+
85
+ Two ledger verbs are new (`write`, `propose`). A CLI older than this
86
+ release skips a line it does not recognise in a folder brain's ledger, and
87
+ its bare `undo` then refuses outright rather than reversing the wrong
88
+ thing — it stops instead of guessing. Upgrading both ends removes the gap.
89
+
90
+ ## [0.13.1] — 2026-08-28
91
+
92
+ ### Changed
93
+
94
+ - **The README matches the CLI it ships with.** It had drifted in the ways
95
+ that mislead: "Nothing is uploaded" predated hosted brains (now: nothing is
96
+ uploaded until you `push` or connect one); the brain-resolution order
97
+ omitted the signed-in machine pointer, which outranks every folder rule;
98
+ the command table was missing thirteen verbs, including the entire account
99
+ group; and storage boundaries — the control "Your notes stay yours" is
100
+ about — were absent entirely. Also fixed: the environment table now lists
101
+ `MEMGINEERING_API_URL` and `MEMGINEERING_AGENT_HOME`, the tool list names
102
+ what `setup` actually installs into (Claude Code, Codex, Grok, Gemini CLI),
103
+ and `resurface`'s folder-local ranking signal is described as existing only
104
+ for a brain on this machine. No behaviour changed.
105
+
14
106
  ## [0.13.0] — 2026-08-28
15
107
 
16
108
  ### Added
package/README.md CHANGED
@@ -3,9 +3,9 @@
3
3
  One memory for the AI you connect.
4
4
 
5
5
  Your notes stay in a folder you own. Every agent you use — Claude Code, Codex,
6
- Antigravity reads and writes the same brain through one CLI, so what you told one
7
- of them is there for the next one, tomorrow, and in whatever tool you move to
8
- after that.
6
+ Grok, Gemini CLI, anything that can run a command reads and writes the same
7
+ brain through one CLI, so what you told one of them is there for the next one,
8
+ tomorrow, and in whatever tool you move to after that.
9
9
 
10
10
  **You do not have to run any of this yourself.** Ask whichever agent you are
11
11
  already talking to — "install memgineering and set it up" — and it does the
@@ -75,14 +75,23 @@ away.
75
75
 
76
76
  ## Your notes stay yours
77
77
 
78
- - **Nothing is uploaded.** The index is derived and lives outside your notes
79
- folder; deleting it costs a rebuild and nothing else.
78
+ - **Nothing is uploaded until you say so.** A brain is a folder on this disk;
79
+ only `push`, or connecting a hosted brain, carries notes to your account. The
80
+ index is derived and lives outside your notes folder; deleting it costs a
81
+ rebuild and nothing else.
80
82
  - **Prose is never rewritten.** `revise` only touches the memory block in a
81
83
  note's frontmatter. Your paragraphs are yours.
82
84
  - **You decide what is read.** `link` shows the actual lines that would be
83
85
  stored — not a description of them — before anything is indexed. Notes whose
84
86
  content looks like a credential are refused automatically; anything else you
85
87
  want left alone goes in `.memgdeny`.
88
+ - **You decide what is never written.** Say "nothing about my health goes in
89
+ here" and the declaration is enforced, not advised:
90
+ `remember "…" --never-store "health, hospital"` records the boundary in your
91
+ own words, and any later write carrying one of them is refused with the word
92
+ and your declaration quoted back — whether or not the agent read anything
93
+ first. Widen it one word at a time with `revise --never-store-add`; retire
94
+ the declaration to lift it.
86
95
  - **`memgineering unlink --purge`** removes every trace this tool kept locally.
87
96
 
88
97
  ## Progressive reading
@@ -102,19 +111,23 @@ and read it" in a single call.
102
111
 
103
112
  ## Several brains
104
113
 
105
- A personal one, a team folder that syncs, one per repository. Which one answers
106
- is decided by where you are:
114
+ A personal one, a team folder that syncs, one per repository, one in your
115
+ account. Which one answers is decided in this order:
107
116
 
108
- 1. `--vault <path>`
109
- 2. a `.memgineering` pointer, found by walking up from the current directory
110
- 3. the brain the current directory is inside
111
- 4. the only one linked
117
+ 1. an explicit flag — `--vault <path>`, `--brain <name>` (a hosted brain, without
118
+ moving the machine's pointer), or `--local`
119
+ 2. the hosted brain this machine is pointed at, when you are signed in
120
+ 3. a `.memgineering` pointer, found by walking up from the current directory
121
+ 4. the brain the current directory is inside
122
+ 5. the only one linked
112
123
 
113
124
  If nothing settles it, memgineering refuses and lists the candidates rather
114
- than guessing. To bind a directory once — a repository root, say:
125
+ than guessing. To bind a directory once — a repository root, say — or to point
126
+ the whole machine at a hosted brain:
115
127
 
116
128
  ```bash
117
129
  memgineering use ~/brains/work # writes a relative path when it can, so it commits
130
+ memgineering use --brain "work" # this machine now reads that hosted brain
118
131
  ```
119
132
 
120
133
  ## Starting a session
@@ -123,40 +136,74 @@ memgineering use ~/brains/work # writes a relative path when it can, so it co
123
136
  memgineering resurface
124
137
  ```
125
138
 
126
- No query. It ranks by what has been recalled in this folder before, how
127
- recently, and which of your base notes have gone unread. `memgineering setup`
128
- can register it to run automatically when a Claude Code session starts.
139
+ No query. It ranks by what has been recalled before, how recently, and which of
140
+ your base notes have gone unread a folder-local signal joins in when the
141
+ brain lives on this machine. `memgineering setup` can register it to run
142
+ automatically when a Claude Code session starts.
129
143
 
130
144
  ## Commands
131
145
 
132
- | | |
133
- | ----------------------------------- | ----------------------------------------------------- |
134
- | `recall <query>` | recall memory cards for a question |
135
- | `open <ref>` | open one memory — by handle, id, path, or exact title |
136
- | `remember <text>` | write something down now |
137
- | `revise <ref>` | change a memory's conclusion |
138
- | `undo [op]` | take back the last change, or a named one |
139
- | `resurface` | what is worth having in view, unasked |
140
- | `init <path>` | create a brain, laid out and ready |
141
- | `link <path>` | read notes you already keep |
142
- | `use [brain]` | bind this folder to one brain |
143
- | `push` · `pull` | carry a brain to your account, and back down again |
144
- | `unlink` · `reindex` · `sync-rules` | brain housekeeping |
145
- | `log` | what changed, and what can still be undone |
146
- | `retire` · `unretire` | mark a memory no longer current, or current again |
147
- | `exclude` · `unexclude` | stop reading a note entirely, or resume |
148
- | `setup` | install into your agents |
149
- | `update` | update memgineering itself |
146
+ **Memory — day to day**
147
+
148
+ | | |
149
+ | ----------------- | ----------------------------------------------------- |
150
+ | `recall <query>` | recall memory cards for a question |
151
+ | `open <ref>` | open one memory — by handle, id, path, or exact title |
152
+ | `evidence <ref>` | how much a memory has been used, and why it changed |
153
+ | `remember <text>` | write something down now |
154
+ | `revise <ref>` | change a memory's conclusion |
155
+ | `undo [op]` | take back the last change, or a named one |
156
+ | `resurface` | what is worth having in view, unasked |
157
+ | `rules` | the standing decisions that bind here |
158
+
159
+ **Brain set up and point**
160
+
161
+ | | |
162
+ | ----------------------------------- | ------------------------------------------------------------------------ |
163
+ | `init <path>` | create a brain, laid out and ready |
164
+ | `onboard` | what to ask so it knows who it belongs to |
165
+ | `link <path>` | read notes you already keep |
166
+ | `use [brain]` | bind this folder — or, with `--brain`, point the machine at a hosted one |
167
+ | `unlink` · `reindex` · `sync-rules` | brain housekeeping |
168
+ | `log` | what changed, and what can still be undone |
169
+
170
+ **Curation — occasional**
171
+
172
+ | | |
173
+ | ----------------------- | --------------------------------------------------- |
174
+ | `retire` · `unretire` | mark a memory no longer current, or current again |
175
+ | `exclude` · `unexclude` | stop reading a note entirely, or resume |
176
+ | `consolidate` | find memories worth merging — reads, writes nothing |
177
+ | `propose <action>` | draft a change for approval — writes no note |
178
+ | `proposals` | review what is waiting — approve, reject, rebase |
179
+
180
+ **Account — optional; everything above works without it**
181
+
182
+ | | |
183
+ | ------------------------------------ | --------------------------------------------------- |
184
+ | `login` · `logout` · `whoami` | the account session on this machine |
185
+ | `brains` | list your hosted brains, and which one answers here |
186
+ | `create` · `rename` · `delete-brain` | make, rename, or delete a hosted brain |
187
+ | `push` · `pull` | carry a brain to your account, and back down again |
188
+
189
+ **System**
190
+
191
+ | | |
192
+ | -------- | -------------------------- |
193
+ | `setup` | install into your agents |
194
+ | `update` | update memgineering itself |
150
195
 
151
196
  Every command takes `--json`.
152
197
 
153
198
  ## Environment
154
199
 
155
- | | |
156
- | -------------------------- | --------------------------------------------------- |
157
- | `MEMGINEERING_HOME` | state and derived index (default `~/.memgineering`) |
158
- | `MEMGINEERING_JSON=1` | force JSON output without the flag |
159
- | `MEMGINEERING_NO_UPDATE=1` | skip the version check for one run |
200
+ | | |
201
+ | -------------------------- | ------------------------------------------------------------ |
202
+ | `MEMGINEERING_HOME` | state and derived index (default `~/.memgineering`) |
203
+ | `MEMGINEERING_JSON=1` | force JSON output without the flag |
204
+ | `MEMGINEERING_NO_UPDATE=1` | skip the version check for one run |
205
+ | `MEMGINEERING_API_URL` | hosted brain server (default `https://api.memgineering.com`) |
206
+ | `MEMGINEERING_AGENT_HOME` | where `setup` installs agent files (default: your home) |
160
207
 
161
208
  ## A brain that is not on this machine
162
209
 
@@ -2,7 +2,7 @@
2
2
  name: memgineering
3
3
  description: Use whenever the user refers to something they told you before, asks what was decided, tells you something worth keeping, or settles something that should hold next time. The memory lives in their own folder and outlives this session; check it before answering from guesswork, and write to it when you learn something durable.
4
4
  type: skill
5
- version: 0.13.0
5
+ version: 0.14.0
6
6
  ---
7
7
 
8
8
  # memgineering
@@ -205,7 +205,10 @@ memgineering propose supersede --memory <id> --claim "…" --reason "…" --exce
205
205
  memgineering propose reclassify --memory <id> --kind decision --reason "…" --excerpt "…"
206
206
  ```
207
207
 
208
- `propose` is where the judgement goes in, and it still writes no note. The
208
+ `propose` is where the judgement goes in, and it still writes no note — but it
209
+ does leave a ledger row the moment the draft exists, so `log` shows a draft
210
+ that later expired unseen instead of pretending it never was. Undoing that row
211
+ is refused on purpose: a draft is closed by deciding it, approve or reject. The
209
212
  actions are `supersede`, `reinforce`, `conflict`, `retire`, `unretire` and
210
213
  `reclassify` — the same vocabulary `revise` uses, plus the one that only changes
211
214
  what sort of memory it is. **`--excerpt` is required for every one of them**,
@@ -290,9 +293,20 @@ its own kind of forgetting. They may also ask outright ("set up my memory", "fil
290
293
  thin out — three good lines beat a filled-in template. Take what they say in
291
294
  passing during ordinary work too; most of `TOOLING.md` gets written by noticing.
292
295
 
293
- **How to write it — both halves.** `revise` only touches frontmatter, so write
294
- the body FIRST with your normal file tools, replacing the template's prompt with
295
- what they actually said, then record the conclusion:
296
+ **How to write it — both halves.** `revise` only touches frontmatter, so the
297
+ body comes first, and how you write it depends on where the brain lives. On a
298
+ folder: your normal file tools, replacing the template's prompt with what they
299
+ actually said. On a hosted brain there are no files — the body goes through the
300
+ verb built for exactly this:
301
+
302
+ ```
303
+ memgineering base-write 01_BASE/USER.md --input -
304
+ ```
305
+
306
+ (`--input` takes a file, `-` for stdin, or the text inline. Only `01_BASE/`
307
+ files — an ordinary note's body is never written this way. The write lands in
308
+ the ledger and `undo` can take it back, though not forever: the replaced body
309
+ is kept 90 days.) Then record the conclusion either way:
296
310
 
297
311
  ```
298
312
  memgineering revise 01_BASE/USER.md \
@@ -384,9 +398,12 @@ which you meant.
384
398
  To lift a boundary entirely: `memgineering retire <the declaration>`. That is
385
399
  the un-declare path, and it is the user's decision, never yours.
386
400
 
387
- On a hosted brain the declaration NOTE is the record there is no route that
388
- edits a base file's body, so mirroring the sentence into `BOUNDARIES.md` is a
389
- folder-brain and onboarding-time thing.
401
+ On a hosted brain the declaration NOTE is the record, and since 0.14.0 the
402
+ sentence can ALSO live in `BOUNDARIES.md` itself: `base-write` fills a base
403
+ file's body where there are no files to edit. A boundary note may say its own
404
+ declared words in its own body — that write carries the `declared` mark in the
405
+ ledger — but OTHER notes' declared words still refuse there like everywhere
406
+ else.
390
407
 
391
408
  ### When a write is refused
392
409