memgineering 0.24.0 → 0.25.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 CHANGED
@@ -11,6 +11,139 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.25.1] — 2026-10-05
15
+
16
+ A security release. Upgrade if you use `setup --web`, or a hosted brain with a
17
+ chat-app connector.
18
+
19
+ ### Security
20
+
21
+ - **`setup --web` no longer switches a machine to another account.** If the
22
+ setup screen is confirmed by a different account from the one this machine is
23
+ signed in to, nothing is written and the terminal says why. The setup screen
24
+ is only told "different account", never who is signed in here.
25
+ - **Notes chosen for upload on the setup screen wait for a check on this
26
+ machine.** A setup left running in the background uploads nothing. The next
27
+ command names the folder, the account that would receive it, and the `push`
28
+ that sends it. That command is quoted, so neither a folder name nor a brain
29
+ name can run as shell code. A setup in the foreground asks first. A `push` of
30
+ that folder, or `logout`, clears the notice.
31
+ - **The setup screen can link or upload only a folder this machine offered.**
32
+ It can create a new local brain only inside the home folder. A relative or
33
+ `~/` path is read against the home folder and created exactly where it was
34
+ checked, and symlinks are followed.
35
+ - **`setup --web --json` prints `setup_url` only when no browser opened**, with
36
+ a hint to use `--print-url` if the browser never appeared. A machine signing
37
+ in for the first time is told once which account it was connected to.
38
+ - **`login` tells the approval screen when and from what the sign-in came**
39
+ (`platform`, `client`). Its wording now says that screen asks the person to
40
+ type the code.
41
+ - **Rules first written through a chat-app connector say so.** `memgineering
42
+ rules` and the before-edit hook print `(written by the ChatGPT connector)`
43
+ next to such a rule, and `--json` carries `written_by`. A rule asked for from
44
+ a chat app is now held as a note until the person promotes it at a terminal.
45
+ The hold is enforced by the server.
46
+
47
+ ### Fixed
48
+
49
+ - `revise --rule` with the claim a note already holds makes it a rule. It used
50
+ to be refused as "already says this", and nothing bound.
51
+
52
+ ### Agent guidance
53
+
54
+ - `memgineering-setup` explains what the setup link gives whoever holds it, and
55
+ what happens to an upload chosen on the screen.
56
+ - `memgineering-rules` explains rules held from chat apps. Promoting one binds
57
+ the note's own text, so read it first with `memgineering open <id> --detail
58
+ full`; to word it differently, write a new rule with `remember --rule`. It
59
+ also explains the `written by` label.
60
+
61
+ Restart the agent session after upgrading so it reads the new guidance.
62
+
63
+ ## [0.25.0] — 2026-10-04
64
+
65
+ ### Added
66
+
67
+ - **Hosted recall says which search found each card.** Every card carries
68
+ `matched` (`words`, `meaning` or `both`), and a card found by meaning alone is
69
+ marked "matched by meaning only — none of the question's words are in this
70
+ note", in the terminal and in `brain_recall` alike.
71
+ - **Hosted brains label untouched starter templates too.** `recall` and `open`
72
+ say "not filled in yet" for a `01_BASE/` file that is still exactly the
73
+ template, as folder brains always did (`scaffolding` in `--json`).
74
+ - **`recall` says when one project filled the whole answer** — "All 8 cards are
75
+ from `owner/beta`. Also in this brain: `owner/alpha` — add `--scope <name>`"
76
+ (`scope_spread` in `--json`). Declared scopes only; folder names are not
77
+ projects.
78
+ - **`setup --help` says how a chat app reaches your brain** — ChatGPT, Claude.ai,
79
+ Claude Desktop and Cowork connect to a hosted brain at
80
+ `https://mcp.memgineering.com/mcp`, with no install on this machine.
81
+ - **`remember` shows the scope it stamped and where it came from** — the git
82
+ remote, the folder's name, `--scope`, or a name set with `memgineering
83
+ project` (`scope_via` in `--json`).
84
+
85
+ ### Changed
86
+
87
+ - **Common English words no longer count as a match.** `i`, `is`, `what`,
88
+ `about`, `do` and the like used to match first-person starter notes whatever
89
+ the question was about. Recall now matches on the words that carry the
90
+ question; Korean queries are unchanged, and a question made only of such
91
+ words ("who am I") still works.
92
+ - **At most two untouched starter templates per recall.** The rest are counted
93
+ and named as left out (`templates_withheld`); nothing you wrote is ever held
94
+ back. A mixed answer now says how many of its cards are still templates.
95
+ - **`resurface` ranks by what you opened and what answered, not by what was
96
+ merely listed.** A card that trailed at the bottom of many recalls no longer
97
+ climbs the page; the reason line reads "opened 2× · surfaced 10× in this
98
+ project" or "…, never opened".
99
+ - **`auto-update: on` now installs.** Once a day, when a newer version exists,
100
+ a global install updates itself in the background — never from a session hook,
101
+ never under CI, and never a project-local or npx copy (a project under a broad
102
+ npm prefix such as `prefix=$HOME` counts as project-local). One install runs
103
+ at a time: `memgineering update` typed while a background install runs says
104
+ so (`update_in_progress` in `--json`) instead of starting a second. A failed
105
+ attempt is reported on the next run with how to turn it off.
106
+ - **The setup reminder informs instead of ordering, and is shorter after the
107
+ first time.** It says what `setup --web` does — opens a setup screen in the
108
+ user's browser and returns at once — and asks the agent to check with the user
109
+ first unless they asked for setup. The old wording told the agent to run setup
110
+ without waiting, which fresh agent sessions reasonably read as a prompt
111
+ injection. The full text appears once per machine; every later command, and
112
+ `--version` / `--help` in a pipe, get two lines. The notice after an upgrade
113
+ ("the guidance in your agent tools is older") and the one asking for a brain
114
+ follow suit. The upgrade notice now says what a refresh overwrites and which
115
+ earlier choices a flag-less run would reset — auto-update, hooks, the tool list,
116
+ and a sign-in on a machine that is not signed in — names the flag that keeps
117
+ each, and no longer tells the agent to keep the refresh from you.
118
+
119
+ ### Fixed
120
+
121
+ - **A note whose path is `constructor`, `toString` or `__proto__` no longer
122
+ breaks `recall` and `open`.** On a hosted brain, every recall that returned
123
+ such a note failed.
124
+ - **`setup` reports what happened, not what was asked for**: "Registered with"
125
+ lists only tools whose guide was written, each hook is reported on the tools
126
+ that received it (Grok's end-of-turn hook is no longer described as a
127
+ session-start one), and a project-local copy is told its hooks and guide need
128
+ a global install to reach it.
129
+ - **`setup`'s refusals say how to get unstuck**: an unknown tool name and a
130
+ known tool that has not been opened yet get different answers, and the
131
+ supported tools are listed with their `--tools` names.
132
+
133
+ ### Agent guidance
134
+
135
+ - The setup skill now says a chat app with no shell can reach your hosted brain
136
+ through the connector at `https://mcp.memgineering.com/mcp` (ChatGPT and
137
+ Claude.ai steps included) — it used to say there was no connector — and that a
138
+ brain kept only as a folder needs both steps: move it up, then add the
139
+ connector. The hub itself now says ChatGPT and Claude.ai reach a hosted brain
140
+ through that connector.
141
+ - The recall skill covers the template cap, `matched`, `scope_spread`, and the
142
+ new resurface wording; the writing skill names the folder-name scope fallback;
143
+ the setup skill explains what auto-update does and to pass `--hook` when
144
+ turning it off.
145
+ - Restart your agent session after upgrading so it reads the new guidance.
146
+
14
147
  ## [0.24.0] — 2026-09-12
15
148
 
16
149
  ### Added
@@ -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.24.0
5
+ version: 0.25.1
6
6
  ---
7
7
 
8
8
  # memgineering
@@ -83,6 +83,8 @@ at six skills, each of which loads on its own when its topic comes up:
83
83
  - `memgineering-registry` — the public layer
84
84
  - `memgineering-installing` — putting a package in their project, and updating it
85
85
 
86
+ Not shell-only: ChatGPT and Claude.ai reach a hosted brain via connector `https://mcp.memgineering.com/mcp`.
87
+
86
88
  A host short on room lists a skill by NAME ONLY, no description — measured on
87
89
  Claude Code. When you cannot see what it covers, READ
88
90
  `<tool-home>/skills/memgineering-<name>/SKILL.md` before deciding it is empty.
@@ -153,6 +153,11 @@ What you must not do is report what came back as everything the brain holds,
153
153
  which is exactly what a short answer looks like to anyone who does not read the
154
154
  line under it.
155
155
 
156
+ When every card with a project came from ONE project and the brain holds
157
+ others, recall says so (`scope_spread`: the project, and up to five others). If
158
+ the user meant one of those, ask again with `--scope <that project>` — the note
159
+ they want may be ranked just below a page full of the one the question named.
160
+
156
161
  ## Whether meaning was searched
157
162
 
158
163
  A hosted brain can match on meaning as well as words — the same idea in other
@@ -177,6 +182,12 @@ anything about what the user knows.
177
182
  If coverage says notes are missing entries, meaning was searched over part of
178
183
  the brain. Do not report that as a complete search.
179
184
 
185
+ When meaning was used, each card also says what reached it — `matched`:
186
+ `"words"`, `"meaning"`, or `"both"`. A `"meaning"` card (printed as _matched by
187
+ meaning only_) shares no word with the question. That is right for a note in
188
+ another language and wrong for one the model merely found nearby, so read its
189
+ summary before you answer from it — never quote it back on the label alone.
190
+
180
191
  ## Two answers that are answers
181
192
 
182
193
  **Nothing matched.** Say so, and do not go read their folder yourself to
@@ -198,7 +209,9 @@ five `01_BASE/` files, still byte-for-byte what `init` wrote. Nobody has answere
198
209
  it, so it is evidence of nothing — do not quote it back as what they think. When
199
210
  every card carries that mark, recall says so above them (`--json`:
200
211
  `scaffolding: true`), and that is the moment to offer to fill them in rather
201
- than answer from them — see `memgineering-writing`.
212
+ than answer from them — see `memgineering-writing`. At most two such cards come
213
+ back per answer; the rest are counted (`templates_withheld`), never silently
214
+ dropped, and nothing anyone wrote is ever held back.
202
215
 
203
216
  The mark disappears once the user writes in the file. A filled-in base note is
204
217
  often the best answer in the brain: _who am I_, _what am I not allowed to do_,
@@ -219,8 +232,11 @@ On a hosted brain the folder counts too, as a name rather than a path: the CLI
219
232
  sends the folder's project — `owner/repo` from the git remote, or whatever
220
233
  `memgineering project` shows — and the server ranks what was asked about in
221
234
  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
235
+ in this project`, a card's reason reads `opened 1× · surfaced 2× in this project`
236
+ (or `surfaced 2× …, never opened`), and the footer names which project those
237
+ words mean. Only an open, or being the FIRST card of a recall, counts toward
238
+ the order; a card merely listed further down is counted in words but earns
239
+ nothing. Trust the footer over your
224
240
  assumption in the other cases as well — it says when this folder names no
225
241
  project (nothing was sent), and when the server does not rank by project yet
226
242
  (it was sent and ignored). A path never leaves the machine either way.
@@ -69,6 +69,20 @@ A hosted brain answers this too, and `--rule` writes to one land marked. The
69
69
  marking lives in the note's own frontmatter either way, so a brain that was
70
70
  pushed from a folder keeps every rule it had.
71
71
 
72
+ **A rule saved from a chat app waits for the user.** ChatGPT, Claude.ai and
73
+ other connectors can write notes, but not rules: a rule asked for there is
74
+ kept as an ordinary note, and binds only once the user promotes it at a
75
+ terminal. Promoting binds the note's own text as the chat wrote it — `--claim`
76
+ changes the summary, not the words that bind — so they read it first with
77
+ `memgineering open <id> --detail full` (the card alone shows only the title and
78
+ summary, which a chat app may have rewritten), then `memgineering revise <id> --rule --claim "<what
79
+ the note says>"`. Worded differently, it is a new rule: `memgineering remember
80
+ "<the rule>" --rule`. A connector also cannot change or unmark an existing rule. Once
81
+ promoted, the rule says where its words came from — `(written by the ChatGPT
82
+ connector)` beside it in `memgineering rules` and in the before-edit hook, and
83
+ `written_by` in `--json`. Treat it as their rule; the label says which surface
84
+ it was first said on.
85
+
72
86
  **A rule also wins a tie in `recall` now.** Where an ordinary memory and a
73
87
  standing decision matched a query equally well, the decision is ranked first —
74
88
  the asymmetry being that a missed fact costs the reader some context, while a
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: memgineering-setup
3
- description: Use when installing or configuring memgineering, when moving a brain between a machine and an account, when renaming or deleting a hosted brain, or whenever the user asks WHICH of their AI tools can see this memory. Triggers include "set up memgineering", "connect my notes", "rename my brain", "delete that brain", "does my other AI see this too", "which of my tools can read this", "will it work in the app on my phone", "no brain is linked".
3
+ description: Use when installing or configuring memgineering, when moving a brain between a machine and an account, when renaming or deleting a hosted brain, or whenever the user asks WHICH of their AI tools can see this memory. Triggers include "set up memgineering", "connect my notes", "rename my brain", "delete that brain", "does my other AI see this too", "which of my tools can read this", "will it work in the app on my phone", "can I use this in ChatGPT", "does it work in Claude.ai", "no brain is linked".
4
4
  type: skill
5
5
  allowed-tools: Bash(memgineering:*)
6
6
  ---
@@ -12,20 +12,37 @@ allowed-tools: Bash(memgineering:*)
12
12
  Answer this from here, not from a guess. The line is capability, not brand, so
13
13
  it does not move as products come and go:
14
14
 
15
- | | |
16
- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
17
- | **Any tool that can run a shell command** | Reads and writes the same brain. Nothing has to be built for a tool that does not exist yet. |
18
- | **Any tool that cannot** | **Not yet.** There is no connector. A hosted brain is reachable in principle and is not wired up in practice. |
15
+ | | |
16
+ | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
17
+ | **Any tool that can run a shell command** | Reads and writes the same brain. Nothing has to be built for a tool that does not exist yet. |
18
+ | **A chat app that takes a custom MCP connector, no shell** | Reads and writes the **hosted** brain on their account through `https://mcp.memgineering.com/mcp`, once they add that connector in the app and sign in with Google. Not a folder brain. |
19
+ | **Neither** | **Not yet.** |
19
20
 
20
21
  `memgineering setup` writes its guidance into the agent tools it finds on the
21
22
  machine, and `setup --dry-run` names the ones it actually found rather than
22
23
  guessing from a list.
23
24
 
24
25
  So when someone names a tool and asks whether it remembers too, work it out from
25
- that line and answer **not yet, and here is what does** — not a hedge, not a
26
- promise. "You are signed in, so it works everywhere" is the specific wrong
27
- answer: the account syncs the brain between machines, it does not add a surface
28
- that can read it.
26
+ those rows and answer plainly — not a hedge, not a promise:
27
+
28
+ - **ChatGPT** — Settings → **Developer mode** → add an MCP server with
29
+ `https://mcp.memgineering.com/mcp`, then sign in with Google when it asks.
30
+ - **Claude.ai, Claude Desktop, Cowork** — **Customize** → **Connectors** →
31
+ **Add custom connector** → the same URL. One connector covers all three, and
32
+ custom connectors are on every plan, the free one included.
33
+ - It reaches the brain **on their account**. A brain that lives only as a folder
34
+ on this machine is out of its reach until it is moved up (see "Moving a brain
35
+ between this machine and their account").
36
+ - Moving it up does NOT make it appear in the chat app by itself. When their
37
+ brain is still a folder, the answer is both steps, in order: move it up, then
38
+ add the connector above in their app. An answer that stops at the first step
39
+ leaves them with an account brain and no way in.
40
+ - `npx memgineering-mcp` — the local, stdio server — is **registry-only**. It has
41
+ no memory tools; for memory from a chat app, the URL above is the way.
42
+
43
+ "You are signed in here, so it works everywhere" is still the wrong answer: the
44
+ account syncs the brain between machines, and each chat app needs the connector
45
+ added in that app, once.
29
46
 
30
47
  ## 1. Register with the agents
31
48
 
@@ -49,6 +66,17 @@ Three things to do after running it:
49
66
  picks it up on its own when they do. There is nothing to poll and nothing
50
67
  to wait for.
51
68
 
69
+ The link is the key to that screen, not the code: whoever holds the whole link
70
+ can drive it. Give it only to them, never paste it anywhere else — with
71
+ `--json`, `setup_url` is printed only when no browser opened.
72
+
73
+ If they chose to upload existing notes on the screen, this machine does NOT
74
+ upload them on its own: the next `memgineering` command shows which folder and
75
+ which account would receive them, with the `push` that sends them. Check with
76
+ them that the account is theirs before running it. And a machine already
77
+ signed in to a different account is never switched by `setup --web` — the
78
+ terminal says so; `logout` first if they really mean to switch.
79
+
52
80
  The screen asks everything `--agent` takes from flags — sign in, where the
53
81
  memory lives, which brain, which tools, auto-update, the session hook — with
54
82
  the recommended answer pre-selected. A person who is already signed in to
@@ -93,8 +121,15 @@ restart. (Measured: a fresh agent relayed "restart required" as fact, the user
93
121
  checked, and it was not one.)
94
122
 
95
123
  **Ask before setting policy for them.** Auto-update means the tool updates
96
- itself; `--hook on` means note summaries and their standing rules reach an agent
97
- unasked. Recommend both, but they are theirs to decide.
124
+ itself: once a day, when a newer version exists, a global install starts
125
+ `memgineering update` in the background and the next run uses it (a project-local
126
+ or npx copy is never touched — it only gets the notice; nor is anything installed
127
+ from a session hook or under CI). One install runs at a time: `memgineering
128
+ update` run while a background install is going answers `update_in_progress`
129
+ and installs nothing — wait a few minutes and run it again; it reports whether
130
+ that install worked. `--hook on` means note
131
+ summaries and their standing rules reach an agent unasked. Recommend both, but
132
+ they are theirs to decide.
98
133
 
99
134
  **Error telemetry is theirs to decide too, and defaults to off.** With
100
135
  `--error-telemetry on`, the CLI sends an anonymous report when it ITSELF
@@ -441,9 +476,12 @@ as a next step rather than running it.
441
476
 
442
477
  ### What a hosted brain does that a folder does not
443
478
 
444
- Every verb works on either kind now, consolidation included. Two things are
479
+ Every verb works on either kind now, consolidation included. Three things are
445
480
  only true of a hosted brain.
446
481
 
482
+ **A chat app with no shell can reach it** — through the connector at the top of
483
+ this file. A folder brain is reached only by tools that can run `memgineering`.
484
+
447
485
  **Meaning is searched, if a model is configured for it.** That is what lets an
448
486
  English question reach a Korean note. It needs `BRAIN_EMBEDDING_URL` and
449
487
  `BRAIN_EMBEDDING_MODEL` set on the server; with neither, the brain searches text
@@ -475,7 +513,7 @@ answers without changing its name and the index has to be laid down again.
475
513
  ## Turning things off
476
514
 
477
515
  ```
478
- memgineering setup --agent --auto-update off
516
+ memgineering setup --agent --auto-update off --hook <on|off> # --agent sets both; keep the hook as it was
479
517
  memgineering unlink # stop reading a brain; notes untouched
480
518
  memgineering unlink --purge # also delete the local index and undo snapshots
481
519
  ```
@@ -23,10 +23,13 @@ reverse it. Do not ask permission for ordinary observations — write them, and
23
23
  mention it in a sentence.
24
24
 
25
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:
26
+ name comes from the folder's binding (`memgineering project` shows it), else the
27
+ git remote (`owner/repo`), else — in a repository with no remote — the checkout
28
+ folder's name. `remember` prints the scope and which of those it came from
29
+ (`scope_via` in `--json`); when it is the folder name, say so, because that is
30
+ the one nobody predicts. The stamp is automatic; an explicit `--scope` beats it;
31
+ a folder that names no project writes exactly what it always wrote. Two flags
32
+ are worth reaching for on purpose:
30
33
 
31
34
  ```
32
35
  memgineering remember "we always squash before merging" --rule --no-scope \