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.
|
|
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.
|
|
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.
|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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`.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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 #
|
|
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 {
|
|
68
|
+
return {};
|
|
66
69
|
if (signature === marker.lastFlaggedDiffSignature) {
|
|
67
|
-
return {
|
|
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 {
|
|
79
|
+
return {};
|
|
77
80
|
}
|
|
78
81
|
writeMarker(markerPath, { lastFlaggedDiffSignature: signature });
|
|
79
82
|
return {
|
package/dist/commands/init.js
CHANGED
|
@@ -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
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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.
|