hmem-mcp 6.5.0 → 6.5.2
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/dist/cli-deactivate.d.ts +13 -0
- package/dist/cli-deactivate.js +69 -0
- package/dist/cli-deactivate.js.map +1 -0
- package/dist/cli-statusline.js +12 -6
- package/dist/cli-statusline.js.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/session-state.d.ts +4 -0
- package/dist/session-state.js +8 -8
- package/dist/session-state.js.map +1 -1
- package/package.json +1 -1
- package/skills/hmem-setup/SKILL.md +10 -5
- package/skills/hmem-write/SKILL.md +54 -63
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli-deactivate.ts
|
|
3
|
+
*
|
|
4
|
+
* Called by Claude Code's SessionStart[clear] hook after /clear.
|
|
5
|
+
* Writes a session marker with projectId=null for the new session so the
|
|
6
|
+
* statusline shows "no project" instead of the previously active project.
|
|
7
|
+
*
|
|
8
|
+
* Also deletes the per-process active-project file and clears statusline
|
|
9
|
+
* cache files so the change takes effect immediately.
|
|
10
|
+
*
|
|
11
|
+
* Usage: hmem deactivate (reads stdin JSON from Claude Code hook)
|
|
12
|
+
*/
|
|
13
|
+
export declare function deactivate(): Promise<void>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli-deactivate.ts
|
|
3
|
+
*
|
|
4
|
+
* Called by Claude Code's SessionStart[clear] hook after /clear.
|
|
5
|
+
* Writes a session marker with projectId=null for the new session so the
|
|
6
|
+
* statusline shows "no project" instead of the previously active project.
|
|
7
|
+
*
|
|
8
|
+
* Also deletes the per-process active-project file and clears statusline
|
|
9
|
+
* cache files so the change takes effect immediately.
|
|
10
|
+
*
|
|
11
|
+
* Usage: hmem deactivate (reads stdin JSON from Claude Code hook)
|
|
12
|
+
*/
|
|
13
|
+
import fs from "node:fs";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import { resolveEnvDefaults } from "./cli-env.js";
|
|
16
|
+
import { writeSessionMarker, writePpidMapping, activeProjectFilePath, getParentPid, } from "./session-state.js";
|
|
17
|
+
export async function deactivate() {
|
|
18
|
+
resolveEnvDefaults();
|
|
19
|
+
// Read hook stdin JSON (Claude Code hook protocol)
|
|
20
|
+
let input = {};
|
|
21
|
+
try {
|
|
22
|
+
const chunks = [];
|
|
23
|
+
for await (const chunk of process.stdin)
|
|
24
|
+
chunks.push(chunk);
|
|
25
|
+
const raw = Buffer.concat(chunks).toString("utf-8").trim();
|
|
26
|
+
if (raw)
|
|
27
|
+
input = JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch { /* no stdin — OK */ }
|
|
30
|
+
const sessionId = input.session_id;
|
|
31
|
+
const hmemPath = process.env.HMEM_PATH || "";
|
|
32
|
+
// Write session marker with projectId=null — makes statusline authoritative "no project"
|
|
33
|
+
if (sessionId) {
|
|
34
|
+
writeSessionMarker(sessionId, { projectId: null, hmemPath, deactivated: true });
|
|
35
|
+
// Update PPID bridge so MCP server can resolve this session
|
|
36
|
+
const ppid = typeof process.ppid === "number" ? process.ppid : 0;
|
|
37
|
+
const grandparent = ppid ? getParentPid(ppid) : null;
|
|
38
|
+
const claudePid = grandparent && grandparent > 1 ? grandparent : ppid;
|
|
39
|
+
if (claudePid) {
|
|
40
|
+
writePpidMapping(claudePid, sessionId, hmemPath);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Delete per-process active-project file (written by MCP server on load_project)
|
|
44
|
+
const ppid = typeof process.ppid === "number" ? process.ppid : 0;
|
|
45
|
+
if (ppid) {
|
|
46
|
+
const grandparent = getParentPid(ppid);
|
|
47
|
+
const pidsToClean = [ppid, ...(grandparent && grandparent > 1 ? [grandparent] : [])];
|
|
48
|
+
for (const pid of pidsToClean) {
|
|
49
|
+
try {
|
|
50
|
+
fs.unlinkSync(activeProjectFilePath(pid));
|
|
51
|
+
}
|
|
52
|
+
catch { /* may not exist */ }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Invalidate statusline cache files so the change shows immediately
|
|
56
|
+
const tmpDir = os.tmpdir();
|
|
57
|
+
try {
|
|
58
|
+
for (const f of fs.readdirSync(tmpDir)) {
|
|
59
|
+
if (f.startsWith(".hmem_statusline_")) {
|
|
60
|
+
try {
|
|
61
|
+
fs.unlinkSync(`${tmpDir}/${f}`);
|
|
62
|
+
}
|
|
63
|
+
catch { /* ignore */ }
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch { /* ignore */ }
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=cli-deactivate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-deactivate.js","sourceRoot":"","sources":["../src/cli-deactivate.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-statusline.js
CHANGED
|
@@ -84,10 +84,16 @@ async function getHmemStatus(sessionId) {
|
|
|
84
84
|
const { readSessionMarker } = await import("./session-state.js");
|
|
85
85
|
const marker = sessionId ? readSessionMarker(sessionId) : null;
|
|
86
86
|
let projRow;
|
|
87
|
-
if (marker
|
|
87
|
+
if (marker?.projectId) {
|
|
88
|
+
// Session marker has an explicit project → use it
|
|
88
89
|
projRow = db.prepare("SELECT id, title FROM memories WHERE id = ? AND prefix='P' AND obsolete!=1 LIMIT 1").get(marker.projectId);
|
|
89
90
|
}
|
|
90
|
-
if (
|
|
91
|
+
else if (marker?.deactivated) {
|
|
92
|
+
// Explicitly deactivated after /clear → show "no project", skip all fallbacks
|
|
93
|
+
projRow = undefined;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// No marker, or marker with null and not explicitly deactivated → fall through to fallbacks
|
|
91
97
|
// Fallback 1: per-process active-project file (written by MCP server on load_project).
|
|
92
98
|
// MCP server is a direct child of Claude Code → writes file keyed by Claude Code PID.
|
|
93
99
|
// Statusline runs via "bash -c" → Claude Code → bash → statusline.
|
|
@@ -97,10 +103,10 @@ async function getHmemStatus(sessionId) {
|
|
|
97
103
|
if (activeFromFile) {
|
|
98
104
|
projRow = db.prepare("SELECT id, title FROM memories WHERE id = ? AND prefix='P' AND obsolete!=1 LIMIT 1").get(activeFromFile);
|
|
99
105
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
106
|
+
if (!projRow) {
|
|
107
|
+
// Fallback 2: shared DB active flag (legacy — unreliable in multi-session setups)
|
|
108
|
+
projRow = db.prepare("SELECT id, title FROM memories WHERE prefix='P' AND active=1 AND obsolete!=1 LIMIT 1").get();
|
|
109
|
+
}
|
|
104
110
|
}
|
|
105
111
|
let project = "";
|
|
106
112
|
if (projRow) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-statusline.js","sourceRoot":"","sources":["../src/cli-statusline.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli-statusline.js","sourceRoot":"","sources":["../src/cli-statusline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,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,kCAAkC,EAAE,MAAM,oBAAoB,CAAC;AAcxE,qBAAqB;AACrB,MAAM,CAAC,GAAG;IACR,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,aAAa;IAClB,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,UAAU;CAClB,CAAC;AAEF,SAAS,SAAS,CAAC,SAA6B;IAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9E,OAAO,yBAAyB,GAAG,QAAQ,CAAC;AAC9C,CAAC;AAED,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,UAAU;AAQhC,SAAS,eAAe,CAAC,KAAkB;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,cAAc,EAAE,eAAe,CAAC;IAClD,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEzE,uBAAuB;IACvB,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC;IAC/C,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,YAAY,IAAI,CAAC,CAAC;UACpC,CAAC,EAAE,EAAE,2BAA2B,IAAI,CAAC,CAAC;UACtC,CAAC,EAAE,EAAE,uBAAuB,IAAI,CAAC,CAAC,CAAC;IAEvC,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC;QAC3B,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG;QACnC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;IAElB,OAAO,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,SAA6B;IACxD,MAAM,KAAK,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACrE,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAExC,cAAc;IACd,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;gBACpD,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;oBACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAe,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAExB,WAAW;IACX,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC;QACH,kBAAkB,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QACvC,IAAI,CAAC,QAAQ;YAAE,OAAO,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAEnD,sCAAsC;QACtC,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE1D,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1D,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE/D,IAAI,OAAkD,CAAC;YACvD,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;gBACtB,kDAAkD;gBAClD,OAAO,GAAG,EAAE,CAAC,OAAO,CAClB,oFAAoF,CACrF,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAA8C,CAAC;YACvE,CAAC;iBAAM,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;gBAC/B,8EAA8E;gBAC9E,OAAO,GAAG,SAAS,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,4FAA4F;gBAC5F,uFAAuF;gBACvF,sFAAsF;gBACtF,mEAAmE;gBACnE,gFAAgF;gBAChF,mDAAmD;gBACnD,MAAM,cAAc,GAAG,kCAAkC,EAAE,CAAC;gBAC5D,IAAI,cAAc,EAAE,CAAC;oBACnB,OAAO,GAAG,EAAE,CAAC,OAAO,CAClB,oFAAoF,CACrF,CAAC,GAAG,CAAC,cAAc,CAA8C,CAAC;gBACrE,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,kFAAkF;oBAClF,OAAO,GAAG,EAAE,CAAC,OAAO,CAClB,sFAAsF,CACvF,CAAC,GAAG,EAA+C,CAAC;gBACvD,CAAC;YACH,CAAC;YAED,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAChD,OAAO,GAAG,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YACpC,CAAC;YAED,uCAAuC;YACvC,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,uCAAuC;YACvC,IAAI,IAAgC,CAAC;YACrC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5D,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBACnD,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,GAAG,CAA+B,CAAC;YACnG,CAAC;YAED,IAAI,IAAI,EAAE,CAAC;gBACT,2BAA2B;gBAC3B,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,8FAA8F,CAC/F,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAA+B,CAAC;gBAE7C,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,cAAc,GAAI,EAAE,CAAC,OAAO,CAChC,0EAA0E,CAC3E,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAS,EAAE,CAAC,IAAI,CAAC,CAAC;oBAEtC,MAAM,QAAQ,GAAG,UAAU,CAAC,kBAAkB,CAAC;oBAC/C,SAAS,GAAG,cAAc,CAAC;oBAC3B,MAAM,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,kBAAkB,EAAE,CAAC;gBAC9E,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAExB,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB,EAAE,SAA6B;IAClE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,uBAAuB;IACvB,IAAI,KAAK,GAAgB,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC,CAAC,mCAAmC,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,6DAA6D;IAC7D,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvD,qFAAqF;QACrF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;YAC9C,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;gBACpD,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -37,6 +37,11 @@ switch (command) {
|
|
|
37
37
|
await contextInject();
|
|
38
38
|
break;
|
|
39
39
|
}
|
|
40
|
+
case "deactivate": {
|
|
41
|
+
const { deactivate } = await import("./cli-deactivate.js");
|
|
42
|
+
await deactivate();
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
40
45
|
case "checkpoint": {
|
|
41
46
|
const { checkpoint } = await import("./cli-checkpoint.js");
|
|
42
47
|
await checkpoint();
|
|
@@ -80,6 +85,7 @@ Usage:
|
|
|
80
85
|
hmem update-skills Copy/update skill files to detected AI tools
|
|
81
86
|
hmem log-exchange Log a chat exchange to active O-entry (called by Stop hook)
|
|
82
87
|
hmem context-inject Output compressed context for re-injection after /clear
|
|
88
|
+
hmem deactivate Clear active project for current session (called by SessionStart[clear] hook)
|
|
83
89
|
hmem checkpoint Extract knowledge from recent exchanges via Haiku (background)
|
|
84
90
|
hmem hook-startup UserPromptSubmit hook — counter, checkpoint reminders (cross-platform)
|
|
85
91
|
hmem statusline Generate statusline for Claude Code (reads JSON from stdin)
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/session-state.d.ts
CHANGED
|
@@ -11,10 +11,13 @@ export interface SessionMarker {
|
|
|
11
11
|
hmemPath: string;
|
|
12
12
|
updatedAt: string;
|
|
13
13
|
pid: number;
|
|
14
|
+
/** Written by 'hmem deactivate' after /clear — distinguishes explicit deactivation from default null */
|
|
15
|
+
deactivated?: boolean;
|
|
14
16
|
}
|
|
15
17
|
export interface SessionMarkerInput {
|
|
16
18
|
projectId?: string | null;
|
|
17
19
|
hmemPath?: string;
|
|
20
|
+
deactivated?: boolean;
|
|
18
21
|
}
|
|
19
22
|
export declare function sessionMarkerDir(): string;
|
|
20
23
|
export declare function writeSessionMarker(sessionId: string, input: SessionMarkerInput): void;
|
|
@@ -44,6 +47,7 @@ export declare function readPpidMapping(ppid: number): PpidMapping | null;
|
|
|
44
47
|
* DB-flag behavior.
|
|
45
48
|
*/
|
|
46
49
|
export declare function currentSessionId(): string | undefined;
|
|
50
|
+
export declare function activeProjectFilePath(claudePid: number): string;
|
|
47
51
|
export declare function writeActiveProjectFile(claudePid: number, projectId: string): void;
|
|
48
52
|
export declare function readActiveProjectFile(claudePid: number): string | null;
|
|
49
53
|
/**
|
package/dist/session-state.js
CHANGED
|
@@ -37,6 +37,7 @@ export function writeSessionMarker(sessionId, input) {
|
|
|
37
37
|
hmemPath: input.hmemPath ?? existing.hmemPath ?? "",
|
|
38
38
|
updatedAt: new Date().toISOString(),
|
|
39
39
|
pid: process.pid,
|
|
40
|
+
...(input.deactivated !== undefined ? { deactivated: input.deactivated } : {}),
|
|
40
41
|
};
|
|
41
42
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
42
43
|
fs.writeFileSync(tmp, JSON.stringify(marker, null, 2));
|
|
@@ -129,17 +130,16 @@ export function readPpidMapping(ppid) {
|
|
|
129
130
|
* DB-flag behavior.
|
|
130
131
|
*/
|
|
131
132
|
export function currentSessionId() {
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
// Always read the ppid-bridge file fresh — do NOT cache in process.env.
|
|
134
|
+
// After /clear or a new Claude Code session, hook-startup rewrites the ppid-bridge
|
|
135
|
+
// with a new session_id. Caching in env would cause the MCP server (long-running process)
|
|
136
|
+
// to keep using the old session_id for the entire lifetime of the process.
|
|
137
|
+
// The ppid-bridge lives in /tmp (tmpfs on Linux) — reads are ~microseconds, no perf concern.
|
|
134
138
|
const ppid = typeof process.ppid === "number" ? process.ppid : 0;
|
|
135
139
|
if (!ppid)
|
|
136
140
|
return undefined;
|
|
137
141
|
const mapping = readPpidMapping(ppid);
|
|
138
|
-
|
|
139
|
-
process.env.HMEM_SESSION_ID = mapping.sessionId;
|
|
140
|
-
return mapping.sessionId;
|
|
141
|
-
}
|
|
142
|
-
return undefined;
|
|
142
|
+
return mapping?.sessionId ?? undefined;
|
|
143
143
|
}
|
|
144
144
|
// ---------------------------------------------------------------------------
|
|
145
145
|
// Per-process active-project file
|
|
@@ -152,7 +152,7 @@ export function currentSessionId() {
|
|
|
152
152
|
// statusline.ppid = B, statusline.grandparent = C
|
|
153
153
|
// So readers must walk up to the grandparent PID to find the file.
|
|
154
154
|
// ---------------------------------------------------------------------------
|
|
155
|
-
function activeProjectFilePath(claudePid) {
|
|
155
|
+
export function activeProjectFilePath(claudePid) {
|
|
156
156
|
return path.join(os.tmpdir(), `hmem-active-${claudePid}.txt`);
|
|
157
157
|
}
|
|
158
158
|
export function writeActiveProjectFile(claudePid, projectId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -73,17 +73,22 @@ Script: `~/.claude/hooks/hmem-log-exchange.sh`
|
|
|
73
73
|
- **remind mode**: Injects a reminder for the main agent to save knowledge manually
|
|
74
74
|
- Checks transcript file size and writes a warning flag when context exceeds `contextTokenThreshold` (default 100k tokens).
|
|
75
75
|
|
|
76
|
-
### 3. SessionStart[clear] — context re-injection
|
|
76
|
+
### 3. SessionStart[clear] — context re-injection + deactivation
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
Fires only after `/clear` (matcher: `"clear"`). Two hooks run in sequence:
|
|
79
79
|
|
|
80
|
-
-
|
|
81
|
-
- Pipes session JSON to `hmem context-inject`, which outputs `additionalContext` containing:
|
|
80
|
+
**a) `hmem context-inject`** — outputs `additionalContext` containing:
|
|
82
81
|
- Last 20 user/assistant messages from the pre-clear transcript
|
|
83
82
|
- Active project briefing (title + overview)
|
|
84
83
|
- Recent O-entries (session logs) linked to the project
|
|
85
84
|
- R-entries (rules)
|
|
86
|
-
- Keeps the agent oriented after a context reset without a full `read_memory()` call.
|
|
85
|
+
- Keeps the agent oriented after a context reset without a full `read_memory()` call.
|
|
86
|
+
|
|
87
|
+
**b) `hmem deactivate`** — resets the active project for the new session:
|
|
88
|
+
- Writes a session marker with `projectId: null, deactivated: true` for the new session_id
|
|
89
|
+
- Deletes the per-process active-project file (`/tmp/hmem-active-<pid>.txt`)
|
|
90
|
+
- Clears statusline cache files
|
|
91
|
+
- Result: statusline shows `no project` after `/clear` until `load_project` is called
|
|
87
92
|
|
|
88
93
|
---
|
|
89
94
|
|
|
@@ -15,39 +15,26 @@ If `write_memory` is not available:
|
|
|
15
15
|
|
|
16
16
|
## Syntax
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
write_memory(
|
|
20
|
-
prefix: "E",
|
|
21
|
-
content: "Short Title (~50 chars)\n\nL1 body — detailed explanation, can span multiple lines\nsecond body line with more context\n\tL2 node title\n\n\tL2 body text (supports newlines)\n\tmore L2 body\n\t\tL3 detail (2 tabs)\n\t\t\tL4 raw data (3 tabs — rarely needed)"
|
|
22
|
-
)
|
|
23
|
-
```
|
|
18
|
+
Every node has a **title** (short navigation label, shown in listings) and an optional **body** (detail shown on drill-down). Use explicit parameters — avoid blank-line tricks in `content`:
|
|
24
19
|
|
|
25
|
-
|
|
20
|
+
```python
|
|
21
|
+
# Preferred: explicit title + body
|
|
22
|
+
write_memory(prefix="E", title="Short Title (~50 chars)", body="Full explanation here.\nCan span multiple lines.", content="\tL2 section\n\t\tL3 detail")
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
- **Legacy `> ` prefix:** Still works for backward compatibility, but blank-line separation is preferred.
|
|
30
|
-
- **Without body:** The full text is stored as `content` and the title is auto-extracted from the first `maxTitleChars` characters.
|
|
24
|
+
# Title only (no body)
|
|
25
|
+
write_memory(prefix="L", title="FTS5 needs rowid-map for contentless tables", content="\tDetails\n\t\tImplication")
|
|
31
26
|
|
|
32
|
-
|
|
27
|
+
# Legacy (still works, but avoid for new entries)
|
|
28
|
+
write_memory(prefix="E", content="Short Title\n\nBody text here.\n\tL2 section\n\t\tL3 detail")
|
|
33
29
|
```
|
|
34
|
-
Short Error Title
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
**Parameters:**
|
|
32
|
+
- **`title`** — Short label (~50 chars). Think "chapter title in a book". Shown in all listings.
|
|
33
|
+
- **`body`** — Freetext detail (any length, newlines OK). Shown only on drill-down.
|
|
34
|
+
- **`content`** — Tab-indented sub-nodes (L2+). When `title` is given, `content` holds only sub-nodes. In legacy mode (no `title`), `content` holds everything.
|
|
39
35
|
|
|
40
|
-
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
**L1 example without body (still works):**
|
|
44
|
-
```
|
|
45
|
-
SQLite connection failed due to wrong path in .mcp.json
|
|
46
|
-
Fix: use absolute path in env var
|
|
47
|
-
```
|
|
36
|
+
**Sub-node indentation:** 1 tab = 1 level deeper. Never use tabs for text formatting inside body — tabs are structural.
|
|
48
37
|
|
|
49
|
-
**Indentation:** 1 tab = 1 level. Alternatively: 2 or 4 spaces per level (auto-detected).
|
|
50
|
-
**Warning:** A tab at the start of any line always means "go one level deeper" — it is structural, not content. If you need to store code or text that contains leading tabs, use spaces instead.
|
|
51
38
|
**IDs and timestamps** are assigned automatically — never write them yourself.
|
|
52
39
|
|
|
53
40
|
---
|
|
@@ -190,16 +177,18 @@ The MCP server validates that L2 nodes start with one of these names. Minimum fo
|
|
|
190
177
|
|
|
191
178
|
**Complete P-entry example (WeatherBot):**
|
|
192
179
|
|
|
193
|
-
```
|
|
180
|
+
```python
|
|
194
181
|
write_memory(
|
|
195
182
|
prefix="P",
|
|
196
|
-
|
|
183
|
+
title="WeatherBot | New | Python/Discord.py | GH: user/weatherbot",
|
|
184
|
+
body="Discord bot for weather forecasts — slash commands for current weather and multi-day forecasts",
|
|
185
|
+
content="\tOverview\n\t\tCurrent state\n\t\t> Scaffolding done, no commands yet. Bot connects to Discord but has no slash commands registered.\n\t\tGoals\n\t\t> Daily/hourly forecasts via slash commands, multi-city support, embed formatting\n\t\tArchitecture\n\t\t> Discord slash command → OpenWeatherMap API → formatted embed. Single-file cog pattern.\n\t\tEnvironment\n\t\t> /home/user/weatherbot, python bot.py, needs DISCORD_TOKEN + WEATHER_API_KEY in .env\n\tCodebase\n\t\tEntry point — bot.py, start: python bot.py\n\t\tCore modules\n\t\t\tweather_cog.py — WeatherCog(Cog); fetch_forecast(city: str) → discord.Embed\n\t\t\tformatter.py — format_embed(data: dict) → discord.Embed\n\t\tHelpers / Utilities\n\t\t\tapi_client.py — get_weather(city: str) → dict; wraps HTTP to OpenWeatherMap\n\t\tConfig / Constants — .env: DISCORD_TOKEN, WEATHER_API_KEY, DEFAULT_CITY\n\t\tTests — pytest, test_weather_cog.py (3 tests)\n\tUsage\n\t\tInstallation / Setup — pip install -r requirements.txt, cp .env.example .env\n\t\tCLI / API — /weather <city>, /forecast <city> (planned)\n\tContext\n\t\tInitiator — personal project, Mar 2026\n\t\tTarget audience — personal Discord server\n\t\tDependencies — discord.py, OpenWeatherMap API, aiohttp\n\tNext Steps\n\t\tImplement /forecast command\n\t\t> Multi-day view with daily highs/lows and weather icons per day\n\t\tAdd city autocomplete",
|
|
197
186
|
tags=["#discord", "#python", "#weather", "#bot"],
|
|
198
187
|
links=[]
|
|
199
188
|
)
|
|
200
189
|
```
|
|
201
190
|
|
|
202
|
-
Note: L2 nodes use 1 tab, L3 uses 2 tabs, L4 uses 3 tabs.
|
|
191
|
+
Note: L2 nodes use 1 tab, L3 uses 2 tabs, L4 uses 3 tabs. Use `title`+`body` for the root entry. For body text on sub-nodes inside `content`, use the `> ` prefix (unambiguous, no blank-line tricks). Skip empty sections — no need for placeholder text.
|
|
203
192
|
|
|
204
193
|
### E-Entry Schema (auto-scaffolded)
|
|
205
194
|
|
|
@@ -291,15 +280,19 @@ write_memory(
|
|
|
291
280
|
- Not "Fixed a bug" — instead explain root cause, fix, and impact
|
|
292
281
|
|
|
293
282
|
**With title + body (recommended):**
|
|
294
|
-
```
|
|
295
|
-
write_memory(
|
|
283
|
+
```python
|
|
284
|
+
write_memory(
|
|
285
|
+
prefix="L",
|
|
286
|
+
title="hmem.py Performance: Bulk-Queries statt N+1",
|
|
287
|
+
body="Alle Nodes in 2 Bulk-Queries laden, nicht pro Entry einzeln.\nVorher: load_nodes() pro Entry = N+1 SQLite-Connections.",
|
|
288
|
+
content="\tImplementation detail\n\t\tChanged read() to batch-fetch all nodes for visible entries in one query"
|
|
289
|
+
)
|
|
296
290
|
```
|
|
297
291
|
|
|
298
|
-
**Without body (simple entries,
|
|
292
|
+
**Without body (simple entries, still works):**
|
|
293
|
+
```python
|
|
294
|
+
write_memory(prefix="E", title="SQLite connection failed due to wrong path in .mcp.json", content="\tFix: use absolute path in env var")
|
|
299
295
|
```
|
|
300
|
-
write_memory(prefix="E", content="SQLite connection failed due to wrong path in .mcp.json\n\tFix: use absolute path in env var")
|
|
301
|
-
```
|
|
302
|
-
Title auto-extracted: `"SQLite connection failed due to wrong path in .mc"`
|
|
303
296
|
|
|
304
297
|
---
|
|
305
298
|
|
|
@@ -403,10 +396,21 @@ Use `update_memory` and `append_memory` to modify entries without deleting and r
|
|
|
403
396
|
|
|
404
397
|
Updates the text of a single node. Children are **not** touched.
|
|
405
398
|
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
update_memory(id="L0003
|
|
409
|
-
|
|
399
|
+
```python
|
|
400
|
+
# Update title only
|
|
401
|
+
update_memory(id="L0003", content="Corrected summary — new wording")
|
|
402
|
+
|
|
403
|
+
# Update body only (title preserved automatically)
|
|
404
|
+
update_memory(id="L0003", body="New detailed explanation here.")
|
|
405
|
+
|
|
406
|
+
# Update both title and body
|
|
407
|
+
update_memory(id="L0003", content="New short title", body="New detailed body text.")
|
|
408
|
+
|
|
409
|
+
# Update sub-node
|
|
410
|
+
update_memory(id="L0003.2", content="Fixed sub-node title", body="Sub-node body.")
|
|
411
|
+
|
|
412
|
+
# Also update links
|
|
413
|
+
update_memory(id="D0010", content="New title", links=["E0042"])
|
|
410
414
|
```
|
|
411
415
|
|
|
412
416
|
Use when: the wording is wrong, outdated, or needs clarification.
|
|
@@ -415,34 +419,21 @@ Use when: the wording is wrong, outdated, or needs clarification.
|
|
|
415
419
|
|
|
416
420
|
Appends new child nodes under an existing root or node. Existing children are preserved.
|
|
417
421
|
|
|
418
|
-
|
|
419
|
-
|
|
422
|
+
```python
|
|
423
|
+
# Preferred: explicit title + body
|
|
424
|
+
append_memory(id="L0003", title="New finding", body="Detailed explanation of what was found.\nCan span multiple lines.")
|
|
420
425
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
> the schema. You must target a specific section: `append_memory(id="P0029.3", content="...")`.
|
|
424
|
-
> For entries without a schema (L, D, E, etc. by default), root appends are allowed.
|
|
426
|
+
# With sub-nodes (complex mode)
|
|
427
|
+
append_memory(id="L0003", content="New finding\n\tSub-detail\n\t\tDeep detail")
|
|
425
428
|
|
|
429
|
+
# Append to a specific section node
|
|
430
|
+
append_memory(id="P0029.3", title="New usage example", body="Run: hmem serve --port 3100")
|
|
426
431
|
```
|
|
427
|
-
append_memory(
|
|
428
|
-
id="L0003",
|
|
429
|
-
content="New finding discovered later\n\nDetailed explanation of what was found and why it matters.\nThis can span multiple lines.\n\tSub-detail about it"
|
|
430
|
-
)
|
|
431
|
-
# → adds L0003.N (L2 with title + body) and L0003.N.1 (L3)
|
|
432
|
-
# ↑ only works if L has no schema defined; use L0003.N for schema-constrained entries
|
|
433
432
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
)
|
|
438
|
-
# → adds P0029.3.M (L3 under section .3) — correct way for schema-constrained entries
|
|
439
|
-
|
|
440
|
-
append_memory(
|
|
441
|
-
id="L0003.2",
|
|
442
|
-
content="Extra note under L0003.2"
|
|
443
|
-
)
|
|
444
|
-
# → adds L0003.2.M (L3)
|
|
445
|
-
```
|
|
433
|
+
> **Schema enforcement:** For entries with a defined schema (e.g., all P-entries), appending
|
|
434
|
+
> to the root (e.g., `id="P0029"`) is **blocked** — that would create a new L2 section outside
|
|
435
|
+
> the schema. You must target a specific section: `append_memory(id="P0029.3", ...)`.
|
|
436
|
+
> For entries without a schema (L, D, E, etc. by default), root appends are allowed.
|
|
446
437
|
|
|
447
438
|
Use when: you have new context to add without replacing what's there.
|
|
448
439
|
|