memgineering 0.5.0 → 0.6.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 +437 -0
- package/NOTICE +22 -0
- package/README.md +1 -1
- package/assets/MEMGINEERING.md +44 -173
- package/assets/memgineering-memory/SKILL.md +44 -329
- package/assets/memgineering-recall/SKILL.md +142 -0
- package/assets/memgineering-rules/SKILL.md +111 -0
- package/assets/memgineering-setup/SKILL.md +184 -119
- package/assets/memgineering-writing/SKILL.md +183 -0
- package/dist/index.js +2575 -753
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,443 @@ language the reader wants. The bilingual rule the monorepo applies to
|
|
|
11
11
|
|
|
12
12
|
## [Unreleased]
|
|
13
13
|
|
|
14
|
+
## [0.6.0] — 2026-08-16
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **A memory can say it binds.** `memgineering remember "<the decision>" --rule`
|
|
19
|
+
marks something as a decision rather than a fact — a colour you will not use, a
|
|
20
|
+
step never to skip. `memgineering rules` lists what is marked. Ordinary
|
|
21
|
+
observations are untouched, and a note that never mentions this is stored
|
|
22
|
+
exactly as before.
|
|
23
|
+
|
|
24
|
+
- **Your rules turn up before an edit, not after somebody asks.** With the hooks
|
|
25
|
+
installed (`memgineering setup`, Claude Code and Codex), whichever agent is
|
|
26
|
+
working in a folder is handed your marked decisions the first time it goes near
|
|
27
|
+
a file in that session — once, capped at eight lines, silent for the rest of the
|
|
28
|
+
session. It never blocks an edit and never answers whether one is allowed; the
|
|
29
|
+
worst it can do is stay quiet.
|
|
30
|
+
|
|
31
|
+
This exists because the session-start summary alone was measured not to work.
|
|
32
|
+
Twice, a session was given a recorded decision — "this site uses no blue", hex
|
|
33
|
+
codes included — at session start, and shipped a blue page; adding a stronger
|
|
34
|
+
instruction to that opening made the next run worse. A decision has to arrive
|
|
35
|
+
when it is about to be broken.
|
|
36
|
+
|
|
37
|
+
- **`memgineering undo` works on a hosted brain for more than `remember`.** A
|
|
38
|
+
`revise`, `retire` or `unretire` made against a hosted brain could not be taken
|
|
39
|
+
back — the refusal said the reverse patch was "not written yet", which was true
|
|
40
|
+
of nothing: it had been recorded all along and nothing read it. A change to a
|
|
41
|
+
memory that cannot be reversed is the one thing this tool promises never to
|
|
42
|
+
make, and it was making it. The reversal is byte for byte, refuses if the note
|
|
43
|
+
has been written since, and will not run twice.
|
|
44
|
+
|
|
45
|
+
- **Rules work on a hosted brain.** `memgineering rules` lists them and
|
|
46
|
+
`remember --rule` creates them there; both used to answer "a hosted brain does
|
|
47
|
+
not store the marking yet", which was true of the schema and false of the note —
|
|
48
|
+
a hosted brain keeps the whole text, so the marking arrived with every push and
|
|
49
|
+
nothing read it. Pushing a brain holding five standing decisions produced a
|
|
50
|
+
rules list of zero. Rules already pushed are backfilled, so they appear without
|
|
51
|
+
anyone re-writing them.
|
|
52
|
+
|
|
53
|
+
The before-edit hook still reads a brain on this machine: a network call on the
|
|
54
|
+
path of every file write is not a trade worth making. On a machine pointed at a
|
|
55
|
+
hosted brain, `memgineering rules --local` is what the hook will actually
|
|
56
|
+
deliver.
|
|
57
|
+
|
|
58
|
+
- **A memory can become a rule after it was written**, on a brain in a folder or
|
|
59
|
+
a hosted one. `memgineering revise <ref> --rule` marks an existing memory as a
|
|
60
|
+
decision that binds, and `--no-rule` stops it being one; leaving both off
|
|
61
|
+
changes nothing, as before. Until now the marking was fixed at the moment a note
|
|
62
|
+
was created, which is the wrong moment — a conclusion usually becomes a rule
|
|
63
|
+
later, when it changes.
|
|
64
|
+
|
|
65
|
+
The hosted half briefly shipped as the worst version of this: the command took
|
|
66
|
+
the flag, sent nothing, and reported success, so a rule somebody had just turned
|
|
67
|
+
off was still a rule and nothing said so. It carries now.
|
|
68
|
+
|
|
69
|
+
- **`memgineering use --json` says where the next write goes.** `destination` is
|
|
70
|
+
`"hosted"`, `"local"`, or `"pending"` — the third meaning a sign-in is waiting
|
|
71
|
+
to be approved, so writes land in `brain` until then and in `hosted` after
|
|
72
|
+
(`destination_until_approved` names the first half). `hosted.sign_in_pending`
|
|
73
|
+
carries the same distinction as a boolean. `hosted.signed_in` alone cannot
|
|
74
|
+
answer the question: it is false for both the logged-out and the waiting
|
|
75
|
+
state, and those land in different places.
|
|
76
|
+
|
|
77
|
+
- **`memgineering log --json` carries `superseded` on every operation**, on a
|
|
78
|
+
brain in a folder and a hosted one alike. It is what the printed line uses to
|
|
79
|
+
decide whether to offer `undo`, and a caller reading the structured output had
|
|
80
|
+
no way to reach the same conclusion.
|
|
81
|
+
|
|
82
|
+
### Changed
|
|
83
|
+
|
|
84
|
+
- **A large push is no longer stopped by the server's rate limit.** The server
|
|
85
|
+
allows 300 requests a minute and `push` sends one per note, in order, so a brain
|
|
86
|
+
past that size climbed to the ceiling and stopped part-way — some notes across,
|
|
87
|
+
some not. A refusal is now waited out and the note re-sent, up to a bounded
|
|
88
|
+
number of times, and the pause says why once rather than going quiet. Only
|
|
89
|
+
`429` is retried: it means the request was refused, so nothing was written and
|
|
90
|
+
repeating it cannot double anything.
|
|
91
|
+
|
|
92
|
+
- **A hook can no longer hold your session open.** Both callbacks now give up
|
|
93
|
+
after five seconds and print nothing, and the hook `setup` installs carries a
|
|
94
|
+
timeout for the host to enforce as well. Neither existed before, and the gap was
|
|
95
|
+
not theoretical: a brain kept in a folder the OS syncs to the cloud, whose notes
|
|
96
|
+
had been evicted and would not come back, blocked `resurface` for over two
|
|
97
|
+
minutes — at the start of every session, because that is when it runs. Run by
|
|
98
|
+
hand, `resurface` still waits as long as your brain takes; you asked for it and
|
|
99
|
+
you are watching.
|
|
100
|
+
|
|
101
|
+
- **`memgineering setup --agent --hook off` now removes the callbacks.** It used
|
|
102
|
+
to skip installing them, which is right on a machine that never had them and
|
|
103
|
+
wrong on every machine that did — so the hooks stayed armed under a report that
|
|
104
|
+
had just printed "Turn it back off with `--hook off`". Only the groups
|
|
105
|
+
memgineering wrote are taken out; every other hook and setting in that file is
|
|
106
|
+
left exactly as it was, and a settings file that cannot be parsed is reported
|
|
107
|
+
rather than passed over in silence.
|
|
108
|
+
|
|
109
|
+
- **A guide whose markers were deleted no longer duplicates in silence.** Without
|
|
110
|
+
`<!-- memgineering-start -->` and `<!-- memgineering-end -->` the file read as
|
|
111
|
+
"never installed", so a second copy of the whole guide was appended — into every
|
|
112
|
+
session, permanently, with nothing to detect it.
|
|
113
|
+
|
|
114
|
+
Where setup can prove it wrote that file, it now skips it, names it, finishes
|
|
115
|
+
the rest of the run, and exits non-zero. Where it cannot — an install from a
|
|
116
|
+
release before this one, or a machine whose config is gone — it installs anyway,
|
|
117
|
+
because refusing there would make a first install impossible for anyone whose
|
|
118
|
+
own notes happen to use the same two verbs, and says so: "Appended below an
|
|
119
|
+
unmarked guide", with what to check. Losing only the end marker still repairs
|
|
120
|
+
itself.
|
|
121
|
+
|
|
122
|
+
- **Replacing something you edited is said out loud.** setup owns the guide block
|
|
123
|
+
and the skill files, so an upgrade overwrites them; it now records what it wrote
|
|
124
|
+
and tells you when what it replaced was not that. Ordinary upgrades stay quiet.
|
|
125
|
+
|
|
126
|
+
- **A flag that does not exist now says what does.** An unknown option used to
|
|
127
|
+
answer with one line and nothing to act on, and the recovery — opening the help
|
|
128
|
+
page — costs ten times what the answer does. The error now lists the command's
|
|
129
|
+
flags inline, and near-misses get a "did you mean" as well.
|
|
130
|
+
|
|
131
|
+
- **Codex gets both callbacks too.** `memgineering setup --hook on` now writes
|
|
132
|
+
them to `~/.codex/hooks.json` as well as Claude Code's settings, with a matcher
|
|
133
|
+
naming the tools Codex actually reports (`apply_patch` and `Bash` — it has no
|
|
134
|
+
Read or Grep tool, so its reading is a shell call). Codex was previously listed
|
|
135
|
+
as unable to run either one; a live session showed otherwise, including that
|
|
136
|
+
the before-edit hook's context reaches the model. One difference worth knowing:
|
|
137
|
+
Codex asks you to review new hooks once, at the start of the next session, and
|
|
138
|
+
runs nothing until you answer — the setup report now says so.
|
|
139
|
+
|
|
140
|
+
- **Grok is a supported tool.** `memgineering setup` installs the guide into
|
|
141
|
+
`~/.grok/rules/memgineering.md` and the skills into `~/.grok/skills/`, and Grok
|
|
142
|
+
loads both on its own.
|
|
143
|
+
|
|
144
|
+
Your rules reach it at the end of a turn rather than before an edit, and that
|
|
145
|
+
is the most the host allows. Three of Grok's hook events were each tried with a
|
|
146
|
+
value the session could not otherwise know — `PreToolUse` with
|
|
147
|
+
`additionalContext`, `SessionStart` stdout, `UserPromptSubmit` with
|
|
148
|
+
`additionalContext` — and all three hooks ran while none of the three arrived.
|
|
149
|
+
`Stop` does arrive. So the rules land as the turn finishes: too late for what
|
|
150
|
+
that turn already wrote, in time for everything after it. It costs one extra
|
|
151
|
+
round, once a session, because speaking there keeps the agent working.
|
|
152
|
+
`resurface` gets no hook on Grok at all; the guide asks for it instead.
|
|
153
|
+
|
|
154
|
+
- **The third tool is called Antigravity now.** Gemini CLI is discontinued and
|
|
155
|
+
Antigravity CLI took its place, keeping the same home — a line planted in
|
|
156
|
+
`~/.gemini/GEMINI.md` came back out of an `agy` session word for word, and one
|
|
157
|
+
planted in `~/.antigravity/` did not. So nothing moves: the guide and the
|
|
158
|
+
skills install exactly where they did, `--tools gemini` still selects it, and
|
|
159
|
+
only the name shown to you changes. It still has no hooks, so its skills tell
|
|
160
|
+
its agent to run `resurface` and `rules` itself.
|
|
161
|
+
|
|
162
|
+
- `memgineering setup --hook on` now arms two callbacks instead of one, and the
|
|
163
|
+
report names both. `--hook off` still installs neither.
|
|
164
|
+
|
|
165
|
+
- `sync-rules` is described as copying the brain's **read/index exclusions**,
|
|
166
|
+
which is what it has always copied. "Rules" alone now has another owner.
|
|
167
|
+
|
|
168
|
+
- **The bundled skills are English throughout, including their trigger
|
|
169
|
+
phrases.** 0.5.0 shipped a handful of Korean phrases in those triggers, so a
|
|
170
|
+
Korean speaker's agent could match a skill from the words they actually used;
|
|
171
|
+
everyone else got a package with one arbitrary second language in it. Picking
|
|
172
|
+
the trigger language at `setup` time is the right answer and is not built yet,
|
|
173
|
+
so until it is, the phrases are English.
|
|
174
|
+
|
|
175
|
+
Measured before saying so: the same Korean request that used to open a skill
|
|
176
|
+
still opens it with only English phrases installed, and six Korean requests
|
|
177
|
+
across two shapes were all handled correctly. A description is read by a model
|
|
178
|
+
that knows the language either way — the phrases name the situation, not the
|
|
179
|
+
wording. Asking for your memory in Korean still works.
|
|
180
|
+
|
|
181
|
+
- **The guidance now says a fact has to be checked, not worked out.** A session
|
|
182
|
+
that reads an address, an identifier or a version and then reasons its way to a
|
|
183
|
+
different one can write that reasoning into the brain as fact, where every later
|
|
184
|
+
session recalls it as one. A guess in a file turns up in a diff; a guess in a
|
|
185
|
+
memory does not. Two sentences, in the hub and in `memgineering-writing`: a
|
|
186
|
+
decision is whatever the user says it is, and anything a command or a file could
|
|
187
|
+
confirm goes in verified or not at all.
|
|
188
|
+
|
|
189
|
+
- **Tools that nothing calls for them now get told so.** On Antigravity — which
|
|
190
|
+
loads no skills of its own, measured — the installed guide was a router
|
|
191
|
+
pointing at five skills that were never opened, so a brain full of answers went
|
|
192
|
+
unread across a whole session. `setup` now appends two lines to the guide it
|
|
193
|
+
writes for any tool with no session hook: run `memgineering resurface` when you
|
|
194
|
+
start work in a folder, and `memgineering rules` before changing a file. Tools
|
|
195
|
+
that do get called back are unchanged, and see nothing extra.
|
|
196
|
+
|
|
197
|
+
Measured on the same task before and after: no memory calls and a generic
|
|
198
|
+
answer, then `resurface` + `rules`, the right answer, and the decision recorded
|
|
199
|
+
as a rule without being asked.
|
|
200
|
+
|
|
201
|
+
### Fixed
|
|
202
|
+
|
|
203
|
+
- **Everything on the install screen is drawn by the same hand.** The
|
|
204
|
+
comparison's row rules were 1px hairlines running directly underneath
|
|
205
|
+
hand-drawn frames — the only straight edges on the page, and the first thing
|
|
206
|
+
the eye found. Rules, the recommended badge and the checkboxes are drawn now,
|
|
207
|
+
and hovering a drawn control makes its outline quiver in place the way the
|
|
208
|
+
site's do, instead of repainting a background the way nothing else in the
|
|
209
|
+
product does. Reduced-motion settings hold it to a single frame.
|
|
210
|
+
|
|
211
|
+
- **The first install screen stops asking you to match a table to a pair of
|
|
212
|
+
cards.** It compared "this machine only" against "in an account" in a table,
|
|
213
|
+
and then offered the choice underneath as two cards — in the opposite order to
|
|
214
|
+
the columns, worded differently from the column headers. Someone seeing it for
|
|
215
|
+
the first time could not tell which card the left column was about, which is
|
|
216
|
+
the one thing that screen exists to make obvious. The two answers are now the
|
|
217
|
+
table's own column headers: picking one paints its whole column, so every row
|
|
218
|
+
is read against the answer it belongs to. The recommended one is first in both
|
|
219
|
+
senses, because there is only one order left to be first in.
|
|
220
|
+
|
|
221
|
+
- **The Korean install screen is written the way the rest of it should have
|
|
222
|
+
been.** Every sentence moved to 해요체 and lost the clauses it did not need —
|
|
223
|
+
the register a person deciding something is spoken to, rather than one being
|
|
224
|
+
informed of a decision. The draft terms moved with it; a policy nobody can read
|
|
225
|
+
is not a stricter policy.
|
|
226
|
+
|
|
227
|
+
- **A rule about a command now actually arrives.** The before-edit hook is
|
|
228
|
+
installed with a tool matcher, and `Bash` was not in it — so a decision about
|
|
229
|
+
committing, deleting or deploying could never be shown, because those are shell
|
|
230
|
+
calls. A fresh agent asked to make "never put emoji in commit messages" stick
|
|
231
|
+
ran its whole task through `Bash` and was handed that rule zero times. The
|
|
232
|
+
matcher already carried `Read`, `Glob` and `Grep`, none of which writes
|
|
233
|
+
anything, so waiting for a "file tool" was never waiting for a write.
|
|
234
|
+
**Re-run `memgineering setup` to pick this up** — the matcher lives in your
|
|
235
|
+
tool's settings and an upgrade alone does not rewrite it.
|
|
236
|
+
|
|
237
|
+
- **Renaming your notes folder no longer makes your rules disappear.** When the
|
|
238
|
+
brain you set as default is not on disk, everything falls through to the one
|
|
239
|
+
that is — deliberate, so an unmounted drive does not stop you working. Nothing
|
|
240
|
+
said it had happened, so `rules` answered from the other brain with "no
|
|
241
|
+
standing decisions recorded", which reads as "I never wrote any down" and gets
|
|
242
|
+
acted on by writing them again, into a brain that is not the one you lost.
|
|
243
|
+
`use` said "because it is the only brain linked" while two were linked.
|
|
244
|
+
`rules`, `use` and `resurface` now name the folder they could not reach, say
|
|
245
|
+
the answer came from somewhere else, say nothing is lost, and give the one
|
|
246
|
+
command that fixes it. Silent when your default is fine.
|
|
247
|
+
|
|
248
|
+
- **The sign-in screens are on memgineering.com.** Approving a sign-in used to
|
|
249
|
+
happen on `api.memgineering.com`, an API subdomain, on a page built from
|
|
250
|
+
colours that matched nothing else in the product. Approval, the refusals and
|
|
251
|
+
the "you're done" screen are now all at `memgineering.com/auth/device`, drawn
|
|
252
|
+
from the same stylesheet as the rest of the site. Nothing changes in the CLI —
|
|
253
|
+
`login` opens whichever address the server hands it.
|
|
254
|
+
|
|
255
|
+
- **The install screen draws itself again.** `memgineering setup --web` serves one
|
|
256
|
+
self-contained page under `default-src 'none'`, and that policy named no
|
|
257
|
+
`img-src` and no `font-src` — so the browser silently dropped every asset the
|
|
258
|
+
page was carrying inside itself. The hand-drawn borders around the cards, the
|
|
259
|
+
inputs and the buttons never painted, and neither did the typeface. On the
|
|
260
|
+
account step this cost the reader the way forward: the `Next` button is drawn
|
|
261
|
+
rather than filled with a colour, so it rendered as an invisible rectangle with
|
|
262
|
+
a label the same shade as the page. The policy now permits `data:` for images
|
|
263
|
+
and fonts, and nothing else — no host, no scheme, no wildcard — so the screen
|
|
264
|
+
still opens with the machine offline. A test now reads the page for the
|
|
265
|
+
schemes it actually uses and asks the policy about each one, which is the
|
|
266
|
+
comparison nobody was making: both files were correct about themselves.
|
|
267
|
+
|
|
268
|
+
- **A hosted brain shows why a memory changed, in the output you get without
|
|
269
|
+
asking.** Every write is told to carry a `--reason`, on the argument that it is
|
|
270
|
+
the only part of the record still worth anything six months later — and then
|
|
271
|
+
neither read command printed one. On a hosted brain, `memgineering evidence`
|
|
272
|
+
answered with `surfaced 8 · opened 4` and stopped, and `memgineering log` gave a
|
|
273
|
+
timestamp and a path. The reasons had been in the response all along, and in
|
|
274
|
+
`--json`, so nothing was lost; it was simply never shown, which for a default
|
|
275
|
+
output is the same thing.
|
|
276
|
+
|
|
277
|
+
Both commands now print the same report from a hosted brain that they print
|
|
278
|
+
from one on your disk: the title, the standing and what it means, the ledger,
|
|
279
|
+
and the reason quoted. `log` additionally shows who made each change, whether
|
|
280
|
+
it was already undone, and whether the note has moved on since — all of which
|
|
281
|
+
the server was sending and the client was discarding.
|
|
282
|
+
|
|
283
|
+
- **`memgineering use` named the wrong brain.** Signed in and pointed at a
|
|
284
|
+
hosted brain, it reported the folder on this disk — a real folder, that
|
|
285
|
+
nothing had written to in weeks — while every `recall` and `remember` went to
|
|
286
|
+
the server. Naming the wrong destination is the one thing this tool cannot do:
|
|
287
|
+
nothing about the answer looks wrong until somebody goes looking for a note
|
|
288
|
+
that was never written there.
|
|
289
|
+
|
|
290
|
+
It now answers with whichever brain the next command will actually use, in all
|
|
291
|
+
three states: the hosted one when signed in; the folder when the pointer is
|
|
292
|
+
there but the sign-in is not, because that is where writes land; and, when a
|
|
293
|
+
sign-in is merely waiting to be approved, both — the folder until somebody
|
|
294
|
+
approves it, the hosted brain after. It reads state off the disk, so it
|
|
295
|
+
answers with the server down and it never completes a sign-in as a side
|
|
296
|
+
effect of being asked a question. See the `--json` fields under Added.
|
|
297
|
+
|
|
298
|
+
- **`memgineering pull` uses the brain this machine is pointed at.** It was the
|
|
299
|
+
only hosted verb that could not answer "which brain" from state every other
|
|
300
|
+
verb reads, so on an account with two, the command somebody runs to back up
|
|
301
|
+
the brain they had been using all session answered "more than one hosted brain
|
|
302
|
+
— say which". `--brain` still wins, an unpointed machine with two brains still
|
|
303
|
+
gets the refusal, and the success line now names the brain it downloaded.
|
|
304
|
+
|
|
305
|
+
- **`memgineering pull` says which of your brains the folder does not contain.**
|
|
306
|
+
A tester pulled, was told 21 notes had arrived, and had no reason to doubt it —
|
|
307
|
+
the other 45 of their 66 were in a second hosted brain on the same account, and
|
|
308
|
+
a successful run never mentioned that it existed. A backup nobody knows is
|
|
309
|
+
partial is worse than one that failed. Both the real run and `--dry-run` now
|
|
310
|
+
name the other brains and give a command that fetches one; `--json` carries
|
|
311
|
+
`other_brains` and a hint saying not to call this a backup until each has been
|
|
312
|
+
pulled.
|
|
313
|
+
|
|
314
|
+
- **Asking where an install stands no longer means running the command that
|
|
315
|
+
installs.** There is no `status` verb, and the answer lives behind
|
|
316
|
+
`memgineering setup --agent --dry-run`, which writes nothing. A tester looking
|
|
317
|
+
for it either avoided `setup` — whose name says it installs — and got no
|
|
318
|
+
answer, or ran it and changed something to find out. `--help` now names the
|
|
319
|
+
dry run on the `setup` line, and the setup skill collects the three read-only
|
|
320
|
+
questions (`setup --dry-run`, `whoami`, `use`) in one place. It also names
|
|
321
|
+
`memgineering guard` as the hook's entry point, which stays out of `--help` on
|
|
322
|
+
purpose: it reads a hook payload on stdin and does nothing without one.
|
|
323
|
+
|
|
324
|
+
- **A question asked as a sentence is told what `recall` actually matched.**
|
|
325
|
+
"Only titles, aliases and summaries are searched" printed on zero results only
|
|
326
|
+
— the one case where there is nothing to misread. Asked as a whole sentence,
|
|
327
|
+
recall can return notes that share a single ordinary word with the question,
|
|
328
|
+
and every card reads `stated` with nothing to say the match was on "not"
|
|
329
|
+
rather than on the subject. That sentence now also appears under the results
|
|
330
|
+
when the query is a question or four words or more. It is not a warning: this
|
|
331
|
+
cannot know whether the results are any good, and a ⚠ over a right answer is
|
|
332
|
+
how a reader learns to skip the line.
|
|
333
|
+
|
|
334
|
+
- **A hosted card with no age no longer reads `NaN years ago`.** The guard
|
|
335
|
+
tested for `null` and a server that omits the field sends `undefined`, so a
|
|
336
|
+
real answer arrived wearing a number that was not one.
|
|
337
|
+
|
|
338
|
+
- **`memgineering recall` says which results are decisions you already made.**
|
|
339
|
+
`resurface` has labelled them "a standing decision" since rules existed, and
|
|
340
|
+
`recall` — the verb an agent reaches for far more often — returned a decision
|
|
341
|
+
and an ordinary observation looking identical. A brain with five standing
|
|
342
|
+
decisions in it could answer a question without saying which of the answers
|
|
343
|
+
the user had already committed to. The card now says so, and `--json` carries
|
|
344
|
+
a `binding` field on every card: present and `false` on an ordinary memory, so
|
|
345
|
+
a caller can tell "not a rule" from "this version does not say".
|
|
346
|
+
|
|
347
|
+
A hosted brain shows this once its server is updated; nothing breaks in the
|
|
348
|
+
meantime, the label is simply absent.
|
|
349
|
+
|
|
350
|
+
- **An id from `memgineering log` no longer looks like one from `recall`.** They
|
|
351
|
+
are the same length in the same alphabet, arrive in the same backticks, and
|
|
352
|
+
nothing said which was which — so an agent read an operation id off `log`, ran
|
|
353
|
+
`open` on it, and was told "nothing here matches — try searching". No search
|
|
354
|
+
can return an operation id. `log` now labels each one `undo:`, and `op:`
|
|
355
|
+
wherever `undo` would refuse it: an operation already undone, one that is
|
|
356
|
+
itself an undo, one whose note has been written since, or a verb that brain
|
|
357
|
+
cannot reverse — a hosted brain cannot reverse an `exclude`, and neither side
|
|
358
|
+
reverses an `import`. Fed one anyway, `open` says what the id is, which change
|
|
359
|
+
it names, the note it touched, and how to read that note; a truncated id works
|
|
360
|
+
there too, since `undo` accepts one.
|
|
361
|
+
|
|
362
|
+
- **`memgineering log` no longer warns that notes changed when they did not.**
|
|
363
|
+
It checked each operation's file through the note reader, which refuses
|
|
364
|
+
excluded and deny-listed paths — and read that refusal as "the file is gone".
|
|
365
|
+
So every `exclude` anybody ran was reported as changed (its target is
|
|
366
|
+
`.memgignore`, which is deny-listed), and so was the entire history of any
|
|
367
|
+
note that had been excluded. Separately, the divergence check was handed the
|
|
368
|
+
rows newest-first while it keeps the last one it sees per note, so it compared
|
|
369
|
+
against the OLDEST operation — an ordinary remember-then-revise reported the
|
|
370
|
+
note as edited outside the tool, about the tool's own write. Measured in each
|
|
371
|
+
case: the warning appeared and `undo` reversed the operation happily.
|
|
372
|
+
|
|
373
|
+
- **A crafted name from a hosted brain can no longer rewrite your terminal.**
|
|
374
|
+
Titles, paths, handles, brain names, account names, ranking reasons and server
|
|
375
|
+
hints were printed as they arrived, so a string containing terminal escape
|
|
376
|
+
sequences could erase the lines above it, move the cursor, or plant a
|
|
377
|
+
clickable link that goes somewhere else. `pull` was worse than a rendering
|
|
378
|
+
bug: with no destination given it names the folder after the brain, so a
|
|
379
|
+
crafted name created a directory on your disk carrying those bytes.
|
|
380
|
+
|
|
381
|
+
Every command that renders one of these strings now strips it — `recall`
|
|
382
|
+
(cards and the contradictions block), `open`, `evidence`, `log`, `resurface`,
|
|
383
|
+
`rules`, `remember`, `revise`, `undo`, `retire`, `unretire`, `exclude`,
|
|
384
|
+
`unexclude`, `use`, `whoami`, `push`, `pull`, `login`, `setup`'s sign-in step,
|
|
385
|
+
`update`, `link`'s previews, and the error output. Handles are stripped where
|
|
386
|
+
they are built rather than where they are printed, because a handle this tool
|
|
387
|
+
did not mint is the note's own `id:` field and there are a dozen places that
|
|
388
|
+
print one.
|
|
389
|
+
|
|
390
|
+
A brain in a folder gets the same treatment, and it took three passes to mean
|
|
391
|
+
it. The first sweep drove only each verb's hosted half, so a local note's
|
|
392
|
+
title, path, claim, scope, headings and ledger target still reached the
|
|
393
|
+
terminal. Patching those by hand missed five more, and the round after that
|
|
394
|
+
missed six — which is what finally replaced "check each one" with mutation
|
|
395
|
+
testing: break one strip, and a suite has to go red. `stripControl` says why
|
|
396
|
+
this is in scope at all — a folder brain can have synced from another machine
|
|
397
|
+
or be written by a team — and a note that arrived over Dropbox is as much
|
|
398
|
+
somebody else's writing as one that arrived over HTTPS.
|
|
399
|
+
|
|
400
|
+
Two suites drive it, one per brain, against notes and responses poisoned at
|
|
401
|
+
both ends of every string: eighteen local surfaces and eighteen hosted ones,
|
|
402
|
+
plus three server replies the fixture previously could not produce — a
|
|
403
|
+
reversal the server cannot describe, a curation that changed nothing, and a
|
|
404
|
+
recall carrying a contradiction.
|
|
405
|
+
|
|
406
|
+
Coverage is stated as measured rather than asserted. Breaking each of the 120
|
|
407
|
+
strips one at a time and re-running the suite, 92 are caught by a test. Of the
|
|
408
|
+
28 that are not, most cannot be: `revise`'s diff renders YAML source, and the
|
|
409
|
+
serializer has already turned any control character into the four letters
|
|
410
|
+
`\x1b` before it reaches a screen; `open`'s claim line prints two enums;
|
|
411
|
+
`.memgignore` refuses a path with control characters before the branch that
|
|
412
|
+
would echo one; ids and error codes are excluded from the poisoned fixture on
|
|
413
|
+
purpose, since a caller passes an id back as a selector and branches on a code.
|
|
414
|
+
What is left genuinely untested is small and named: the browser consent screen,
|
|
415
|
+
which needs a terminal; the two `login` lines that need a browser to open and a
|
|
416
|
+
device flow to be approved; and a handful of second arms only a particular
|
|
417
|
+
server reply produces. Saying "every command is covered" was wrong four
|
|
418
|
+
releases running, so this says the number instead.
|
|
419
|
+
|
|
420
|
+
### Agent guidance
|
|
421
|
+
|
|
422
|
+
- **Re-run `memgineering setup` after upgrading, then restart the
|
|
423
|
+
conversation.** Two things this release changes live outside the package: the
|
|
424
|
+
guidance block in your tool's instructions file, and the before-edit hook's
|
|
425
|
+
tool matcher — which gains `Bash`, without which a rule about a command is
|
|
426
|
+
never shown. Upgrading the CLI rewrites neither; `setup` does. The restart is
|
|
427
|
+
because the guidance is read once, when a conversation starts.
|
|
428
|
+
|
|
429
|
+
- **The block memgineering writes into your `CLAUDE.md` is now a third of the
|
|
430
|
+
size** — 178 lines to 52, and no command syntax at all. That block is in your
|
|
431
|
+
agent's context for every session forever, and it had grown into a second copy
|
|
432
|
+
of a manual that already existed as an on-demand skill. What it keeps is what
|
|
433
|
+
has to be true before any skill loads: what a brain is, which tools this
|
|
434
|
+
actually reaches, when to reach for it, and where the detail is.
|
|
435
|
+
|
|
436
|
+
- **Five skills instead of two.** `memgineering-memory` is now the map — which
|
|
437
|
+
verb answers which question — and points at `memgineering-recall` (recall,
|
|
438
|
+
open, evidence, resurface), `memgineering-writing` (remember, revise, undo,
|
|
439
|
+
retire, exclude, filling in `01_BASE/`), `memgineering-rules` (`--rule`, the
|
|
440
|
+
eight-slot budget, what the before-edit hook shows) and `memgineering-setup`,
|
|
441
|
+
which gains `push`/`pull`. Nothing was dropped; `resurface` had been explained
|
|
442
|
+
twice and now is explained once.
|
|
443
|
+
|
|
444
|
+
- `MEMGINEERING.md` 0.2.0 → 0.4.0, covering `--rule`: what counts as a decision,
|
|
445
|
+
and that a user saying "from now on" or "never" is making one without using
|
|
446
|
+
the word. **Restart your agent session after upgrading** so the new guidance
|
|
447
|
+
is read.
|
|
448
|
+
|
|
449
|
+
## [0.5.0] — 2026-08-12
|
|
450
|
+
|
|
14
451
|
### Added
|
|
15
452
|
|
|
16
453
|
- **Every command works on a hosted brain.** `revise`, `resurface`, `retire`,
|
package/NOTICE
CHANGED
|
@@ -9,6 +9,28 @@ terms. This NOTICE file must be included in redistributions and derivative
|
|
|
9
9
|
works, per section 4(d) of that license.
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
BUNDLED FONT
|
|
13
|
+
------------
|
|
14
|
+
|
|
15
|
+
The install screen (`memgineering setup --web`) carries a typeface inside the
|
|
16
|
+
program rather than fetching one. It is served over loopback under a policy
|
|
17
|
+
that allows no outbound request, so a webfont either arrives in the document or
|
|
18
|
+
does not arrive at all.
|
|
19
|
+
|
|
20
|
+
Jua
|
|
21
|
+
Copyright 2018 The BM JUA Project Authors
|
|
22
|
+
(https://github.com/googlefonts/jua)
|
|
23
|
+
Licensed under the SIL Open Font License, Version 1.1
|
|
24
|
+
(http://scripts.sil.org/OFL)
|
|
25
|
+
|
|
26
|
+
What ships is a SUBSET — 431 of the face's 2,520 glyphs, being the characters
|
|
27
|
+
the install screen's headings contain in Korean and English. It is embedded as
|
|
28
|
+
a WOFF2 in the program's own code and is not offered for download, sold, or
|
|
29
|
+
distributed on its own. The OFL permits both the subsetting and the embedding;
|
|
30
|
+
this notice is the attribution it asks for in return. The font is not renamed,
|
|
31
|
+
and no Reserved Font Name is claimed.
|
|
32
|
+
|
|
33
|
+
|
|
12
34
|
UPDATES AND SUPPORT
|
|
13
35
|
-------------------
|
|
14
36
|
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
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
|
-
|
|
6
|
+
Antigravity — reads and writes the same brain through one CLI, so what you told one
|
|
7
7
|
of them is there for the next one, tomorrow, and in whatever tool you move to
|
|
8
8
|
after that.
|
|
9
9
|
|