claude-code-memory 1.0.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 +21 -0
- package/LICENSE +21 -0
- package/README.md +195 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +550 -0
- package/dist/cli.js.map +1 -0
- package/dist/extractor.d.ts +10 -0
- package/dist/extractor.d.ts.map +1 -0
- package/dist/extractor.js +323 -0
- package/dist/extractor.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +249 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +12 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +204 -0
- package/dist/install.js.map +1 -0
- package/dist/llm.d.ts +13 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +165 -0
- package/dist/llm.js.map +1 -0
- package/dist/store.d.ts +57 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +452 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const readline = __importStar(require("readline"));
|
|
40
|
+
const store_1 = require("./store");
|
|
41
|
+
const llm_1 = require("./llm");
|
|
42
|
+
// --- Colors (no dependencies) ---
|
|
43
|
+
const c = {
|
|
44
|
+
reset: "\x1b[0m",
|
|
45
|
+
bold: "\x1b[1m",
|
|
46
|
+
dim: "\x1b[2m",
|
|
47
|
+
green: "\x1b[32m",
|
|
48
|
+
yellow: "\x1b[33m",
|
|
49
|
+
blue: "\x1b[34m",
|
|
50
|
+
magenta: "\x1b[35m",
|
|
51
|
+
cyan: "\x1b[36m",
|
|
52
|
+
red: "\x1b[31m",
|
|
53
|
+
gray: "\x1b[90m",
|
|
54
|
+
};
|
|
55
|
+
function ok(msg) { console.log(` ${c.green}✓${c.reset} ${msg}`); }
|
|
56
|
+
function skip(msg) { console.log(` ${c.gray}·${c.reset} ${c.gray}${msg}${c.reset}`); }
|
|
57
|
+
function warn(msg) { console.log(` ${c.yellow}!${c.reset} ${msg}`); }
|
|
58
|
+
function err(msg) { console.error(` ${c.red}✗${c.reset} ${msg}`); }
|
|
59
|
+
function heading(msg) { console.log(`\n${c.bold}${msg}${c.reset}\n`); }
|
|
60
|
+
// --- Prompt ---
|
|
61
|
+
function ask(question) {
|
|
62
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
63
|
+
return new Promise((resolve) => {
|
|
64
|
+
rl.question(` ${question} `, (answer) => {
|
|
65
|
+
rl.close();
|
|
66
|
+
resolve(answer.trim());
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async function confirm(question) {
|
|
71
|
+
const answer = await ask(`${question} (Y/n)`);
|
|
72
|
+
return answer === "" || answer.toLowerCase().startsWith("y");
|
|
73
|
+
}
|
|
74
|
+
// --- Paths ---
|
|
75
|
+
const HOME = process.env.HOME || "";
|
|
76
|
+
const MEMORY_MCP_DIR = path.resolve(__dirname, "..");
|
|
77
|
+
const EXTRACTOR_PATH = path.join(MEMORY_MCP_DIR, "dist", "extractor.js");
|
|
78
|
+
const SERVER_PATH = path.join(MEMORY_MCP_DIR, "dist", "index.js");
|
|
79
|
+
const GLOBAL_CONFIG_DIR = path.join(HOME, ".memory-mcp");
|
|
80
|
+
const GLOBAL_CONFIG_PATH = path.join(GLOBAL_CONFIG_DIR, "config.json");
|
|
81
|
+
const GLOBAL_CLAUDE_SETTINGS = path.join(HOME, ".claude", "settings.json");
|
|
82
|
+
// --- Config ---
|
|
83
|
+
function readGlobalConfig() {
|
|
84
|
+
if (fs.existsSync(GLOBAL_CONFIG_PATH)) {
|
|
85
|
+
try {
|
|
86
|
+
return JSON.parse(fs.readFileSync(GLOBAL_CONFIG_PATH, "utf-8"));
|
|
87
|
+
}
|
|
88
|
+
catch { }
|
|
89
|
+
}
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
92
|
+
function writeGlobalConfig(config) {
|
|
93
|
+
if (!fs.existsSync(GLOBAL_CONFIG_DIR))
|
|
94
|
+
fs.mkdirSync(GLOBAL_CONFIG_DIR, { recursive: true });
|
|
95
|
+
fs.writeFileSync(GLOBAL_CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
96
|
+
}
|
|
97
|
+
function hasApiKey() {
|
|
98
|
+
if (process.env.ANTHROPIC_API_KEY)
|
|
99
|
+
return true;
|
|
100
|
+
const config = readGlobalConfig();
|
|
101
|
+
if (config.apiKey)
|
|
102
|
+
return true;
|
|
103
|
+
const candidates = [
|
|
104
|
+
path.join(HOME, ".config", "anthropic", "api_key"),
|
|
105
|
+
path.join(HOME, ".anthropic", "api_key"),
|
|
106
|
+
];
|
|
107
|
+
return candidates.some((p) => fs.existsSync(p));
|
|
108
|
+
}
|
|
109
|
+
// --- Hook Installation ---
|
|
110
|
+
function installHooks(settingsPath) {
|
|
111
|
+
const dir = path.dirname(settingsPath);
|
|
112
|
+
if (!fs.existsSync(dir))
|
|
113
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
114
|
+
let settings = {};
|
|
115
|
+
if (fs.existsSync(settingsPath)) {
|
|
116
|
+
try {
|
|
117
|
+
settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
settings = {};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (!settings.hooks)
|
|
124
|
+
settings.hooks = {};
|
|
125
|
+
const hookEntry = {
|
|
126
|
+
hooks: [{ type: "command", command: `node ${EXTRACTOR_PATH}`, timeout: 30 }],
|
|
127
|
+
};
|
|
128
|
+
let added = 0;
|
|
129
|
+
for (const event of ["Stop", "PreCompact", "SessionEnd"]) {
|
|
130
|
+
if (!settings.hooks[event])
|
|
131
|
+
settings.hooks[event] = [];
|
|
132
|
+
const exists = settings.hooks[event].some((h) => h.hooks?.some((hh) => hh.command?.includes("memory-mcp")));
|
|
133
|
+
if (!exists) {
|
|
134
|
+
settings.hooks[event].push(hookEntry);
|
|
135
|
+
added++;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
139
|
+
return { added };
|
|
140
|
+
}
|
|
141
|
+
// --- Commands ---
|
|
142
|
+
async function cmdSetup() {
|
|
143
|
+
console.log(`
|
|
144
|
+
${c.bold}${c.magenta} memory-mcp${c.reset} ${c.dim}— persistent memory for Claude Code${c.reset}
|
|
145
|
+
`);
|
|
146
|
+
// 1. API Key
|
|
147
|
+
heading("Step 1: API Key");
|
|
148
|
+
if (hasApiKey()) {
|
|
149
|
+
ok("API key found");
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
console.log(" The extractor needs an Anthropic API key to analyze transcripts.");
|
|
153
|
+
console.log(" It uses Haiku (very cheap — ~$0.001 per extraction).\n");
|
|
154
|
+
const key = await ask("Paste your ANTHROPIC_API_KEY:");
|
|
155
|
+
if (key) {
|
|
156
|
+
const config = readGlobalConfig();
|
|
157
|
+
config.apiKey = key;
|
|
158
|
+
writeGlobalConfig(config);
|
|
159
|
+
ok("API key saved to ~/.memory-mcp/config.json");
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
warn("No key provided. Set ANTHROPIC_API_KEY env var or run: memory-mcp setup");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// 2. Install mode
|
|
166
|
+
heading("Step 2: Install hooks");
|
|
167
|
+
const global = await confirm("Install globally? (works for all projects)");
|
|
168
|
+
if (global) {
|
|
169
|
+
const { added } = installHooks(GLOBAL_CLAUDE_SETTINGS);
|
|
170
|
+
if (added > 0) {
|
|
171
|
+
ok(`Installed ${added} hooks in ~/.claude/settings.json`);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
skip("Hooks already installed globally");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const projectDir = await ask("Project directory (or . for current):");
|
|
179
|
+
const absDir = path.resolve(projectDir || ".");
|
|
180
|
+
if (!fs.existsSync(absDir)) {
|
|
181
|
+
err(`Directory not found: ${absDir}`);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const settingsPath = path.join(absDir, ".claude", "settings.json");
|
|
185
|
+
const { added } = installHooks(settingsPath);
|
|
186
|
+
if (added > 0) {
|
|
187
|
+
ok(`Installed ${added} hooks in ${settingsPath}`);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
skip("Hooks already installed");
|
|
191
|
+
}
|
|
192
|
+
// Also add MCP server
|
|
193
|
+
installMcpConfig(absDir);
|
|
194
|
+
// Also add .gitignore
|
|
195
|
+
installGitignore(absDir);
|
|
196
|
+
}
|
|
197
|
+
// 3. Done
|
|
198
|
+
heading("Setup complete");
|
|
199
|
+
console.log(` How it works:
|
|
200
|
+
${c.cyan}1.${c.reset} Claude works normally — no commands needed
|
|
201
|
+
${c.cyan}2.${c.reset} After each response, a hook silently extracts memories
|
|
202
|
+
${c.cyan}3.${c.reset} Memories sync to CLAUDE.md automatically
|
|
203
|
+
${c.cyan}4.${c.reset} New session → reads CLAUDE.md → instant context
|
|
204
|
+
|
|
205
|
+
To add MCP tools (search, ask) to a project:
|
|
206
|
+
${c.bold}memory-mcp init ${c.dim}/path/to/project${c.reset}
|
|
207
|
+
`);
|
|
208
|
+
}
|
|
209
|
+
async function cmdInit(projectDir) {
|
|
210
|
+
const absDir = path.resolve(projectDir || ".");
|
|
211
|
+
if (!fs.existsSync(absDir)) {
|
|
212
|
+
err(`Directory not found: ${absDir}`);
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
heading(`Initializing memory-mcp for ${c.cyan}${absDir}${c.reset}`);
|
|
216
|
+
// .memory dir
|
|
217
|
+
const memDir = path.join(absDir, ".memory");
|
|
218
|
+
if (!fs.existsSync(memDir)) {
|
|
219
|
+
fs.mkdirSync(memDir, { recursive: true });
|
|
220
|
+
ok("Created .memory/");
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
skip(".memory/ exists");
|
|
224
|
+
}
|
|
225
|
+
// Hooks
|
|
226
|
+
const settingsPath = path.join(absDir, ".claude", "settings.json");
|
|
227
|
+
const { added } = installHooks(settingsPath);
|
|
228
|
+
if (added > 0)
|
|
229
|
+
ok(`Installed ${added} hooks`);
|
|
230
|
+
else
|
|
231
|
+
skip("Hooks already installed");
|
|
232
|
+
// MCP config
|
|
233
|
+
installMcpConfig(absDir);
|
|
234
|
+
// .gitignore
|
|
235
|
+
installGitignore(absDir);
|
|
236
|
+
// Project name
|
|
237
|
+
const store = new store_1.MemoryStore(absDir);
|
|
238
|
+
const state = store.getState();
|
|
239
|
+
if (!state.description) {
|
|
240
|
+
const name = await ask(`Project name [${path.basename(absDir)}]:`);
|
|
241
|
+
const desc = await ask("Brief description:");
|
|
242
|
+
store.setProject(name || path.basename(absDir), desc || "");
|
|
243
|
+
ok("Project initialized");
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
skip(`Project already named: ${state.project}`);
|
|
247
|
+
}
|
|
248
|
+
console.log(`
|
|
249
|
+
${c.green}Done!${c.reset} MCP tools available next time Claude Code starts.
|
|
250
|
+
`);
|
|
251
|
+
}
|
|
252
|
+
function installMcpConfig(absDir) {
|
|
253
|
+
const mcpPath = path.join(absDir, ".mcp.json");
|
|
254
|
+
let mcpConfig = {};
|
|
255
|
+
if (fs.existsSync(mcpPath)) {
|
|
256
|
+
try {
|
|
257
|
+
mcpConfig = JSON.parse(fs.readFileSync(mcpPath, "utf-8"));
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
mcpConfig = {};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (!mcpConfig.mcpServers)
|
|
264
|
+
mcpConfig.mcpServers = {};
|
|
265
|
+
if (!mcpConfig.mcpServers.memory) {
|
|
266
|
+
mcpConfig.mcpServers.memory = {
|
|
267
|
+
command: "node",
|
|
268
|
+
args: [SERVER_PATH, absDir],
|
|
269
|
+
};
|
|
270
|
+
fs.writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2));
|
|
271
|
+
ok("Added MCP server to .mcp.json");
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
skip("MCP server already in .mcp.json");
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
function installGitignore(absDir) {
|
|
278
|
+
const gitignorePath = path.join(absDir, ".gitignore");
|
|
279
|
+
if (fs.existsSync(gitignorePath)) {
|
|
280
|
+
const content = fs.readFileSync(gitignorePath, "utf-8");
|
|
281
|
+
if (!content.includes(".memory")) {
|
|
282
|
+
fs.appendFileSync(gitignorePath, "\n# Memory MCP\n.memory/\n");
|
|
283
|
+
ok("Added .memory/ to .gitignore");
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
skip(".memory/ already in .gitignore");
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
fs.writeFileSync(gitignorePath, "# Memory MCP\n.memory/\n");
|
|
291
|
+
ok("Created .gitignore");
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async function cmdStatus(projectDir) {
|
|
295
|
+
const absDir = path.resolve(projectDir || ".");
|
|
296
|
+
const memDir = path.join(absDir, ".memory");
|
|
297
|
+
heading(`memory-mcp status`);
|
|
298
|
+
// Check components
|
|
299
|
+
const hasMemDir = fs.existsSync(memDir);
|
|
300
|
+
const hasState = fs.existsSync(path.join(memDir, "state.json"));
|
|
301
|
+
const hasMcp = fs.existsSync(path.join(absDir, ".mcp.json"));
|
|
302
|
+
const hasHooks = checkHooksInstalled(absDir);
|
|
303
|
+
const hasKey = hasApiKey();
|
|
304
|
+
const hasClaudeMd = fs.existsSync(path.join(absDir, "CLAUDE.md"));
|
|
305
|
+
console.log(` ${c.bold}Project:${c.reset} ${absDir}`);
|
|
306
|
+
console.log(` ${c.bold}.memory/:${c.reset} ${hasMemDir ? c.green + "exists" : c.red + "missing"}${c.reset}`);
|
|
307
|
+
console.log(` ${c.bold}State:${c.reset} ${hasState ? c.green + "exists" : c.yellow + "empty"}${c.reset}`);
|
|
308
|
+
console.log(` ${c.bold}.mcp.json:${c.reset} ${hasMcp ? c.green + "configured" : c.red + "missing"}${c.reset}`);
|
|
309
|
+
console.log(` ${c.bold}Hooks:${c.reset} ${hasHooks ? c.green + "installed" : c.red + "not installed"}${c.reset}`);
|
|
310
|
+
console.log(` ${c.bold}API key:${c.reset} ${hasKey ? c.green + "found" : c.red + "missing"}${c.reset}`);
|
|
311
|
+
console.log(` ${c.bold}CLAUDE.md:${c.reset} ${hasClaudeMd ? c.green + "exists" : c.yellow + "not yet created"}${c.reset}`);
|
|
312
|
+
if (hasState) {
|
|
313
|
+
const store = new store_1.MemoryStore(absDir);
|
|
314
|
+
const counts = store.getAllMemoryCount();
|
|
315
|
+
const state = store.getState();
|
|
316
|
+
console.log("");
|
|
317
|
+
console.log(` ${c.bold}Memories:${c.reset} ${c.cyan}${counts.active}${c.reset} active, ${c.gray}${counts.archived} archived, ${counts.superseded} superseded${c.reset}`);
|
|
318
|
+
console.log(` ${c.bold}Extractions:${c.reset} ${state.extractionCount}`);
|
|
319
|
+
console.log(` ${c.bold}Last update:${c.reset} ${state.lastUpdated}`);
|
|
320
|
+
console.log(` ${c.bold}Last consolidation:${c.reset} ${state.lastConsolidation || "never"}`);
|
|
321
|
+
}
|
|
322
|
+
if (!hasMemDir || !hasHooks || !hasKey) {
|
|
323
|
+
console.log(`\n Run ${c.bold}memory-mcp setup${c.reset} to fix missing components.`);
|
|
324
|
+
}
|
|
325
|
+
console.log("");
|
|
326
|
+
}
|
|
327
|
+
function checkHooksInstalled(absDir) {
|
|
328
|
+
// Check project-level
|
|
329
|
+
const projectSettings = path.join(absDir, ".claude", "settings.json");
|
|
330
|
+
if (checkHooksInFile(projectSettings))
|
|
331
|
+
return true;
|
|
332
|
+
// Check global
|
|
333
|
+
return checkHooksInFile(GLOBAL_CLAUDE_SETTINGS);
|
|
334
|
+
}
|
|
335
|
+
function checkHooksInFile(settingsPath) {
|
|
336
|
+
if (!fs.existsSync(settingsPath))
|
|
337
|
+
return false;
|
|
338
|
+
try {
|
|
339
|
+
const settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
|
|
340
|
+
return settings.hooks?.Stop?.some((h) => h.hooks?.some((hh) => hh.command?.includes("memory-mcp"))) ?? false;
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
async function cmdSearch(query, projectDir) {
|
|
347
|
+
const absDir = path.resolve(projectDir || ".");
|
|
348
|
+
const store = new store_1.MemoryStore(absDir);
|
|
349
|
+
const results = store.searchMemories(query, 20);
|
|
350
|
+
if (results.length === 0) {
|
|
351
|
+
console.log(` No memories matching "${query}".`);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
heading(`${results.length} results for "${query}"`);
|
|
355
|
+
for (const m of results) {
|
|
356
|
+
const tags = m.tags.length ? ` ${c.dim}[${m.tags.join(", ")}]${c.reset}` : "";
|
|
357
|
+
const conf = m.confidence < 1 ? ` ${c.yellow}(${Math.round(m.confidence * 100)}%)${c.reset}` : "";
|
|
358
|
+
console.log(` ${c.cyan}${m.type}${c.reset} ${m.content}${tags}${conf}`);
|
|
359
|
+
console.log(` ${c.gray}${m.id}${c.reset}`);
|
|
360
|
+
console.log("");
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
async function cmdAsk(question, projectDir) {
|
|
364
|
+
const absDir = path.resolve(projectDir || ".");
|
|
365
|
+
const store = new store_1.MemoryStore(absDir);
|
|
366
|
+
const results = store.searchMemories(question, 30);
|
|
367
|
+
if (results.length === 0) {
|
|
368
|
+
console.log(" No relevant memories found.");
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
heading("Thinking...");
|
|
372
|
+
const prompt = (0, llm_1.buildAskPrompt)(question, results);
|
|
373
|
+
const answer = await (0, llm_1.callHaiku)(prompt, 1024);
|
|
374
|
+
if (answer) {
|
|
375
|
+
console.log(` ${answer}`);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
err("Could not reach LLM. Showing raw matches:");
|
|
379
|
+
for (const m of results.slice(0, 5)) {
|
|
380
|
+
console.log(` - (${m.type}) ${m.content}`);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
console.log("");
|
|
384
|
+
}
|
|
385
|
+
async function cmdConsolidate(projectDir) {
|
|
386
|
+
const absDir = path.resolve(projectDir || ".");
|
|
387
|
+
const store = new store_1.MemoryStore(absDir);
|
|
388
|
+
const grouped = store.getMemoriesForConsolidation();
|
|
389
|
+
heading("Consolidating memories...");
|
|
390
|
+
let totalMerged = 0;
|
|
391
|
+
for (const [type, memories] of Object.entries(grouped)) {
|
|
392
|
+
if (memories.length < 3)
|
|
393
|
+
continue;
|
|
394
|
+
console.log(` ${c.cyan}${type}${c.reset}: ${memories.length} memories`);
|
|
395
|
+
const prompt = (0, llm_1.buildConsolidationPrompt)(type, memories);
|
|
396
|
+
const response = await (0, llm_1.callHaiku)(prompt, 2048);
|
|
397
|
+
if (!response) {
|
|
398
|
+
warn(` Failed for ${type}`);
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
try {
|
|
402
|
+
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
403
|
+
if (!jsonMatch)
|
|
404
|
+
continue;
|
|
405
|
+
const result = JSON.parse(jsonMatch[0]);
|
|
406
|
+
if (result.keep && result.merge && result.drop) {
|
|
407
|
+
store.applyConsolidation(result);
|
|
408
|
+
const count = result.merge.length + result.drop.length;
|
|
409
|
+
totalMerged += count;
|
|
410
|
+
ok(`${count} merged/archived`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
warn(`Parse error for ${type}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
// Sync CLAUDE.md
|
|
418
|
+
syncClaudeMd(absDir, store);
|
|
419
|
+
const counts = store.getAllMemoryCount();
|
|
420
|
+
console.log(`\n ${c.green}Done.${c.reset} ${totalMerged} memories consolidated. ${counts.active} active, ${counts.total} total.\n`);
|
|
421
|
+
}
|
|
422
|
+
function syncClaudeMd(projectDir, store) {
|
|
423
|
+
const claudeMdPath = path.join(projectDir, "CLAUDE.md");
|
|
424
|
+
const consciousness = store.generateConsciousness();
|
|
425
|
+
const marker = { start: "<!-- MEMORY:START -->", end: "<!-- MEMORY:END -->" };
|
|
426
|
+
const memoryBlock = `${marker.start}\n${consciousness}\n${marker.end}`;
|
|
427
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
428
|
+
let existing = fs.readFileSync(claudeMdPath, "utf-8");
|
|
429
|
+
if (existing.includes(marker.start) && existing.includes(marker.end)) {
|
|
430
|
+
const regex = new RegExp(`${marker.start.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}[\\s\\S]*?${marker.end.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`);
|
|
431
|
+
existing = existing.replace(regex, memoryBlock);
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
existing = existing.trimEnd() + "\n\n" + memoryBlock + "\n";
|
|
435
|
+
}
|
|
436
|
+
fs.writeFileSync(claudeMdPath, existing);
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
fs.writeFileSync(claudeMdPath, memoryBlock + "\n");
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
async function cmdKey(key) {
|
|
443
|
+
if (key) {
|
|
444
|
+
const config = readGlobalConfig();
|
|
445
|
+
config.apiKey = key;
|
|
446
|
+
writeGlobalConfig(config);
|
|
447
|
+
ok("API key saved to ~/.memory-mcp/config.json");
|
|
448
|
+
}
|
|
449
|
+
else if (hasApiKey()) {
|
|
450
|
+
ok("API key is configured");
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
err("No API key found");
|
|
454
|
+
console.log(`\n Set it with: ${c.bold}memory-mcp key <your-api-key>${c.reset}`);
|
|
455
|
+
console.log(` Or set ANTHROPIC_API_KEY environment variable.\n`);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
// --- Help ---
|
|
459
|
+
function printHelp() {
|
|
460
|
+
console.log(`
|
|
461
|
+
${c.bold}${c.magenta}memory-mcp${c.reset} — persistent memory for Claude Code
|
|
462
|
+
|
|
463
|
+
${c.bold}USAGE${c.reset}
|
|
464
|
+
memory-mcp <command> [options]
|
|
465
|
+
|
|
466
|
+
${c.bold}COMMANDS${c.reset}
|
|
467
|
+
${c.cyan}setup${c.reset} Interactive first-time setup (API key + hooks)
|
|
468
|
+
${c.cyan}init${c.reset} [dir] Initialize memory for a project
|
|
469
|
+
${c.cyan}status${c.reset} [dir] Show memory status and health
|
|
470
|
+
${c.cyan}search${c.reset} <query> [dir] Search memories by keyword
|
|
471
|
+
${c.cyan}ask${c.reset} <question> [dir] Ask a question, get answer from memory
|
|
472
|
+
${c.cyan}consolidate${c.reset} [dir] Merge duplicates, prune stale memories
|
|
473
|
+
${c.cyan}key${c.reset} [api-key] Set or check Anthropic API key
|
|
474
|
+
${c.cyan}help${c.reset} Show this help
|
|
475
|
+
|
|
476
|
+
${c.bold}EXAMPLES${c.reset}
|
|
477
|
+
${c.dim}# First time setup${c.reset}
|
|
478
|
+
memory-mcp setup
|
|
479
|
+
|
|
480
|
+
${c.dim}# Add memory to a project${c.reset}
|
|
481
|
+
memory-mcp init ~/Projects/my-app
|
|
482
|
+
|
|
483
|
+
${c.dim}# Check what's remembered${c.reset}
|
|
484
|
+
memory-mcp search "auth flow"
|
|
485
|
+
|
|
486
|
+
${c.dim}# Ask your project's memory a question${c.reset}
|
|
487
|
+
memory-mcp ask "how does billing work?"
|
|
488
|
+
|
|
489
|
+
${c.bold}HOW IT WORKS${c.reset}
|
|
490
|
+
1. Claude Code hooks silently capture what happens each session
|
|
491
|
+
2. A fast LLM (Haiku) extracts important memories automatically
|
|
492
|
+
3. Memories sync to CLAUDE.md — read on every new session
|
|
493
|
+
4. MCP tools let Claude search/ask memory mid-conversation
|
|
494
|
+
`);
|
|
495
|
+
}
|
|
496
|
+
function printVersion() {
|
|
497
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(MEMORY_MCP_DIR, "package.json"), "utf-8"));
|
|
498
|
+
console.log(`memory-mcp v${pkg.version}`);
|
|
499
|
+
}
|
|
500
|
+
// --- Main ---
|
|
501
|
+
async function main() {
|
|
502
|
+
const args = process.argv.slice(2);
|
|
503
|
+
const command = args[0];
|
|
504
|
+
switch (command) {
|
|
505
|
+
case "setup":
|
|
506
|
+
return cmdSetup();
|
|
507
|
+
case "init":
|
|
508
|
+
return cmdInit(args[1]);
|
|
509
|
+
case "status":
|
|
510
|
+
return cmdStatus(args[1]);
|
|
511
|
+
case "search":
|
|
512
|
+
if (!args[1]) {
|
|
513
|
+
err("Usage: memory-mcp search <query>");
|
|
514
|
+
process.exit(1);
|
|
515
|
+
}
|
|
516
|
+
return cmdSearch(args[1], args[2]);
|
|
517
|
+
case "ask":
|
|
518
|
+
if (!args[1]) {
|
|
519
|
+
err("Usage: memory-mcp ask <question>");
|
|
520
|
+
process.exit(1);
|
|
521
|
+
}
|
|
522
|
+
return cmdAsk(args[1], args[2]);
|
|
523
|
+
case "consolidate":
|
|
524
|
+
return cmdConsolidate(args[1]);
|
|
525
|
+
case "key":
|
|
526
|
+
return cmdKey(args[1]);
|
|
527
|
+
case "help":
|
|
528
|
+
case "--help":
|
|
529
|
+
case "-h":
|
|
530
|
+
return printHelp();
|
|
531
|
+
case "version":
|
|
532
|
+
case "--version":
|
|
533
|
+
case "-v":
|
|
534
|
+
return printVersion();
|
|
535
|
+
default:
|
|
536
|
+
if (!command) {
|
|
537
|
+
printHelp();
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
err(`Unknown command: ${command}`);
|
|
541
|
+
console.log(` Run ${c.bold}memory-mcp help${c.reset} for usage.\n`);
|
|
542
|
+
process.exit(1);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
main().catch((e) => {
|
|
547
|
+
err(e.message || String(e));
|
|
548
|
+
process.exit(1);
|
|
549
|
+
});
|
|
550
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* extractor.ts - The silent brain of memory-mcp
|
|
4
|
+
*
|
|
5
|
+
* Called by Claude Code hooks (Stop, PreCompact, SessionEnd).
|
|
6
|
+
* Reads the conversation transcript, extracts meaningful memories
|
|
7
|
+
* using Haiku, deduplicates, and syncs to CLAUDE.md.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
|