memgineering 0.2.0 → 0.3.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 +177 -3
- package/NOTICE +2 -2
- package/assets/MEMGINEERING.md +15 -0
- package/assets/memgineering-memory/SKILL.md +62 -1
- package/assets/memgineering-setup/SKILL.md +26 -1
- package/dist/index.js +5121 -3026
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,181 @@ language the reader wants. The bilingual rule the monorepo applies to
|
|
|
11
11
|
|
|
12
12
|
## [Unreleased]
|
|
13
13
|
|
|
14
|
+
## [0.3.0] — 2026-08-10
|
|
15
|
+
|
|
16
|
+
Recall says how old a memory is and why two of them disagree; a screen for
|
|
17
|
+
people who did not come here for flags; and seven places the tool was doing
|
|
18
|
+
something other than what it said.
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- **Cards carry an age.** `recall` prints `stated · 3 days ago`, and `--json`
|
|
23
|
+
carries `age_days`. Deciding whether to revise a memory or write a new one is
|
|
24
|
+
a recency judgement, and the card was missing the field that decides it.
|
|
25
|
+
- **Contradictions you can act on.** When two memories disagree, the block now
|
|
26
|
+
gives each side's date and quotes the reason recorded for its last change,
|
|
27
|
+
and names `retire` as the way to settle it. Previously it said only that they
|
|
28
|
+
disagreed, which left the reader to go and find out why.
|
|
29
|
+
- **`revise --title`.** `recall` renders the title as a card's heading, so a
|
|
30
|
+
superseded conclusion used to go on asserting itself in every heading while
|
|
31
|
+
the summary underneath said otherwise.
|
|
32
|
+
- **A warning when the prose stops agreeing with the conclusion.** After a
|
|
33
|
+
supersede, if the note's body still states the claim that was just replaced,
|
|
34
|
+
`revise` says so. It does not touch the body — that is yours — but an
|
|
35
|
+
invisible contradiction inside one note is worse than a visible one.
|
|
36
|
+
- **`setup --web` — setting it up on a screen, for someone who has never opened
|
|
37
|
+
a terminal.** The browser is asked one question at a time: which agents share
|
|
38
|
+
the memory, whether the tool keeps itself updated, whether note summaries are
|
|
39
|
+
handed to every new session, and which folder holds the notes. The folder step
|
|
40
|
+
shows what `link` shows — how many notes would be indexed, which files are
|
|
41
|
+
refused and why, with samples of the exact lines that would be stored — before
|
|
42
|
+
anything is read. Applying calls the same installer the flags do, so both doors
|
|
43
|
+
leave the same files behind. The page is self-contained and served on
|
|
44
|
+
`127.0.0.1` with a one-time key in its URL; it opens the browser itself
|
|
45
|
+
(`--print-url` where there is none) and closes when the setup is applied or
|
|
46
|
+
after ten idle minutes.
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
|
|
50
|
+
- **One note could stop the tool for minutes.** The credential scanner's
|
|
51
|
+
short-secret pattern backtracked cubically on text that matched a label and
|
|
52
|
+
then failed at the digits: 200 spaces cost 12ms, 800 cost 279ms, 1,600 cost
|
|
53
|
+
2.2 seconds — against a 20,000-character field. Bounded now, and flat: the
|
|
54
|
+
same input takes 0.01ms at 20,000 characters, with every short-secret shape
|
|
55
|
+
still detected and no new false positives.
|
|
56
|
+
- **`undo` could delete a note you did not name.** It resolved an operation id
|
|
57
|
+
by unchecked prefix and took the oldest match, so `undo 6` removed the oldest
|
|
58
|
+
note whose id began with a six and reported success. It now requires the same
|
|
59
|
+
five-character minimum `open` does and names the candidates when a prefix is
|
|
60
|
+
ambiguous.
|
|
61
|
+
- **`undo` on a damaged ledger reversed the wrong operation.** A line lost to an
|
|
62
|
+
interrupted write is normally the newest one, so "the last change" stops being
|
|
63
|
+
answerable — and a bare `undo` was then taking the change before it. It
|
|
64
|
+
refuses now and points at `log`; `undo <op_id>` still works, because that
|
|
65
|
+
record parsed and you said which one you meant.
|
|
66
|
+
- **`revise --action conflict` said "Revised" and wrote nothing.** Recording a
|
|
67
|
+
disagreement deliberately does not overwrite either conclusion, but reporting
|
|
68
|
+
a revision while discarding the claim you passed is the tool telling you
|
|
69
|
+
something untrue about your own brain. It now says what it did, says the claim
|
|
70
|
+
was not written, and names `--action supersede` for the other case.
|
|
71
|
+
- **Every read re-checked the same directories, once per note.** Resolving a
|
|
72
|
+
path refuses symlinks by walking it component by component, and in a brain
|
|
73
|
+
whose notes sit under `20_TIMELINE/observations/2026-08/` three of every four
|
|
74
|
+
checks were re-asking about the same three directories: 659ms per command at
|
|
75
|
+
twelve thousand notes, against 220ms for the identical guarantee. Directories
|
|
76
|
+
cleared during one command are not re-checked during that command; the memo
|
|
77
|
+
dies with the command, and the final component — the one the answer is about —
|
|
78
|
+
is always checked.
|
|
79
|
+
- **`resurface` presented `init`'s own boilerplate as something you had
|
|
80
|
+
written.** A base file nobody has filled in still carries the summary `init`
|
|
81
|
+
gave it — so a fresh brain answered "what should you already know here" with
|
|
82
|
+
"Tooling · recalled 14× in this folder · The tools, machines and commands I
|
|
83
|
+
actually use", for a file whose body is one empty bullet. It still surfaces,
|
|
84
|
+
because an unfilled base file is the most worth raising, but it is labelled
|
|
85
|
+
`not filled in yet` and says the line is a prompt. Judged by comparing the
|
|
86
|
+
file byte-for-byte against what `init` wrote: an exact match cannot be a false
|
|
87
|
+
positive, and the moment somebody touches the file it goes back to being their
|
|
88
|
+
note.
|
|
89
|
+
- **`revise` moved a memory's start date every time it ran.** `valid_from` is
|
|
90
|
+
when the fact became true, and it was being written as an edit timestamp — so
|
|
91
|
+
`reinforce`, whose whole job is "same conclusion, better support", walked the
|
|
92
|
+
date forward on every use. A tester added a reason to a memory and watched its
|
|
93
|
+
start date land a day after the thing it describes. `supersede` still stamps
|
|
94
|
+
now, because a replaced conclusion does start now; `reinforce` and `conflict`
|
|
95
|
+
leave it alone, and the new `--valid-from` sets it when the caller knows the
|
|
96
|
+
real date.
|
|
97
|
+
- **The contradiction footer told you to retire a side you had already
|
|
98
|
+
retired.** Two testers hit it independently: retire, run recall, and be
|
|
99
|
+
advised to retire. The disagreement is still shown — both notes are still in
|
|
100
|
+
the brain — but when every side is settled the footer says so.
|
|
101
|
+
- **The rules file written into your notes folder was in Korean.** Every other
|
|
102
|
+
string this tool emits is English on the theory that an agent re-renders for
|
|
103
|
+
its reader — but this one is a document left on disk among somebody's own
|
|
104
|
+
notes, with no agent standing between it and whoever opens it. It also still
|
|
105
|
+
called the tool Kordis.
|
|
106
|
+
- **`stated` was glossed as something it does not mean.** It reports that a
|
|
107
|
+
card's fields came from the note rather than from inference, which is why a
|
|
108
|
+
note carrying a `memgineering:` block but no claim is `stated` — and `open`
|
|
109
|
+
then printed `stated` in its header and "nothing here states a conclusion"
|
|
110
|
+
two lines below. Both sentences were right; the gloss was describing the
|
|
111
|
+
wrong thing, and now says "these fields came from the note".
|
|
112
|
+
- **`log` blamed an external edit it could not have known about.** Divergence
|
|
113
|
+
has more than one cause — an editor, or a write whose ledger entry never
|
|
114
|
+
landed — and the message asserted the first as fact.
|
|
115
|
+
- **A brain whose folder was deleted made every command ambiguous, forever.**
|
|
116
|
+
The linked list is written by `link` and was never re-checked, so one gone
|
|
117
|
+
path — a scratch folder, a moved vault — meant every verb refused until
|
|
118
|
+
somebody found and unlinked it. Missing folders no longer count toward
|
|
119
|
+
ambiguity, are listed as `(missing)` when it still is ambiguous, and are not
|
|
120
|
+
removed from the config: a folder that is absent today may be an unmounted
|
|
121
|
+
disk tomorrow.
|
|
122
|
+
- **`use` with no argument threw instead of answering.** It is the command you
|
|
123
|
+
run to find out why the others are refusing, and it was refusing the same
|
|
124
|
+
way. It now describes the situation, including when nothing resolves.
|
|
125
|
+
- **The `undo` line printed after a write can be pasted and run.** It carries
|
|
126
|
+
`--vault` when the command was given one — a tester copied it verbatim and
|
|
127
|
+
got "2 brains are linked, so this is ambiguous", from a process that knew
|
|
128
|
+
which brain it had just written to one line earlier.
|
|
129
|
+
- **`log` read the whole brain to print twenty lines.** Checking whether notes
|
|
130
|
+
still match the ledger was run over the entire history rather than the rows
|
|
131
|
+
being shown: 161ms at a hundred operations, 5.7 seconds at twenty thousand,
|
|
132
|
+
and worse with every use. Scoped to what is displayed, and the footer now says
|
|
133
|
+
"N of these 20" rather than a brain-wide count it did not pay for.
|
|
134
|
+
- **A reason attached to an undone operation was still being quoted.** `recall`
|
|
135
|
+
and `evidence` would explain a change the note no longer contains.
|
|
136
|
+
- **The `stated` gloss appeared under cards that did not say `stated`.**
|
|
137
|
+
Defining a word the card does not carry teaches the reader something false
|
|
138
|
+
about what they are looking at.
|
|
139
|
+
|
|
140
|
+
### Changed
|
|
141
|
+
|
|
142
|
+
- `remember`'s two ids are labelled — `note:` and `undo:` — because a tester
|
|
143
|
+
tried the note id with `undo`.
|
|
144
|
+
- A bare `undo` now reports what it reversed and when, and cautions when that
|
|
145
|
+
operation is more than ten minutes old. With another agent or a session hook
|
|
146
|
+
writing to the same brain, "the last change" is not necessarily yours.
|
|
147
|
+
|
|
148
|
+
- **`memgineering onboard`** — what to ask so the brain knows who it belongs to.
|
|
149
|
+
It does not run the conversation, and that is the design: a CLI cannot ask
|
|
150
|
+
"what should I never do without asking you first" and understand the answer,
|
|
151
|
+
but the agent reading this output can. So it returns the work — which of the
|
|
152
|
+
five base files are still exactly what `init` wrote, what each is for, and
|
|
153
|
+
where to start asking — and reports that there is nothing to do once they are
|
|
154
|
+
written.
|
|
155
|
+
- **`init` now hands the base files to the agent instead of the user.** It used
|
|
156
|
+
to close with "Start by filling in 01_BASE/USER.md", which is homework nobody
|
|
157
|
+
does — and what goes in those files (who they are, how they want answers,
|
|
158
|
+
what to ask before doing) cannot be typed into a form. It comes out of a
|
|
159
|
+
conversation, so `init` asks the agent to have one, and the skill carries the
|
|
160
|
+
questions.
|
|
161
|
+
|
|
162
|
+
### Agent guidance
|
|
163
|
+
|
|
164
|
+
- `memgineering-memory` covers reading a card's age and the contradiction block,
|
|
165
|
+
and asks for `--reason` on every write.
|
|
166
|
+
- `memgineering-memory` also covers filling in `01_BASE/` — the questions, how
|
|
167
|
+
to ask them, and the one narrow case where writing a brain file directly is
|
|
168
|
+
the right move.
|
|
169
|
+
- `memgineering-setup` covers `--web`: when to put a screen in front of a person
|
|
170
|
+
rather than answer setup's flags for them, and that the command does not
|
|
171
|
+
return until they have finished with it.
|
|
172
|
+
|
|
173
|
+
**Restart your agent session after upgrading** so the updated skills load.
|
|
174
|
+
|
|
175
|
+
## [0.2.1] — 2026-08-09
|
|
176
|
+
|
|
177
|
+
### Fixed
|
|
178
|
+
|
|
179
|
+
- **The language warning no longer fires on a query that worked.** On a brain
|
|
180
|
+
holding notes in more than one language, `recall "배포"` returned the Korean
|
|
181
|
+
note it was looking for and was told, above the result, that the query could
|
|
182
|
+
not reach the brain. A query that reached a note you wrote reached the brain,
|
|
183
|
+
whatever script it was in. It now stays quiet in that case, and still speaks
|
|
184
|
+
when everything that came back was `01_BASE/` scaffolding — which `init`
|
|
185
|
+
writes in English for everybody, so matching it is not evidence the query
|
|
186
|
+
landed. Found by using 0.2.0 against a real brain; a single-language fixture
|
|
187
|
+
could not produce it.
|
|
188
|
+
|
|
14
189
|
## [0.2.0] — 2026-08-09
|
|
15
190
|
|
|
16
191
|
The record can say why, and you can see what a memory is actually worth.
|
|
@@ -46,9 +221,8 @@ The record can say why, and you can see what a memory is actually worth.
|
|
|
46
221
|
however it is worded — and the old zero-result footer suggested broader
|
|
47
222
|
wording, the one remedy that cannot work. Four testers hit this and came
|
|
48
223
|
within one command of telling their user the brain held nothing on a subject
|
|
49
|
-
it had notes about.
|
|
50
|
-
|
|
51
|
-
and look like an answer.
|
|
224
|
+
it had notes about. It appears above results too, since the failure is rarely
|
|
225
|
+
a clean zero: a couple of scaffolding notes match and look like an answer.
|
|
52
226
|
- **`use` with no argument now says which brain you are on**, and how it
|
|
53
227
|
resolved — by pointer, by containment, or by being the only one linked. Its
|
|
54
228
|
own help had always promised this; it reported only whether a pointer file
|
package/NOTICE
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
memgineering
|
|
2
|
-
Copyright 2026
|
|
2
|
+
Copyright 2026 Chang Do Geon ("Rayul", 장도건)
|
|
3
3
|
|
|
4
|
-
This product includes software developed
|
|
4
|
+
This product includes software developed for memgineering
|
|
5
5
|
(https://memgineering.com).
|
|
6
6
|
|
|
7
7
|
Licensed under the Apache License, Version 2.0. See LICENSE for the full
|
package/assets/MEMGINEERING.md
CHANGED
|
@@ -26,6 +26,21 @@ No query — it ranks by what has been recalled here before, how recently, and
|
|
|
26
26
|
which of their core notes have gone unread. It is the answer to a vague
|
|
27
27
|
question that recall cannot serve, because there is nothing to search for yet.
|
|
28
28
|
|
|
29
|
+
**Fill in their base files when they are still empty.** `init` leaves five
|
|
30
|
+
files in `01_BASE/` as templates, and `resurface` marks an untouched one
|
|
31
|
+
`not filled in yet`. What goes in them — who they are, how they want answers,
|
|
32
|
+
what to ask before doing — only comes out of a conversation, and every session
|
|
33
|
+
starts from zero until it exists. Offer once, ask one question at a time; the
|
|
34
|
+
`memgineering-memory` skill has the questions and how to write the answers.
|
|
35
|
+
They can also ask for it directly — "set up my memory", "내 정보 채워줘" — and
|
|
36
|
+
that is the same job.
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
memgineering onboard
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Says which are still untouched and what to ask for each.
|
|
43
|
+
|
|
29
44
|
**Recall before answering** anything that sounds like it was settled before:
|
|
30
45
|
|
|
31
46
|
- "what did we decide about…", "how do I deploy this again", "왜 이렇게 했더라"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: memgineering-memory
|
|
3
|
-
description: Use when the user asks about something they told you before, refers to a past decision, wants their own notes searched,
|
|
3
|
+
description: Use when the user asks about something they told you before, refers to a past decision, wants their own notes searched, says something worth keeping, or wants their memory set up so it knows who they are. Triggers include "what did I decide about X", "check my notes", "how do we deploy again", "remember this", "is this still true", "which one do I go with", "set up my memory", "fill in my profile", "teach it about me", "예전에 뭐라고 정했더라", "내 노트에서 찾아줘", "이거 기억해둬", "내 정보 채워줘", "나에 대해 알려줘", "what do you know about my setup". Covers recall, open, evidence, remember, revise, undo, resurface, and filling in the `01_BASE/` files by asking.
|
|
4
4
|
type: skill
|
|
5
5
|
allowed-tools: Bash(memgineering:*)
|
|
6
6
|
---
|
|
@@ -74,6 +74,67 @@ Say so. Only titles, aliases and summaries are searched, so suggest broader
|
|
|
74
74
|
words — but do not go read their folder yourself to compensate. A brain that
|
|
75
75
|
answers "nothing" is giving you real information.
|
|
76
76
|
|
|
77
|
+
## Filling in the base files, which only you can do
|
|
78
|
+
|
|
79
|
+
`init` creates five files in `01_BASE/` and leaves them empty, because what
|
|
80
|
+
goes in them cannot be typed into a form. Who the user is, how they want
|
|
81
|
+
answers, what you must ask before doing, what would be expensive to get wrong,
|
|
82
|
+
what they actually run — those come out of a conversation.
|
|
83
|
+
|
|
84
|
+
They matter more than any single memory: `resurface` puts these at the top of a
|
|
85
|
+
new session, and an empty one teaches the next agent nothing. A brain whose
|
|
86
|
+
base is untouched is a brain that starts every session from zero.
|
|
87
|
+
|
|
88
|
+
**Offer once, at the natural moment** — right after `init`, or the first time
|
|
89
|
+
`resurface` marks one `not filled in yet`.
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
memgineering onboard
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Says which of the five are still untouched and what to ask for each. Run it
|
|
96
|
+
first rather than working from the list below; it knows what has already been
|
|
97
|
+
done, and asking somebody a question they have answered is its own kind of
|
|
98
|
+
forgetting. Then follow their answers rather than the script.
|
|
99
|
+
|
|
100
|
+
They may also ask for it outright — "set up my memory", "fill in my profile",
|
|
101
|
+
"내 정보 채워줘". Same job, and it is the only entry point that works when you
|
|
102
|
+
did not offer.
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
01_BASE/USER.md who they are, what they work on, what they are trying to do
|
|
106
|
+
01_BASE/PREFERENCES.md how they like answers, code, decisions — length, tone, how much checking in
|
|
107
|
+
01_BASE/BOUNDARIES.md what you must ask before doing. The one they will regret not saying
|
|
108
|
+
01_BASE/CRITICAL_FACTS.md what is expensive to get wrong — deploy, money, data, people
|
|
109
|
+
01_BASE/TOOLING.md editors, languages, machines, the commands they actually run
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**How to ask.** One question at a time, in their words, and stop when the
|
|
113
|
+
answers thin out — three good lines beat a filled-in template. Take what they
|
|
114
|
+
say in passing during ordinary work too; most of `TOOLING.md` gets written by
|
|
115
|
+
noticing, not by asking.
|
|
116
|
+
|
|
117
|
+
**How to write it.** These files' bodies are prose, and `revise` only touches
|
|
118
|
+
frontmatter — so write the body with your normal file tools, then set the
|
|
119
|
+
summary so recall shows the real thing rather than the prompt:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
memgineering revise 01_BASE/USER.md \
|
|
123
|
+
--action reinforce \
|
|
124
|
+
--claim "<one line: who they are>" \
|
|
125
|
+
--summary "<the line recall should show>"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
This is the ONE place you edit a brain file directly, and the boundary is
|
|
129
|
+
narrow: `01_BASE/` only, and only while the file is still the template `init`
|
|
130
|
+
wrote. Nothing is lost — there is no history to break and nothing to undo — and
|
|
131
|
+
after that first pass these files are theirs like any other note, changed
|
|
132
|
+
through `revise` and never behind their back.
|
|
133
|
+
|
|
134
|
+
**What not to do.** Do not invent an answer to move on, and do not fill a file
|
|
135
|
+
because it is empty. `BOUNDARIES.md` guessed at is worse than blank: the next
|
|
136
|
+
agent will read it as something the user said.
|
|
137
|
+
|
|
77
138
|
## Deciding which one to trust
|
|
78
139
|
|
|
79
140
|
When two memories disagree, or one looks old enough to doubt, do not settle it
|
|
@@ -40,7 +40,32 @@ updates itself. Recommend `on` — old versions can lose access to hosted
|
|
|
40
40
|
features later — but it is theirs to decide.
|
|
41
41
|
|
|
42
42
|
If the user would rather click than type, `memgineering setup --human` gives
|
|
43
|
-
them a checkbox screen. Run it and let them drive; do not
|
|
43
|
+
them a checkbox screen in your terminal. Run it and let them drive; do not
|
|
44
|
+
answer for them.
|
|
45
|
+
|
|
46
|
+
### When a person needs a screen, not flags
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
memgineering setup --web
|
|
50
|
+
memgineering setup --web --print-url # no browser here — hand over the link
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`--web` opens a page in their own browser and asks the same questions there,
|
|
54
|
+
one at a time, in plain language. Reach for it when the user is not reading
|
|
55
|
+
your terminal at all — they have never opened one, or they are the one who has
|
|
56
|
+
to decide and a checkbox screen you are driving is not where they can.
|
|
57
|
+
|
|
58
|
+
It covers step 2 as well: the page offers the notes folders it finds on the
|
|
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.
|
|
44
69
|
|
|
45
70
|
**After setup, the agent session has to restart** for the guidance to load.
|
|
46
71
|
Say so — the user will otherwise wonder why nothing changed.
|