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
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* extractor.ts - The silent brain of memory-mcp
|
|
5
|
+
*
|
|
6
|
+
* Called by Claude Code hooks (Stop, PreCompact, SessionEnd).
|
|
7
|
+
* Reads the conversation transcript, extracts meaningful memories
|
|
8
|
+
* using Haiku, deduplicates, and syncs to CLAUDE.md.
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const store_1 = require("./store");
|
|
47
|
+
const llm_1 = require("./llm");
|
|
48
|
+
// --- Stdin ---
|
|
49
|
+
async function readStdin() {
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
let data = "";
|
|
52
|
+
process.stdin.setEncoding("utf-8");
|
|
53
|
+
process.stdin.on("data", (chunk) => (data += chunk));
|
|
54
|
+
process.stdin.on("end", () => resolve(data));
|
|
55
|
+
setTimeout(() => resolve(data), 1000);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// --- Transcript Parsing ---
|
|
59
|
+
function readTranscript(transcriptPath, afterLine) {
|
|
60
|
+
if (!fs.existsSync(transcriptPath))
|
|
61
|
+
return [];
|
|
62
|
+
const content = fs.readFileSync(transcriptPath, "utf-8");
|
|
63
|
+
const lines = content.split("\n").filter((l) => l.trim());
|
|
64
|
+
return lines.slice(afterLine);
|
|
65
|
+
}
|
|
66
|
+
function summarizeTranscriptLines(lines) {
|
|
67
|
+
const events = [];
|
|
68
|
+
for (const line of lines) {
|
|
69
|
+
try {
|
|
70
|
+
const entry = JSON.parse(line);
|
|
71
|
+
const msg = entry.message || {};
|
|
72
|
+
const content = msg.content;
|
|
73
|
+
if (entry.type === "user") {
|
|
74
|
+
const text = typeof content === "string" ? content : extractTextFromBlocks(content);
|
|
75
|
+
if (text)
|
|
76
|
+
events.push(`USER: ${text.slice(0, 500)}`);
|
|
77
|
+
}
|
|
78
|
+
else if (entry.type === "assistant") {
|
|
79
|
+
// Extract text blocks
|
|
80
|
+
const text = extractTextFromBlocks(content);
|
|
81
|
+
if (text)
|
|
82
|
+
events.push(`CLAUDE: ${text.slice(0, 500)}`);
|
|
83
|
+
// Extract tool_use blocks
|
|
84
|
+
if (Array.isArray(content)) {
|
|
85
|
+
for (const block of content) {
|
|
86
|
+
if (block.type === "tool_use") {
|
|
87
|
+
const name = block.name || "unknown";
|
|
88
|
+
const input = block.input || {};
|
|
89
|
+
if (name === "Write" || name === "Edit") {
|
|
90
|
+
events.push(`TOOL [${name}]: ${input.file_path || "unknown file"}`);
|
|
91
|
+
}
|
|
92
|
+
else if (name === "Bash") {
|
|
93
|
+
events.push(`TOOL [Bash]: ${(input.command || "").slice(0, 200)}`);
|
|
94
|
+
}
|
|
95
|
+
else if (name === "Read") {
|
|
96
|
+
events.push(`TOOL [Read]: ${input.file_path || "unknown"}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
events.push(`TOOL [${name}]`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Skip unparseable lines
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return events.join("\n");
|
|
111
|
+
}
|
|
112
|
+
function extractTextFromBlocks(content) {
|
|
113
|
+
if (typeof content === "string")
|
|
114
|
+
return content;
|
|
115
|
+
if (Array.isArray(content)) {
|
|
116
|
+
return content
|
|
117
|
+
.filter((b) => b.type === "text")
|
|
118
|
+
.map((b) => b.text)
|
|
119
|
+
.join(" ");
|
|
120
|
+
}
|
|
121
|
+
return "";
|
|
122
|
+
}
|
|
123
|
+
// --- Chunked Extraction ---
|
|
124
|
+
function chunkText(text, chunkSize, overlap) {
|
|
125
|
+
if (text.length <= chunkSize)
|
|
126
|
+
return [text];
|
|
127
|
+
const chunks = [];
|
|
128
|
+
let start = 0;
|
|
129
|
+
while (start < text.length) {
|
|
130
|
+
chunks.push(text.slice(start, start + chunkSize));
|
|
131
|
+
start += chunkSize - overlap;
|
|
132
|
+
}
|
|
133
|
+
return chunks;
|
|
134
|
+
}
|
|
135
|
+
async function extractMemories(transcript, existingMemories) {
|
|
136
|
+
const chunks = chunkText(transcript, 6000, 500);
|
|
137
|
+
const allMemories = [];
|
|
138
|
+
for (const chunk of chunks) {
|
|
139
|
+
const prompt = (0, llm_1.buildExtractionPrompt)(existingMemories, chunk);
|
|
140
|
+
const response = await (0, llm_1.callHaiku)(prompt);
|
|
141
|
+
if (!response)
|
|
142
|
+
continue;
|
|
143
|
+
try {
|
|
144
|
+
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
145
|
+
if (!jsonMatch)
|
|
146
|
+
continue;
|
|
147
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
148
|
+
allMemories.push(...parsed);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Skip unparseable
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return allMemories;
|
|
155
|
+
}
|
|
156
|
+
// --- Consolidation ---
|
|
157
|
+
async function runConsolidation(store) {
|
|
158
|
+
const grouped = store.getMemoriesForConsolidation();
|
|
159
|
+
for (const [type, memories] of Object.entries(grouped)) {
|
|
160
|
+
if (memories.length < 5)
|
|
161
|
+
continue; // Not worth consolidating small groups
|
|
162
|
+
const prompt = (0, llm_1.buildConsolidationPrompt)(type, memories);
|
|
163
|
+
const response = await (0, llm_1.callHaiku)(prompt, 2048);
|
|
164
|
+
if (!response)
|
|
165
|
+
continue;
|
|
166
|
+
try {
|
|
167
|
+
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
168
|
+
if (!jsonMatch)
|
|
169
|
+
continue;
|
|
170
|
+
const result = JSON.parse(jsonMatch[0]);
|
|
171
|
+
if (result.keep && result.merge && result.drop) {
|
|
172
|
+
store.applyConsolidation(result);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Skip
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// --- Cursor ---
|
|
181
|
+
function getCursorPath(projectDir) {
|
|
182
|
+
return path.join(projectDir, ".memory", "cursor.json");
|
|
183
|
+
}
|
|
184
|
+
function getCursor(projectDir, sessionId) {
|
|
185
|
+
const cursorPath = getCursorPath(projectDir);
|
|
186
|
+
if (!fs.existsSync(cursorPath))
|
|
187
|
+
return 0;
|
|
188
|
+
try {
|
|
189
|
+
const cursors = JSON.parse(fs.readFileSync(cursorPath, "utf-8"));
|
|
190
|
+
return cursors[sessionId] || 0;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function setCursor(projectDir, sessionId, line) {
|
|
197
|
+
const cursorPath = getCursorPath(projectDir);
|
|
198
|
+
let cursors = {};
|
|
199
|
+
if (fs.existsSync(cursorPath)) {
|
|
200
|
+
try {
|
|
201
|
+
cursors = JSON.parse(fs.readFileSync(cursorPath, "utf-8"));
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
cursors = {};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
cursors[sessionId] = line;
|
|
208
|
+
fs.writeFileSync(cursorPath, JSON.stringify(cursors, null, 2));
|
|
209
|
+
}
|
|
210
|
+
// --- CLAUDE.md Sync ---
|
|
211
|
+
function syncClaudeMd(projectDir, store) {
|
|
212
|
+
const claudeMdPath = path.join(projectDir, "CLAUDE.md");
|
|
213
|
+
const consciousness = store.generateConsciousness();
|
|
214
|
+
const marker = { start: "<!-- MEMORY:START -->", end: "<!-- MEMORY:END -->" };
|
|
215
|
+
const memoryBlock = `${marker.start}\n${consciousness}\n${marker.end}`;
|
|
216
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
217
|
+
let existing = fs.readFileSync(claudeMdPath, "utf-8");
|
|
218
|
+
if (existing.includes(marker.start) && existing.includes(marker.end)) {
|
|
219
|
+
const regex = new RegExp(`${escapeRegex(marker.start)}[\\s\\S]*?${escapeRegex(marker.end)}`);
|
|
220
|
+
existing = existing.replace(regex, memoryBlock);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
existing = existing.trimEnd() + "\n\n" + memoryBlock + "\n";
|
|
224
|
+
}
|
|
225
|
+
fs.writeFileSync(claudeMdPath, existing);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
fs.writeFileSync(claudeMdPath, memoryBlock + "\n");
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function escapeRegex(s) {
|
|
232
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
233
|
+
}
|
|
234
|
+
// --- Main ---
|
|
235
|
+
async function main() {
|
|
236
|
+
try {
|
|
237
|
+
const stdinData = await readStdin();
|
|
238
|
+
if (!stdinData.trim())
|
|
239
|
+
return;
|
|
240
|
+
const input = JSON.parse(stdinData);
|
|
241
|
+
const { session_id, transcript_path, cwd } = input;
|
|
242
|
+
const event = input.hook_event_name;
|
|
243
|
+
if (!transcript_path || !cwd)
|
|
244
|
+
return;
|
|
245
|
+
// Ensure .memory dir exists
|
|
246
|
+
const memDir = path.join(cwd, ".memory");
|
|
247
|
+
if (!fs.existsSync(memDir)) {
|
|
248
|
+
fs.mkdirSync(memDir, { recursive: true });
|
|
249
|
+
}
|
|
250
|
+
const store = new store_1.MemoryStore(cwd);
|
|
251
|
+
// Acquire lock
|
|
252
|
+
if (!store.acquireLock())
|
|
253
|
+
return;
|
|
254
|
+
try {
|
|
255
|
+
// Read new transcript lines
|
|
256
|
+
const cursor = getCursor(cwd, session_id);
|
|
257
|
+
const newLines = readTranscript(transcript_path, cursor);
|
|
258
|
+
// Minimum threshold: need meaningful content
|
|
259
|
+
const minLines = event === "PreCompact" ? 1 : 3;
|
|
260
|
+
if (newLines.length < minLines) {
|
|
261
|
+
setCursor(cwd, session_id, cursor + newLines.length);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// Summarize transcript
|
|
265
|
+
const summary = summarizeTranscriptLines(newLines);
|
|
266
|
+
if (!summary.trim())
|
|
267
|
+
return;
|
|
268
|
+
// Extract memories (context-aware)
|
|
269
|
+
const existingMemories = store.getActiveMemories();
|
|
270
|
+
const extracted = await extractMemories(summary, existingMemories);
|
|
271
|
+
// Save extracted memories
|
|
272
|
+
for (const mem of extracted) {
|
|
273
|
+
// If superseding an existing memory by content match
|
|
274
|
+
if (mem.supersedes_content) {
|
|
275
|
+
const { tokenize, jaccard } = require("./store");
|
|
276
|
+
const superTokens = tokenize(mem.supersedes_content);
|
|
277
|
+
for (const existing of existingMemories) {
|
|
278
|
+
if (existing.type === mem.type) {
|
|
279
|
+
const sim = jaccard(superTokens, tokenize(existing.content));
|
|
280
|
+
if (sim > 0.5) {
|
|
281
|
+
mem.tags = mem.tags || [];
|
|
282
|
+
store.addMemory({
|
|
283
|
+
type: mem.type,
|
|
284
|
+
content: mem.content,
|
|
285
|
+
tags: mem.tags,
|
|
286
|
+
supersedes: existing.id,
|
|
287
|
+
});
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
store.addMemory({
|
|
295
|
+
type: mem.type,
|
|
296
|
+
content: mem.content,
|
|
297
|
+
tags: mem.tags || [],
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Update cursor
|
|
302
|
+
setCursor(cwd, session_id, cursor + newLines.length);
|
|
303
|
+
// Increment extraction count
|
|
304
|
+
store.incrementExtractionCount();
|
|
305
|
+
// Decay confidence
|
|
306
|
+
store.decayConfidence();
|
|
307
|
+
// Consolidate if needed (always on SessionEnd, threshold otherwise)
|
|
308
|
+
if (event === "SessionEnd" || store.needsConsolidation()) {
|
|
309
|
+
await runConsolidation(store);
|
|
310
|
+
}
|
|
311
|
+
// Sync CLAUDE.md
|
|
312
|
+
syncClaudeMd(cwd, store);
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
store.releaseLock();
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// Silent failure — never disrupt Claude's work
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
main();
|
|
323
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
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 mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
38
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
39
|
+
const zod_1 = require("zod");
|
|
40
|
+
const store_1 = require("./store");
|
|
41
|
+
const llm_1 = require("./llm");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const projectDir = process.argv[2] || process.cwd();
|
|
45
|
+
const store = new store_1.MemoryStore(projectDir);
|
|
46
|
+
const server = new mcp_js_1.McpServer({
|
|
47
|
+
name: "memory-mcp",
|
|
48
|
+
version: "2.0.0",
|
|
49
|
+
});
|
|
50
|
+
const MEMORY_TYPE = zod_1.z
|
|
51
|
+
.enum(["decision", "pattern", "gotcha", "architecture", "progress", "context"])
|
|
52
|
+
.describe("Memory type: decision (why X over Y), pattern (conventions), gotcha (pitfalls), architecture (system structure), progress (what's done/in-flight), context (business context)");
|
|
53
|
+
// --- Core Tools ---
|
|
54
|
+
server.tool("memory_init", "Initialize project memory with name and description.", {
|
|
55
|
+
name: zod_1.z.string().describe("Project name"),
|
|
56
|
+
description: zod_1.z.string().describe("Brief project description"),
|
|
57
|
+
}, async ({ name, description }) => {
|
|
58
|
+
store.setProject(name, description);
|
|
59
|
+
syncClaudeMd();
|
|
60
|
+
return { content: [{ type: "text", text: `Project "${name}" initialized.` }] };
|
|
61
|
+
});
|
|
62
|
+
server.tool("memory_save", "Save a memory about this project. Records decisions, patterns, architecture, gotchas, progress, or context for future sessions.", {
|
|
63
|
+
type: MEMORY_TYPE,
|
|
64
|
+
content: zod_1.z.string().describe("The memory — be specific and concise"),
|
|
65
|
+
tags: zod_1.z.array(zod_1.z.string()).optional().describe("Tags for categorization"),
|
|
66
|
+
supersedes: zod_1.z.string().optional().describe("ID of memory this replaces"),
|
|
67
|
+
}, async ({ type, content, tags, supersedes }) => {
|
|
68
|
+
const mem = store.addMemory({
|
|
69
|
+
type,
|
|
70
|
+
content,
|
|
71
|
+
tags: tags || [],
|
|
72
|
+
supersedes,
|
|
73
|
+
});
|
|
74
|
+
syncClaudeMd();
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: "text", text: mem ? `Saved: [${mem.id}] (${type}) ${content}` : "Duplicate detected, skipped." }],
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
server.tool("memory_recall", "Recall all active memories, optionally filtered by type or tags.", {
|
|
80
|
+
type: MEMORY_TYPE.optional(),
|
|
81
|
+
tags: zod_1.z.array(zod_1.z.string()).optional().describe("Filter by tags"),
|
|
82
|
+
}, async ({ type, tags }) => {
|
|
83
|
+
const memories = store.getMemories({ type, tags });
|
|
84
|
+
if (memories.length === 0) {
|
|
85
|
+
return { content: [{ type: "text", text: "No memories found." }] };
|
|
86
|
+
}
|
|
87
|
+
const text = memories
|
|
88
|
+
.map((m) => {
|
|
89
|
+
const tagStr = m.tags.length ? ` [${m.tags.join(", ")}]` : "";
|
|
90
|
+
return `[${m.id}] (${m.type}) ${m.content}${tagStr}`;
|
|
91
|
+
})
|
|
92
|
+
.join("\n\n");
|
|
93
|
+
return { content: [{ type: "text", text: `${memories.length} memories:\n\n${text}` }] };
|
|
94
|
+
});
|
|
95
|
+
server.tool("memory_delete", "Delete a specific memory by ID.", { id: zod_1.z.string().describe("Memory ID to delete") }, async ({ id }) => {
|
|
96
|
+
const ok = store.deleteMemory(id);
|
|
97
|
+
if (ok)
|
|
98
|
+
syncClaudeMd();
|
|
99
|
+
return { content: [{ type: "text", text: ok ? `Deleted ${id}` : `Not found: ${id}` }] };
|
|
100
|
+
});
|
|
101
|
+
// --- Search & Retrieval Tools ---
|
|
102
|
+
server.tool("memory_search", "Search memories by keyword. Returns ranked results matching the query across content and tags.", {
|
|
103
|
+
query: zod_1.z.string().describe("Search query (keywords)"),
|
|
104
|
+
limit: zod_1.z.number().optional().describe("Max results (default 20)"),
|
|
105
|
+
}, async ({ query, limit }) => {
|
|
106
|
+
const results = store.searchMemories(query, limit || 20);
|
|
107
|
+
if (results.length === 0) {
|
|
108
|
+
return { content: [{ type: "text", text: `No memories matching "${query}".` }] };
|
|
109
|
+
}
|
|
110
|
+
const text = results
|
|
111
|
+
.map((m) => {
|
|
112
|
+
const tagStr = m.tags.length ? ` [${m.tags.join(", ")}]` : "";
|
|
113
|
+
return `[${m.id}] (${m.type}) ${m.content}${tagStr}`;
|
|
114
|
+
})
|
|
115
|
+
.join("\n\n");
|
|
116
|
+
return { content: [{ type: "text", text: `${results.length} results for "${query}":\n\n${text}` }] };
|
|
117
|
+
});
|
|
118
|
+
server.tool("memory_related", "Get all memories related to specific tags/areas. Use to explore a topic in depth.", {
|
|
119
|
+
tags: zod_1.z.array(zod_1.z.string()).describe("Tags to search for"),
|
|
120
|
+
type: MEMORY_TYPE.optional(),
|
|
121
|
+
}, async ({ tags, type }) => {
|
|
122
|
+
const results = store.getRelated(tags, type);
|
|
123
|
+
if (results.length === 0) {
|
|
124
|
+
return { content: [{ type: "text", text: `No memories tagged with: ${tags.join(", ")}` }] };
|
|
125
|
+
}
|
|
126
|
+
const text = results
|
|
127
|
+
.map((m) => {
|
|
128
|
+
const tagStr = m.tags.length ? ` [${m.tags.join(", ")}]` : "";
|
|
129
|
+
return `[${m.id}] (${m.type}) ${m.content}${tagStr}`;
|
|
130
|
+
})
|
|
131
|
+
.join("\n\n");
|
|
132
|
+
return { content: [{ type: "text", text: `${results.length} related memories:\n\n${text}` }] };
|
|
133
|
+
});
|
|
134
|
+
server.tool("memory_ask", "Ask a question and get an answer synthesized from project memories. Like RAG over your project knowledge.", {
|
|
135
|
+
question: zod_1.z.string().describe("Question about the project"),
|
|
136
|
+
}, async ({ question }) => {
|
|
137
|
+
// Search for relevant memories
|
|
138
|
+
const results = store.searchMemories(question, 30);
|
|
139
|
+
if (results.length === 0) {
|
|
140
|
+
return { content: [{ type: "text", text: "No relevant memories found to answer this question." }] };
|
|
141
|
+
}
|
|
142
|
+
const prompt = (0, llm_1.buildAskPrompt)(question, results);
|
|
143
|
+
const answer = await (0, llm_1.callHaiku)(prompt, 1024);
|
|
144
|
+
if (!answer) {
|
|
145
|
+
// Fallback: return raw memories
|
|
146
|
+
const text = results
|
|
147
|
+
.slice(0, 10)
|
|
148
|
+
.map((m) => `- (${m.type}) ${m.content}`)
|
|
149
|
+
.join("\n");
|
|
150
|
+
return { content: [{ type: "text", text: `Could not synthesize answer. Relevant memories:\n${text}` }] };
|
|
151
|
+
}
|
|
152
|
+
return { content: [{ type: "text", text: answer }] };
|
|
153
|
+
});
|
|
154
|
+
// --- Maintenance Tools ---
|
|
155
|
+
server.tool("memory_consolidate", "Manually trigger memory consolidation. Merges duplicates, removes outdated memories, keeps memory sharp.", {}, async () => {
|
|
156
|
+
const grouped = store.getMemoriesForConsolidation();
|
|
157
|
+
let consolidated = 0;
|
|
158
|
+
for (const [type, memories] of Object.entries(grouped)) {
|
|
159
|
+
if (memories.length < 3)
|
|
160
|
+
continue;
|
|
161
|
+
const prompt = (0, llm_1.buildConsolidationPrompt)(type, memories);
|
|
162
|
+
const response = await (0, llm_1.callHaiku)(prompt, 2048);
|
|
163
|
+
if (!response)
|
|
164
|
+
continue;
|
|
165
|
+
try {
|
|
166
|
+
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
167
|
+
if (!jsonMatch)
|
|
168
|
+
continue;
|
|
169
|
+
const result = JSON.parse(jsonMatch[0]);
|
|
170
|
+
if (result.keep && result.merge && result.drop) {
|
|
171
|
+
store.applyConsolidation(result);
|
|
172
|
+
consolidated += result.merge.length + result.drop.length;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Skip
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
syncClaudeMd();
|
|
180
|
+
const counts = store.getAllMemoryCount();
|
|
181
|
+
return {
|
|
182
|
+
content: [{
|
|
183
|
+
type: "text",
|
|
184
|
+
text: `Consolidation complete. ${consolidated} memories merged/archived. Current: ${counts.active} active, ${counts.total} total.`,
|
|
185
|
+
}],
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
server.tool("memory_consciousness", "Generate the full consciousness document. This is what gets written to CLAUDE.md.", {}, async () => {
|
|
189
|
+
const doc = store.generateConsciousness();
|
|
190
|
+
return { content: [{ type: "text", text: doc }] };
|
|
191
|
+
});
|
|
192
|
+
server.tool("memory_stats", "Show memory statistics: counts by type, active/archived/superseded, last consolidation.", {}, async () => {
|
|
193
|
+
const counts = store.getAllMemoryCount();
|
|
194
|
+
const state = store.getState();
|
|
195
|
+
const active = store.getActiveMemories();
|
|
196
|
+
const byType = {};
|
|
197
|
+
for (const m of active) {
|
|
198
|
+
byType[m.type] = (byType[m.type] || 0) + 1;
|
|
199
|
+
}
|
|
200
|
+
const lines = [
|
|
201
|
+
`Memory Stats:`,
|
|
202
|
+
` Active: ${counts.active}`,
|
|
203
|
+
` Archived: ${counts.archived}`,
|
|
204
|
+
` Superseded: ${counts.superseded}`,
|
|
205
|
+
` Total: ${counts.total}`,
|
|
206
|
+
``,
|
|
207
|
+
`By type:`,
|
|
208
|
+
...Object.entries(byType).map(([t, n]) => ` ${t}: ${n}`),
|
|
209
|
+
``,
|
|
210
|
+
`Extractions: ${state.extractionCount}`,
|
|
211
|
+
`Last consolidation: ${state.lastConsolidation || "never"}`,
|
|
212
|
+
`Last updated: ${state.lastUpdated}`,
|
|
213
|
+
];
|
|
214
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
215
|
+
});
|
|
216
|
+
// --- CLAUDE.md Sync ---
|
|
217
|
+
function syncClaudeMd() {
|
|
218
|
+
const claudeMdPath = path.join(projectDir, "CLAUDE.md");
|
|
219
|
+
const consciousness = store.generateConsciousness();
|
|
220
|
+
const marker = { start: "<!-- MEMORY:START -->", end: "<!-- MEMORY:END -->" };
|
|
221
|
+
const memoryBlock = `${marker.start}\n${consciousness}\n${marker.end}`;
|
|
222
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
223
|
+
let existing = fs.readFileSync(claudeMdPath, "utf-8");
|
|
224
|
+
if (existing.includes(marker.start) && existing.includes(marker.end)) {
|
|
225
|
+
const regex = new RegExp(`${escapeRegex(marker.start)}[\\s\\S]*?${escapeRegex(marker.end)}`);
|
|
226
|
+
existing = existing.replace(regex, memoryBlock);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
existing = existing.trimEnd() + "\n\n" + memoryBlock + "\n";
|
|
230
|
+
}
|
|
231
|
+
fs.writeFileSync(claudeMdPath, existing);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
fs.writeFileSync(claudeMdPath, memoryBlock + "\n");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function escapeRegex(s) {
|
|
238
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
239
|
+
}
|
|
240
|
+
// --- Start ---
|
|
241
|
+
async function main() {
|
|
242
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
243
|
+
await server.connect(transport);
|
|
244
|
+
}
|
|
245
|
+
main().catch((err) => {
|
|
246
|
+
console.error("Fatal:", err);
|
|
247
|
+
process.exit(1);
|
|
248
|
+
});
|
|
249
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,oEAAoE;AACpE,wEAAiF;AACjF,6BAAwB;AACxB,mCAAsC;AACtC,+BAA4E;AAC5E,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AACpD,MAAM,KAAK,GAAG,IAAI,mBAAW,CAAC,UAAU,CAAC,CAAC;AAE1C,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;IAC3B,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,OAAC;KAClB,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;KAC9E,QAAQ,CACP,+KAA+K,CAChL,CAAC;AAEJ,qBAAqB;AAErB,MAAM,CAAC,IAAI,CACT,aAAa,EACb,sDAAsD,EACtD;IACE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IACzC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;CAC9D,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;IAC9B,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpC,YAAY,EAAE,CAAC;IACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,IAAI,gBAAgB,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,iIAAiI,EACjI;IACE,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACpE,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACxE,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;CACzE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;QAC1B,IAAI;QACJ,OAAO;QACP,IAAI,EAAE,IAAI,IAAI,EAAE;QAChB,UAAU;KACX,CAAC,CAAC;IACH,YAAY,EAAE,CAAC;IACf,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,8BAA8B,EAAE,CAAC;KACpH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,kEAAkE,EAClE;IACE,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE;IAC5B,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CAChE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC;IACrE,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;IACvD,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,MAAM,iBAAiB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;AAC1F,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,iCAAiC,EACjC,EAAE,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAClD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACf,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAClC,IAAI,EAAE;QAAE,YAAY,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AAC1F,CAAC,CACF,CAAC;AAEF,mCAAmC;AAEnC,MAAM,CAAC,IAAI,CACT,eAAe,EACf,gGAAgG,EAChG;IACE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACrD,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAClE,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACzB,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC;IACD,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;IACvD,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,iBAAiB,KAAK,SAAS,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;AACvG,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,mFAAmF,EACnF;IACE,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACxD,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE;CAC7B,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC;IACD,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;IACvD,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,yBAAyB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;AACjG,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,2GAA2G,EAC3G;IACE,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;CAC5D,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IACrB,+BAA+B;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qDAAqD,EAAE,CAAC,EAAE,CAAC;IACtG,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,oBAAc,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,IAAA,eAAS,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,gCAAgC;QAChC,MAAM,IAAI,GAAG,OAAO;aACjB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACxC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oDAAoD,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;IAC3G,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC,CACF,CAAC;AAEF,4BAA4B;AAE5B,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,0GAA0G,EAC1G,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,OAAO,GAAG,KAAK,CAAC,2BAA2B,EAAE,CAAC;IACpD,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAElC,MAAM,MAAM,GAAG,IAAA,8BAAwB,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAS,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS;gBAAE,SAAS;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC/C,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBACjC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;IACH,CAAC;IAED,YAAY,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACzC,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,2BAA2B,YAAY,uCAAuC,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,KAAK,SAAS;aACnI,CAAC;KACH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,mFAAmF,EACnF,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,GAAG,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;IAC1C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,yFAAyF,EACzF,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IAEzC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,eAAe;QACf,aAAa,MAAM,CAAC,MAAM,EAAE;QAC5B,eAAe,MAAM,CAAC,QAAQ,EAAE;QAChC,iBAAiB,MAAM,CAAC,UAAU,EAAE;QACpC,YAAY,MAAM,CAAC,KAAK,EAAE;QAC1B,EAAE;QACF,UAAU;QACV,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,EAAE;QACF,gBAAgB,KAAK,CAAC,eAAe,EAAE;QACvC,uBAAuB,KAAK,CAAC,iBAAiB,IAAI,OAAO,EAAE;QAC3D,iBAAiB,KAAK,CAAC,WAAW,EAAE;KACrC,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACjE,CAAC,CACF,CAAC;AAEF,yBAAyB;AAEzB,SAAS,YAAY;IACnB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;IAEpD,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,uBAAuB,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC;IAC9E,MAAM,WAAW,GAAG,GAAG,MAAM,CAAC,KAAK,KAAK,aAAa,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;IAEvE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrE,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7F,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;QAC9D,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,gBAAgB;AAEhB,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* install.ts - Set up memory-mcp for a project or globally.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node dist/install.js <project-dir> # Per-project install
|
|
7
|
+
* node dist/install.js --global # Global install (all projects)
|
|
8
|
+
* node dist/install.js --api-key <key> # Store API key globally
|
|
9
|
+
* node dist/install.js --global --api-key <key> # Both
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|