memgineering 0.4.2 → 0.5.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 CHANGED
@@ -11,6 +11,236 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ### Added
15
+
16
+ - **Every command works on a hosted brain.** `revise`, `resurface`, `retire`,
17
+ `unretire`, `exclude` and `unexclude` used to refuse when this machine was
18
+ pointed at a hosted brain and tell you to add `--local`. They go to the server
19
+ now. Nothing memgineering offers says no because your brain is not on this
20
+ disk.
21
+
22
+ - **The setup screen starts with where your memory goes.**
23
+ `memgineering setup --web` used to open a Google sign-in before it showed you
24
+ anything, so the first thing you saw was a consent page for a product that
25
+ had not told you what it was. It now opens on the choice — what memgineering is in one
26
+ sentence, then a plain comparison of keeping the memory on this machine
27
+ against keeping it in an account, and what each costs. One brain is free, and
28
+ stays free. The sign-in only starts once you have picked it, and the code to
29
+ approve is shown on the last screen. Draft terms and a privacy draft are
30
+ reachable from the same screen; they are marked as drafts because they have
31
+ not been through legal review.
32
+
33
+ - **`memgineering pull [folder]`** — download your hosted brain back to this
34
+ machine, as the markdown it is. Until now notes went up and nothing came back,
35
+ so "your memory is yours" stopped being demonstrable the moment you used the
36
+ hosted side. It **never overwrites**: a file already at that path is left
37
+ exactly as it is and reported as skipped, which is what makes it safe to point
38
+ at the wrong folder and what makes an interrupted download finishable by
39
+ running the command again. Notes your rules exclude come down too — excluded
40
+ means "stop reading this", not "this is no longer yours" — and `.memgignore`
41
+ travels with them, so the folder does not silently un-exclude anything. The
42
+ result is plain markdown; `memgineering link <folder>` is what turns it into a
43
+ brain on this machine, and it is not done for you. `--dry-run` lists what would
44
+ be written without writing it.
45
+
46
+ - **`memgineering push`** — upload the brain on this machine to your hosted one,
47
+ keeping every note at the path it already had. Nothing is deleted locally, a
48
+ note already up there is counted as already up there rather than as a failure
49
+ (so an interrupted upload is finished by running the command again), and any
50
+ note the server refuses is listed in the summary instead of quietly dropped
51
+ from the count. `--dry-run` lists what would go without sending anything.
52
+
53
+ ### Changed
54
+
55
+ - **Setup no longer decides about accounts behind your back.** Run by an agent,
56
+ it skipped sign-in and said nothing — so you got a folder on one machine and
57
+ found out later that your memory does not follow you. It now says plainly that
58
+ no account was used and how to connect one, and the install tells your agent to
59
+ ask you first: memory on this machine, or synced across your devices and tools.
60
+
61
+ - **After install, your agent finishes the job.** Installing used to print
62
+ `Next: memgineering setup` — which agents dutifully relayed to their user as a
63
+ command to type, in a product whose whole premise is that the agent does this
64
+ for you. The install now tells the agent to ask you one question — should it
65
+ set things up, or would you rather choose on a screen — and then run setup
66
+ itself. The message is also no longer suppressed when output is piped, which
67
+ is exactly the case where an agent is the one reading it.
68
+
69
+ - **`--local` still does exactly what it did.** The product works with no
70
+ server: pass `--local` to any command and it reads and writes the folder on
71
+ this machine, whether or not you are signed in.
72
+
73
+ - **A hosted `resurface` says what it ranked by.** It has three signals where a
74
+ local brain has four — it cannot know which folder you asked from, because the
75
+ server records what was recalled and never where you were standing. The output
76
+ names the signals it used rather than leaving you to notice that "recalled 14×
77
+ in this folder" stopped appearing.
78
+
79
+ - **`revise --input` is refused against a hosted brain**, rather than partly
80
+ honoured. The JSON can name a different memory and set fields the flags do not
81
+ expose, so sending only the understood parts would report a success for a
82
+ change you did not ask for. Pass the change as flags, or use `--local`.
83
+
84
+ - **What you exclude travels with your brain.** The rules live in a
85
+ `.memgignore` file inside the brain rather than in a setting beside it, so a
86
+ hosted brain pulled back down to a folder is still scoped the way you scoped
87
+ it. `undo` for an exclusion is `unexclude`, not `undo <op_id>`.
88
+
89
+ - **`memgineering login`, `logout` and `whoami`** — sign in to a hosted brain.
90
+ Optional, and nothing that already worked needs it: a brain is still a folder
91
+ of markdown files on your machine, and every other command works on it with no
92
+ account and no network.
93
+
94
+ `login` pairs this machine with an account without a token ever appearing in a
95
+ browser. It prints a code, opens an approval page, and collects the token
96
+ itself once you approve — so the credential never lands on a screen, in a
97
+ scrollback, or in a chat window.
98
+
99
+ **Agents should use `login --emit-only`.** It starts the sign-in, opens the
100
+ browser and returns immediately rather than waiting for a human to click,
101
+ which no agent's command timeout survives. The next `memgineering` command
102
+ claims the token automatically. Show the printed code in your reply: the
103
+ approval page asks the user to check it against what they were shown, and on
104
+ surfaces where you are the only thing that saw it, they cannot.
105
+
106
+ `logout` revokes on the server before forgetting anything locally — a token
107
+ deleted only here still works for whoever has a copy. `--all` ends every
108
+ session on the account, `--local` forgets it here when the server is
109
+ unreachable and says plainly what that does not do.
110
+
111
+ - **`setup` offers an account as its first step, and lets you walk past it.**
112
+ Skipping installs byte-for-byte the same files; there is a test that compares
113
+ the two trees. With no terminal it does nothing unless you pass `--login`, so
114
+ an agent running `setup --agent` never opens a browser you did not ask for.
115
+
116
+ - **`MEMGINEERING_API_URL`** points the account commands at a different brain
117
+ server. The token is stored with the server that minted it and is never sent
118
+ anywhere else.
119
+
120
+ - **The `--human` prompt no longer hangs where there is no terminal.** Asking for
121
+ `--human` says which mode you want; it does not conjure a screen to draw a
122
+ prompt on.
123
+
124
+ - **The setup screen no longer promises a sync it does not perform.** Its first
125
+ screen ticks "the same memory on another machine" for keeping the memory in an
126
+ account — and choosing that only signed you in. No hosted brain was created and
127
+ no note was uploaded, so you would have found out on the second machine. The
128
+ last screen now says the notes are still only on this machine and what changes
129
+ that; the machine-readable half tells your agent the same thing, and to ask you
130
+ before sending anything to a server.
131
+
132
+ - **Two screens no longer ask near-identical questions.** "기억을 어디에
133
+ 둘까요?" (this machine or an account) was followed two screens later by "기억을
134
+ 어디에 담을까요?" (which folder to read). The second is now "어느 폴더를
135
+ 쓸까요?".
136
+
137
+ - **The screen separates what is kept here from what an upload sends.** It said
138
+ only a note's title and first paragraph get stored — true of the index on this
139
+ machine, and read as the whole of what reaches the server by anyone who had
140
+ just chosen an account. Uploading sends the entire file, and the screen now
141
+ says so where the claim is made.
142
+
143
+ - **The privacy draft says notes are stored in plain text.** No end-to-end
144
+ encryption; whoever runs the server can technically read them, and not doing so
145
+ is a promise rather than an impossibility. It was the one fact a person
146
+ weighing whether to put a diary in an account most needs, and the easiest to
147
+ leave out.
148
+
149
+ - **The setup screen stopped handing out commands.** It answered three of a
150
+ non-developer's questions with one — how to stop a note being surfaced, how to
151
+ update, how to connect a folder — and each answer was a command to type, on the
152
+ one screen built for somebody who has never opened a terminal. Each is now
153
+ phrased as something to ask their agent for. A test fails if any
154
+ `memgineering <verb>` reappears on that page.
155
+
156
+ - **Folder suggestions say how many notes each one holds.** The list offered
157
+ every folder containing at least one markdown file, so a photo archive with a
158
+ stray README sat beside somebody's actual notes with nothing to tell them
159
+ apart. The count is the reason each row is there, so it is now on the row.
160
+ Filtering harder was the wrong fix: a folder with one note is still notes.
161
+
162
+ - **The terms draft lists what it has not decided.** Legal entity and
163
+ jurisdiction, where the servers are, how long a deletion takes to reach
164
+ backups, how a breach would be announced, and where to delete an account —
165
+ absent from the draft, and now absent in writing rather than by omission.
166
+
167
+ - **`recall` stopped telling Korean users their own Korean notes were
168
+ unreachable.** When a query found nothing, the footer could claim "this
169
+ brain's notes are mostly written in English … no rewording in another
170
+ language will reach them" — in a brain holding Korean notes. Two scaffolding
171
+ files were voting: `01_BASE/` was already excluded, `00_HUB/` was not, and on
172
+ a small brain one English note `init` wrote decides the count. A note like
173
+ `글꼴은 Pretendard 하나로` then votes English on the strength of the product
174
+ name, and the majority flips. The hub no longer votes, and the warning is
175
+ suppressed outright when any note somebody wrote is in the asker's script —
176
+ the claim is about reachability, and one such note makes it false.
177
+
178
+ Caught by a fresh-context agent, which read the footer, believed it, and told
179
+ its user that Korean titles are not searchable. A hint that is wrong does not
180
+ merely mislead — it stops the tool being used.
181
+
182
+ - **`resurface` shows what a brain holds before anything has been recalled from
183
+ it.** It ranked purely on evidence of use — recalled here, recalled anywhere,
184
+ read lately — and dropped everything that scored zero. A note that had only
185
+ ever been written scored zero, so a brain nobody had searched yet returned its
186
+ five untouched `01_BASE/` templates and none of its actual notes, even at
187
+ `--limit 8`. That is a loop with no way in: a note is not surfaced until it has
188
+ been recalled, and surfacing is how you find out it exists.
189
+
190
+ It runs at session start, so that was an agent's entire first impression of the
191
+ brain. Measured: one saw five "not filled in yet" placeholders, concluded there
192
+ was nothing there, and did not call memgineering again for the rest of the
193
+ session.
194
+
195
+ Never-reached notes now rank, below anything with evidence behind them, and
196
+ untouched templates take at most two of the slots instead of all five. When
197
+ nothing has been recalled yet the page says so in a line — the order means
198
+ "what this holds", not "what matters here". Refusing to guess was right;
199
+ refusing to speak was not.
200
+
201
+ - **Checking whether you are signed in no longer opens a Google consent page.**
202
+ The `not_signed_in` hint read "YOU run `memgineering login --emit-only`" with
203
+ no precondition attached, and agents follow instructions — so an agent that
204
+ ran `whoami` to orient itself started a sign-in. Measured during testing:
205
+ three consent windows appeared in a user's browser in a session where nobody
206
+ had mentioned accounts. `setup` already refused to do this on the grounds that
207
+ nobody should be sent to a consent screen they did not ask for; the tool held
208
+ both positions and this one ran more often. The hint now leads with the fact
209
+ that an account is optional and `--local` is right there, and gates the
210
+ sign-in on the user having asked for one.
211
+
212
+ - **`resurface` says what to do with what it just showed.** It printed five
213
+ cards and stopped, at session start, to a reader that is always an agent. One
214
+ was handed a note saying this site does not use blue, with the hex codes in
215
+ the summary, and shipped a page with a blue accent: the memory reached its
216
+ context and never reached its output. It now closes with three lines — these
217
+ are the user's own decisions, follow them unasked, recall before answering
218
+ something already settled, remember what this session decides. Untouched
219
+ templates also stop explaining themselves at length when real notes share the
220
+ page; six lines about unfilled files were burying the two that mattered.
221
+
222
+ - **A hosted brain answers the same way as a local one when nothing has been
223
+ recalled from it yet** — the notes, plus a line saying the order is what the
224
+ brain holds rather than what matters here. It used to return an empty list,
225
+ which reads as an empty brain.
226
+
227
+ ### Agent guidance
228
+
229
+ - **The hub now says which tools this actually reaches.** A fresh-context test
230
+ asked an agent to make ChatGPT, Claude and Codex share one memory; it set up
231
+ the two it could and then had to read the product's source code to find out
232
+ whether ChatGPT was possible at all. On a machine without that source it
233
+ would have had to guess. The guidance now states plainly that `setup` covers
234
+ Claude Code, Codex and Gemini CLI, that anything with a shell works, and that
235
+ web and phone surfaces have no connector yet — including the specific wrong
236
+ answer to avoid ("you are signed in, so it works everywhere").
237
+
238
+ - The bundled guidance changed: the hub now tells your agent to fetch your
239
+ notes back with `pull` whenever you ask for them, and the setup skill says
240
+ the account question on the first screen is yours to answer rather than
241
+ something it should decide or pre-empt. **Restart your agent session after
242
+ upgrading** — the guidance is read once, when the session starts.
243
+
14
244
  ## [0.4.2] — 2026-08-10
15
245
 
16
246
  ### Fixed
package/README.md CHANGED
@@ -7,12 +7,21 @@ Gemini — reads and writes the same brain through one CLI, so what you told one
7
7
  of them is there for the next one, tomorrow, and in whatever tool you move to
8
8
  after that.
9
9
 
10
+ **You do not have to run any of this yourself.** Ask whichever agent you are
11
+ already talking to — "install memgineering and set it up" — and it does the
12
+ whole thing, asking you only what it genuinely cannot decide.
13
+
14
+ <details>
15
+ <summary>The commands, for the agent (or for you, if you prefer a terminal)</summary>
16
+
10
17
  ```bash
11
18
  npm i -g memgineering
12
- memgineering setup
19
+ memgineering setup --agent # or --web to choose the settings on a screen
13
20
  memgineering link ~/Documents/Notes # or: memgineering init ~/brain
14
21
  ```
15
22
 
23
+ </details>
24
+
16
25
  ## What it does
17
26
 
18
27
  ```bash
@@ -131,6 +140,7 @@ can register it to run automatically when a Claude Code session starts.
131
140
  | `init <path>` | create a brain, laid out and ready |
132
141
  | `link <path>` | read notes you already keep |
133
142
  | `use [brain]` | bind this folder to one brain |
143
+ | `push` · `pull` | carry a brain to your account, and back down again |
134
144
  | `unlink` · `reindex` · `sync-rules` | brain housekeeping |
135
145
  | `log` | what changed, and what can still be undone |
136
146
  | `retire` · `unretire` | mark a memory no longer current, or current again |
@@ -148,13 +158,27 @@ Every command takes `--json`.
148
158
  | `MEMGINEERING_JSON=1` | force JSON output without the flag |
149
159
  | `MEMGINEERING_NO_UPDATE=1` | skip the version check for one run |
150
160
 
151
- ## What is coming
161
+ ## A brain that is not on this machine
162
+
163
+ A brain can also live in a memgineering account, so the same memory reaches
164
+ every tool and device you sign in from. Nothing about the local path went away —
165
+ `--local` reads the folder on this disk whether or not you are signed in.
166
+
167
+ ```bash
168
+ memgineering push # carry this folder up, note by note
169
+ memgineering pull ~/my-brain # bring it back down, as markdown
170
+ ```
171
+
172
+ The pair is deliberately asymmetric in the same direction: **`push` never
173
+ deletes anything here, and `pull` never overwrites anything here.** A file
174
+ already at that path is left alone and reported, so an interrupted transfer is
175
+ finished by running the command again and a mistyped folder costs you nothing.
152
176
 
153
- **0.2.0 cloud brains.** Today a brain is a folder on this machine. Next it
154
- can also live in a memgineering account, so the same memory reaches ChatGPT,
155
- Claude on the web, and anywhere a browser goes. The local path is not going
156
- away: what syncs is your originals, your ledger and your rules never a
157
- vendor's copy of your notes.
177
+ What `pull` writes is your notes, at the paths they had, including the ones your
178
+ rules exclude excluded means "stop reading this", not "this is no longer
179
+ yours" with `.memgignore` alongside them so the scoping survives the trip.
180
+ It is a folder of markdown, not yet a brain: `memgineering link` is what makes
181
+ it one, and it shows you what it would read first.
158
182
 
159
183
  ## Licence
160
184
 
@@ -12,6 +12,22 @@ use can read and write through the `memgineering` CLI. It outlives this
12
12
  session and this tool. Treat it as the place where what they know actually
13
13
  lives, and this conversation as temporary.
14
14
 
15
+ ## Which tools this actually reaches, today
16
+
17
+ Answer this from here, not from a guess. "Every AI tool" above means every tool
18
+ that can run this CLI — and that is a shorter list than people assume.
19
+
20
+ | | |
21
+ | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
22
+ | **Claude Code · Codex · Gemini CLI** | `memgineering setup` installs into these. They read and write the same brain. |
23
+ | **Anything else with a shell** | Works — the CLI is the whole interface. Nothing has to be built for a new tool. |
24
+ | **ChatGPT · Claude on the web · phone apps** | **Not yet.** There is no connector. A hosted brain is reachable by them in principle and is not wired up in practice. |
25
+
26
+ So when someone asks _"will my ChatGPT remember this too?"_, the answer is **not
27
+ yet, and here is what does** — not a hedge, and not a promise. Saying "you are
28
+ signed in, so it works everywhere" is the specific wrong answer: the account
29
+ syncs the brain between machines, it does not add a surface that can read it.
30
+
15
31
  ## When to reach for it
16
32
 
17
33
  **Start a session by asking what you are missing.** Before working in an
@@ -95,6 +111,23 @@ six months from now, and it is refused if it looks like it carries a credential.
95
111
  memgineering revise <handle> --claim "Deploying is manual now." --summary "manual only"
96
112
  ```
97
113
 
114
+ **Get their notes out whenever they ask** — a backup, a new machine, "where is
115
+ my memory actually kept", or plain curiosity about what is stored:
116
+
117
+ ```
118
+ memgineering pull ~/my-brain
119
+ ```
120
+
121
+ It downloads their hosted brain as markdown and **never overwrites** a file
122
+ already there, so it is safe to run twice and safe to point at the wrong
123
+ folder. `push` is the other direction and never deletes anything locally.
124
+
125
+ Say what arrives: notes the brain excludes from recall come down too, with
126
+ `.memgignore` beside them. Excluded means "stop reading this", not "this is no
127
+ longer theirs" — but readable files in a folder is not something to let them
128
+ discover later. What lands is markdown, not yet a brain here; offer
129
+ `memgineering link <folder>` rather than running it.
130
+
98
131
  ## What to raise with the user rather than just doing
99
132
 
100
133
  The tool does not gate writes; your judgement does. Tell them — plainly, once
@@ -335,3 +335,29 @@ the user can see, and let them answer. Do not pass `--yes` on their behalf.
335
335
  With no terminal attached it says so instead of assuming the answer was no.
336
336
  Show them `memgineering link <path> --dry-run` — same disclosure, writes
337
337
  nothing — and run with `--yes` only once they have actually said yes.
338
+
339
+ ## Moving a brain between this machine and their account
340
+
341
+ ```
342
+ memgineering push # this folder → their account
343
+ memgineering pull ~/my-brain # their account → a folder here
344
+ ```
345
+
346
+ Both are safe to run twice, and each is careful in the opposite direction:
347
+ **`push` never deletes anything locally, `pull` never overwrites anything
348
+ locally.** Whatever was already there is left alone and counted in the summary,
349
+ so an interrupted transfer finishes by running the same command again.
350
+
351
+ Reach for `pull` when the user asks to get their notes out, wants a backup,
352
+ is moving machines, or asks where their memory actually lives. **Say what it
353
+ brings**: notes the brain excludes from recall come down too — excluded means
354
+ "stop reading this", not "this is no longer yours" — along with `.memgignore`,
355
+ so nothing is silently un-excluded on the way. If any of those arrive, tell
356
+ them; readable files in a folder is not something to discover later.
357
+
358
+ What lands is markdown and nothing more. It is not a brain on this machine
359
+ until `memgineering link <folder>` — offer that as a next step rather than
360
+ doing it, since it is a second decision they did not ask for.
361
+
362
+ `--dry-run` on either verb lists what would move and moves nothing. Use it when
363
+ the user is unsure which folder they mean.
@@ -55,6 +55,20 @@ one at a time, in plain language. Reach for it when the user is not reading
55
55
  your terminal at all — they have never opened one, or they are the one who has
56
56
  to decide and a checkbox screen you are driving is not where they can.
57
57
 
58
+ **Its first screen is the account question, and it is theirs.** The page
59
+ explains what memgineering is, compares keeping the memory on this machine
60
+ against keeping it in an account — what works without one (everything), what
61
+ only works with one (the same memory on another machine, and on a machine they
62
+ no longer have), what it costs (one brain, free) — and only starts a sign-in
63
+ after they pick. Do not answer it for them and do not pre-empt it by running
64
+ `login` first.
65
+
66
+ If they already told you which way they want it, pass `--login` or
67
+ `--no-login`: the screen opens with that answer selected rather than asking
68
+ again, and they can still change it. If they chose an account, the page shows
69
+ a short code at the end — read it out to them; approving it in the browser is
70
+ the last thing they do.
71
+
58
72
  It covers step 2 as well: the page offers the notes folders it finds on the
59
73
  machine, and shows the same disclosure `link --dry-run` prints — how many notes
60
74
  would be indexed, which ones are refused and why, with samples of the lines
File without changes