memgineering 0.13.1 → 0.15.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 +139 -0
- package/assets/MEMGINEERING.md +1 -1
- package/assets/memgineering-recall/SKILL.md +10 -0
- package/assets/memgineering-setup/SKILL.md +18 -0
- package/assets/memgineering-writing/SKILL.md +43 -7
- package/dist/index.js +5724 -5121
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,145 @@ language the reader wants. The bilingual rule the monorepo applies to
|
|
|
11
11
|
|
|
12
12
|
## [Unreleased]
|
|
13
13
|
|
|
14
|
+
## [0.15.0] — 2026-08-29
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **A folder knows which project it is.** `memgineering project` names the
|
|
19
|
+
project the current folder counts as — derived from the git remote
|
|
20
|
+
(`owner/repo`), else the checkout's folder name, else nothing; worktrees
|
|
21
|
+
and subfolders of one checkout answer the same. `memgineering project
|
|
22
|
+
<name>` binds your own name to the repository and `--unset` returns to the
|
|
23
|
+
derived one. Renaming does not move history: what was recalled under the
|
|
24
|
+
old name stays recorded there, and the command says so whenever it
|
|
25
|
+
changes anything. Derivation reads `.git/config` directly — no
|
|
26
|
+
subprocess, so the session-start hook's deadline is never spent on it.
|
|
27
|
+
- **A note remembers the project it was born in.** `remember` inside a
|
|
28
|
+
project folder stamps that project as the note's `scope` automatically.
|
|
29
|
+
An explicit `--scope` still wins; the new `--no-scope` writes a
|
|
30
|
+
machine-wide note on purpose — rules especially, since a rule stamped
|
|
31
|
+
with one project's scope drops out of another project's `--scope`
|
|
32
|
+
recalls. A derived name the server would refuse (over 128 chars, or
|
|
33
|
+
nothing once normalized) is skipped silently and the note is written
|
|
34
|
+
unscoped — an ambient signal never fails a command. The `YYYY-MM` noise
|
|
35
|
+
scope that path inference used to give observations is gone for new
|
|
36
|
+
notes.
|
|
37
|
+
- **Reads say where they were asked from — as a name, never a path.**
|
|
38
|
+
recall, open and resurface now send `asked_from`, the folder's project
|
|
39
|
+
name, and a hosted brain records it beside what was returned. The local
|
|
40
|
+
event log records the same name next to the `context_dir` it always
|
|
41
|
+
kept. The working directory itself still never leaves the machine; the
|
|
42
|
+
privacy page names the new field, what it holds, and its 90-day window.
|
|
43
|
+
- **A hosted resurface finally ranks by "asked about here."** When the
|
|
44
|
+
session's folder names a project, the hosted ranking weighs what was
|
|
45
|
+
asked about in that project first — the same weight a folder brain has
|
|
46
|
+
always given "in this folder" — and says so honestly: `ranked_by` gains
|
|
47
|
+
`asked about in this project`, a card's reason reads `recalled 2× in
|
|
48
|
+
this project`, and the footer names which project those words mean. A
|
|
49
|
+
brain with no history yet ranks exactly as before and claims nothing.
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
|
|
53
|
+
- The hosted resurface footer no longer claims a hosted brain cannot know
|
|
54
|
+
where a question was asked from. It now tells one of three truths: which
|
|
55
|
+
project the ranking used; that this folder names no project, so nothing
|
|
56
|
+
was sent; or that the server was sent the signal and does not rank by
|
|
57
|
+
project yet. `resurface --json` carries `asked_from` so a machine reader
|
|
58
|
+
can tell those cases apart too.
|
|
59
|
+
|
|
60
|
+
### Compatibility
|
|
61
|
+
|
|
62
|
+
- An older server ignores `asked_from` entirely (unknown fields are
|
|
63
|
+
dropped); the CLI reads the three-entry `ranked_by` and says the server
|
|
64
|
+
does not rank by project yet, rather than letting the silence read as an
|
|
65
|
+
empty folder signal. An older CLI against the new server sends nothing
|
|
66
|
+
and behaves exactly as before. Event lines written before the field
|
|
67
|
+
existed still parse and still rank.
|
|
68
|
+
|
|
69
|
+
### Agent guidance
|
|
70
|
+
|
|
71
|
+
- `memgineering-recall` (what the project signal means and which footer to
|
|
72
|
+
trust), `memgineering-writing` (the automatic scope stamp, and
|
|
73
|
+
`--no-scope` for machine-wide rules) and `memgineering-setup` (the
|
|
74
|
+
`project` verb) were updated. Restart your agent session after upgrading
|
|
75
|
+
so the new guidance is what gets read.
|
|
76
|
+
|
|
77
|
+
## [0.14.0] — 2026-08-29
|
|
78
|
+
|
|
79
|
+
### Added
|
|
80
|
+
|
|
81
|
+
- **A hosted brain's base files can finally be written.** `memgineering
|
|
82
|
+
base-write 01_BASE/USER.md --input <file|-|text>` fills or replaces the
|
|
83
|
+
body of a `01_BASE/` file on a hosted brain — the files `onboard` points
|
|
84
|
+
at, which until now could only be filled on a folder and left a hosted
|
|
85
|
+
brain reading as a blank form forever. The `memgineering:` block above
|
|
86
|
+
the body survives byte-for-byte, a body that would itself parse as
|
|
87
|
+
frontmatter is refused rather than stored as a note that invents its own
|
|
88
|
+
id, and replacing requires the revision a prior read handed you. On a
|
|
89
|
+
folder brain the verb refuses and names the file to open instead: there,
|
|
90
|
+
bodies belong to your own file tools, and that has not changed.
|
|
91
|
+
- **The write is in the ledger, and `undo` takes it back.** A base write
|
|
92
|
+
records the same row every other change does; `undo` restores the
|
|
93
|
+
replaced body, or deletes the file when the write is the one that
|
|
94
|
+
created it. The replaced prose waits OUTSIDE the ledger, for 90 days —
|
|
95
|
+
the ledger records hashes and a reverse patch, never a note's text, and
|
|
96
|
+
an append-only copy of deleted prose would be one nothing screens. After
|
|
97
|
+
90 days the sweep takes it and that particular write can no longer be
|
|
98
|
+
reversed; the refusal says so plainly rather than calling it "expired".
|
|
99
|
+
The privacy page names this store and its window.
|
|
100
|
+
- **Boundaries screen base writes too**, with one exemption: a note that
|
|
101
|
+
declares `never_store` words may say its own words in its own body —
|
|
102
|
+
which is what a BOUNDARIES.md is for — and that write carries the
|
|
103
|
+
`declared` mark in the ledger, so a crossing the record cannot name is
|
|
104
|
+
not possible. Other notes' declared words still refuse there.
|
|
105
|
+
- **A draft leaves a ledger row the moment it exists.** `propose` (and the
|
|
106
|
+
hosted equivalent) now records that a draft was made, so a proposal that
|
|
107
|
+
expired unseen is visible in `log` instead of having never existed. The
|
|
108
|
+
row carries no patch and no hashes, because nothing changed: undoing it
|
|
109
|
+
is refused with the way out named — decide it, approve or reject. A bare
|
|
110
|
+
`undo` steps over a waiting draft rather than refusing because one is
|
|
111
|
+
pending, and `evidence` counts drafts on their own line instead of
|
|
112
|
+
inflating what changed.
|
|
113
|
+
|
|
114
|
+
### Changed
|
|
115
|
+
|
|
116
|
+
- **`revise` against a hosted brain now answers with the boundary words the
|
|
117
|
+
note actually holds**, parsed from the bytes that landed rather than the
|
|
118
|
+
ones that were sent. `--never-store-add` uses that answer instead of
|
|
119
|
+
reading the note back, so widening a boundary costs one round trip fewer
|
|
120
|
+
while the check that catches a server storing something other than what
|
|
121
|
+
it accepted stays exactly as strong. A server too old to answer that way
|
|
122
|
+
is detected by the absence and read back as before.
|
|
123
|
+
- `revise --json` against such a server therefore carries a `never_store`
|
|
124
|
+
field.
|
|
125
|
+
|
|
126
|
+
### Fixed
|
|
127
|
+
|
|
128
|
+
- **The `undo` line printed after a `--local` write now says `--local`.**
|
|
129
|
+
It printed `--vault` or nothing, so on a machine signed in to a hosted
|
|
130
|
+
brain the suggested undo acted on the cloud brain — a suggestion that
|
|
131
|
+
failed when followed, on the exact machine `--local` exists for. Both
|
|
132
|
+
flags print when both were passed.
|
|
133
|
+
- The refusal a folder brain gives `base-write` names the file to edit in
|
|
134
|
+
full; an earlier form truncated long paths, cutting off the one thing
|
|
135
|
+
the message exists to say.
|
|
136
|
+
|
|
137
|
+
### Agent guidance
|
|
138
|
+
|
|
139
|
+
- The `memgineering-writing` skill changed: onboarding branches on where
|
|
140
|
+
the brain lives (file tools on a folder, `base-write` on a hosted
|
|
141
|
+
brain), the line claiming no route can edit a base file's body is gone,
|
|
142
|
+
and the `propose` section says a draft leaves a ledger row and is closed
|
|
143
|
+
by deciding. **Restart your agent session after upgrading** so the new
|
|
144
|
+
guidance is what gets injected.
|
|
145
|
+
|
|
146
|
+
### Note for older clients
|
|
147
|
+
|
|
148
|
+
Two ledger verbs are new (`write`, `propose`). A CLI older than this
|
|
149
|
+
release skips a line it does not recognise in a folder brain's ledger, and
|
|
150
|
+
its bare `undo` then refuses outright rather than reversing the wrong
|
|
151
|
+
thing — it stops instead of guessing. Upgrading both ends removes the gap.
|
|
152
|
+
|
|
14
153
|
## [0.13.1] — 2026-08-28
|
|
15
154
|
|
|
16
155
|
### Changed
|
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.15.0
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# memgineering
|
|
@@ -215,6 +215,16 @@ and which base notes have gone unread — what you should already know here befo
|
|
|
215
215
|
they have to tell you again. It is the answer to a vague opening that recall
|
|
216
216
|
cannot serve, because there is nothing to search for yet.
|
|
217
217
|
|
|
218
|
+
On a hosted brain the folder counts too, as a name rather than a path: the CLI
|
|
219
|
+
sends the folder's project — `owner/repo` from the git remote, or whatever
|
|
220
|
+
`memgineering project` shows — and the server ranks what was asked about in
|
|
221
|
+
that project first. The response says so itself: `ranked_by` gains `asked about
|
|
222
|
+
in this project`, a card's reason reads `recalled 2× in this project`, and the
|
|
223
|
+
footer names which project those words mean. Trust the footer over your
|
|
224
|
+
assumption in the other cases as well — it says when this folder names no
|
|
225
|
+
project (nothing was sent), and when the server does not rank by project yet
|
|
226
|
+
(it was sent and ignored). A path never leaves the machine either way.
|
|
227
|
+
|
|
218
228
|
## Deciding which one to trust
|
|
219
229
|
|
|
220
230
|
```
|
|
@@ -255,6 +255,24 @@ memgineering use --default ~/brains/work
|
|
|
255
255
|
Inside a repository `use` writes a relative path, so it can be committed and
|
|
256
256
|
resolves for a teammate who links the same brain.
|
|
257
257
|
|
|
258
|
+
### Which project a folder is
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
memgineering project # what this folder answers to, and how it was decided
|
|
262
|
+
memgineering project acme/site # bind a name of your own to this repository
|
|
263
|
+
memgineering project --unset # back to the derived name
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Derived without asking: the git remote's `owner/repo`, else the checkout's
|
|
267
|
+
folder name, else nothing — a folder outside any repository names no project
|
|
268
|
+
until somebody sets one. The name follows the repository, so worktrees and
|
|
269
|
+
subfolders of one checkout answer the same. It is what `remember` stamps as a
|
|
270
|
+
note's scope and what the reads send as `asked_from`, so a hosted resurface
|
|
271
|
+
can rank what was asked about here — as a name; the folder's path never
|
|
272
|
+
leaves the machine. Renaming does not move history: what was recalled under
|
|
273
|
+
the old name stays recorded there and the new name starts fresh, which the
|
|
274
|
+
command says out loud whenever it changes anything.
|
|
275
|
+
|
|
258
276
|
**An account can hold several hosted brains. `brains` lists them and
|
|
259
277
|
`use --brain <name>` switches.**
|
|
260
278
|
|
|
@@ -22,6 +22,25 @@ trade is permission-before for correction-after, and every write records how to
|
|
|
22
22
|
reverse it. Do not ask permission for ordinary observations — write them, and
|
|
23
23
|
mention it in a sentence.
|
|
24
24
|
|
|
25
|
+
**A note born in a project folder carries that project as its `scope`** — the
|
|
26
|
+
name comes from the git remote (`owner/repo`), or from the folder's binding
|
|
27
|
+
(`memgineering project` shows it). The stamp is automatic; an explicit
|
|
28
|
+
`--scope` beats it; a folder that names no project writes exactly what it
|
|
29
|
+
always wrote. Two flags are worth reaching for on purpose:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
memgineering remember "we always squash before merging" --rule --no-scope \
|
|
33
|
+
--reason "they said from now on, about every repo — not this one"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- `--no-scope` for anything meant to hold machine-wide, rules especially: a
|
|
37
|
+
rule stamped with one project's scope drops out of another project's
|
|
38
|
+
`recall --scope` answers.
|
|
39
|
+
- `--scope <name>` when the note is ABOUT a project you are not standing in.
|
|
40
|
+
|
|
41
|
+
`--scope` and `--no-scope` together are refused — they answer the same
|
|
42
|
+
question both ways.
|
|
43
|
+
|
|
25
44
|
**`--reason` on every write.** It goes in the ledger and is the only part of the
|
|
26
45
|
record that still means anything six months later. Every write verb takes it:
|
|
27
46
|
`remember`, `revise`, `retire`, `exclude`, `undo`. The one on `undo` matters
|
|
@@ -205,7 +224,10 @@ memgineering propose supersede --memory <id> --claim "…" --reason "…" --exce
|
|
|
205
224
|
memgineering propose reclassify --memory <id> --kind decision --reason "…" --excerpt "…"
|
|
206
225
|
```
|
|
207
226
|
|
|
208
|
-
`propose` is where the judgement goes in, and it still writes no note
|
|
227
|
+
`propose` is where the judgement goes in, and it still writes no note — but it
|
|
228
|
+
does leave a ledger row the moment the draft exists, so `log` shows a draft
|
|
229
|
+
that later expired unseen instead of pretending it never was. Undoing that row
|
|
230
|
+
is refused on purpose: a draft is closed by deciding it, approve or reject. The
|
|
209
231
|
actions are `supersede`, `reinforce`, `conflict`, `retire`, `unretire` and
|
|
210
232
|
`reclassify` — the same vocabulary `revise` uses, plus the one that only changes
|
|
211
233
|
what sort of memory it is. **`--excerpt` is required for every one of them**,
|
|
@@ -290,9 +312,20 @@ its own kind of forgetting. They may also ask outright ("set up my memory", "fil
|
|
|
290
312
|
thin out — three good lines beat a filled-in template. Take what they say in
|
|
291
313
|
passing during ordinary work too; most of `TOOLING.md` gets written by noticing.
|
|
292
314
|
|
|
293
|
-
**How to write it — both halves.** `revise` only touches frontmatter, so
|
|
294
|
-
|
|
295
|
-
|
|
315
|
+
**How to write it — both halves.** `revise` only touches frontmatter, so the
|
|
316
|
+
body comes first, and how you write it depends on where the brain lives. On a
|
|
317
|
+
folder: your normal file tools, replacing the template's prompt with what they
|
|
318
|
+
actually said. On a hosted brain there are no files — the body goes through the
|
|
319
|
+
verb built for exactly this:
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
memgineering base-write 01_BASE/USER.md --input -
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
(`--input` takes a file, `-` for stdin, or the text inline. Only `01_BASE/`
|
|
326
|
+
files — an ordinary note's body is never written this way. The write lands in
|
|
327
|
+
the ledger and `undo` can take it back, though not forever: the replaced body
|
|
328
|
+
is kept 90 days.) Then record the conclusion either way:
|
|
296
329
|
|
|
297
330
|
```
|
|
298
331
|
memgineering revise 01_BASE/USER.md \
|
|
@@ -384,9 +417,12 @@ which you meant.
|
|
|
384
417
|
To lift a boundary entirely: `memgineering retire <the declaration>`. That is
|
|
385
418
|
the un-declare path, and it is the user's decision, never yours.
|
|
386
419
|
|
|
387
|
-
On a hosted brain the declaration NOTE is the record
|
|
388
|
-
|
|
389
|
-
|
|
420
|
+
On a hosted brain the declaration NOTE is the record, and since 0.14.0 the
|
|
421
|
+
sentence can ALSO live in `BOUNDARIES.md` itself: `base-write` fills a base
|
|
422
|
+
file's body where there are no files to edit. A boundary note may say its own
|
|
423
|
+
declared words in its own body — that write carries the `declared` mark in the
|
|
424
|
+
ledger — but OTHER notes' declared words still refuse there like everywhere
|
|
425
|
+
else.
|
|
390
426
|
|
|
391
427
|
### When a write is refused
|
|
392
428
|
|