hmem-mcp 7.2.4 → 7.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/README.md +3 -3
- package/dist/cli-checkpoint.js +33 -1
- package/dist/cli-checkpoint.js.map +1 -1
- package/dist/cli-hook-startup.js +34 -15
- package/dist/cli-hook-startup.js.map +1 -1
- package/dist/extensions/pi-hmem.d.ts +4 -0
- package/dist/extensions/pi-hmem.js +108 -0
- package/dist/extensions/pi-hmem.js.map +1 -0
- package/package.json +15 -1
- package/scripts/autoresearch-nightly.sh +1 -1
- package/skills/hmem-activate/SKILL.md +14 -0
- package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/with_skill/outputs/response.md +1 -1
- package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/without_skill/outputs/response.md +1 -1
- package/skills/hmem-context/SKILL.md +9 -0
- package/skills/hmem-search/SKILL.md +1 -1
- package/skills/hmem-session-start/SKILL.md +11 -1
- package/skills/hmem-sync-setup/SKILL.md +1 -1
- package/skills/hmem-using-hmem/SKILL.md +14 -1
package/README.md
CHANGED
|
@@ -16,13 +16,13 @@ You've tried workarounds — CLAUDE.md files, custom prompts, manually pasting c
|
|
|
16
16
|
|
|
17
17
|
```
|
|
18
18
|
You: "Load project hmem"
|
|
19
|
-
Agent: [calls load_project("P0048") —
|
|
19
|
+
Agent: [calls load_project("P0048") — 3000 tokens]
|
|
20
20
|
Agent: "Got it. v5.0.0, TypeScript/SQLite/npm, 10 source files,
|
|
21
21
|
3 open tasks, 9 ideas. Last session you implemented
|
|
22
22
|
auto-checkpoints via Haiku. What's next?"
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
That's it.
|
|
25
|
+
That's it. 3000 tokens for a complete project briefing. The agent knows the stack, the architecture, the open bugs, the recent decisions, and exactly where you left off — even if "you" was a different AI on a different machine yesterday.
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
@@ -103,7 +103,7 @@ Sessions are meaningless. Projects are everything.
|
|
|
103
103
|
| **H** | Human | `User Skill: TypeScript 9, Architecture 9, React 3` |
|
|
104
104
|
| **R** | Rule | `Max one npm publish per day — batch changes` |
|
|
105
105
|
| **O** | Original | Auto-recorded conversation history (every exchange, every device) |
|
|
106
|
-
| **I** | Infra | `Strato Server \| Active \| Linux \|
|
|
106
|
+
| **I** | Infra | `Strato Server \| Active \| Linux \| Ubuntu 22.04` |
|
|
107
107
|
|
|
108
108
|
---
|
|
109
109
|
|
package/dist/cli-checkpoint.js
CHANGED
|
@@ -90,6 +90,29 @@ export async function checkpoint() {
|
|
|
90
90
|
const batchExchanges = allExchanges.filter(ex => ex.nodeId.startsWith(batchId + "."));
|
|
91
91
|
if (batchExchanges.length < 2)
|
|
92
92
|
return;
|
|
93
|
+
// 3b. Find sessions that never got summarized (too short for a full batch)
|
|
94
|
+
const allSessions = store.getChildNodes(oId)
|
|
95
|
+
.filter(n => n.depth === 2)
|
|
96
|
+
.sort((a, b) => a.seq - b.seq);
|
|
97
|
+
const catchupSessions = allSessions
|
|
98
|
+
.filter(s => s.id !== sessionId && (!s.content || s.content === s.title))
|
|
99
|
+
.slice(-3)
|
|
100
|
+
.map(session => {
|
|
101
|
+
const exs = store.getOEntryExchangesV2(oId, 5, { sessionScope: [session.id] });
|
|
102
|
+
const lines = exs
|
|
103
|
+
.filter(ex => ex.userText || ex.agentText)
|
|
104
|
+
.map((ex, i) => {
|
|
105
|
+
let u = ex.userText.replace(/<channel[^>]*>\s*/g, "").replace(/<\/channel>\s*/g, "").trim();
|
|
106
|
+
let a = (ex.agentText ?? "").replace(/<[^>]+>/g, "").trim();
|
|
107
|
+
u = u.length > 300 ? u.substring(0, 300) + "…" : u;
|
|
108
|
+
a = a.length > 500 ? a.substring(0, 500) + "…" : a;
|
|
109
|
+
return ` [${i + 1}] USER: ${u}\n AGENT: ${a}`;
|
|
110
|
+
});
|
|
111
|
+
return lines.length > 0
|
|
112
|
+
? { id: session.id, date: session.created_at.substring(0, 10), title: session.title, body: lines.join("\n") }
|
|
113
|
+
: null;
|
|
114
|
+
})
|
|
115
|
+
.filter((s) => s !== null);
|
|
93
116
|
// 4. Tag skill-dialog exchanges
|
|
94
117
|
const skillMarker = "Base directory for this skill:";
|
|
95
118
|
for (const ex of batchExchanges) {
|
|
@@ -137,6 +160,15 @@ export async function checkpoint() {
|
|
|
137
160
|
.filter(s => s.checkpointPolicy === "readonly")
|
|
138
161
|
.map(s => `${projectId}.${s.idx} (${s.name})`)
|
|
139
162
|
.join(", ");
|
|
163
|
+
const catchupSection = catchupSessions.length > 0
|
|
164
|
+
? `### 0. Catch up on unsummarized sessions
|
|
165
|
+
${catchupSessions.length} prior session(s) completed without a summary. Write a brief summary for each.
|
|
166
|
+
Call: update_memory(id="<id>", content="Short title\\n> 2-5 sentences. Skip if no meaningful content.")
|
|
167
|
+
|
|
168
|
+
${catchupSessions.map(d => `Session ${d.id} (${d.date}) — "${d.title}":\n${d.body}`).join("\n\n")}
|
|
169
|
+
|
|
170
|
+
`
|
|
171
|
+
: "";
|
|
140
172
|
const prompt = `You are a checkpoint agent for "${projectName}" (${projectId}).
|
|
141
173
|
Process batch ${batchId} with ${batchExchanges.length} exchanges.
|
|
142
174
|
|
|
@@ -149,7 +181,7 @@ ${prevSummaryText}
|
|
|
149
181
|
== Batch Exchanges ==
|
|
150
182
|
${formattedExchanges}
|
|
151
183
|
|
|
152
|
-
## Tasks (execute ALL in order):
|
|
184
|
+
${catchupSection}## Tasks (execute ALL in order):
|
|
153
185
|
|
|
154
186
|
### 1. Title each exchange (REQUIRED)
|
|
155
187
|
Current titles (auto-extracted):
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-checkpoint.js","sourceRoot":"","sources":["../src/cli-checkpoint.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli-checkpoint.js","sourceRoot":"","sources":["../src/cli-checkpoint.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-hook-startup.js
CHANGED
|
@@ -94,7 +94,7 @@ export async function hookStartup() {
|
|
|
94
94
|
if (count === 1) {
|
|
95
95
|
const deviceId = getActiveDevice();
|
|
96
96
|
const deviceNote = deviceId
|
|
97
|
-
?
|
|
97
|
+
? ""
|
|
98
98
|
: "\n\nIMPORTANT: No active device is set for this machine. After loading memory, identify which device you are on (check hostname, hardware specs, or location), find the matching I-entry via read_memory() or search_memory(), then call set_active_device(id='I00XX'). Do this silently alongside the memory load.";
|
|
99
99
|
let humanContext = "";
|
|
100
100
|
let recentProjects = "";
|
|
@@ -111,29 +111,48 @@ export async function hookStartup() {
|
|
|
111
111
|
return `${r.id} ${raw.split("\n")[0]}`;
|
|
112
112
|
}).join("\n");
|
|
113
113
|
}
|
|
114
|
-
// Active I-entry: body + L2 titles + L3 for Apps
|
|
115
114
|
if (deviceId) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const l3Rows = db.prepare("SELECT title FROM memory_nodes WHERE parent_id=? AND depth=3 AND (irrelevant IS NULL OR irrelevant!=1) ORDER BY seq").all(l2.id);
|
|
124
|
-
for (const l3 of l3Rows) {
|
|
125
|
-
iContext += `\n - ${l3.title || ""}`;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
115
|
+
// Device is known: inject Apps list for this machine only
|
|
116
|
+
const appsNode = db.prepare("SELECT id FROM memory_nodes WHERE root_id=? AND depth=2 AND title='Apps' AND (irrelevant IS NULL OR irrelevant!=1) LIMIT 1").get(deviceId);
|
|
117
|
+
if (appsNode) {
|
|
118
|
+
const l3Rows = db.prepare("SELECT title FROM memory_nodes WHERE parent_id=? AND depth=3 AND (irrelevant IS NULL OR irrelevant!=1) ORDER BY seq").all(appsNode.id);
|
|
119
|
+
if (l3Rows.length > 0) {
|
|
120
|
+
humanContext += `\n\n--- Active device (${deviceId}) Apps ---\n` +
|
|
121
|
+
l3Rows.map(r => ` - ${r.title ?? ""}`).join("\n");
|
|
128
122
|
}
|
|
129
|
-
humanContext += iContext;
|
|
130
123
|
}
|
|
131
124
|
}
|
|
125
|
+
else {
|
|
126
|
+
// Device unknown: list known I-entries so agent can identify this machine
|
|
127
|
+
const iRows = db.prepare("SELECT id, title FROM memories WHERE prefix='I' AND obsolete!=1 ORDER BY id").all();
|
|
128
|
+
if (iRows.length > 0) {
|
|
129
|
+
humanContext += "\n\n--- Known devices (identify this machine) ---\n" +
|
|
130
|
+
iRows.map(r => `${r.id} ${r.title ?? ""}`).join("\n");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const iFavRows = db.prepare("SELECT id, title FROM memories WHERE prefix='I' AND favorite=1 AND obsolete!=1 AND (irrelevant IS NULL OR irrelevant!=1) ORDER BY id").all();
|
|
134
|
+
if (iFavRows.length > 0) {
|
|
135
|
+
humanContext += "\n\n--- Infrastructure (favorites) ---\n" +
|
|
136
|
+
iFavRows.map(r => `${r.id} ${r.title ?? ""}`).join("\n");
|
|
137
|
+
}
|
|
132
138
|
const pRows = db.prepare("SELECT id, title FROM memories WHERE prefix='P' AND obsolete!=1 ORDER BY updated_at DESC LIMIT 5").all();
|
|
133
139
|
if (pRows.length > 0) {
|
|
134
140
|
recentProjects = "\n\n--- Recent projects ---\n" +
|
|
135
141
|
pRows.map((r) => `${r.id} ${r.title ?? ""}`).join("\n");
|
|
136
142
|
}
|
|
143
|
+
// Checkpoint status: count unsummarized sessions in active project's O-entry
|
|
144
|
+
const activeP = db.prepare("SELECT id FROM memories WHERE prefix='P' AND active=1 AND obsolete!=1 LIMIT 1").get();
|
|
145
|
+
if (activeP) {
|
|
146
|
+
const seq = parseInt(activeP.id.replace(/\D/g, ""), 10);
|
|
147
|
+
const oId = `O${String(seq).padStart(4, "0")}`;
|
|
148
|
+
const unsummarized = db.prepare(`SELECT COUNT(*) as cnt FROM memory_nodes
|
|
149
|
+
WHERE root_id=? AND depth=2
|
|
150
|
+
AND (content IS NULL OR content = title)
|
|
151
|
+
AND (irrelevant IS NULL OR irrelevant != 1)`).get(oId);
|
|
152
|
+
if (unsummarized && unsummarized.cnt > 0) {
|
|
153
|
+
recentProjects += `\n\n--- Checkpoint status ---\n${unsummarized.cnt} session(s) in ${oId} without summary. Run \`hmem checkpoint\` or wait for auto-checkpoint.`;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
137
156
|
}
|
|
138
157
|
finally {
|
|
139
158
|
db.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-hook-startup.js","sourceRoot":"","sources":["../src/cli-hook-startup.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli-hook-startup.js","sourceRoot":"","sources":["../src/cli-hook-startup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEtJ,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,mEAAmE;IACnE,+CAA+C;IAC/C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,KAAU,CAAC;IACf,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAG,KAAK,EAAE,UAAU,IAAI,QAAQ,CAAC;IAEhD,iBAAiB;IACjB,IAAI,KAAK,EAAE,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEvC,uBAAuB;IACvB,kBAAkB,EAAE,CAAC;IAErB,cAAc;IACd,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;YACzC,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;YACrC,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,gCAAgC;IAChC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,uBAAuB,SAAS,EAAE,CAAC,CAAC;IAC/E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,KAAK,EAAE,CAAC;IACR,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IAErD,mFAAmF;IACnF,IAAI,SAAS,IAAI,SAAS,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,kBAAkB,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,CAAC;gBAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC7D,CAAC;QACD,gEAAgE;QAChE,0EAA0E;QAC1E,4EAA4E;QAC5E,gFAAgF;QAChF,kFAAkF;QAClF,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACzD,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,sCAAsC;YAC3F,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,cAAc,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACzC,gBAAgB,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,kBAAkB;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,QAAQ;YACzB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,qTAAqT,CAAC;QAE1T,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1D,MAAM,EAAE,GAAG,IAAK,QAAgB,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/D,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CACtB,8GAA8G,CAC/G,CAAC,GAAG,EAA2D,CAAC;oBACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,YAAY,GAAG,yCAAyC;4BACtD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gCACd,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;gCACvC,OAAO,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC1C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClB,CAAC;oBAED,IAAI,QAAQ,EAAE,CAAC;wBACb,0DAA0D;wBAC1D,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,4HAA4H,CAC7H,CAAC,GAAG,CAAC,QAAQ,CAA+B,CAAC;wBAC9C,IAAI,QAAQ,EAAE,CAAC;4BACb,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,qHAAqH,CACtH,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAA6B,CAAC;4BAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACtB,YAAY,IAAI,0BAA0B,QAAQ,cAAc;oCAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BACvD,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,0EAA0E;wBAC1E,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CACtB,6EAA6E,CAC9E,CAAC,GAAG,EAA0C,CAAC;wBAChD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACrB,YAAY,IAAI,qDAAqD;gCACnE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC3D,CAAC;oBACH,CAAC;oBAED,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,sIAAsI,CACvI,CAAC,GAAG,EAA0C,CAAC;oBAChD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxB,YAAY,IAAI,0CAA0C;4BACxD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC9D,CAAC;oBAED,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CACtB,kGAAkG,CACnG,CAAC,GAAG,EAA0C,CAAC;oBAChD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,cAAc,GAAG,+BAA+B;4BAC9C,KAAK,CAAC,GAAG,CAAC,CAAC,CAAgC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5F,CAAC;oBAED,6EAA6E;oBAC7E,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,+EAA+E,CAChF,CAAC,GAAG,EAAgC,CAAC;oBACtC,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;wBACxD,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;wBAC/C,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAC7B;;;2DAG6C,CAC9C,CAAC,GAAG,CAAC,GAAG,CAAgC,CAAC;wBAC1C,IAAI,YAAY,IAAI,YAAY,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;4BACzC,cAAc,IAAI,kCAAkC,YAAY,CAAC,GAAG,kBAAkB,GAAG,wEAAwE,CAAC;wBACpK,CAAC;oBACH,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,EAAE,CAAC,KAAK,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAClC,kBAAkB,EAAE;gBAClB,aAAa,EAAE,kBAAkB;gBACjC,iBAAiB,EAAE,kIAAkI;oBACnJ,iQAAiQ;oBACjQ,2FAA2F;oBAC3F,UAAU;oBACV,YAAY;oBACZ,cAAc;aACjB;SACF,CAAC,CAAC,CAAC;IACN,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,QAAQ,GAAG,CAAC,IAAI,KAAK,GAAG,QAAQ,KAAK,CAAC,EAAE,CAAC;QACvE,6EAA6E;QAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAClC,kBAAkB,EAAE;gBAClB,aAAa,EAAE,kBAAkB;gBACjC,iBAAiB,EAAE,8QAA8Q;aAClS;SACF,CAAC,CAAC,CAAC;IACN,CAAC;SAAM,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,oCAAoC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAClC,kBAAkB,EAAE;gBAClB,aAAa,EAAE,kBAAkB;gBACjC,iBAAiB,EAAE,uMAAuM;aAC3N;SACF,CAAC,CAAC,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { isToolCallEventType } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
// dist/extensions/ → ../../skills/hmem-using-hmem/SKILL.md
|
|
8
|
+
const SKILL_PATH = join(__dirname, "../../skills/hmem-using-hmem/SKILL.md");
|
|
9
|
+
/** Extract plain text from a Pi message content value. */
|
|
10
|
+
export function extractText(content) {
|
|
11
|
+
if (typeof content === "string")
|
|
12
|
+
return content;
|
|
13
|
+
if (!Array.isArray(content))
|
|
14
|
+
return "";
|
|
15
|
+
return content
|
|
16
|
+
.filter((b) => b.type === "text" && typeof b.text === "string")
|
|
17
|
+
.map((b) => b.text)
|
|
18
|
+
.join("");
|
|
19
|
+
}
|
|
20
|
+
/** Run an hmem CLI subcommand, piping `input` to stdin. Resolves with stdout. */
|
|
21
|
+
function runHmem(args, input = "{}", timeout = 10_000) {
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
const child = execFile("hmem", args, { timeout, env: process.env }, (_err, stdout) => {
|
|
24
|
+
resolve(stdout ?? "");
|
|
25
|
+
});
|
|
26
|
+
if (child.stdin) {
|
|
27
|
+
child.stdin.on("error", () => { }); // suppress EPIPE if child exits early
|
|
28
|
+
child.stdin.write(input);
|
|
29
|
+
child.stdin.end();
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export default async function (pi) {
|
|
34
|
+
let startupContext = "";
|
|
35
|
+
let injected = false;
|
|
36
|
+
let lastLogTime = 0;
|
|
37
|
+
// ── 1. Session start: run hook-startup once to get memory context ──────────
|
|
38
|
+
pi.on("session_start", async (event) => {
|
|
39
|
+
if (event.reason !== "startup")
|
|
40
|
+
return;
|
|
41
|
+
try {
|
|
42
|
+
const raw = await runHmem(["hook-startup"], "{}", 5_000);
|
|
43
|
+
const parsed = JSON.parse(raw);
|
|
44
|
+
startupContext = parsed?.hookSpecificOutput?.additionalContext ?? "";
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// hmem not available or errored — skip silently
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// ── 2. before_agent_start: inject skill + startup context (first turn only) ─
|
|
51
|
+
pi.on("before_agent_start", async (event) => {
|
|
52
|
+
if (injected)
|
|
53
|
+
return;
|
|
54
|
+
injected = true;
|
|
55
|
+
let addition = "";
|
|
56
|
+
// Inject hmem-using-hmem skill as <important-reminder>
|
|
57
|
+
try {
|
|
58
|
+
const skill = readFileSync(SKILL_PATH, "utf8");
|
|
59
|
+
addition += `\n\n<important-reminder>\n${skill}\n</important-reminder>`;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Skill file not found — skip
|
|
63
|
+
}
|
|
64
|
+
if (startupContext) {
|
|
65
|
+
addition += `\n\n${startupContext}`;
|
|
66
|
+
}
|
|
67
|
+
if (!addition)
|
|
68
|
+
return;
|
|
69
|
+
return { systemPrompt: event.systemPrompt + addition };
|
|
70
|
+
});
|
|
71
|
+
// ── 3. tool_call: block direct .hmem file reads ───────────────────────────
|
|
72
|
+
pi.on("tool_call", async (event) => {
|
|
73
|
+
if (!isToolCallEventType("read", event))
|
|
74
|
+
return;
|
|
75
|
+
const filePath = event.input.path ?? "";
|
|
76
|
+
if (!filePath.endsWith(".hmem"))
|
|
77
|
+
return;
|
|
78
|
+
return {
|
|
79
|
+
block: true,
|
|
80
|
+
reason: "Direct .hmem file access is blocked. Use hmem MCP tools instead: " +
|
|
81
|
+
"read_memory(), search_memory(), load_project(), or the /hmem-read skill. " +
|
|
82
|
+
"Raw .hmem files are SQLite databases — reading them directly bypasses filtering, FTS5 search, and sync.",
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
// ── 4. session_before_compact: checkpoint + context-inject + deactivate ────
|
|
86
|
+
pi.on("session_before_compact", async () => {
|
|
87
|
+
lastLogTime = Date.now();
|
|
88
|
+
await runHmem(["log-exchange"], "{}", 10_000).catch(() => { });
|
|
89
|
+
await runHmem(["context-inject"], "{}", 10_000).catch(() => { });
|
|
90
|
+
await runHmem(["deactivate"], "{}", 5_000).catch(() => { });
|
|
91
|
+
});
|
|
92
|
+
// ── 5. agent_end: checkpoint after every agent response ───────────────────
|
|
93
|
+
pi.on("agent_end", async (event) => {
|
|
94
|
+
// Debounce: skip if session_before_compact just ran
|
|
95
|
+
if (Date.now() - lastLogTime < 5_000)
|
|
96
|
+
return;
|
|
97
|
+
lastLogTime = Date.now();
|
|
98
|
+
const messages = event.messages;
|
|
99
|
+
const lastUser = [...messages].reverse().find((m) => m.role === "user");
|
|
100
|
+
const lastAssistant = [...messages].reverse().find((m) => m.role === "assistant");
|
|
101
|
+
const userText = extractText(lastUser?.content ?? "");
|
|
102
|
+
const assistantText = extractText(lastAssistant?.content ?? "");
|
|
103
|
+
if (!userText || !assistantText)
|
|
104
|
+
return;
|
|
105
|
+
await runHmem(["log-exchange"], JSON.stringify({ last_user_message: userText, last_assistant_message: assistantText }), 10_000).catch(() => { });
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=pi-hmem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-hmem.js","sourceRoot":"","sources":["../../src/extensions/pi-hmem.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hmem-mcp",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.3.0",
|
|
4
4
|
"description": "Persistent memory and agent lifecycle for Claude Code — because sessions shouldn't start from zero.",
|
|
5
5
|
"author": "Bumblebiber",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
"types": "./dist/index.d.ts"
|
|
30
30
|
}
|
|
31
31
|
},
|
|
32
|
+
"pi": {
|
|
33
|
+
"extensions": [
|
|
34
|
+
"./dist/extensions/pi-hmem"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
32
37
|
"files": [
|
|
33
38
|
"dist",
|
|
34
39
|
"skills",
|
|
@@ -71,6 +76,7 @@
|
|
|
71
76
|
"persistent-memory"
|
|
72
77
|
],
|
|
73
78
|
"devDependencies": {
|
|
79
|
+
"@earendil-works/pi-coding-agent": "^0.74.0",
|
|
74
80
|
"@types/better-sqlite3": "^7.6.13",
|
|
75
81
|
"@types/node": "^25.2.3",
|
|
76
82
|
"typescript": "^5.9.3",
|
|
@@ -82,5 +88,13 @@
|
|
|
82
88
|
},
|
|
83
89
|
"optionalDependencies": {
|
|
84
90
|
"better-sqlite3": "^12.6.2"
|
|
91
|
+
},
|
|
92
|
+
"peerDependencies": {
|
|
93
|
+
"@earendil-works/pi-coding-agent": ">=0.74.0"
|
|
94
|
+
},
|
|
95
|
+
"peerDependenciesMeta": {
|
|
96
|
+
"@earendil-works/pi-coding-agent": {
|
|
97
|
+
"optional": true
|
|
98
|
+
}
|
|
85
99
|
}
|
|
86
100
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# Autoresearch Nightly — optimizes hmem checkpoint prompts
|
|
3
|
-
# Run via cron: 0 2 * * 0 /home/
|
|
3
|
+
# Run via cron: 0 2 * * 0 /home/username/projects/hmem/scripts/autoresearch-nightly.sh
|
|
4
4
|
#
|
|
5
5
|
# What it does:
|
|
6
6
|
# 1. Creates a fresh branch from main
|
|
@@ -54,6 +54,20 @@ Scan the load_project output:
|
|
|
54
54
|
|
|
55
55
|
Fix immediately, do not defer.
|
|
56
56
|
|
|
57
|
+
## STEP 3.6: Schema Check
|
|
58
|
+
|
|
59
|
+
Scan the load_project output for schema mismatches and fix them immediately.
|
|
60
|
+
|
|
61
|
+
**`[-]` prefix sections** — orphaned nodes outside the current schema (e.g. `P0048.10 [-] Bugs (duplicate)`, `P0048.21 [-] Protocol (stale artifact)`):
|
|
62
|
+
```
|
|
63
|
+
update_memory(id="P00XX.YY", { irrelevant: true })
|
|
64
|
+
```
|
|
65
|
+
Mark every `[-]` section irrelevant. Do not skip, do not defer.
|
|
66
|
+
|
|
67
|
+
**Duplicate L2 sections** — two entries with the same section name (e.g. two `.6 Bugs` nodes) → mark the higher-numbered one irrelevant, keep the canonical one.
|
|
68
|
+
|
|
69
|
+
**Missing required sections** — auto-reconcile on the next `load_project` will add them automatically. No manual action needed unless you are actively working on that section right now.
|
|
70
|
+
|
|
57
71
|
## STEP 4: Confirm
|
|
58
72
|
|
|
59
73
|
Output:
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
- User request: "aktiviere projekt hmem"
|
|
5
5
|
- Current active project: P0043 (EasySAP)
|
|
6
6
|
- Target project: P0048 (hmem)
|
|
7
|
-
- Skill file read: `/home/
|
|
7
|
+
- Skill file read: `/home/username/projects/hmem/skills/hmem-activate/SKILL.md`
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -8,7 +8,7 @@ Aktuell aktives Projekt: P0043 (EasySAP)
|
|
|
8
8
|
|
|
9
9
|
### Schritt 1: Projekt identifizieren
|
|
10
10
|
- Benutzer sagt "aktiviere projekt hmem"
|
|
11
|
-
- Ich weiß aus dem Kontext, dass ich in `/home/
|
|
11
|
+
- Ich weiß aus dem Kontext, dass ich in `/home/username/projects/hmem` bin
|
|
12
12
|
- Das Projekt "hmem" ist wahrscheinlich eine der P-Einträge in meinem hmem-Speicher
|
|
13
13
|
- Normalerweise würde ich `list_projects()` aufrufen, aber ich kann hier keine MCP-Tools aufrufen
|
|
14
14
|
- Im Standard-Workflow: Ich würde das hmem-Projekt in der P-Liste suchen (vermutlich P00XX für "hmem")
|
|
@@ -53,3 +53,12 @@ If nothing relevant found:
|
|
|
53
53
|
[CONTEXT LOADED]
|
|
54
54
|
No relevant context found for: <your query>
|
|
55
55
|
[/CONTEXT LOADED]
|
|
56
|
+
|
|
57
|
+
→ If the missing info is code structure: dispatch an Explore agent to locate it in the filesystem.
|
|
58
|
+
→ After finding it, update the Codebase node immediately using the correct depth:
|
|
59
|
+
L3 — module group (if the group is missing):
|
|
60
|
+
append_memory(id="P00XX.2", title="Core modules")
|
|
61
|
+
L4 — individual module with signature + purpose:
|
|
62
|
+
append_memory(id="P00XX.2.N", title="moduleName.ts", body="functionName(param: Type): Return — purpose. src/path/moduleName.ts")
|
|
63
|
+
L5 — optional extended notes (edge cases, caveats):
|
|
64
|
+
append_memory(id="P00XX.2.N.M", title="Note", body="...")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hmem-search
|
|
3
|
-
description: Search hmem
|
|
3
|
+
description: Search hmem memory for things referenced without an ID. Trigger when user refers to past conversations ("letzte Woche", "gestern", "remember when", "we talked about"), mentions proper names unknown this session, uses definite articles assuming shared context ("der Bug mit X", "the issue we had"), or seems to assume you know something. If you think "the user assumes I know this" — search first, ask second. Combines full-text search with time window from phrasing. Trigger on casual/vague references. Do NOT trigger for explicit ID lookups like "read P0048".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# hmem Search
|
|
@@ -28,8 +28,10 @@ Scan the output for:
|
|
|
28
28
|
- **✓ DONE items in Roadmap** → `update_memory(id, { irrelevant: true })`
|
|
29
29
|
- **Decommissioned / concept entries in Infrastructure** → `update_memory(id, { irrelevant: true })`
|
|
30
30
|
- **Old status snapshots in Overview** (superseded by newer) → mark obsolete
|
|
31
|
+
- **`[-]` prefix sections** (e.g. `P00XX.10 [-] Bugs`) — orphaned schema artifacts → `update_memory(id, { irrelevant: true })` for each
|
|
32
|
+
- **Duplicate L2 sections** (two nodes with same name) → mark the higher-numbered one irrelevant
|
|
31
33
|
|
|
32
|
-
Fix
|
|
34
|
+
Fix all of the above immediately. Do not note and defer.
|
|
33
35
|
|
|
34
36
|
## STEP 3: Calibrate explanation depth
|
|
35
37
|
|
|
@@ -63,6 +65,14 @@ Move the misrouted session/batch node to the correct O-entry.
|
|
|
63
65
|
|
|
64
66
|
**Rule:** Never call `load_project` on a secondary project without immediately re-calling it on your working project. Routing follows the last `load_project` call — always return control explicitly.
|
|
65
67
|
|
|
68
|
+
## What gets injected automatically (first message)
|
|
69
|
+
|
|
70
|
+
The UserPromptSubmit hook injects the following into every session start:
|
|
71
|
+
- **H-entries** — top 10 by access count (ID + title)
|
|
72
|
+
- **Active device apps** — Apps list of the current I-entry (if device is set)
|
|
73
|
+
- **Infrastructure favorites** — any I-entry with `favorite: true` (e.g. reMarkable, shared server). Mark with `update_memory(id="I00XX", favorite=true)`.
|
|
74
|
+
- **Recent projects** — 5 most recently updated P-entries
|
|
75
|
+
|
|
66
76
|
## OUTPUT
|
|
67
77
|
|
|
68
78
|
After both steps, output exactly:
|
|
@@ -129,7 +129,7 @@ npm install -g hmem-sync
|
|
|
129
129
|
### Step 2: Gather credentials from the original device
|
|
130
130
|
|
|
131
131
|
The user needs:
|
|
132
|
-
- **Server URL** (e.g. `https://
|
|
132
|
+
- **Server URL** (e.g. `https://your-server.example.com/hmem-sync`)
|
|
133
133
|
- **User ID** (e.g. `bbbee`)
|
|
134
134
|
- **Token** (64-char hex string from `.hmem-sync-token`)
|
|
135
135
|
- **Passphrase** (same as original device)
|
|
@@ -36,7 +36,7 @@ Not all Bash calls need dispatching. The key distinction:
|
|
|
36
36
|
| **Targeted** | Known path/pattern, single command, result ≤3 lines | Run directly |
|
|
37
37
|
| **Exploratory** | Open-ended, multiple locations, result unknown | Dispatch |
|
|
38
38
|
|
|
39
|
-
**Targeted (OK to run directly):** `find /home/
|
|
39
|
+
**Targeted (OK to run directly):** `find /home/username -name "settings.json" -path "*claude*"` — one known location, one expected result.
|
|
40
40
|
|
|
41
41
|
**Exploratory (must dispatch):** `grep -r "functionName" ~/projects/` across repos, or "where is X defined?" without knowing which file.
|
|
42
42
|
|
|
@@ -58,6 +58,19 @@ These thoughts mean STOP — dispatch instead:
|
|
|
58
58
|
| "I remember how this works" | Skills evolve. Invoke the skill. |
|
|
59
59
|
| "I'll write the P-entry manually with write_memory" | Use `hmem-new-project`. It handles schema, O-entry linking, and section setup. |
|
|
60
60
|
|
|
61
|
+
## MANDATORY — DO NOT
|
|
62
|
+
|
|
63
|
+
Hard stops, not guidelines:
|
|
64
|
+
|
|
65
|
+
| DO NOT | Instead |
|
|
66
|
+
|--------|---------|
|
|
67
|
+
| Read `~/.hmem/*.hmem` directly | Use `read_memory()`, `search_memory()`, or `/hmem-read` |
|
|
68
|
+
| Create O-entries manually | O-entries are auto-managed by Haiku — use `/hmem-session-start` (R0022) |
|
|
69
|
+
| Write to memory during an active task | Finish the task first, then write |
|
|
70
|
+
| Call `search_memory` twice in one turn | Batch into one call, or use `hmem-recall` |
|
|
71
|
+
| Create P-entries with `write_memory` | Use `hmem-new-project` — schema + O-entry linking auto-handled |
|
|
72
|
+
| Call `load_project` mid-session without routing | Always use `/hmem-activate` — it handles exchange misrouting |
|
|
73
|
+
|
|
61
74
|
## Mandatory Habits
|
|
62
75
|
|
|
63
76
|
1. **Search = Dispatch — unless targeted.** Exploratory searches ("find", "where is X", "what does file Y contain") → `hmem-dispatch`. Single targeted command with a predictable result (≤3 lines) → run directly.
|