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 +92 -0
- package/README.md +85 -38
- package/assets/MEMGINEERING.md +1 -1
- package/assets/memgineering-writing/SKILL.md +24 -7
- package/dist/index.js +5264 -5060
- package/package.json +1 -1
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
|
-
|
|
7
|
-
of them is there for the next one,
|
|
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.**
|
|
79
|
-
|
|
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
|
|
106
|
-
is decided
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
|
135
|
-
|
|
|
136
|
-
| `
|
|
137
|
-
| `
|
|
138
|
-
| `
|
|
139
|
-
| `
|
|
140
|
-
| `
|
|
141
|
-
| `
|
|
142
|
-
| `
|
|
143
|
-
| `
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
|
148
|
-
|
|
|
149
|
-
| `
|
|
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
|
|
package/assets/MEMGINEERING.md
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
|
294
|
-
|
|
295
|
-
|
|
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
|
|
388
|
-
|
|
389
|
-
|
|
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
|
|