memhook 0.2.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 +105 -0
- package/LICENSE +21 -0
- package/README.md +204 -0
- package/dist/bin/memhook.d.ts +16 -0
- package/dist/bin/memhook.d.ts.map +1 -0
- package/dist/bin/memhook.js +122 -0
- package/dist/bin/memhook.js.map +1 -0
- package/dist/src/cache.d.ts +30 -0
- package/dist/src/cache.d.ts.map +1 -0
- package/dist/src/cache.js +80 -0
- package/dist/src/cache.js.map +1 -0
- package/dist/src/catalog.d.ts +20 -0
- package/dist/src/catalog.d.ts.map +1 -0
- package/dist/src/catalog.js +152 -0
- package/dist/src/catalog.js.map +1 -0
- package/dist/src/config.d.ts +60 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +172 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/configFile.d.ts +54 -0
- package/dist/src/configFile.d.ts.map +1 -0
- package/dist/src/configFile.js +51 -0
- package/dist/src/configFile.js.map +1 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +19 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/preFilter.d.ts +16 -0
- package/dist/src/preFilter.d.ts.map +1 -0
- package/dist/src/preFilter.js +40 -0
- package/dist/src/preFilter.js.map +1 -0
- package/dist/src/providers/anthropic.d.ts +33 -0
- package/dist/src/providers/anthropic.d.ts.map +1 -0
- package/dist/src/providers/anthropic.js +98 -0
- package/dist/src/providers/anthropic.js.map +1 -0
- package/dist/src/providers/factory.d.ts +15 -0
- package/dist/src/providers/factory.d.ts.map +1 -0
- package/dist/src/providers/factory.js +37 -0
- package/dist/src/providers/factory.js.map +1 -0
- package/dist/src/providers/http.d.ts +34 -0
- package/dist/src/providers/http.d.ts.map +1 -0
- package/dist/src/providers/http.js +60 -0
- package/dist/src/providers/http.js.map +1 -0
- package/dist/src/providers/ollama.d.ts +30 -0
- package/dist/src/providers/ollama.d.ts.map +1 -0
- package/dist/src/providers/ollama.js +89 -0
- package/dist/src/providers/ollama.js.map +1 -0
- package/dist/src/providers/openai.d.ts +31 -0
- package/dist/src/providers/openai.d.ts.map +1 -0
- package/dist/src/providers/openai.js +94 -0
- package/dist/src/providers/openai.js.map +1 -0
- package/dist/src/providers/types.d.ts +48 -0
- package/dist/src/providers/types.d.ts.map +1 -0
- package/dist/src/providers/types.js +18 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/router.d.ts +32 -0
- package/dist/src/router.d.ts.map +1 -0
- package/dist/src/router.js +342 -0
- package/dist/src/router.js.map +1 -0
- package/dist/src/version.d.ts +13 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/src/version.js +13 -0
- package/dist/src/version.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memhook router — UserPromptSubmit hook entry point.
|
|
3
|
+
*
|
|
4
|
+
* Port of ~/.claude/hooks/memory-guard.sh (Phase 0.5 r5, 2026-05-28).
|
|
5
|
+
*
|
|
6
|
+
* Pipeline:
|
|
7
|
+
* 1. Parse stdin: {"prompt", "cwd"}
|
|
8
|
+
* 2. Toggle gate (config.enabled)
|
|
9
|
+
* 3. Pre-filter trivial prompts (skip LLM entirely)
|
|
10
|
+
* 4. Catalog & API key checks
|
|
11
|
+
* 5. Local LRU cache (key: prompt + catalog_mtime + cwd + script_version)
|
|
12
|
+
* 6. Provider call (Haiku 4.5 default, ttl 1h ephemeral)
|
|
13
|
+
* 7. Parse JSON array of basenames, sanitise
|
|
14
|
+
* 8. Read selected files with cap-by-tokens fix (projected size check)
|
|
15
|
+
* 9. Emit {"hookSpecificOutput": {"additionalContext": "..."}}
|
|
16
|
+
* 10. Append JSONL log entry
|
|
17
|
+
*
|
|
18
|
+
* Fail-soft: every error path falls back to empty additionalContext.
|
|
19
|
+
* Never blocks Claude Code.
|
|
20
|
+
*/
|
|
21
|
+
export interface HookInput {
|
|
22
|
+
prompt: string;
|
|
23
|
+
cwd?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface HookOutput {
|
|
26
|
+
hookSpecificOutput: {
|
|
27
|
+
hookEventName: "UserPromptSubmit";
|
|
28
|
+
additionalContext: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export declare function route(stdinJson: string, env?: NodeJS.ProcessEnv): Promise<HookOutput>;
|
|
32
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAkBH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE;QAClB,aAAa,EAAE,kBAAkB,CAAC;QAClC,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAuBD,wBAAsB,KAAK,CACzB,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,UAAU,CAAC,CA0JrB"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memhook router — UserPromptSubmit hook entry point.
|
|
3
|
+
*
|
|
4
|
+
* Port of ~/.claude/hooks/memory-guard.sh (Phase 0.5 r5, 2026-05-28).
|
|
5
|
+
*
|
|
6
|
+
* Pipeline:
|
|
7
|
+
* 1. Parse stdin: {"prompt", "cwd"}
|
|
8
|
+
* 2. Toggle gate (config.enabled)
|
|
9
|
+
* 3. Pre-filter trivial prompts (skip LLM entirely)
|
|
10
|
+
* 4. Catalog & API key checks
|
|
11
|
+
* 5. Local LRU cache (key: prompt + catalog_mtime + cwd + script_version)
|
|
12
|
+
* 6. Provider call (Haiku 4.5 default, ttl 1h ephemeral)
|
|
13
|
+
* 7. Parse JSON array of basenames, sanitise
|
|
14
|
+
* 8. Read selected files with cap-by-tokens fix (projected size check)
|
|
15
|
+
* 9. Emit {"hookSpecificOutput": {"additionalContext": "..."}}
|
|
16
|
+
* 10. Append JSONL log entry
|
|
17
|
+
*
|
|
18
|
+
* Fail-soft: every error path falls back to empty additionalContext.
|
|
19
|
+
* Never blocks Claude Code.
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync, readFileSync, statSync, appendFileSync, mkdirSync, readdirSync, } from "node:fs";
|
|
22
|
+
import { join, dirname, basename } from "node:path";
|
|
23
|
+
import { LocalCache } from "./cache.js";
|
|
24
|
+
import { loadConfig } from "./config.js";
|
|
25
|
+
import { PreFilter } from "./preFilter.js";
|
|
26
|
+
import { createProvider } from "./providers/factory.js";
|
|
27
|
+
const SAFE_BASENAME_RE = /^[A-Za-z0-9._-]+\.md$/;
|
|
28
|
+
const EMPTY = {
|
|
29
|
+
hookSpecificOutput: {
|
|
30
|
+
hookEventName: "UserPromptSubmit",
|
|
31
|
+
additionalContext: "",
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
export async function route(stdinJson, env = process.env) {
|
|
35
|
+
const config = loadConfig(env);
|
|
36
|
+
ensureDirs(config);
|
|
37
|
+
evictStale(config);
|
|
38
|
+
if (!config.enabled)
|
|
39
|
+
return EMPTY;
|
|
40
|
+
let input;
|
|
41
|
+
try {
|
|
42
|
+
input = JSON.parse(stdinJson);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return EMPTY;
|
|
46
|
+
}
|
|
47
|
+
if (!input.prompt || typeof input.prompt !== "string")
|
|
48
|
+
return EMPTY;
|
|
49
|
+
const cwd = input.cwd ?? process.cwd();
|
|
50
|
+
const preFilter = new PreFilter(config.preFilter.trivialWordsFile, config.preFilter.defaultWords);
|
|
51
|
+
if (config.preFilter.enabled && preFilter.isTrivial(input.prompt)) {
|
|
52
|
+
logEntry(config, baseLog(input.prompt, "pre_filter_skip"));
|
|
53
|
+
return EMPTY;
|
|
54
|
+
}
|
|
55
|
+
if (!existsSync(config.catalog.path)) {
|
|
56
|
+
logEntry(config, baseLog(input.prompt, "no_catalog"));
|
|
57
|
+
return EMPTY;
|
|
58
|
+
}
|
|
59
|
+
// Provider-aware key gate: local providers (Ollama) need no API key.
|
|
60
|
+
const needsKey = config.provider.type !== "ollama";
|
|
61
|
+
const apiKey = config.provider.apiKeyEnv ? env[config.provider.apiKeyEnv] : undefined;
|
|
62
|
+
if (needsKey && !apiKey) {
|
|
63
|
+
logEntry(config, baseLog(input.prompt, "no_api_key"));
|
|
64
|
+
return EMPTY;
|
|
65
|
+
}
|
|
66
|
+
const catalogStat = statSync(config.catalog.path);
|
|
67
|
+
const cache = new LocalCache(config.cache.dir, config.cache.ttlMin, config.cache.evictionDays);
|
|
68
|
+
const cacheKey = config.cache.enabled
|
|
69
|
+
? cache.key({
|
|
70
|
+
prompt: input.prompt,
|
|
71
|
+
catalogMtimeMs: catalogStat.mtimeMs,
|
|
72
|
+
cwd,
|
|
73
|
+
scriptVersion: config.scriptVersion,
|
|
74
|
+
provider: `${config.provider.type}:${config.provider.model}`,
|
|
75
|
+
})
|
|
76
|
+
: "";
|
|
77
|
+
let selectedJson = "";
|
|
78
|
+
let fromCache = false;
|
|
79
|
+
let usage = {
|
|
80
|
+
inputTokens: 0,
|
|
81
|
+
outputTokens: 0,
|
|
82
|
+
cacheCreateTokens: 0,
|
|
83
|
+
cacheReadTokens: 0,
|
|
84
|
+
};
|
|
85
|
+
let latencyMs = 0;
|
|
86
|
+
if (config.cache.enabled) {
|
|
87
|
+
const hit = cache.get(cacheKey);
|
|
88
|
+
// Only trust a cache entry that still parses to a string array; a corrupted
|
|
89
|
+
// entry is treated as a miss (we re-fetch) rather than killing the turn.
|
|
90
|
+
if (hit !== null && parseBasenames(hit) !== null) {
|
|
91
|
+
selectedJson = hit;
|
|
92
|
+
fromCache = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!fromCache) {
|
|
96
|
+
const catalogContent = readFileSync(config.catalog.path, "utf8");
|
|
97
|
+
const systemPrompt = buildSystemPrompt(catalogContent);
|
|
98
|
+
// Provider construction can throw on bad config; the constructor `throw`s
|
|
99
|
+
// are reachable from the hook, so they MUST be caught here (fail-soft).
|
|
100
|
+
let provider;
|
|
101
|
+
try {
|
|
102
|
+
provider = createProvider(config, apiKey);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
logEntry(config, baseLog(input.prompt, "provider_init_failed"));
|
|
106
|
+
return EMPTY;
|
|
107
|
+
}
|
|
108
|
+
let resp;
|
|
109
|
+
try {
|
|
110
|
+
resp = await provider.select({
|
|
111
|
+
systemPrompt,
|
|
112
|
+
userPrompt: input.prompt,
|
|
113
|
+
maxOutputTokens: config.selection.maxOutputTokens,
|
|
114
|
+
timeoutMs: config.selection.curlTimeoutMs,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
logEntry(config, baseLog(input.prompt, "api_no_response"));
|
|
119
|
+
return EMPTY;
|
|
120
|
+
}
|
|
121
|
+
latencyMs = resp.latencyMs;
|
|
122
|
+
usage = resp.usage;
|
|
123
|
+
if (!resp.rawText) {
|
|
124
|
+
logEntry(config, {
|
|
125
|
+
...baseLog(input.prompt, "api_no_content"),
|
|
126
|
+
latencyMs,
|
|
127
|
+
tokensIn: usage.inputTokens,
|
|
128
|
+
tokensOut: usage.outputTokens,
|
|
129
|
+
cacheCreate: usage.cacheCreateTokens,
|
|
130
|
+
cacheRead: usage.cacheReadTokens,
|
|
131
|
+
});
|
|
132
|
+
return EMPTY;
|
|
133
|
+
}
|
|
134
|
+
const extracted = extractJsonArray(resp.rawText);
|
|
135
|
+
if (extracted === null) {
|
|
136
|
+
logEntry(config, {
|
|
137
|
+
...baseLog(input.prompt, "parse_invalid"),
|
|
138
|
+
latencyMs,
|
|
139
|
+
tokensIn: usage.inputTokens,
|
|
140
|
+
tokensOut: usage.outputTokens,
|
|
141
|
+
cacheCreate: usage.cacheCreateTokens,
|
|
142
|
+
cacheRead: usage.cacheReadTokens,
|
|
143
|
+
});
|
|
144
|
+
return EMPTY;
|
|
145
|
+
}
|
|
146
|
+
selectedJson = JSON.stringify(extracted);
|
|
147
|
+
if (config.cache.enabled && selectedJson !== "[]") {
|
|
148
|
+
cache.put(cacheKey, selectedJson);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// selectedJson is a validated cache entry or a fresh `JSON.stringify` of a
|
|
152
|
+
// string array, so this parse is safe by construction; `?? []` is a final
|
|
153
|
+
// fail-soft backstop that never lets a malformed value throw out of route().
|
|
154
|
+
const basenames = parseBasenames(selectedJson) ?? [];
|
|
155
|
+
const { additional, injected, allBasenames } = readSelected(basenames, cwd, config);
|
|
156
|
+
let status;
|
|
157
|
+
if (fromCache && injected > 0)
|
|
158
|
+
status = "cache_hit";
|
|
159
|
+
else if (injected > 0)
|
|
160
|
+
status = "ok";
|
|
161
|
+
else if (selectedJson === "[]")
|
|
162
|
+
status = "empty_selection";
|
|
163
|
+
else
|
|
164
|
+
status = "all_unfound";
|
|
165
|
+
logEntry(config, {
|
|
166
|
+
ts: nowIso(),
|
|
167
|
+
promptPreview: input.prompt.slice(0, 80),
|
|
168
|
+
selected: allBasenames,
|
|
169
|
+
latencyMs,
|
|
170
|
+
tokensIn: usage.inputTokens,
|
|
171
|
+
tokensOut: usage.outputTokens,
|
|
172
|
+
cacheCreate: usage.cacheCreateTokens,
|
|
173
|
+
cacheRead: usage.cacheReadTokens,
|
|
174
|
+
additionalSizeChars: additional.length,
|
|
175
|
+
additionalSizeTokensEst: Math.floor(additional.length / 4),
|
|
176
|
+
status,
|
|
177
|
+
});
|
|
178
|
+
return {
|
|
179
|
+
hookSpecificOutput: {
|
|
180
|
+
hookEventName: "UserPromptSubmit",
|
|
181
|
+
additionalContext: additional,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function buildSystemPrompt(catalog) {
|
|
186
|
+
return `Tu es un sélecteur de mémoire pour Claude Code. Tu identifies les feedbacks et règles pertinents pour le prompt utilisateur. Tu réponds UNIQUEMENT avec un JSON array de basenames .md, sans explication, sans markdown code fence.
|
|
187
|
+
|
|
188
|
+
Voici les memory feedbacks + rules disponibles (sections par type, sous-sections par repo, [CWD] = repo courant à prioriser) :
|
|
189
|
+
|
|
190
|
+
${catalog}
|
|
191
|
+
|
|
192
|
+
Sélectionne 0 à 5 fichiers (basenames .md) dont le contenu sera DIRECTEMENT pertinent pour la demande utilisateur qui suit.
|
|
193
|
+
|
|
194
|
+
Critères :
|
|
195
|
+
- Feedback comportemental qui matche l'action (git, crypto, design, commit, etc.)
|
|
196
|
+
- Rule globale qui contraint la zone touchée
|
|
197
|
+
- Project memory qui décrit une décision déjà prise
|
|
198
|
+
- Memory ou rule du repo CWD (marqué [CWD]) — prioriser en cas de collision basename cross-repo
|
|
199
|
+
|
|
200
|
+
RÈGLES STRICTES POUR LES BASENAMES :
|
|
201
|
+
1. Copie le basename EXACT tel qu'il apparaît dans le catalog (avec préfixe \`feedback_\` ou \`project_\` si présent)
|
|
202
|
+
2. NE substitue PAS \`_\` par \`-\` ou inverse — les rules sont en kebab-case (\`crypto-standards.md\`), les memory en snake_case (\`feedback_X.md\`)
|
|
203
|
+
3. NE tronque PAS le préfixe : \`feedback_commit_without_asking.md\` reste avec son préfixe
|
|
204
|
+
4. N'invente JAMAIS un basename absent du catalog
|
|
205
|
+
|
|
206
|
+
Format réponse : JSON array de basenames sur UNE SEULE LIGNE.
|
|
207
|
+
Exemple correct : ["feedback_commit_without_asking.md", "crypto-standards.md"]
|
|
208
|
+
Si rien n'est pertinent : []
|
|
209
|
+
Pas d'explication, pas de markdown code fence.`;
|
|
210
|
+
}
|
|
211
|
+
/** Strictly parse a JSON string into a string array, or null if it isn't one. */
|
|
212
|
+
function parseBasenames(raw) {
|
|
213
|
+
try {
|
|
214
|
+
const parsed = JSON.parse(raw);
|
|
215
|
+
if (!Array.isArray(parsed))
|
|
216
|
+
return null;
|
|
217
|
+
return parsed.filter((x) => typeof x === "string");
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function extractJsonArray(text) {
|
|
224
|
+
const flat = text.replace(/\n/g, " ");
|
|
225
|
+
const match = flat.match(/\[[^\]]*\]/);
|
|
226
|
+
if (!match)
|
|
227
|
+
return null;
|
|
228
|
+
try {
|
|
229
|
+
const parsed = JSON.parse(match[0]);
|
|
230
|
+
if (!Array.isArray(parsed))
|
|
231
|
+
return null;
|
|
232
|
+
return parsed.filter((x) => typeof x === "string");
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function readSelected(basenames, cwd, config) {
|
|
239
|
+
// Build search dirs: ~/.claude/projects/*/memory + global rules + cwd rules.
|
|
240
|
+
const projectDirs = listProjectsMemoryDirs(config.searchDirs[0]);
|
|
241
|
+
const rulesDir = config.searchDirs[1];
|
|
242
|
+
const cwdRulesDir = join(cwd, ".claude", "rules");
|
|
243
|
+
const dirs = [...projectDirs, rulesDir, cwdRulesDir].filter((d) => typeof d === "string" && d.length > 0);
|
|
244
|
+
let additional = "";
|
|
245
|
+
let injected = 0;
|
|
246
|
+
const seen = [];
|
|
247
|
+
for (const name of basenames) {
|
|
248
|
+
if (injected >= config.selection.maxFiles)
|
|
249
|
+
break;
|
|
250
|
+
if (!SAFE_BASENAME_RE.test(name))
|
|
251
|
+
continue;
|
|
252
|
+
seen.push(name);
|
|
253
|
+
for (const dir of dirs) {
|
|
254
|
+
const file = join(dir, name);
|
|
255
|
+
if (!existsSync(file))
|
|
256
|
+
continue;
|
|
257
|
+
// Cap-A1 projection check — pre-injection, allow ≥1 file always.
|
|
258
|
+
const content = readFileSync(file, "utf8");
|
|
259
|
+
const projected = additional.length + content.length + 64;
|
|
260
|
+
if (injected > 0 && projected > config.selection.maxAdditionalChars) {
|
|
261
|
+
return { additional, injected, allBasenames: seen };
|
|
262
|
+
}
|
|
263
|
+
additional += `\n\n<!-- ${name} (from ${basename(dir)}) -->\n${content}`;
|
|
264
|
+
injected++;
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return { additional, injected, allBasenames: seen };
|
|
269
|
+
}
|
|
270
|
+
function listProjectsMemoryDirs(projectsRoot) {
|
|
271
|
+
if (!projectsRoot)
|
|
272
|
+
return [];
|
|
273
|
+
let entries = [];
|
|
274
|
+
try {
|
|
275
|
+
entries = readdirSync(projectsRoot);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
return [];
|
|
279
|
+
}
|
|
280
|
+
const out = [];
|
|
281
|
+
for (const e of entries) {
|
|
282
|
+
const mem = join(projectsRoot, e, "memory");
|
|
283
|
+
if (existsSync(mem))
|
|
284
|
+
out.push(mem);
|
|
285
|
+
}
|
|
286
|
+
return out;
|
|
287
|
+
}
|
|
288
|
+
function ensureDirs(config) {
|
|
289
|
+
mkdirSync(dirname(config.logging.jsonlPath), { recursive: true });
|
|
290
|
+
mkdirSync(config.cache.dir, { recursive: true });
|
|
291
|
+
}
|
|
292
|
+
function evictStale(config) {
|
|
293
|
+
if (!config.cache.enabled)
|
|
294
|
+
return;
|
|
295
|
+
try {
|
|
296
|
+
const cache = new LocalCache(config.cache.dir, config.cache.ttlMin, config.cache.evictionDays);
|
|
297
|
+
cache.evictStale();
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
// silent — eviction is best-effort
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function baseLog(prompt, status) {
|
|
304
|
+
return {
|
|
305
|
+
ts: nowIso(),
|
|
306
|
+
promptPreview: prompt.slice(0, 80),
|
|
307
|
+
selected: [],
|
|
308
|
+
latencyMs: 0,
|
|
309
|
+
tokensIn: 0,
|
|
310
|
+
tokensOut: 0,
|
|
311
|
+
cacheCreate: 0,
|
|
312
|
+
cacheRead: 0,
|
|
313
|
+
additionalSizeChars: 0,
|
|
314
|
+
additionalSizeTokensEst: 0,
|
|
315
|
+
status,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function logEntry(config, entry) {
|
|
319
|
+
try {
|
|
320
|
+
const line = JSON.stringify({
|
|
321
|
+
ts: entry.ts,
|
|
322
|
+
prompt_preview: entry.promptPreview,
|
|
323
|
+
selected: entry.selected,
|
|
324
|
+
latency_ms: entry.latencyMs,
|
|
325
|
+
tokens_in: entry.tokensIn,
|
|
326
|
+
tokens_out: entry.tokensOut,
|
|
327
|
+
cache_create: entry.cacheCreate,
|
|
328
|
+
cache_read: entry.cacheRead,
|
|
329
|
+
additional_size_chars: entry.additionalSizeChars,
|
|
330
|
+
additional_size_tokens_est: entry.additionalSizeTokensEst,
|
|
331
|
+
status: entry.status,
|
|
332
|
+
});
|
|
333
|
+
appendFileSync(config.logging.jsonlPath, line + "\n", "utf8");
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
// silent — logging is best-effort, never block hook
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
function nowIso() {
|
|
340
|
+
return new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for memhook's version string at runtime.
|
|
3
|
+
*
|
|
4
|
+
* Imported by `src/config.ts` (the cache-key `scriptVersion` token) and
|
|
5
|
+
* `bin/memhook.ts` (the `version` / `--help` banner). This constant reflects
|
|
6
|
+
* the LAST RELEASED version and is bumped automatically by release-please: it
|
|
7
|
+
* is listed in `release-please-config.json` `extra-files`, and the
|
|
8
|
+
* `x-release-please-version` annotation below tells release-please to rewrite
|
|
9
|
+
* the literal in lockstep with `package.json` + `.release-please-manifest.json`.
|
|
10
|
+
* Do not bump it by hand.
|
|
11
|
+
*/
|
|
12
|
+
export declare const MEMHOOK_VERSION = "0.2.0";
|
|
13
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for memhook's version string at runtime.
|
|
3
|
+
*
|
|
4
|
+
* Imported by `src/config.ts` (the cache-key `scriptVersion` token) and
|
|
5
|
+
* `bin/memhook.ts` (the `version` / `--help` banner). This constant reflects
|
|
6
|
+
* the LAST RELEASED version and is bumped automatically by release-please: it
|
|
7
|
+
* is listed in `release-please-config.json` `extra-files`, and the
|
|
8
|
+
* `x-release-please-version` annotation below tells release-please to rewrite
|
|
9
|
+
* the literal in lockstep with `package.json` + `.release-please-manifest.json`.
|
|
10
|
+
* Do not bump it by hand.
|
|
11
|
+
*/
|
|
12
|
+
export const MEMHOOK_VERSION = "0.2.0"; // x-release-please-version
|
|
13
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,2BAA2B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "memhook",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Semantic memory router for Claude Code — picks relevant feedbacks & rules per prompt via Haiku, injects them as additionalContext.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "wox <hello@utilia-ai.com>",
|
|
8
|
+
"homepage": "https://github.com/utilia-ai-wox/memhook",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/utilia-ai-wox/memhook.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/utilia-ai-wox/memhook/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"claude-code",
|
|
18
|
+
"claude",
|
|
19
|
+
"anthropic",
|
|
20
|
+
"memory",
|
|
21
|
+
"hook",
|
|
22
|
+
"userpromptsubmit",
|
|
23
|
+
"semantic-router",
|
|
24
|
+
"haiku"
|
|
25
|
+
],
|
|
26
|
+
"bin": {
|
|
27
|
+
"memhook": "./dist/bin/memhook.js"
|
|
28
|
+
},
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/src/index.d.ts",
|
|
32
|
+
"import": "./dist/src/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./hook": {
|
|
35
|
+
"types": "./dist/src/router.d.ts",
|
|
36
|
+
"import": "./dist/src/router.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"README.md",
|
|
42
|
+
"LICENSE",
|
|
43
|
+
"CHANGELOG.md"
|
|
44
|
+
],
|
|
45
|
+
"scripts": {
|
|
46
|
+
"clean": "node scripts/clean.mjs",
|
|
47
|
+
"prebuild": "node scripts/clean.mjs",
|
|
48
|
+
"build": "tsc -p tsconfig.json",
|
|
49
|
+
"dev": "tsc -w -p tsconfig.json",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"test:watch": "vitest",
|
|
52
|
+
"typecheck": "tsc --noEmit",
|
|
53
|
+
"lint": "eslint .",
|
|
54
|
+
"lint:fix": "eslint . --fix",
|
|
55
|
+
"format": "prettier --write .",
|
|
56
|
+
"format:check": "prettier --check .",
|
|
57
|
+
"prepare": "husky",
|
|
58
|
+
"prepublishOnly": "npm run typecheck && npm run lint && npm test && npm run build"
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=18.0.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@commitlint/cli": "^19.0.0",
|
|
65
|
+
"@commitlint/config-conventional": "^19.0.0",
|
|
66
|
+
"@eslint/js": "^9.0.0",
|
|
67
|
+
"@types/node": "^22.0.0",
|
|
68
|
+
"eslint": "^9.0.0",
|
|
69
|
+
"husky": "^9.0.0",
|
|
70
|
+
"lint-staged": "^15.0.0",
|
|
71
|
+
"prettier": "^3.0.0",
|
|
72
|
+
"typescript": "^5.5.0",
|
|
73
|
+
"typescript-eslint": "^8.0.0",
|
|
74
|
+
"vitest": "^2.0.0"
|
|
75
|
+
},
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"yaml": "^2.9.0"
|
|
78
|
+
},
|
|
79
|
+
"lint-staged": {
|
|
80
|
+
"*.{ts,js,mjs,cjs}": [
|
|
81
|
+
"prettier --write",
|
|
82
|
+
"eslint --fix"
|
|
83
|
+
],
|
|
84
|
+
"*.{json,yml,yaml,md}": [
|
|
85
|
+
"prettier --write"
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
}
|