memgineering 0.7.5 → 0.8.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-setup/SKILL.md +25 -0
- package/dist/index.js +701 -211
- 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.8.0] — 2026-08-23
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **`memgineering unlink --brain` stops reading the hosted brain.** There was no
|
|
19
|
+
way to clear that pointer — `use --brain ""` is refused and `logout` leaves it
|
|
20
|
+
in place on purpose — so a machine-wide setting had no way back to the state it
|
|
21
|
+
started in. Nothing on the server is touched, and it says so.
|
|
22
|
+
- **`memgineering brains` names whose account it is and which server**, so
|
|
23
|
+
"what is this computer connected to" takes one command instead of three.
|
|
24
|
+
- **`memgineering brains` lists the hosted brains on your account**, with a note
|
|
25
|
+
count and a creation date, and marks the one this machine reads. There was no
|
|
26
|
+
listing at all: the only way to learn the names was to pass one you knew was
|
|
27
|
+
wrong and read the refusal — and the sub-skill documented that as the
|
|
28
|
+
technique, so the docs taught guessing. `--json` carries `current` at the top
|
|
29
|
+
level. An absent count is `null` rather than `0`, because zero notes is an
|
|
30
|
+
empty brain and no count is a server that does not send one.
|
|
31
|
+
|
|
32
|
+
- **`memgineering use --brain <name>` points this machine at a hosted brain.**
|
|
33
|
+
`push --brain` and `pull --brain` already took one by name and nothing could
|
|
34
|
+
point at one, so switching which brain you read meant pushing a folder into it
|
|
35
|
+
— an upload as the price of changing a setting. Takes a name or an id, says
|
|
36
|
+
which brain it stopped reading, and `--json` carries `changed` so "already
|
|
37
|
+
there" and "switched" are told apart. It does NOT create: pointing at a brain
|
|
38
|
+
that does not exist would leave every recall answering from an empty one, which
|
|
39
|
+
from the outside looks exactly like having lost the notes, so an unknown name is
|
|
40
|
+
refused with the account's list. A folder path, `--default` and `--here` are
|
|
41
|
+
refused alongside it rather than ignored — they bind a folder, and this is one
|
|
42
|
+
setting for the whole machine.
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- **A note's own words can no longer start a line of memgineering's output.**
|
|
47
|
+
A title, a summary, a brain name — anything the tool prints inside a line —
|
|
48
|
+
is now folded onto one line first. It was not, and a value carrying a line
|
|
49
|
+
break ended the tool's sentence and began one of its own. In `recall` that
|
|
50
|
+
looked like an extra result card; whatever it said appeared to come from
|
|
51
|
+
memgineering rather than from the note. The tools reading this output are
|
|
52
|
+
agents, so that distinction is the whole point. Roughly 120 places across
|
|
53
|
+
every command, plus a test that fails if a new one is added. `--json` is
|
|
54
|
+
unchanged and still carries the full value, line breaks included.
|
|
55
|
+
- **A hosted brain's name is stored as one line.** The server accepted a line
|
|
56
|
+
break in a name, so the same forged line reached every client, not just this
|
|
57
|
+
one. Names are folded rather than refused — a slash is still refused, because
|
|
58
|
+
a synced brain becomes a folder and a slash would make it two.
|
|
59
|
+
|
|
60
|
+
- **`logout` now says your notes are untouched**, and that this machine keeps
|
|
61
|
+
which brain it was reading so a later `login` resumes. It said only that a
|
|
62
|
+
token was revoked, which is not the sentence somebody signing out is waiting
|
|
63
|
+
for.
|
|
64
|
+
- **An unknown command is answered with commands.** `memgineering disconnect`
|
|
65
|
+
used to get "memgineering takes `--version` `--json`" — true, useless, and it
|
|
66
|
+
reads as though the tool has two features.
|
|
67
|
+
- **`logout`'s description says it signs out of your account**, not "of a hosted
|
|
68
|
+
brain". That wording made three disconnect-shaped verbs indistinguishable.
|
|
69
|
+
- **Unlinking the last brain no longer leaves a default naming it.**
|
|
70
|
+
- **`MEMGINEERING_AGENT_HOME` is listed in `--help`.** It is what keeps `setup`
|
|
71
|
+
off a real machine, and it was the only one of five missing.
|
|
72
|
+
|
|
73
|
+
- **A signed-out machine, and one whose token was rejected, are both told to sign
|
|
74
|
+
in rather than to make a new brain.** The refusal that names the account's
|
|
75
|
+
brains treated any failure the same way and fell back to "link a folder · or
|
|
76
|
+
start a new brain" — including for a 401, where the server has just confirmed
|
|
77
|
+
the account exists and the notes are on it. Only a server that cannot be
|
|
78
|
+
reached falls back now.
|
|
79
|
+
- **That refusal cannot stall a command any more.** It makes one request with no
|
|
80
|
+
retry. It had inherited the ordinary 429 ladder — three retries sleeping the
|
|
81
|
+
server's `retry-after`, capped at a minute each — which on a rate-limited
|
|
82
|
+
server turned an instant offline answer into minutes and, past an agent's
|
|
83
|
+
command timeout, into a killed command rather than a refusal.
|
|
84
|
+
- **`use --brain` on a machine with no account no longer points at `--local`,**
|
|
85
|
+
which it does not accept. It names `memgineering login --emit-only` instead.
|
|
86
|
+
- **`use --brain <name>` refuses a flag written where the name goes.**
|
|
87
|
+
`use --brain --default` bound `--default` as the value, so the
|
|
88
|
+
cannot-combine check never ran, the command asked the server for a brain by
|
|
89
|
+
that name, and the refusal recommended `push --brain <name>` — which creates.
|
|
90
|
+
Following it produced a hosted brain literally called `--default`.
|
|
91
|
+
- **`use --brain` moves the pointer when only the SERVER differs**, and prefers
|
|
92
|
+
an id over a name that merely looks like one. Both were silent wrong answers:
|
|
93
|
+
the first left the machine on the old host reporting "Already using", the
|
|
94
|
+
second resolved a different brain through the handle this command advertises
|
|
95
|
+
as unambiguous.
|
|
96
|
+
- **`use --brain` says when the brain it just pointed at is empty.** The count
|
|
97
|
+
was in the response already. Pointing at an existing-but-empty brain produced
|
|
98
|
+
the same experience as pointing at one that does not exist — which is the thing
|
|
99
|
+
the no-create refusal exists to prevent.
|
|
100
|
+
- **`push` no longer tells you there is no way to point back without uploading.**
|
|
101
|
+
0.8.0 added exactly that verb; the sentence now names it.
|
|
102
|
+
- **The "not set up yet" notice stays quiet only for a pointer this machine can
|
|
103
|
+
actually read.** It checked that a hosted brain was named, not that it was on
|
|
104
|
+
the server currently configured — so a pointer left behind by a different host
|
|
105
|
+
silenced the notice on a machine that could answer nothing.
|
|
106
|
+
- **"No brain is linked" no longer sends somebody whose notes are on their
|
|
107
|
+
account to create an empty one.** Signed in, holding hosted brains, and pointed
|
|
108
|
+
at none of them, the refusal offered `link` and `init` — and an agent that
|
|
109
|
+
follows `init` makes a third empty notebook and reports that the notes are
|
|
110
|
+
still gone. It now names the account's brains and `use --brain`, and says in as
|
|
111
|
+
many words not to run `init` for this. Found by fresh-context agents: three of
|
|
112
|
+
ten hit it, one on the ask "i think my notes are gone", which is exactly when
|
|
113
|
+
it fired. The offline refusal still stands unchanged when the account cannot be
|
|
114
|
+
reached, holds nothing, or `--local` was asked for.
|
|
115
|
+
- **The "not set up yet" notice stops firing on a machine that is working.**
|
|
116
|
+
It reads `system.installed`, which records whether `setup` ran and says nothing
|
|
117
|
+
about whether this machine can read and write — so it printed above successful
|
|
118
|
+
output on every command. Worse, it tells the reading agent to run
|
|
119
|
+
`setup --agent`, which re-points the brain: the one action it demands would
|
|
120
|
+
undo a `use --brain` the user had just asked for. Ten of ten fresh agents saw
|
|
121
|
+
it over working output; four named running it as the trap they nearly walked
|
|
122
|
+
into. It now stands down whenever a hosted brain is pointed at.
|
|
123
|
+
|
|
124
|
+
### Fixed
|
|
125
|
+
|
|
126
|
+
- **Your standing rules now reach an agent before it edits a file on a machine
|
|
127
|
+
that reads a hosted brain.** `--rule` exists so a decision arrives before the
|
|
128
|
+
work rather than after somebody asks, and the hook that delivers it read only a
|
|
129
|
+
brain in a folder — so on a signed-in machine it delivered nothing. Measured on
|
|
130
|
+
a real account: `rules` answered seven and the hook answered none.
|
|
131
|
+
- **A rule can no longer put its own line into an agent's instructions.** Rule
|
|
132
|
+
text lands there verbatim, and a newline in one produced a second line with no
|
|
133
|
+
bullet in front of it — from inside that context, indistinguishable from
|
|
134
|
+
something the tool wrote.
|
|
135
|
+
- **Unlinking a folder no longer stops this machine reading its hosted brain.**
|
|
136
|
+
The config write rebuilt one object and dropped every key it did not name, and
|
|
137
|
+
the account pointer was one of them — so `unlink <folder>` sent every later
|
|
138
|
+
recall somewhere else with nothing on screen to explain it.
|
|
139
|
+
- **`unlink` no longer says "no brain is linked yet" while `use` names a hosted
|
|
140
|
+
brain.** It asked only the resolver that knows about folders, so the two
|
|
141
|
+
commands answered a single state two opposite ways — and its advice was to
|
|
142
|
+
create a brain, which for somebody whose notes are already in one ends in a
|
|
143
|
+
third empty brain.
|
|
144
|
+
- **`setup --dry-run` tells "nothing to change" apart from "no tools found".**
|
|
145
|
+
Both printed `Would change 0 file(s):` over an empty list. The second is what
|
|
146
|
+
an ordinary re-run looks like, so the common case read as the alarming one.
|
|
147
|
+
|
|
148
|
+
### Agent guidance
|
|
149
|
+
|
|
150
|
+
`memgineering-setup` documents the new verb. Restart your agent session after
|
|
151
|
+
upgrading so it picks it up.
|
|
152
|
+
|
|
14
153
|
## [0.7.5] — 2026-08-23
|
|
15
154
|
|
|
16
155
|
### Fixed
|
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.8.0
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# memgineering
|
|
@@ -182,6 +182,31 @@ memgineering use --default ~/brains/work
|
|
|
182
182
|
Inside a repository `use` writes a relative path, so it can be committed and
|
|
183
183
|
resolves for a teammate who links the same brain.
|
|
184
184
|
|
|
185
|
+
**An account can hold several hosted brains. `brains` lists them and
|
|
186
|
+
`use --brain <name>` switches.**
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
memgineering brains # what the account holds, and which one this machine reads
|
|
190
|
+
memgineering use --brain work # name or id; nothing is uploaded
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Run `brains` before you switch, not after a guess.** It carries a note count
|
|
194
|
+
and a creation date, which is what tells two brains apart when their names do
|
|
195
|
+
not — and it marks the one this machine currently reads. `--json` puts that id
|
|
196
|
+
at the top level as `current`, so you do not have to scan the array to answer
|
|
197
|
+
the question you most often have. An absent `note_count` is `null` and not `0`:
|
|
198
|
+
zero notes is an empty brain, and no count is a server too old to send one.
|
|
199
|
+
|
|
200
|
+
It moves the one hosted brain this machine reads and touches no notes — `push`
|
|
201
|
+
and `pull` are what move those. It does not create: an unknown name is refused
|
|
202
|
+
with the account's list, because pointing at a brain that does not exist would
|
|
203
|
+
have every recall answer from an empty one, and from the outside that looks like
|
|
204
|
+
the notes are gone. Before this, `push --brain <name>` was the only thing that
|
|
205
|
+
could move the pointer, so switching meant uploading a folder first.
|
|
206
|
+
|
|
207
|
+
It refuses a folder path, `--default` or `--here` in the same call. Those bind a
|
|
208
|
+
folder; this is one setting for the whole machine.
|
|
209
|
+
|
|
185
210
|
**Do not give up on a write because the choice is ambiguous.** A refused
|
|
186
211
|
`remember` means the thing they asked you to keep was not kept — ask which
|
|
187
212
|
brain, or pass `--vault` for the write and settle the default afterwards.
|