memgineering 0.25.0 → 0.25.2

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,111 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.25.2] — 2026-10-05
15
+
16
+ Small fixes found by an independent review of 0.25.0 and 0.25.1. Nothing here
17
+ changes what you type.
18
+
19
+ ### Fixed
20
+
21
+ - **A refresh `setup` keeps your choices.** `memgineering setup` run again
22
+ without `--hook` or `--auto-update` used to turn both back on. It now keeps
23
+ the hook and auto-update choices recorded on this machine, including a hook
24
+ choice made on the `setup --web` screen. On a machine set
25
+ up before this release, the hook choice is read from whether the hook is
26
+ installed. A kept choice is no longer listed as a default nobody was asked
27
+ about.
28
+ - **A command no longer waits on the update check.** Before a background
29
+ install, the CLI asks npm, pnpm and bun where they keep global packages. That
30
+ could hold your command open for up to 15 seconds after its output, and
31
+ longer behind a version manager. The CLI now asks all three at once and gives
32
+ up after 1.5 seconds. If it cannot tell how memgineering was installed, it
33
+ installs nothing and prints the usual "is available — `memgineering update`"
34
+ line.
35
+ - **The before-edit hook never starts an update**, even when it is called with
36
+ a flag first (`memgineering --json guard`). The same holds for `resurface`.
37
+ - **Two commands starting together cannot both start a background install.**
38
+ This could happen when the previous install had been left unfinished. If the
39
+ lock behind this fix is ever left in place, `memgineering update` says so
40
+ (`update_claim_stuck`) instead of reporting another install in progress.
41
+ - **Both sides of a conflict appear in recall.** When a note contradicted an
42
+ unfilled base template, the limit of two template cards could hide one side
43
+ while recall said "Both sides are above". Both sides now show, even if that
44
+ means more than two template cards, and the line counting held-back
45
+ templates says so.
46
+ - **Hosted recall by meaning no longer drops a base note you have filled in.**
47
+ A `USER.md` or other `01_BASE/` note you rewrote in your own words was
48
+ treated as an untouched template and left out. Only an exact, untouched
49
+ template is held back now.
50
+ - **A chat-app connector cannot change a rule by other routes.** Retiring,
51
+ restoring or undoing a rule from a connector is now refused with
52
+ `rule_needs_a_person`, as editing one already was. That includes undoing the
53
+ `remember` that created a rule. A connector's `undo` with no id undoes only
54
+ that app's own changes, including those made before its sign-in was
55
+ refreshed. If it has made none, it is told so and nothing is undone.
56
+ - Hosted `retire` and `unretire` no longer say that `undo` cannot reverse
57
+ them. It can, and their hint now names both ways back.
58
+ - `setup --help` gives ChatGPT its own route: Settings → Developer mode → add
59
+ an MCP server. Claude.ai, Claude Desktop and Cowork use a custom connector.
60
+ - `setup --web` prints its terminal lines in English.
61
+
62
+ ### Agent guidance
63
+
64
+ - `memgineering-setup`: turning auto-update off with
65
+ `setup --agent --auto-update off` no longer needs `--hook`, because the hook
66
+ stays as this machine recorded it. It also explains `update_claim_stuck`.
67
+ - `memgineering-recall`: a template card that is one side of a conflict comes
68
+ on top of the two-card limit.
69
+
70
+ ## [0.25.1] — 2026-10-05
71
+
72
+ A security release. Upgrade if you use `setup --web`, or a hosted brain with a
73
+ chat-app connector.
74
+
75
+ ### Security
76
+
77
+ - **`setup --web` no longer switches a machine to another account.** If the
78
+ setup screen is confirmed by a different account from the one this machine is
79
+ signed in to, nothing is written and the terminal says why. The setup screen
80
+ is only told "different account", never who is signed in here.
81
+ - **Notes chosen for upload on the setup screen wait for a check on this
82
+ machine.** A setup left running in the background uploads nothing. The next
83
+ command names the folder, the account that would receive it, and the `push`
84
+ that sends it. That command is quoted, so neither a folder name nor a brain
85
+ name can run as shell code. A setup in the foreground asks first. A `push` of
86
+ that folder, or `logout`, clears the notice.
87
+ - **The setup screen can link or upload only a folder this machine offered.**
88
+ It can create a new local brain only inside the home folder. A relative or
89
+ `~/` path is read against the home folder and created exactly where it was
90
+ checked, and symlinks are followed.
91
+ - **`setup --web --json` prints `setup_url` only when no browser opened**, with
92
+ a hint to use `--print-url` if the browser never appeared. A machine signing
93
+ in for the first time is told once which account it was connected to.
94
+ - **`login` tells the approval screen when and from what the sign-in came**
95
+ (`platform`, `client`). Its wording now says that screen asks the person to
96
+ type the code.
97
+ - **Rules first written through a chat-app connector say so.** `memgineering
98
+ rules` and the before-edit hook print `(written by the ChatGPT connector)`
99
+ next to such a rule, and `--json` carries `written_by`. A rule asked for from
100
+ a chat app is now held as a note until the person promotes it at a terminal.
101
+ The hold is enforced by the server.
102
+
103
+ ### Fixed
104
+
105
+ - `revise --rule` with the claim a note already holds makes it a rule. It used
106
+ to be refused as "already says this", and nothing bound.
107
+
108
+ ### Agent guidance
109
+
110
+ - `memgineering-setup` explains what the setup link gives whoever holds it, and
111
+ what happens to an upload chosen on the screen.
112
+ - `memgineering-rules` explains rules held from chat apps. Promoting one binds
113
+ the note's own text, so read it first with `memgineering open <id> --detail
114
+ full`; to word it differently, write a new rule with `remember --rule`. It
115
+ also explains the `written by` label.
116
+
117
+ Restart the agent session after upgrading so it reads the new guidance.
118
+
14
119
  ## [0.25.0] — 2026-10-04
15
120
 
16
121
  ### 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.25.0
5
+ version: 0.25.2
6
6
  ---
7
7
 
8
8
  # memgineering
@@ -210,8 +210,9 @@ it, so it is evidence of nothing — do not quote it back as what they think. Wh
210
210
  every card carries that mark, recall says so above them (`--json`:
211
211
  `scaffolding: true`), and that is the moment to offer to fill them in rather
212
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.
213
+ back per answer, plus any that is one side of a conflict, so both sides of a
214
+ conflict always show; the rest are counted (`templates_withheld`), never
215
+ silently dropped, and nothing anyone wrote is ever held back.
215
216
 
216
217
  The mark disappears once the user writes in the file. A filled-in base note is
217
218
  often the best answer in the brain: _who am I_, _what am I not allowed to do_,
@@ -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
@@ -66,6 +66,17 @@ Three things to do after running it:
66
66
  picks it up on its own when they do. There is nothing to poll and nothing
67
67
  to wait for.
68
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
+
69
80
  The screen asks everything `--agent` takes from flags — sign in, where the
70
81
  memory lives, which brain, which tools, auto-update, the session hook — with
71
82
  the recommended answer pre-selected. A person who is already signed in to
@@ -116,7 +127,8 @@ or npx copy is never touched — it only gets the notice; nor is anything instal
116
127
  from a session hook or under CI). One install runs at a time: `memgineering
117
128
  update` run while a background install is going answers `update_in_progress`
118
129
  and installs nothing — wait a few minutes and run it again; it reports whether
119
- that install worked. `--hook on` means note
130
+ that install worked. `update_claim_stuck` means a crashed install's leftover
131
+ could not be cleared; its hint names the folder to delete. `--hook on` means note
120
132
  summaries and their standing rules reach an agent unasked. Recommend both, but
121
133
  they are theirs to decide.
122
134
 
@@ -502,7 +514,7 @@ answers without changing its name and the index has to be laid down again.
502
514
  ## Turning things off
503
515
 
504
516
  ```
505
- memgineering setup --agent --auto-update off --hook <on|off> # --agent sets both; keep the hook as it was
517
+ memgineering setup --agent --auto-update off # the hook stays as this machine recorded it
506
518
  memgineering unlink # stop reading a brain; notes untouched
507
519
  memgineering unlink --purge # also delete the local index and undo snapshots
508
520
  ```