memgineering 0.23.1 → 0.24.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,60 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.24.0] — 2026-09-12
15
+
16
+ ### Added
17
+
18
+ - **`memgineering rescope <ref>` changes which project a memory binds in.**
19
+ `scope` decides which of the two rule budgets a decision is drawn from — it
20
+ is the field that answers "does this bind me here" — and nothing could write
21
+ it. Moving one meant `supersede`, which retires the loser, so folding a
22
+ project-scoped rule into an unscoped one would have made the rule vanish
23
+ everywhere except the project it was scoped to.
24
+ Two flags, deliberately: `--scope <project>` narrows or moves,`--global`
25
+ widens. A rule that stops naming a project starts binding in every project,
26
+ and that is the change hardest to notice afterwards, so it is spelled rather
27
+ than being what happens when the scope is left off.
28
+ - **`memgineering expire <ref> --until <date>` gives a memory an end date, and
29
+ does not retire it.** Until that date it is current; after it, recall still
30
+ returns it — one step below what is current, and labelled. Recall has always
31
+ understood this; only the writer was missing. Reach for it when a memory was
32
+ always going to run out, rather than when a decision has been overtaken.
33
+ - **A hosted brain's rule list says how fresh each rule is** (`freshness` on
34
+ `POST /rules`), so an agent handed a rule whose end date has passed is told
35
+ so rather than reading it as current.
36
+
37
+ ### Fixed
38
+
39
+ - **Retiring a rule now stops it being pushed to agents on a hosted brain.**
40
+ The rule list filtered "is it marked as a rule" and nothing else, while the
41
+ local one has always dropped retired rules — putting a decision somebody
42
+ retired in front of an agent as binding is the tool arguing with them.
43
+ `retire` writes the status and leaves the marking alone, so nothing else
44
+ caught it: on a hosted brain, which is what a signed-in machine reads,
45
+ retiring a rule did not stop the before-edit hook showing it.
46
+ - **A date written into a note that states no claim is no longer ignored.**
47
+ Freshness read `valid_until` only off a stated claim, and most notes state
48
+ none — so an end date in such a note was read by nothing at all.
49
+ - **An upgrade now tells your agent that its guidance went stale.** The only
50
+ thing that ever said so was a `postinstall` script, and npm 12 blocks install
51
+ scripts by default — measured on 12.0.2, all it prints is `1 package had
52
+ install scripts blocked`, which does not say what the blocked script would
53
+ have said. So on that npm an upgrade left a new binary beside the hub and
54
+ skills an older release wrote, in `~/.claude`, `~/.codex` and `~/.gemini`,
55
+ and both halves reported success. The CLI now says it itself, before any
56
+ command, on a channel npm cannot block: run `memgineering setup` once and it
57
+ goes quiet. It stays out of `guard`, which runs on every file edit.
58
+
59
+ ### Agent guidance
60
+
61
+ `memgineering-rules` and `memgineering-writing` both changed: there are now
62
+ three ways a rule stops applying rather than two (`--no-rule`, `retire`,
63
+ `expire`), and `rescope` is how a rule moves between projects. **Restart your
64
+ agent session after upgrading** so the new guidance is loaded — or run
65
+ `memgineering setup`, which the CLI will now ask for by itself when the
66
+ installed guidance is older than the binary.
67
+
14
68
  ## [0.23.1] — 2026-09-11
15
69
 
16
70
  ### Fixed
@@ -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.23.1
5
+ version: 0.24.0
6
6
  ---
7
7
 
8
8
  # memgineering
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: memgineering-rules
3
- description: Use when the user settles something they expect to hold next time — a colour they will not use, a step never to skip, a way things get named here — or when you want to see what already binds you in this folder. A decision does not have to be announced as a rule to be one. Triggers include "from now on", "always", "never", "don't do that again", "let's go with X from here", "we always do it this way", "what rules do I have". Covers remember --rule, rules, and what the before-edit hook shows.
3
+ description: Use when the user settles something they expect to hold next time — a colour they will not use, a step never to skip, a way things get named here — or when you want to see what already binds you in this folder. A decision does not have to be announced as a rule to be one. Triggers include "from now on", "always", "never", "don't do that again", "let's go with X from here", "we always do it this way", "what rules do I have" — and, for moving one, "that should apply everywhere", "not just this project", "all my projects", "only in this repo from now on". Covers remember --rule, rules, rescope, and what the before-edit hook shows.
4
4
  type: skill
5
5
  allowed-tools: Bash(memgineering:*)
6
6
  ---
@@ -150,12 +150,23 @@ Two consequences worth knowing before you mark things:
150
150
  are why they no longer can: a rule scoped to the project has its own room and
151
151
  cannot lose every slot to whatever the user has been reaching for lately. It
152
152
  still pays to keep the standing set small — ten is what a session reads.
153
- - **Two ways out, and they are not the same.** `memgineering revise <ref>
153
+ - **Three ways out, and they are not the same.** `memgineering revise <ref>
154
154
  --no-rule --reason "…"` says it was never a rule: it stops being shown before
155
155
  an edit, and stays a perfectly ordinary current memory that recall returns.
156
156
  `memgineering retire <ref>` says it no longer holds: it stops binding AND
157
- drops to the bottom of recall, labelled. Reach for the first when the marking
158
- was the mistake and the second when the decision has been overtaken.
157
+ drops to the bottom of recall, labelled. `memgineering expire <ref> --until
158
+ <date>` says it held until then: it KEEPS binding and recall keeps returning
159
+ it, ranked below what is current and labelled from that date. Reach for the
160
+ first when the marking was the mistake, the second when the decision has been
161
+ overtaken, and the third when it was always going to run out.
162
+ - **`memgineering rescope <ref>` changes WHERE a rule binds, not whether it
163
+ does.** `--scope <project>` binds it in that project alone — agents working
164
+ anywhere else stop being shown it. `--global` binds it everywhere, which is
165
+ the change hardest to notice afterwards, so it has a flag of its own rather
166
+ than being what happens when you leave the scope off. Nothing the note says
167
+ changes either way, and `memgineering undo` reverses it.
168
+ Ask before widening: a rule the user wrote about one repository, made global,
169
+ arrives in every session they open.
159
170
  - **`--no-rule` on its own asks for nothing else.** No claim, no summary — the
160
171
  conclusion, the summary and the title come back byte for byte, which is the
161
172
  whole reason it exists. It used to go through `revise`, which requires a
@@ -1,6 +1,6 @@
1
1
  ---
2
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, when the brain has filled up with near-duplicates that want tidying, 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", "clean up my notes", "these two say the same thing", "is this a duplicate", "move my memories over", "bring my notes from the other tool", "don't save that", "never store that". Covers remember, revise, undo, log, retire, exclude, onboard, the consolidate/propose/approve flow, carrying facts in from another store, storage boundaries, and what to say before 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, when the brain has filled up with near-duplicates that want tidying, 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", "clean up my notes", "these two say the same thing", "is this a duplicate", "move my memories over", "bring my notes from the other tool", "don't save that", "never store that", "that's only true until <date>", "it stops being true after", "don't tell me that forever". Covers remember, revise, undo, log, retire, expire, exclude, onboard, the consolidate/propose/approve flow, carrying facts in from another store, storage boundaries, and what to say before writing.
4
4
  type: skill
5
5
  allowed-tools: Bash(memgineering:*)
6
6
  ---
@@ -203,17 +203,26 @@ it>"`.
203
203
  This rewrites only the memory block in frontmatter. The prose is the user's;
204
204
  neither the command nor you should rewrite it uninvited.
205
205
 
206
- ## Retiring versus excluding
206
+ ## Retiring versus expiring versus excluding
207
207
 
208
208
  ```
209
209
  memgineering retire <ref> --reason "the date moved" # no longer current, still visible
210
+ memgineering expire <ref> --until 2026-10-31 --reason "the phase ends then" # NOT retired
210
211
  memgineering exclude path/to/note.md --reason "it has someone's phone number in it" # stop reading it
211
212
  memgineering retract --actor "mcp:ChatGPT" --since 2026-09-01 # SHOWS what one writer / window wrote
212
213
  memgineering retract --actor "mcp:ChatGPT" --since 2026-09-01 --yes # retires all of it, one ledger row each
213
214
  ```
214
215
 
215
216
  Retiring keeps the note in recall, ranked last and labelled. Excluding takes it
216
- out of the index and never touches the file. If the user says "delete", ask
217
+ out of the index and never touches the file.
218
+
219
+ **`expire` is not a retirement, and the difference only shows up later.** It
220
+ gives a memory an end date: until then it is current, and after it recall still
221
+ returns it — one step below what is current, labelled with the date. Reach for
222
+ it when the memory was always going to run out ("Phase 1 lands by the end of
223
+ October", a key that rotates, a plan with a deadline in it) rather than when a
224
+ decision has been overtaken. Retiring such a note says something untrue about
225
+ it; leaving it says something untrue too. If the user says "delete", ask
217
226
  which they mean.
218
227
 
219
228
  ## Tidying up a brain: detect, draft, approve