memoryintel 1.1.3 → 1.1.4

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.
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Persistent, cross-session project memory for AI coding agents.",
9
- "version": "1.1.3"
9
+ "version": "1.1.4"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "memoryintel",
14
14
  "source": "./",
15
15
  "description": "Persistent project memory for AI coding agents — initialize once, then agents automatically load and update project understanding across sessions.",
16
- "version": "1.1.3"
16
+ "version": "1.1.4"
17
17
  }
18
18
  ]
19
19
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "memoryintel",
3
3
  "description": "Persistent project memory for AI coding agents — initialize once, then agents automatically load and update project understanding across sessions.",
4
- "version": "1.1.3",
4
+ "version": "1.1.4",
5
5
  "author": {
6
6
  "name": "Adeesh Sharma",
7
7
  "url": "https://github.com/adeeshsharma"
package/README.md CHANGED
@@ -13,6 +13,13 @@ This repository is itself running Memory Intel on itself — see `.memoryintel/`
13
13
  current state, decisions, and open todo items. Any agent with the skill below active will read it
14
14
  automatically.
15
15
 
16
+ ![Memory Intel's dashboard: a registry of projects and one project's mental model](assets/dashboard-demo.gif)
17
+
18
+ *The local dashboard (`memoryintel dashboard enable`) — a read-only view of every initialized
19
+ project on the machine. Demo data shown above; captured against the real running server, not
20
+ mocked up. [Watch the full tour (mp4)](assets/dashboard-demo.mp4) for automation status, session
21
+ activity, and the event timeline too.*
22
+
16
23
  ## Quick Start
17
24
 
18
25
  ```bash
@@ -88,7 +95,9 @@ depend on the agent noticing anything.
88
95
  ### If you don't want to touch Claude Code's plugin system at all
89
96
 
90
97
  The CLI works standalone, with no plugin/skill/hook involved — useful for scripting, for other
91
- tools, or just to try it out:
98
+ tools, or just to try it out. This is exactly what a `SessionStart`/`Stop` hook runs for you
99
+ automatically when a plugin is active — shown here run by hand so you can see what actually
100
+ happens under the hood:
92
101
 
93
102
  ```bash
94
103
  memoryintel init # once per project — scaffolds .memoryintel/, installs pointer files
@@ -97,6 +106,13 @@ memoryintel load # print resolved context to stdout
97
106
  memoryintel update plan.toon # apply an update-plan
98
107
  ```
99
108
 
109
+ ![Terminal walkthrough: memoryintel init, then load printing an empty scaffold](assets/cli-walkthrough.gif)
110
+
111
+ *`init` → `load` → draft a real update-plan → `update` → `load` again, now auto-carrying the
112
+ domain the update just touched. Every command above actually ran; nothing is a typed-out
113
+ transcript. [Watch the full walkthrough (mp4)](assets/cli-walkthrough.mp4) for the update-plan and
114
+ the auto-carry-domain payoff.*
115
+
100
116
  `memoryintel init` never touches a project's own `.claude/settings.json` — Claude Code automation
101
117
  comes entirely from the plugin's own `hooks/hooks.json` in this repo, active once the plugin
102
118
  itself is active. From then on, agents load and update project memory on their own, per that
@@ -113,12 +129,68 @@ assumed default.
113
129
 
114
130
  ## How it works
115
131
 
132
+ ![Architecture diagram: a session starts and calls load(), which pulls context from .memoryintel/ (auto-carrying whichever domain the last update touched) into the agent; the agent works; update() writes back to .memoryintel/ as an atomic, per-file-locked write; the next session repeats the cycle](assets/architecture-flow.svg)
133
+
134
+ `.memoryintel/` is a structured, git-committed set of markdown/JSON files — the single source of
135
+ truth both directions in the diagram above read from and write to. At session start, `load()`
136
+ prints the always-loaded files plus whichever technical/business/research domain the most recent
137
+ `update()` actually touched (an explicit `--domain` still overrides). The agent works, then drafts
138
+ an update-plan and calls `update()`, which validates it, writes atomically under a per-file lock,
139
+ and logs the change — never a changelog, always a maintained understanding of the project as it
140
+ currently is.
141
+
116
142
  Full design docs live in `docs/superpowers/specs/`; a diagram-heavy architecture reference lives
117
- in `docs/architecture/memory-intel-architecture.html`. In short: `.memoryintel/` is a structured,
118
- git-committed set of markdown/JSON files an agent reads at session start and selectively updates
119
- when something meaningful changes — never a changelog, always a maintained understanding of the
120
- project as it currently is. See `.memoryintel/context/decisions.md` in this very repository for
121
- the specific design decisions behind that, with rationale.
143
+ in `docs/architecture/memory-intel-architecture.html`. See `.memoryintel/context/decisions.md` in
144
+ this very repository for the specific design decisions behind the mechanism above, with rationale.
145
+
146
+ ### What `memoryintel init` actually creates
147
+
148
+ Exactly this, and nothing else — every file below is real output from a fresh `memoryintel init`,
149
+ not a hand-typed example:
150
+
151
+ ```text
152
+ .memoryintel/
153
+ ├── instructions.md # what an agent reads every session — the mechanism, in full
154
+ ├── memory-config.json # compression ceiling overrides, generated-file hashes (for `doctor`)
155
+ ├── memory-index.json # lastUpdated + one-line summary per file, keyed by path
156
+ ├── memory-events.jsonl # append-only log: every load/update/compression, ever
157
+
158
+ ├── context/ # always loaded in full — no --domain needed
159
+ │ ├── currentMentalModel.md # whole-file replace only; the one narrative summary, not a log
160
+ │ ├── activeContext.md # what session-to-session work is focused on right now
161
+ │ ├── projectBrief.md # what the project is, for someone who's never seen it
162
+ │ ├── objectives.md # goals the project is actually working toward
163
+ │ ├── decisions.md # append-only decision log, with rationale
164
+ │ ├── progress.md # what's done, what's in flight
165
+ │ └── learnings.md # things worth not re-learning the hard way
166
+
167
+ ├── technical/ # a --domain: architecture, stack, patterns
168
+ │ ├── architecture.md
169
+ │ ├── techContext.md
170
+ │ ├── patterns.md
171
+ │ ├── integrations.md
172
+ │ └── infrastructure.md
173
+
174
+ ├── business/ # a --domain: product, roadmap, stakeholders
175
+ │ ├── productContext.md
176
+ │ ├── roadmap.md
177
+ │ ├── stakeholders.md
178
+ │ └── marketContext.md
179
+
180
+ └── research/ # a --domain: findings, open questions
181
+ ├── findings.md
182
+ ├── references.md
183
+ └── hypotheses.md
184
+
185
+ AGENTS.md # pointer file (or .cursor/rules/memoryintel.mdc, GEMINI.md) —
186
+ # tells tools with no native hook where instructions.md lives
187
+ ```
188
+
189
+ `context/` loads on every session automatically; `technical/`, `business/`, and `research/` are
190
+ domains — `load()` pulls in whichever one the most recent `update()` touched, or you can ask for
191
+ one explicitly (`memoryintel load --domain technical`). Every file starts as an empty, headed
192
+ scaffold; there's no separate "add a new memory type" step; you just write to any of the 19 files
193
+ above via an update-plan, same as any other.
122
194
 
123
195
  ## Existing projects (not greenfield)
124
196
 
@@ -201,7 +273,7 @@ cd memoryintel
201
273
  npm install
202
274
  npm run build # compiles dist/, regenerates skills/memoryintel/SKILL.md from src/skill.ts
203
275
  npm link # makes `memoryintel` resolve to this exact checkout instead of the published one
204
- npm test # 207 tests, vitest
276
+ npm test # 300 tests, vitest
205
277
  npm run build:skill:check # fails if skills/memoryintel/SKILL.md has drifted from src/skill.ts
206
278
  ```
207
279
 
@@ -56,15 +56,18 @@ function isWorkingTreeDirty(projectRoot) {
56
56
  return path !== '.memoryintel' && !path.startsWith('.memoryintel/');
57
57
  });
58
58
  }
59
+ // Claude Code's Stop hook JSON schema only recognizes decision: "block" - there is no "allow"
60
+ // value, so the non-blocking cases must return {} (decision omitted), not { decision: 'allow' },
61
+ // or Claude Code rejects the hook output outright ("Hook JSON output validation failed").
59
62
  export function runCheckStop(memoryRoot) {
60
63
  const projectRoot = dirname(memoryRoot);
61
64
  const markerPath = join(memoryRoot, '.session-marker.json');
62
65
  const marker = readMarker(markerPath);
63
66
  const signature = computeDiffSignature(projectRoot);
64
67
  if (signature === null)
65
- return { decision: 'allow' };
68
+ return {};
66
69
  if (signature === marker.lastFlaggedDiffSignature) {
67
- return { decision: 'allow' };
70
+ return {};
68
71
  }
69
72
  // A brand-new marker (nothing has ever been flagged or resolved in this project) with a
70
73
  // currently-clean working tree has nothing actionable to report - baseline silently so a
@@ -73,7 +76,7 @@ export function runCheckStop(memoryRoot) {
73
76
  // project's very first Stop event.
74
77
  if (marker.lastFlaggedDiffSignature === null && !isWorkingTreeDirty(projectRoot)) {
75
78
  writeMarker(markerPath, { lastFlaggedDiffSignature: signature });
76
- return { decision: 'allow' };
79
+ return {};
77
80
  }
78
81
  writeMarker(markerPath, { lastFlaggedDiffSignature: signature });
79
82
  return {
@@ -115,10 +115,12 @@ committed — not because updating was hard, but because nothing in the session
115
115
  before the worktree's job was considered done.
116
116
 
117
117
  ## Compaction
118
- A file marked \`status: over\` in \`load\`'s manifest has grown past its configured line ceiling.
119
- This is a signal, not a command compact it only when it's a sensible moment to (the same
120
- judgment you already apply to whether to update at all), by adding a row to your update-plan with
121
- one extra field, \`kind: compress\`, and \`action: replace\` against the section that's grown large.
118
+ A file marked \`status: over\` in \`load\`'s manifest has grown past its configured char ceiling
119
+ \`update\` also flags this itself, in the same call that pushes a file over, rather than waiting for
120
+ the next \`load\`. This is a signal, not a command compact it only when it's a sensible moment to
121
+ (the same judgment you already apply to whether to update at all), by adding a row to your
122
+ update-plan with one extra field, \`kind: compress\`, and \`action: replace\` against the section
123
+ that's grown large.
122
124
  \`update\` will only apply that row if the target file is currently git-clean — if it isn't, the row
123
125
  is rejected and the file is left untouched; commit the current state first, then retry. Aim to
124
126
  compact to comfortably under the ceiling, not exactly at it.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memoryintel",
3
- "version": "1.1.3",
3
+ "version": "1.1.4",
4
4
  "description": "Persistent, cross-session project memory for AI coding agents.",
5
5
  "type": "module",
6
6
  "bin": {