memgineering 0.4.2 → 0.6.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 +667 -0
- package/NOTICE +22 -0
- package/README.md +32 -8
- package/assets/MEMGINEERING.md +44 -140
- package/assets/memgineering-memory/SKILL.md +44 -303
- package/assets/memgineering-recall/SKILL.md +142 -0
- package/assets/memgineering-rules/SKILL.md +111 -0
- package/assets/memgineering-setup/SKILL.md +184 -105
- package/assets/memgineering-writing/SKILL.md +183 -0
- package/bin/memgineering.js +0 -0
- package/dist/index.js +4981 -1222
- package/package.json +2 -2
- package/scripts/postinstall.mjs +59 -10
|
@@ -1,173 +1,252 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: memgineering-setup
|
|
3
|
-
description: Use when installing or configuring memgineering
|
|
3
|
+
description: Use when installing or configuring memgineering, when moving a brain between a machine and an account, or whenever the user asks WHICH of their AI tools can see this memory. Triggers include "set up memgineering", "connect my notes", "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".
|
|
4
4
|
type: skill
|
|
5
5
|
allowed-tools: Bash(memgineering:*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Setting memgineering up
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
## Which tools this actually reaches, today
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
2. **Connect a brain** — which folder holds the notes. This one is the user's
|
|
15
|
-
decision, and it involves showing them what gets stored.
|
|
12
|
+
Answer this from here, not from a guess. The line is capability, not brand, so
|
|
13
|
+
it does not move as products come and go:
|
|
16
14
|
|
|
17
|
-
|
|
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. |
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
`memgineering setup` writes its guidance into the agent tools it finds on the
|
|
21
|
+
machine, and `setup --dry-run` names the ones it actually found rather than
|
|
22
|
+
guessing from a list.
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
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.
|
|
29
|
+
|
|
30
|
+
## 1. Register with the agents
|
|
26
31
|
|
|
27
32
|
```
|
|
28
33
|
memgineering setup --agent \
|
|
29
34
|
--tools claude,codex \ # default: everything detected
|
|
30
35
|
--auto-update on \ # default: on, and recommended
|
|
31
|
-
--hook on #
|
|
36
|
+
--hook on # session-start summary + rules before an edit
|
|
32
37
|
```
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
`--dry-run` reports what would change without changing it.
|
|
40
|
+
|
|
41
|
+
**Ask before setting policy for them.** Auto-update means the tool updates
|
|
42
|
+
itself; `--hook on` means note summaries and their standing rules reach an agent
|
|
43
|
+
unasked. Recommend both, but they are theirs to decide.
|
|
44
|
+
|
|
45
|
+
**`--hook off` removes them**, it does not merely decline to add them, so it is
|
|
46
|
+
the answer when someone already has the callbacks and has decided they do not
|
|
47
|
+
want them. Only groups memgineering wrote are taken out; anything else in that
|
|
48
|
+
settings file is left alone.
|
|
49
|
+
|
|
50
|
+
**After setup the agent session has to restart** for the guidance to load. Say
|
|
51
|
+
so, or they will wonder why nothing changed.
|
|
52
|
+
|
|
53
|
+
### When it reports something it could not do
|
|
54
|
+
|
|
55
|
+
The guide lives between `<!-- memgineering-start -->` and
|
|
56
|
+
`<!-- memgineering-end -->`, and those markers are the only way it can be found
|
|
57
|
+
again. Two outcomes are worth recognising:
|
|
58
|
+
|
|
59
|
+
- **`N file(s) could not be written`** — a guide setup wrote is still in that
|
|
60
|
+
file with its markers gone, or a settings file is not valid JSON. Everything
|
|
61
|
+
else in that run WAS applied; the exit code is non-zero so the one skipped
|
|
62
|
+
file is not mistaken for a clean install. Put the markers back around the
|
|
63
|
+
block, or delete the block, then run setup again. Never append a second copy
|
|
64
|
+
by hand: two guides means both are in the user's context every session.
|
|
65
|
+
- **`Appended below an unmarked guide`** — the same shape, on a file setup has
|
|
66
|
+
no record of writing, so it installed rather than refusing. Look at the file:
|
|
67
|
+
if an older unmarked copy is now sitting above the new block, delete that copy.
|
|
68
|
+
If those lines are the user's own writing, nothing is wrong.
|
|
69
|
+
- **`Replaced N file(s) you had edited`** — the bytes on disk were not the ones
|
|
70
|
+
setup last wrote, so someone's own words were just overwritten. setup owns
|
|
71
|
+
those files and an upgrade has to replace them; what belongs to the user goes
|
|
72
|
+
OUTSIDE the markers, where nothing touches it. Ordinary upgrades do not print
|
|
73
|
+
this.
|
|
74
|
+
|
|
75
|
+
The hooks go to Claude Code and Codex, and only there. Codex asks the user to
|
|
76
|
+
review new hooks once at the start of the next session and runs neither until
|
|
77
|
+
they answer.
|
|
78
|
+
|
|
79
|
+
Grok is the case worth knowing, because the obvious guess is wrong: it has
|
|
80
|
+
hooks, more events than either of those two, and `~/.grok/hooks/` needs no
|
|
81
|
+
trust prompt — but a hook there cannot say anything to the model. Measured
|
|
82
|
+
three ways on 1.0.3, each with a value the session could not have known:
|
|
83
|
+
`PreToolUse` with `additionalContext`, `SessionStart` stdout, and
|
|
84
|
+
`UserPromptSubmit` with `additionalContext`. All three hooks ran; none of the
|
|
85
|
+
three arrived. Its own docs agree — `PreToolUse` reads `decision`/`deny`, and
|
|
86
|
+
"every other event is passive". So Grok gets the guide and the skills, which do
|
|
87
|
+
reach it, and nothing that would spawn a process to talk to nobody.
|
|
88
|
+
|
|
89
|
+
On Grok and Antigravity, run `memgineering resurface` yourself when you start
|
|
90
|
+
work in a folder, and `memgineering rules` before you change anything — that is
|
|
91
|
+
the same job the hooks do elsewhere, done by hand.
|
|
45
92
|
|
|
46
93
|
### When a person needs a screen, not flags
|
|
47
94
|
|
|
48
95
|
```
|
|
49
|
-
memgineering setup --
|
|
50
|
-
memgineering setup --web
|
|
96
|
+
memgineering setup --human # checkbox screen in your terminal
|
|
97
|
+
memgineering setup --web # a page in their own browser
|
|
98
|
+
memgineering setup --web --print-url # no browser here — hand over the link
|
|
51
99
|
```
|
|
52
100
|
|
|
53
|
-
`--web`
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
machine, and shows the same disclosure `link --dry-run` prints — how many notes
|
|
60
|
-
would be indexed, which ones are refused and why, with samples of the lines
|
|
61
|
-
that would be stored — before anything is read. When they finish, both steps
|
|
62
|
-
are done and there is nothing left for you to run.
|
|
63
|
-
|
|
64
|
-
The page is served on `127.0.0.1` with a one-time key in the URL, and closes
|
|
65
|
-
itself when the setup is applied or after ten idle minutes. **The command does
|
|
66
|
-
not return until then.** Run it, tell the user to look at their browser, and
|
|
67
|
-
wait for it — a setup screen nobody answered has not set anything up, so do not
|
|
68
|
-
report it as done until the command comes back.
|
|
101
|
+
Reach for `--web` when the user is not reading your terminal at all. Its first
|
|
102
|
+
screen is the account question, and it is theirs: the page explains what
|
|
103
|
+
memgineering is, compares this machine against an account, and starts a sign-in
|
|
104
|
+
only after they pick. **Do not pre-empt it by running `login` first.** If they
|
|
105
|
+
already told you which way, pass `--login` / `--no-login` and the screen opens
|
|
106
|
+
with that selected.
|
|
69
107
|
|
|
70
|
-
|
|
71
|
-
|
|
108
|
+
It covers step 2 as well, with the same disclosure `link --dry-run` prints. The
|
|
109
|
+
page serves on `127.0.0.1` with a one-time key and **the command does not return
|
|
110
|
+
until it is answered or ten idle minutes pass** — a screen nobody answered has
|
|
111
|
+
set nothing up, so wait for it rather than reporting done.
|
|
72
112
|
|
|
73
113
|
## 2. Connect a brain
|
|
74
114
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
**They already keep notes somewhere** — Obsidian, a folder of markdown,
|
|
78
|
-
anything:
|
|
115
|
+
**They already keep notes somewhere:**
|
|
79
116
|
|
|
80
117
|
```
|
|
81
|
-
memgineering link ~/
|
|
118
|
+
memgineering link ~/notes
|
|
82
119
|
```
|
|
83
120
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
takes that away.
|
|
89
|
-
|
|
90
|
-
If your shell has no terminal attached, `link` will say so rather than
|
|
91
|
-
pretending the answer was no. When that happens, show them the decision
|
|
92
|
-
instead of making it:
|
|
121
|
+
Prints exactly what would be indexed and what would be refused — with samples of
|
|
122
|
+
the real lines that would be stored — then asks. **Run it and stop.** Do not
|
|
123
|
+
pass `--yes` for them: that screen is the one moment they decide what this tool
|
|
124
|
+
may read.
|
|
93
125
|
|
|
94
|
-
|
|
95
|
-
memgineering link
|
|
96
|
-
|
|
126
|
+
With no terminal attached it says so rather than assuming no. Then show them
|
|
127
|
+
`memgineering link <path> --dry-run` — same disclosure, writes nothing — wait
|
|
128
|
+
for a real yes, and only then run with `--yes`.
|
|
97
129
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
If they cannot see your terminal at all, hand them the command rather than
|
|
104
|
-
answering for them.
|
|
105
|
-
|
|
106
|
-
**What to tell them, in one line before they answer:** the title and first
|
|
107
|
-
paragraph of every note listed gets stored outside the folder, and if the
|
|
108
|
-
session-start hook is on, a few of those summaries appear in every new session
|
|
109
|
-
without anyone asking. Anything they would not want in either place goes in a
|
|
110
|
-
`.memgdeny` file at the top of the folder — one path per line, no wildcards:
|
|
130
|
+
**Tell them one thing before they answer:** the title and first paragraph of
|
|
131
|
+
every listed note gets stored outside the folder, and with the session-start
|
|
132
|
+
hook on, a few of those summaries reach every new session unasked. Anything they
|
|
133
|
+
would not want in either place goes in `.memgdeny` at the top of the folder, one
|
|
134
|
+
path per line, no wildcards:
|
|
111
135
|
|
|
112
136
|
```
|
|
113
137
|
30_personal/medical.md
|
|
114
138
|
journal/ (a trailing slash covers a whole folder)
|
|
115
139
|
```
|
|
116
140
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
suggests, or remove the lines.
|
|
141
|
+
A `.memgdeny` line matching no file is refused on purpose — a rule with a wrong
|
|
142
|
+
path protects nothing.
|
|
120
143
|
|
|
121
|
-
**They have no notes yet
|
|
144
|
+
**They have no notes yet:**
|
|
122
145
|
|
|
123
146
|
```
|
|
124
147
|
memgineering init ~/brain
|
|
125
148
|
```
|
|
126
149
|
|
|
127
|
-
Creates the layout
|
|
128
|
-
|
|
129
|
-
there for when they are needed, not as homework.
|
|
150
|
+
Creates the layout and links it. Tell them to fill in `01_BASE/USER.md` and
|
|
151
|
+
leave the rest; the folders are there for when they are needed, not as homework.
|
|
130
152
|
|
|
131
153
|
### Several brains
|
|
132
154
|
|
|
133
|
-
Normal
|
|
134
|
-
|
|
155
|
+
Normal — one of their own, a shared folder, one per project. Which one answers is
|
|
156
|
+
decided in this order: `--vault <path>` → a `.memgineering` pointer found by
|
|
157
|
+
walking up → the brain the cwd is inside → the only one linked → their default.
|
|
135
158
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
5. their default brain — the first one they linked, unless they changed it
|
|
159
|
+
```
|
|
160
|
+
memgineering use ~/brains/work # bind this directory to one brain
|
|
161
|
+
memgineering use --default ~/brains/work
|
|
162
|
+
```
|
|
141
163
|
|
|
142
|
-
|
|
164
|
+
Inside a repository `use` writes a relative path, so it can be committed and
|
|
165
|
+
resolves for a teammate who links the same brain.
|
|
166
|
+
|
|
167
|
+
**Do not give up on a write because the choice is ambiguous.** A refused
|
|
168
|
+
`remember` means the thing they asked you to keep was not kept — ask which
|
|
169
|
+
brain, or pass `--vault` for the write and settle the default afterwards.
|
|
170
|
+
|
|
171
|
+
## Checking it worked
|
|
143
172
|
|
|
144
173
|
```
|
|
145
|
-
memgineering
|
|
174
|
+
memgineering recall "anything" # should answer, even if with "nothing matched"
|
|
175
|
+
memgineering log # what this brain has recorded
|
|
146
176
|
```
|
|
147
177
|
|
|
148
|
-
|
|
149
|
-
will resolve for a teammate who links the same brain.
|
|
178
|
+
## Asking where things stand, without changing them
|
|
150
179
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
the list it printed and offer the one-time fix:
|
|
180
|
+
There is no `status` verb. Three read-only questions cover it, and none of them
|
|
181
|
+
writes anything:
|
|
154
182
|
|
|
155
183
|
```
|
|
156
|
-
memgineering
|
|
184
|
+
memgineering setup --agent --dry-run # which tools are installed, what would change
|
|
185
|
+
memgineering whoami # which account this machine is signed in as
|
|
186
|
+
memgineering use # which brain answers recall and takes writes
|
|
157
187
|
```
|
|
158
188
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
the
|
|
163
|
-
|
|
164
|
-
|
|
189
|
+
**`use` is the one to run before believing anything about where a note went.**
|
|
190
|
+
Signed in and pointed at a hosted brain, it names that brain — where `recall`
|
|
191
|
+
reads and every write lands — and then the folder on this disk, which `--local`
|
|
192
|
+
reaches and which the before-edit hook reads.
|
|
193
|
+
|
|
194
|
+
Pointed at one with no sign-in here (what `logout` leaves: token cleared,
|
|
195
|
+
pointer kept), it names the **folder** first, because that is genuinely where
|
|
196
|
+
the next write goes — nothing refuses, it falls through to the local brain.
|
|
197
|
+
|
|
198
|
+
The third state is a sign-in left waiting by `login --emit-only`: it names the
|
|
199
|
+
folder AND the waiting sign-in, because until somebody approves it the next
|
|
200
|
+
command's claim is refused and the write lands in the folder — and once approved
|
|
201
|
+
that same claim succeeds and everything goes to the hosted brain.
|
|
202
|
+
|
|
203
|
+
In `--json`, read **`destination`**: `"hosted"`, `"local"`, or `"pending"`.
|
|
204
|
+
`"pending"` is not a hedge — a sign-in waiting for approval lands writes in
|
|
205
|
+
`brain` until somebody approves it and in the hosted brain after, and this
|
|
206
|
+
command will not open a browser to find out which. Do not read
|
|
207
|
+
`hosted.signed_in` for this: it is `false` for both the logged-out and the
|
|
208
|
+
waiting state, and those go to different places. It reads state off the disk, so
|
|
209
|
+
it answers with the server down and never finishes a sign-in just for being
|
|
210
|
+
asked.
|
|
211
|
+
|
|
212
|
+
`setup --agent --dry-run` is the one worth naming out loud, because the answer to
|
|
213
|
+
"am I installed" lives behind a verb that otherwise installs. A tester who wanted
|
|
214
|
+
the answer either avoided `setup` and had no answer, or ran it without
|
|
215
|
+
`--dry-run`. It writes nothing at all — it reports.
|
|
216
|
+
|
|
217
|
+
The hook itself is `memgineering guard`, deliberately absent from `--help`: it
|
|
218
|
+
reads a PreToolUse payload on stdin and does nothing without one, so listing it
|
|
219
|
+
would put "run this" in front of an agent for a command that cannot work when
|
|
220
|
+
run. If a hook is misbehaving, that is the name to look for in the tool's hook
|
|
221
|
+
config — not a command to invoke by hand.
|
|
222
|
+
|
|
223
|
+
## Moving a brain between this machine and their account
|
|
165
224
|
|
|
166
225
|
```
|
|
167
|
-
memgineering
|
|
168
|
-
memgineering
|
|
226
|
+
memgineering push # this folder → their account
|
|
227
|
+
memgineering pull ~/my-brain # their account → a folder here
|
|
169
228
|
```
|
|
170
229
|
|
|
230
|
+
Both are safe to run twice and careful in opposite directions: **`push` never
|
|
231
|
+
deletes anything locally, `pull` never overwrites anything locally.** Whatever
|
|
232
|
+
was already there is left alone and counted, so an interrupted transfer finishes
|
|
233
|
+
by running the same command again. `--dry-run` on either lists what would move.
|
|
234
|
+
|
|
235
|
+
Reach for `pull` when they want a backup, are moving machines, or ask where
|
|
236
|
+
their memory actually lives. **Say what it brings**: notes the brain excludes
|
|
237
|
+
from recall come down too — excluded means "stop reading this", not "this is no
|
|
238
|
+
longer yours" — along with `.memgignore`. Readable files in a folder is not
|
|
239
|
+
something to let them discover later.
|
|
240
|
+
|
|
241
|
+
**One `pull` is one brain, not one account.** If the output names other hosted
|
|
242
|
+
brains (`other_brains` in `--json`), this folder is not their memory — it is part
|
|
243
|
+
of it. Run `pull --brain <name> <folder>` for each before telling them anything
|
|
244
|
+
is backed up. A partial backup nobody knows is partial is worse than one that
|
|
245
|
+
failed.
|
|
246
|
+
|
|
247
|
+
What lands is markdown, not yet a brain here. Offer `memgineering link <folder>`
|
|
248
|
+
as a next step rather than running it.
|
|
249
|
+
|
|
171
250
|
## Turning things off
|
|
172
251
|
|
|
173
252
|
```
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: memgineering-writing
|
|
3
|
+
description: Use when you learn something durable and should record it, when a conclusion you already recorded turns out to have changed, when something needs undoing or retiring, or when the user's `01_BASE/` files are still empty and only a conversation can fill them. Triggers include "remember this", "that didn't work", "this worked instead", "that's not right anymore", "undo that", "looks good", "set up my memory", "fill in my profile", "stop reading that note". Covers remember, revise, undo, log, retire, exclude, onboard, and what to say before writing.
|
|
4
|
+
type: skill
|
|
5
|
+
allowed-tools: Bash(memgineering:*)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Writing to the user's brain
|
|
9
|
+
|
|
10
|
+
Reading is `memgineering-recall`; decisions that bind an agent are
|
|
11
|
+
`memgineering-rules`.
|
|
12
|
+
|
|
13
|
+
## Recording what you learned
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
memgineering remember "the deadline moved to the 30th" \
|
|
17
|
+
--reason "they said so on the call and the old date is still written down"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Lands immediately and is recallable at once. No approval queue by design: the
|
|
21
|
+
trade is permission-before for correction-after, and every write records how to
|
|
22
|
+
reverse it. Do not ask permission for ordinary observations — write them, and
|
|
23
|
+
mention it in a sentence.
|
|
24
|
+
|
|
25
|
+
**`--reason` on every write.** It goes in the ledger and is the only part of the
|
|
26
|
+
record that still means anything six months later. Every write verb takes it:
|
|
27
|
+
`remember`, `revise`, `retire`, `exclude`, `undo`. The one on `undo` matters
|
|
28
|
+
most — it is the moment an earlier conclusion turned out to be wrong. It is
|
|
29
|
+
refused if it looks like it carries a credential; say what changed without the
|
|
30
|
+
value rather than dropping the flag.
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
memgineering undo --reason "that belonged to the other project" # the last change
|
|
34
|
+
memgineering undo <op_id> # a specific one
|
|
35
|
+
memgineering log # what changed, why, what can still be undone
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**`log` labels the id with the verb that takes it.** `undo: <id>` means `undo`
|
|
39
|
+
will accept that one; `op: <id>` means it will not. `undo` is last-in-first-out
|
|
40
|
+
per note — only the most recent operation on a note can be taken back, and the
|
|
41
|
+
one underneath becomes available again the moment it is — so `op:` covers an
|
|
42
|
+
operation a later one wrote over, one already undone, one that is itself an
|
|
43
|
+
undo, a note edited outside the tool since, and a verb that brain cannot reverse
|
|
44
|
+
(a hosted brain cannot reverse an `exclude`; neither reverses an `import`). The
|
|
45
|
+
id is still shown either way so you can quote it, and `--json` carries
|
|
46
|
+
`superseded` on both a hosted brain and one in a folder, so you do not have to
|
|
47
|
+
read the label.
|
|
48
|
+
|
|
49
|
+
**An operation id is not a memory handle**, though they look alike. `open` takes
|
|
50
|
+
handles from `recall`; ids from `log` name changes. Handed one anyway, `open`
|
|
51
|
+
says what it actually is and which note it touched, rather than "nothing here
|
|
52
|
+
matches".
|
|
53
|
+
|
|
54
|
+
**Write down:** something that turned out to work a particular way; a choice
|
|
55
|
+
that got made, by them or by you; **an attempt that failed, and what finally
|
|
56
|
+
worked instead**; a constraint; a decision they stated; work of yours they
|
|
57
|
+
looked at and confirmed. The failed attempt is the one most often skipped and
|
|
58
|
+
the one that saves the most — without it the next session walks the same dead
|
|
59
|
+
end.
|
|
60
|
+
**Skip:** anything true only inside this conversation, and anything they said
|
|
61
|
+
they did not want kept.
|
|
62
|
+
|
|
63
|
+
**If it is a decision rather than a fact** — something they settled and expect to
|
|
64
|
+
hold next time — it takes `--rule`. See `memgineering-rules`.
|
|
65
|
+
|
|
66
|
+
**Write what you checked, not what you worked out.** A decision is whatever the
|
|
67
|
+
user says it is. A fact is not: anything a command or a file could confirm —
|
|
68
|
+
an address, an identifier, a version, a path, a number — goes in verified, or
|
|
69
|
+
not at all. If you derived it from a pattern rather than reading it, check it
|
|
70
|
+
first, or write the part you know and leave the rest out. A guess in a note is
|
|
71
|
+
indistinguishable from a fact the next time it is recalled, and it will be
|
|
72
|
+
recalled long after anyone remembers it was a guess.
|
|
73
|
+
|
|
74
|
+
**Recall first, then pick the verb.** If what you learned answers a note that
|
|
75
|
+
already exists, `revise` it. `remember` would leave two current notes on one
|
|
76
|
+
subject and the next recall returns both — the re-discovery problem the user was
|
|
77
|
+
trying to end. New subject → `remember`. Existing subject, now settled →
|
|
78
|
+
`revise`.
|
|
79
|
+
|
|
80
|
+
## Changing a conclusion
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
memgineering revise friday-review \
|
|
84
|
+
--claim "Fridays are for review. Nothing new goes out that day." \
|
|
85
|
+
--summary "no new work on Fridays"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
- `--action supersede` (default) — the conclusion CHANGED. Stamps `valid_from`
|
|
89
|
+
with now, because a replaced conclusion starts now.
|
|
90
|
+
- `--action reinforce` — same conclusion, new support. Leaves `valid_from` alone.
|
|
91
|
+
- `--action conflict` — two notes DISAGREE. Records the edge, leaves both
|
|
92
|
+
standing, deliberately does not write the claim you passed.
|
|
93
|
+
- `--dry-run` shows the diff and writes nothing.
|
|
94
|
+
|
|
95
|
+
Pick by what changed, not by habit: `supersede` on a fact that was true all
|
|
96
|
+
along dates it from today, and the date is the field this exists to get right.
|
|
97
|
+
|
|
98
|
+
**Re-recording something unchanged is refused** — otherwise a user repeating
|
|
99
|
+
themselves becomes ledger entries recording no change. When you do mean "this
|
|
100
|
+
still holds", say what confirms it: `--action reinforce --reason "<what confirms
|
|
101
|
+
it>"`.
|
|
102
|
+
|
|
103
|
+
This rewrites only the memory block in frontmatter. The prose is the user's;
|
|
104
|
+
neither the command nor you should rewrite it uninvited.
|
|
105
|
+
|
|
106
|
+
## Retiring versus excluding
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
memgineering retire <ref> --reason "the date moved" # no longer current, still visible
|
|
110
|
+
memgineering exclude path/to/note.md --reason "it has someone's phone number in it" # stop reading it
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Retiring keeps the note in recall, ranked last and labelled. Excluding takes it
|
|
114
|
+
out of the index and never touches the file. If the user says "delete", ask
|
|
115
|
+
which they mean.
|
|
116
|
+
|
|
117
|
+
## Filling in the base files, which only you can do
|
|
118
|
+
|
|
119
|
+
`init` leaves five files in `01_BASE/` as templates, because what goes in them
|
|
120
|
+
cannot be typed into a form. `resurface` puts them at the top of every session,
|
|
121
|
+
so an empty one costs something every time.
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
memgineering onboard
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Says which are still untouched and what to ask for each. Run it first rather
|
|
128
|
+
than working from a script — asking somebody a question they already answered is
|
|
129
|
+
its own kind of forgetting. They may also ask outright ("set up my memory", "fill in my profile"); same job.
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
01_BASE/USER.md who they are, what they work on, what they are trying to do
|
|
133
|
+
01_BASE/PREFERENCES.md how they like answers, code, decisions — length, tone, checking in
|
|
134
|
+
01_BASE/BOUNDARIES.md what you must ask before doing. The one they will regret not saying
|
|
135
|
+
01_BASE/CRITICAL_FACTS.md what is expensive to get wrong — money, data, other people
|
|
136
|
+
01_BASE/TOOLING.md the apps, machines and commands they actually use
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**How to ask.** One question at a time, in their words, and stop when the answers
|
|
140
|
+
thin out — three good lines beat a filled-in template. Take what they say in
|
|
141
|
+
passing during ordinary work too; most of `TOOLING.md` gets written by noticing.
|
|
142
|
+
|
|
143
|
+
**How to write it — both halves.** `revise` only touches frontmatter, so write
|
|
144
|
+
the body FIRST with your normal file tools, replacing the template's prompt with
|
|
145
|
+
what they actually said, then record the conclusion:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
memgineering revise 01_BASE/USER.md \
|
|
149
|
+
--action reinforce \
|
|
150
|
+
--claim "<one line: who they are>" \
|
|
151
|
+
--summary "<the line recall should show>"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
A claim written above an untouched template leaves the file reading as a
|
|
155
|
+
half-filled form; `revise` warns when you do this, and the warning means go back
|
|
156
|
+
and write the body. `--action reinforce`, not the default: these facts were
|
|
157
|
+
always true and you have only just been told them, so dating them today is wrong
|
|
158
|
+
in the one field a memory store exists to get right.
|
|
159
|
+
|
|
160
|
+
**This is the ONE place you edit a brain file directly** — `01_BASE/` only, and
|
|
161
|
+
only while it is still the template. After that first pass these are theirs like
|
|
162
|
+
any other note.
|
|
163
|
+
|
|
164
|
+
**Do not invent an answer to move on, and do not fill a file because it is
|
|
165
|
+
empty.** `BOUNDARIES.md` guessed at is worse than blank: the next agent reads it
|
|
166
|
+
as something the user said.
|
|
167
|
+
|
|
168
|
+
## What to raise with the user
|
|
169
|
+
|
|
170
|
+
The tool does not ask; you decide. Say something, once and plainly, when the
|
|
171
|
+
output marks the target `⚠ critical target` (that is `01_BASE/`), when you are
|
|
172
|
+
recording something said in passing that may be sensitive, or when what you
|
|
173
|
+
learned contradicts a memory currently marked current. Everything else: do it,
|
|
174
|
+
and mention it in a sentence.
|
|
175
|
+
|
|
176
|
+
## Rules
|
|
177
|
+
|
|
178
|
+
- **Never edit brain files with Read/Write/Edit**, except the one case above.
|
|
179
|
+
Only the CLI records the change and keeps `undo` working.
|
|
180
|
+
- **Their notes are theirs.** Prose is never rewritten by this tool, and should
|
|
181
|
+
not be rewritten by you without being asked.
|
|
182
|
+
- **Store full ids, not short handles**, anywhere durable. `open` prints the
|
|
183
|
+
full `id:` for exactly this.
|
package/bin/memgineering.js
CHANGED
|
File without changes
|