claude-conversation-memory-mcp 0.2.5 → 0.5.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.
Files changed (40) hide show
  1. package/.claude-memory-config.example.json +8 -0
  2. package/.claude-memory-config.example.jsonc +50 -0
  3. package/README.md +203 -0
  4. package/dist/cli/commands.d.ts.map +1 -1
  5. package/dist/cli/commands.js +260 -20
  6. package/dist/cli/commands.js.map +1 -1
  7. package/dist/embeddings/ModelRegistry.d.ts +48 -0
  8. package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
  9. package/dist/embeddings/ModelRegistry.js +170 -0
  10. package/dist/embeddings/ModelRegistry.js.map +1 -0
  11. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +1 -1
  12. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -1
  13. package/dist/embeddings/providers/OllamaEmbeddings.js +7 -14
  14. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -1
  15. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +1 -1
  16. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -1
  17. package/dist/embeddings/providers/OpenAIEmbeddings.js +9 -7
  18. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -1
  19. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +1 -1
  20. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -1
  21. package/dist/embeddings/providers/TransformersEmbeddings.js +9 -8
  22. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -1
  23. package/dist/mcp-server.d.ts.map +1 -1
  24. package/dist/mcp-server.js +6 -0
  25. package/dist/mcp-server.js.map +1 -1
  26. package/dist/tools/ToolDefinitions.d.ts +46 -0
  27. package/dist/tools/ToolDefinitions.d.ts.map +1 -1
  28. package/dist/tools/ToolDefinitions.js +46 -0
  29. package/dist/tools/ToolDefinitions.js.map +1 -1
  30. package/dist/tools/ToolHandlers.d.ts +11 -2
  31. package/dist/tools/ToolHandlers.d.ts.map +1 -1
  32. package/dist/tools/ToolHandlers.js +86 -2
  33. package/dist/tools/ToolHandlers.js.map +1 -1
  34. package/dist/types/ToolTypes.d.ts +37 -0
  35. package/dist/types/ToolTypes.d.ts.map +1 -1
  36. package/dist/utils/ProjectMigration.d.ts +82 -0
  37. package/dist/utils/ProjectMigration.d.ts.map +1 -0
  38. package/dist/utils/ProjectMigration.js +413 -0
  39. package/dist/utils/ProjectMigration.js.map +1 -0
  40. package/package.json +5 -3
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Project Migration Utility
3
+ * Handles migration of conversation history when project directories are renamed
4
+ */
5
+ import { existsSync, readdirSync, mkdirSync, copyFileSync } from "fs";
6
+ import { join } from "path";
7
+ import { homedir } from "os";
8
+ import Database from "better-sqlite3";
9
+ import { pathToProjectFolderName } from "./sanitization.js";
10
+ export class ProjectMigration {
11
+ projectsDir;
12
+ constructor(_sqliteManager, projectsDir) {
13
+ // Parameter kept for backwards compatibility but not used
14
+ // Allow override of projects directory for testing
15
+ this.projectsDir = projectsDir || join(homedir(), ".claude", "projects");
16
+ }
17
+ /**
18
+ * Get the projects directory (for use by other classes)
19
+ */
20
+ getProjectsDir() {
21
+ return this.projectsDir;
22
+ }
23
+ /**
24
+ * Discover old conversation folders using combined approach
25
+ */
26
+ async discoverOldFolders(currentProjectPath) {
27
+ const candidates = [];
28
+ const projectsDir = this.projectsDir;
29
+ if (!existsSync(projectsDir)) {
30
+ return [];
31
+ }
32
+ const folders = readdirSync(projectsDir);
33
+ for (const folder of folders) {
34
+ const folderPath = join(projectsDir, folder);
35
+ const dbPath = join(folderPath, ".claude-conversations-memory.db");
36
+ let storedPath = null;
37
+ let stats = { conversations: 0, messages: 0, lastActivity: null };
38
+ let pathScore = 0;
39
+ // Strategy 1: Check database for stored project_path
40
+ if (existsSync(dbPath)) {
41
+ try {
42
+ const db = new Database(dbPath, { readonly: true });
43
+ // Get stored project path
44
+ const pathRow = db
45
+ .prepare("SELECT project_path FROM conversations LIMIT 1")
46
+ .get();
47
+ storedPath = pathRow?.project_path || null;
48
+ // Get statistics
49
+ const statsRow = db.prepare(`
50
+ SELECT
51
+ COUNT(DISTINCT id) as conversations,
52
+ MAX(last_message_at) as last_activity
53
+ FROM conversations
54
+ `).get();
55
+ const messageCount = db
56
+ .prepare("SELECT COUNT(*) as count FROM messages")
57
+ .get();
58
+ stats = {
59
+ conversations: statsRow?.conversations || 0,
60
+ messages: messageCount?.count || 0,
61
+ lastActivity: statsRow?.last_activity || null
62
+ };
63
+ db.close();
64
+ // Score based on path match
65
+ if (storedPath) {
66
+ pathScore = this.scorePath(currentProjectPath, storedPath);
67
+ }
68
+ }
69
+ catch (_error) {
70
+ // Database exists but can't read - still a candidate
71
+ pathScore = 10;
72
+ }
73
+ }
74
+ // Strategy 2: Folder name similarity
75
+ const expectedFolder = pathToProjectFolderName(currentProjectPath);
76
+ const folderScore = this.scoreFolderName(expectedFolder, folder);
77
+ // Strategy 3: Check for JSONL files
78
+ let jsonlCount = 0;
79
+ try {
80
+ jsonlCount = readdirSync(folderPath).filter(f => f.endsWith(".jsonl")).length;
81
+ }
82
+ catch (_error) {
83
+ // Can't read folder
84
+ continue;
85
+ }
86
+ // Calculate overall score
87
+ const score = this.calculateOverallScore({
88
+ pathScore,
89
+ folderScore,
90
+ hasDatabase: existsSync(dbPath),
91
+ jsonlCount
92
+ });
93
+ if (score > 0 || storedPath !== null) {
94
+ candidates.push({
95
+ folderPath,
96
+ folderName: folder,
97
+ storedProjectPath: storedPath,
98
+ stats,
99
+ score
100
+ });
101
+ }
102
+ }
103
+ // Sort by score (highest first)
104
+ return candidates.sort((a, b) => b.score - a.score);
105
+ }
106
+ /**
107
+ * Validate migration is safe and possible
108
+ */
109
+ validateMigration(sourceFolder, targetFolder, mode = "migrate") {
110
+ const errors = [];
111
+ // Check source exists
112
+ if (!existsSync(sourceFolder)) {
113
+ errors.push("Source folder does not exist");
114
+ return { valid: false, errors };
115
+ }
116
+ // Check source has JSONL files
117
+ const sourceFiles = readdirSync(sourceFolder).filter(f => f.endsWith(".jsonl"));
118
+ if (sourceFiles.length === 0) {
119
+ errors.push("Source folder has no conversation files");
120
+ }
121
+ // Check source database is readable
122
+ const sourceDb = join(sourceFolder, ".claude-conversations-memory.db");
123
+ if (existsSync(sourceDb)) {
124
+ try {
125
+ const db = new Database(sourceDb, { readonly: true });
126
+ db.prepare("SELECT 1 FROM conversations LIMIT 1").get();
127
+ db.close();
128
+ }
129
+ catch (_error) {
130
+ errors.push("Source database is corrupted or unreadable");
131
+ }
132
+ }
133
+ // Check target doesn't have data (conflict detection) - ONLY for migrate mode
134
+ if (mode === "migrate" && existsSync(targetFolder)) {
135
+ const targetFiles = readdirSync(targetFolder).filter(f => f.endsWith(".jsonl"));
136
+ if (targetFiles.length > 0) {
137
+ errors.push("Target folder already has conversation data");
138
+ }
139
+ }
140
+ // Get statistics if validation passed so far
141
+ let stats;
142
+ if (errors.length === 0 && existsSync(sourceDb)) {
143
+ try {
144
+ const db = new Database(sourceDb, { readonly: true });
145
+ const convCount = db
146
+ .prepare("SELECT COUNT(*) as count FROM conversations")
147
+ .get();
148
+ const msgCount = db
149
+ .prepare("SELECT COUNT(*) as count FROM messages")
150
+ .get();
151
+ db.close();
152
+ stats = {
153
+ conversations: convCount.count,
154
+ messages: msgCount.count,
155
+ files: sourceFiles.length
156
+ };
157
+ }
158
+ catch (_error) {
159
+ // Can't get stats, but not a blocker
160
+ }
161
+ }
162
+ return {
163
+ valid: errors.length === 0,
164
+ errors,
165
+ stats
166
+ };
167
+ }
168
+ /**
169
+ * Execute migration (copy files and update database)
170
+ */
171
+ async executeMigration(sourceFolder, targetFolder, oldProjectPath, newProjectPath, dryRun, mode = "migrate") {
172
+ // Validate first
173
+ const validation = this.validateMigration(sourceFolder, targetFolder, mode);
174
+ if (!validation.valid) {
175
+ throw new Error(`Migration validation failed: ${validation.errors.join(", ")}`);
176
+ }
177
+ if (dryRun) {
178
+ return {
179
+ success: true,
180
+ filesCopied: validation.stats?.files || 0,
181
+ databaseUpdated: false,
182
+ message: "Dry run: No changes made"
183
+ };
184
+ }
185
+ // Create target folder
186
+ if (!existsSync(targetFolder)) {
187
+ mkdirSync(targetFolder, { recursive: true });
188
+ }
189
+ const sourceDb = join(sourceFolder, ".claude-conversations-memory.db");
190
+ const targetDb = join(targetFolder, ".claude-conversations-memory.db");
191
+ // Branch based on mode
192
+ if (mode === "merge") {
193
+ return this.executeMerge(sourceFolder, targetFolder, sourceDb, targetDb, oldProjectPath, newProjectPath);
194
+ }
195
+ else {
196
+ // Original migrate logic (replace target)
197
+ // Copy all JSONL files
198
+ const jsonlFiles = readdirSync(sourceFolder).filter(f => f.endsWith(".jsonl"));
199
+ let filesCopied = 0;
200
+ for (const file of jsonlFiles) {
201
+ const sourcePath = join(sourceFolder, file);
202
+ const targetPath = join(targetFolder, file);
203
+ copyFileSync(sourcePath, targetPath);
204
+ filesCopied++;
205
+ }
206
+ if (existsSync(sourceDb)) {
207
+ // Create backup
208
+ const backupPath = join(sourceFolder, ".claude-conversations-memory.db.bak");
209
+ copyFileSync(sourceDb, backupPath);
210
+ // Copy database
211
+ copyFileSync(sourceDb, targetDb);
212
+ // Update project_path in the copied database
213
+ this.updateProjectPaths(targetDb, oldProjectPath, newProjectPath);
214
+ }
215
+ return {
216
+ success: true,
217
+ filesCopied,
218
+ databaseUpdated: true,
219
+ message: `Migrated ${filesCopied} conversation files`
220
+ };
221
+ }
222
+ }
223
+ /**
224
+ * Execute merge (combine source into existing target)
225
+ */
226
+ executeMerge(sourceFolder, targetFolder, sourceDb, targetDb, oldProjectPath, newProjectPath) {
227
+ // Copy only JSONL files that don't exist in target (skip duplicates)
228
+ const sourceFiles = readdirSync(sourceFolder).filter(f => f.endsWith(".jsonl"));
229
+ const existingFiles = existsSync(targetFolder)
230
+ ? readdirSync(targetFolder).filter(f => f.endsWith(".jsonl"))
231
+ : [];
232
+ const existingSet = new Set(existingFiles);
233
+ let filesCopied = 0;
234
+ for (const file of sourceFiles) {
235
+ if (!existingSet.has(file)) {
236
+ const sourcePath = join(sourceFolder, file);
237
+ const targetPath = join(targetFolder, file);
238
+ copyFileSync(sourcePath, targetPath);
239
+ filesCopied++;
240
+ }
241
+ }
242
+ // Merge databases
243
+ if (existsSync(sourceDb)) {
244
+ if (existsSync(targetDb)) {
245
+ // Backup target database before merge
246
+ const backupPath = join(targetFolder, ".claude-conversations-memory.db.bak");
247
+ copyFileSync(targetDb, backupPath);
248
+ // Merge source into target
249
+ this.mergeDatabase(sourceDb, targetDb, oldProjectPath, newProjectPath);
250
+ }
251
+ else {
252
+ // No target database yet, just copy
253
+ copyFileSync(sourceDb, targetDb);
254
+ this.updateProjectPaths(targetDb, oldProjectPath, newProjectPath);
255
+ }
256
+ }
257
+ return {
258
+ success: true,
259
+ filesCopied,
260
+ databaseUpdated: true,
261
+ message: `Merged ${filesCopied} new conversation files into target`
262
+ };
263
+ }
264
+ /**
265
+ * Merge source database into target database (INSERT OR IGNORE strategy)
266
+ */
267
+ mergeDatabase(sourceDbPath, targetDbPath, oldProjectPath, newProjectPath) {
268
+ // Check which tables exist BEFORE attaching
269
+ const source = new Database(sourceDbPath, { readonly: true });
270
+ const sourceTables = new Set(source.prepare("SELECT name FROM sqlite_master WHERE type='table'").all().map(row => row.name));
271
+ source.close();
272
+ const target = new Database(targetDbPath);
273
+ const targetTables = new Set(target.prepare("SELECT name FROM sqlite_master WHERE type='table'").all().map(row => row.name));
274
+ try {
275
+ target.exec("BEGIN TRANSACTION");
276
+ // Attach source database
277
+ target.exec(`ATTACH DATABASE '${sourceDbPath}' AS source`);
278
+ // Merge conversations (always exists)
279
+ target.exec(`
280
+ INSERT OR IGNORE INTO conversations
281
+ SELECT * FROM source.conversations
282
+ `);
283
+ // Merge other tables only if they exist in both databases
284
+ const tablesToMerge = [
285
+ "messages",
286
+ "tool_uses",
287
+ "decisions",
288
+ "mistakes",
289
+ "requirements",
290
+ "file_evolution",
291
+ "git_commits"
292
+ ];
293
+ for (const table of tablesToMerge) {
294
+ if (sourceTables.has(table) && targetTables.has(table)) {
295
+ target.exec(`
296
+ INSERT OR IGNORE INTO ${table}
297
+ SELECT * FROM source.${table}
298
+ `);
299
+ }
300
+ }
301
+ // Update project_path for newly merged conversations from source
302
+ const stmt = target.prepare(`
303
+ UPDATE conversations
304
+ SET project_path = ?
305
+ WHERE project_path = ?
306
+ `);
307
+ stmt.run(newProjectPath, oldProjectPath);
308
+ target.exec("COMMIT");
309
+ // Detach source after commit
310
+ target.exec("DETACH DATABASE source");
311
+ }
312
+ catch (error) {
313
+ try {
314
+ target.exec("ROLLBACK");
315
+ }
316
+ catch (_rollbackError) {
317
+ // Rollback might fail if transaction already ended
318
+ }
319
+ throw error;
320
+ }
321
+ finally {
322
+ target.close();
323
+ }
324
+ }
325
+ /**
326
+ * Update project_path in database (with transaction)
327
+ */
328
+ updateProjectPaths(dbPath, oldPath, newPath) {
329
+ const db = new Database(dbPath);
330
+ try {
331
+ db.exec("BEGIN TRANSACTION");
332
+ const stmt = db.prepare("UPDATE conversations SET project_path = ? WHERE project_path = ?");
333
+ const result = stmt.run(newPath, oldPath);
334
+ if (result.changes === 0) {
335
+ throw new Error("No conversations updated - path mismatch");
336
+ }
337
+ db.exec("COMMIT");
338
+ }
339
+ catch (error) {
340
+ db.exec("ROLLBACK");
341
+ db.close();
342
+ throw error;
343
+ }
344
+ db.close();
345
+ }
346
+ /**
347
+ * Score path similarity
348
+ */
349
+ scorePath(currentPath, oldPath) {
350
+ // Exact match
351
+ if (currentPath === oldPath) {
352
+ return 100;
353
+ }
354
+ // Split into components
355
+ const currentParts = currentPath.split("/").filter(p => p.length > 0);
356
+ const oldParts = oldPath.split("/").filter(p => p.length > 0);
357
+ // Count matching components
358
+ let matches = 0;
359
+ const minLength = Math.min(currentParts.length, oldParts.length);
360
+ for (let i = 0; i < minLength; i++) {
361
+ if (currentParts[i] === oldParts[i]) {
362
+ matches++;
363
+ }
364
+ }
365
+ // If only one component differs and same length, likely a rename
366
+ if (currentParts.length === oldParts.length &&
367
+ matches === currentParts.length - 1) {
368
+ return 80;
369
+ }
370
+ // General similarity score
371
+ return (matches / Math.max(currentParts.length, oldParts.length)) * 100;
372
+ }
373
+ /**
374
+ * Score folder name similarity
375
+ */
376
+ scoreFolderName(expected, actual) {
377
+ // Exact match
378
+ if (expected === actual) {
379
+ return 100;
380
+ }
381
+ // Split by dashes
382
+ const expectedParts = expected.split("-").filter(p => p.length > 0);
383
+ const actualParts = actual.split("-").filter(p => p.length > 0);
384
+ // Count matching parts
385
+ let matches = 0;
386
+ const minLength = Math.min(expectedParts.length, actualParts.length);
387
+ for (let i = 0; i < minLength; i++) {
388
+ if (expectedParts[i] === actualParts[i]) {
389
+ matches++;
390
+ }
391
+ }
392
+ // Calculate percentage
393
+ return (matches / Math.max(expectedParts.length, actualParts.length)) * 100;
394
+ }
395
+ /**
396
+ * Calculate overall score from multiple factors
397
+ */
398
+ calculateOverallScore(factors) {
399
+ let score = 0;
400
+ // Path similarity is most important (0-100 points)
401
+ score += factors.pathScore;
402
+ // Folder name similarity (weighted 50%)
403
+ score += factors.folderScore * 0.5;
404
+ // Having a database is good (20 points)
405
+ if (factors.hasDatabase) {
406
+ score += 20;
407
+ }
408
+ // More JSONL files = higher confidence (1 point per file, max 30)
409
+ score += Math.min(factors.jsonlCount, 30);
410
+ return score;
411
+ }
412
+ }
413
+ //# sourceMappingURL=ProjectMigration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectMigration.js","sourceRoot":"","sources":["../../src/utils/ProjectMigration.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "claude-conversation-memory-mcp",
3
- "version": "0.2.5",
4
- "description": "MCP server for indexing and searching Claude Code conversation history with decision tracking and git integration",
3
+ "version": "0.5.0",
4
+ "description": "MCP server for indexing and searching Claude Code conversation history with decision tracking, git integration, and project migration/merge",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {
@@ -10,7 +10,9 @@
10
10
  "files": [
11
11
  "dist",
12
12
  "README.md",
13
- "LICENSE"
13
+ "LICENSE",
14
+ ".claude-memory-config.example.json",
15
+ ".claude-memory-config.example.jsonc"
14
16
  ],
15
17
  "scripts": {
16
18
  "build": "tsc && npm run postbuild",