memgineering 0.3.0 → 0.4.1
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 +99 -0
- package/assets/memgineering-memory/SKILL.md +55 -6
- package/assets/memgineering-setup/SKILL.md +15 -1
- package/dist/index.js +583 -321
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,105 @@ language the reader wants. The bilingual rule the monorepo applies to
|
|
|
11
11
|
|
|
12
12
|
## [Unreleased]
|
|
13
13
|
|
|
14
|
+
## [0.4.1] — 2026-08-10
|
|
15
|
+
|
|
16
|
+
Security fixes in `setup --web`, from the 2026-08-09 audit
|
|
17
|
+
(`docs/security-audit-2026-08-09.md`). Every one was reproduced against
|
|
18
|
+
0.3.0/0.4.0 rather than reasoned about. No command or flag changed.
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- **The setup screen no longer stays up for whoever is knocking.** Its idle
|
|
23
|
+
timer was reset before any request was checked, so anything that could reach
|
|
24
|
+
the port kept a writable install endpoint alive by pinging it — without ever
|
|
25
|
+
presenting the key. The timer now moves only for requests that passed the
|
|
26
|
+
origin and key checks, and there is a one-hour ceiling above it that nothing
|
|
27
|
+
can push back.
|
|
28
|
+
- **`--web` no longer reads a folder you did not mean.** Pointed at a system
|
|
29
|
+
directory it walked one and returned the title and first paragraph of every
|
|
30
|
+
markdown file under it. System folders are refused, the scan stops after
|
|
31
|
+
5,000 notes rather than running for minutes on a large folder with no way to
|
|
32
|
+
cancel, and the folder step stops answering once the install is done.
|
|
33
|
+
- **A second submit no longer reports a failed install that succeeded.** Two
|
|
34
|
+
applies — the ordinary case of opening the setup link in a second tab —
|
|
35
|
+
both got past the already-applied guard, and the loser was told "Nothing
|
|
36
|
+
further was written" while everything had been written.
|
|
37
|
+
- **The screen cannot be embedded in another page**, and a request that changes
|
|
38
|
+
something must say where it came from.
|
|
39
|
+
- **`--web` no longer claims it opened a browser when it did not.** On a machine
|
|
40
|
+
with no default browser — or a sandbox, or `xdg-open` with nothing to hand it
|
|
41
|
+
— the opener exits non-zero and this reported success anyway, so an agent told
|
|
42
|
+
its user the screen was open while the desktop was unchanged and the printed
|
|
43
|
+
URL was the only way forward.
|
|
44
|
+
|
|
45
|
+
## [0.4.0] — 2026-08-10
|
|
46
|
+
|
|
47
|
+
A template is not an answer, a revision that revises nothing is not written,
|
|
48
|
+
and linking a second brain no longer breaks the first one everywhere.
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- **`recall` tells a template apart from an answer.** A card that is one of the
|
|
53
|
+
five `01_BASE/` files and is still byte-for-byte what `init` wrote is marked
|
|
54
|
+
`not filled in yet`; when every card in a result carries that mark, one line
|
|
55
|
+
above them says nothing you have written matched, and points at `onboard`.
|
|
56
|
+
`--json` carries it as `scaffolding`. Nothing is removed from the result —
|
|
57
|
+
the label is a fact about the file, so an unfilled base note padding out a
|
|
58
|
+
weak answer is visible as padding instead of reading like a conclusion. The
|
|
59
|
+
mark disappears the moment the file is edited, which is also the moment a base
|
|
60
|
+
note starts being the best answer in the brain.
|
|
61
|
+
|
|
62
|
+
- **`revise` refuses a revision that revises nothing.** When the claim, summary
|
|
63
|
+
and title all match what the note already holds, nothing is written and the
|
|
64
|
+
reason is given — a user repeating an answer they had already given used to
|
|
65
|
+
become ledger entries recording no change. Saying `--reason` makes it a real
|
|
66
|
+
record again, which is what `reinforce` is for.
|
|
67
|
+
- **`revise` says when a conclusion landed above `init`'s instructions.** These
|
|
68
|
+
files take two steps — write the body, then record the claim — and doing only
|
|
69
|
+
the second leaves a note whose frontmatter concludes something while the prose
|
|
70
|
+
under it is still the form telling you what to write.
|
|
71
|
+
|
|
72
|
+
### Changed
|
|
73
|
+
|
|
74
|
+
- **`revise --help` says which `--action` to pick and what it costs to pick
|
|
75
|
+
wrong.** Only `supersede` moves `valid_from`, so using it on a fact that was
|
|
76
|
+
true all along dates it from today. Filling in a blank `01_BASE/` file for the
|
|
77
|
+
first time is `reinforce`.
|
|
78
|
+
|
|
79
|
+
### Fixed
|
|
80
|
+
|
|
81
|
+
- **Linking a second brain no longer breaks the first one everywhere.** With
|
|
82
|
+
more than one brain linked and no pointer in the current folder, every command
|
|
83
|
+
refused as ambiguous — so a scratch brain linked for an afternoon stopped
|
|
84
|
+
`recall` and `remember` working in every other directory, for every tool
|
|
85
|
+
sharing the config. The first brain linked is now the default and is used when
|
|
86
|
+
nothing more specific applies; `memgineering use --default <path>` changes it,
|
|
87
|
+
and `--vault`, a `.memgineering` pointer, and standing inside a brain all
|
|
88
|
+
still win. The ambiguity refusal remains for the case it was written for —
|
|
89
|
+
several brains and nothing ever said which — and now names the one-time fix.
|
|
90
|
+
Upgrading picks the brain you already had, not the next one you happen to
|
|
91
|
+
link.
|
|
92
|
+
- **The cross-language warning no longer fires over a base file the user wrote.**
|
|
93
|
+
It decided "did this query reach anything the person wrote" from the path — a
|
|
94
|
+
match under `01_BASE/` did not count — so somebody who had answered those five
|
|
95
|
+
questions could ask about their own preferences, get their own note, and be
|
|
96
|
+
told the query could not reach their brain. It now asks whether the file has
|
|
97
|
+
been touched, which is what it meant all along.
|
|
98
|
+
|
|
99
|
+
### Agent guidance
|
|
100
|
+
|
|
101
|
+
- `memgineering-memory` covers the `not filled in yet` mark and the header above
|
|
102
|
+
a result made only of templates: what they mean, and that a card carrying one
|
|
103
|
+
is not evidence of anything.
|
|
104
|
+
- `memgineering-memory` spells out that filling in a base file is two steps —
|
|
105
|
+
write the body, then record the claim — why it is `--action reinforce` rather
|
|
106
|
+
than the default, and that re-recording something unchanged is refused.
|
|
107
|
+
- `memgineering-setup` covers the default brain, and says not to abandon a write
|
|
108
|
+
because the brain was ambiguous: a refused `remember` means the thing the user
|
|
109
|
+
asked you to keep was not kept.
|
|
110
|
+
|
|
111
|
+
**Restart your agent session after upgrading** so the updated skills load.
|
|
112
|
+
|
|
14
113
|
## [0.3.0] — 2026-08-10
|
|
15
114
|
|
|
16
115
|
Recall says how old a memory is and why two of them disagree; a screen for
|
|
@@ -74,6 +74,29 @@ Say so. Only titles, aliases and summaries are searched, so suggest broader
|
|
|
74
74
|
words — but do not go read their folder yourself to compensate. A brain that
|
|
75
75
|
answers "nothing" is giving you real information.
|
|
76
76
|
|
|
77
|
+
### Cards that are not answers
|
|
78
|
+
|
|
79
|
+
A card marked `not filled in yet` is one of the five `01_BASE/` files, still
|
|
80
|
+
byte-for-byte what `init` wrote. Nobody has answered it, so it is evidence of
|
|
81
|
+
nothing — do not quote it back as if it were what they think.
|
|
82
|
+
|
|
83
|
+
When every card carries that mark, recall says so above them:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
⚠ Nothing you have written matched this.
|
|
87
|
+
Every card below is still the template `init` wrote
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
That is the moment to offer to fill them in rather than to answer from them —
|
|
91
|
+
`memgineering onboard` prints the questions. The cards are still listed, because
|
|
92
|
+
the label is a claim about the file, not a decision about what you may see;
|
|
93
|
+
`--json` carries the same fact as `scaffolding: true`.
|
|
94
|
+
|
|
95
|
+
The mark disappears the moment the user writes in the file. A base note they
|
|
96
|
+
have filled in is an ordinary note of theirs and often the best answer in the
|
|
97
|
+
brain — `who am I`, `what am I not allowed to do`, `where does everything live`
|
|
98
|
+
are all answered from `01_BASE/`.
|
|
99
|
+
|
|
77
100
|
## Filling in the base files, which only you can do
|
|
78
101
|
|
|
79
102
|
`init` creates five files in `01_BASE/` and leaves them empty, because what
|
|
@@ -114,17 +137,30 @@ answers thin out — three good lines beat a filled-in template. Take what they
|
|
|
114
137
|
say in passing during ordinary work too; most of `TOOLING.md` gets written by
|
|
115
138
|
noticing, not by asking.
|
|
116
139
|
|
|
117
|
-
**How to write it
|
|
118
|
-
|
|
119
|
-
|
|
140
|
+
**How to write it — both halves.** `revise` only touches frontmatter, so it
|
|
141
|
+
takes two steps, and skipping the first is the common failure: write the body
|
|
142
|
+
with your normal file tools FIRST, replacing `init`'s instructions with what
|
|
143
|
+
they actually said, then record the conclusion.
|
|
120
144
|
|
|
121
145
|
```
|
|
146
|
+
# 1. replace the body — their words, not the template's prompt
|
|
147
|
+
# 2. then:
|
|
122
148
|
memgineering revise 01_BASE/USER.md \
|
|
123
149
|
--action reinforce \
|
|
124
150
|
--claim "<one line: who they are>" \
|
|
125
151
|
--summary "<the line recall should show>"
|
|
126
152
|
```
|
|
127
153
|
|
|
154
|
+
A claim written above the untouched template leaves the file reading as a form
|
|
155
|
+
somebody half-filled — the conclusion in the frontmatter, the instructions for
|
|
156
|
+
writing one still underneath. `revise` warns when you do this; the warning means
|
|
157
|
+
go back and write the body.
|
|
158
|
+
|
|
159
|
+
`--action reinforce`, not the default, and the reason is the date. `supersede`
|
|
160
|
+
stamps `valid_from` with now because a replaced conclusion starts now — but
|
|
161
|
+
these facts were always true and you have only just been told them. Dating them
|
|
162
|
+
today is wrong in the one field a memory store exists to get right.
|
|
163
|
+
|
|
128
164
|
This is the ONE place you edit a brain file directly, and the boundary is
|
|
129
165
|
narrow: `01_BASE/` only, and only while the file is still the template `init`
|
|
130
166
|
wrote. Nothing is lost — there is no history to break and nothing to undo — and
|
|
@@ -221,11 +257,24 @@ memgineering revise deploy-manual \
|
|
|
221
257
|
--summary "manual only, no CD"
|
|
222
258
|
```
|
|
223
259
|
|
|
224
|
-
- `--action supersede` (default)
|
|
225
|
-
|
|
226
|
-
- `--action
|
|
260
|
+
- `--action supersede` (default) — the conclusion CHANGED. Stamps `valid_from`
|
|
261
|
+
with now, because a replaced conclusion starts now.
|
|
262
|
+
- `--action reinforce` — the SAME conclusion, new support. Leaves `valid_from`
|
|
263
|
+
alone. Use it when nothing about the fact changed, only your evidence.
|
|
264
|
+
- `--action conflict` — two notes DISAGREE. Records the edge, leaves both
|
|
265
|
+
standing, and deliberately does not write the claim you passed.
|
|
227
266
|
- `--dry-run` shows the diff and writes nothing
|
|
228
267
|
|
|
268
|
+
Pick by what changed, not by habit: `supersede` on a fact that was true all
|
|
269
|
+
along dates it from today, and the date is the field this is all for.
|
|
270
|
+
|
|
271
|
+
**Re-recording something unchanged is refused.** If the claim, summary and title
|
|
272
|
+
all match what the note already holds, `revise` writes nothing and says so —
|
|
273
|
+
otherwise a user repeating themselves turns into ledger entries that record no
|
|
274
|
+
change. When you do mean "this still holds", say what confirms it:
|
|
275
|
+
`--action reinforce --reason "<what confirms it>"`. Check with `open <ref>`
|
|
276
|
+
before rewriting something you may already have.
|
|
277
|
+
|
|
229
278
|
This only ever rewrites the memory block in a note's frontmatter. The prose is
|
|
230
279
|
the user's; neither this command nor you should rewrite it uninvited.
|
|
231
280
|
|
|
@@ -137,8 +137,9 @@ one answers is decided by where you are, in this order:
|
|
|
137
137
|
2. a `.memgineering` pointer file, found by walking up from the cwd
|
|
138
138
|
3. the brain the current directory is inside
|
|
139
139
|
4. the only one linked
|
|
140
|
+
5. their default brain — the first one they linked, unless they changed it
|
|
140
141
|
|
|
141
|
-
|
|
142
|
+
Bind a directory to one brain when that directory belongs to it:
|
|
142
143
|
|
|
143
144
|
```
|
|
144
145
|
memgineering use ~/brains/work
|
|
@@ -147,6 +148,19 @@ memgineering use ~/brains/work
|
|
|
147
148
|
Inside a repository this writes a relative path, so it can be committed and
|
|
148
149
|
will resolve for a teammate who links the same brain.
|
|
149
150
|
|
|
151
|
+
If it still says the choice is ambiguous — several brains, and nothing has ever
|
|
152
|
+
said which is theirs — that is a question for them, not a guess for you. Show
|
|
153
|
+
the list it printed and offer the one-time fix:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
memgineering use --default ~/brains/work
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Do not give up on a write because of this.** A refused `remember` means the
|
|
160
|
+
thing they asked you to keep was not kept, and "I could not tell which brain"
|
|
161
|
+
is a solvable problem — ask which one, or use `--vault` for the write and raise
|
|
162
|
+
the default with them afterwards.
|
|
163
|
+
|
|
150
164
|
## Checking it worked
|
|
151
165
|
|
|
152
166
|
```
|