cccmemory 1.8.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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +349 -0
  3. package/dist/ConversationMemory.d.ts +231 -0
  4. package/dist/ConversationMemory.d.ts.map +1 -0
  5. package/dist/ConversationMemory.js +357 -0
  6. package/dist/ConversationMemory.js.map +1 -0
  7. package/dist/cache/QueryCache.d.ts +215 -0
  8. package/dist/cache/QueryCache.d.ts.map +1 -0
  9. package/dist/cache/QueryCache.js +294 -0
  10. package/dist/cache/QueryCache.js.map +1 -0
  11. package/dist/cli/commands.d.ts +9 -0
  12. package/dist/cli/commands.d.ts.map +1 -0
  13. package/dist/cli/commands.js +954 -0
  14. package/dist/cli/commands.js.map +1 -0
  15. package/dist/cli/help.d.ts +16 -0
  16. package/dist/cli/help.d.ts.map +1 -0
  17. package/dist/cli/help.js +361 -0
  18. package/dist/cli/help.js.map +1 -0
  19. package/dist/cli/index.d.ts +30 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +111 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/context/ContextInjector.d.ts +38 -0
  24. package/dist/context/ContextInjector.d.ts.map +1 -0
  25. package/dist/context/ContextInjector.js +235 -0
  26. package/dist/context/ContextInjector.js.map +1 -0
  27. package/dist/documentation/CodeAnalyzer.d.ts +29 -0
  28. package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
  29. package/dist/documentation/CodeAnalyzer.js +122 -0
  30. package/dist/documentation/CodeAnalyzer.js.map +1 -0
  31. package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
  32. package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
  33. package/dist/documentation/ConversationAnalyzer.js +157 -0
  34. package/dist/documentation/ConversationAnalyzer.js.map +1 -0
  35. package/dist/documentation/CrossReferencer.d.ts +67 -0
  36. package/dist/documentation/CrossReferencer.d.ts.map +1 -0
  37. package/dist/documentation/CrossReferencer.js +247 -0
  38. package/dist/documentation/CrossReferencer.js.map +1 -0
  39. package/dist/documentation/DocumentationGenerator.d.ts +22 -0
  40. package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
  41. package/dist/documentation/DocumentationGenerator.js +57 -0
  42. package/dist/documentation/DocumentationGenerator.js.map +1 -0
  43. package/dist/documentation/MarkdownFormatter.d.ts +26 -0
  44. package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
  45. package/dist/documentation/MarkdownFormatter.js +301 -0
  46. package/dist/documentation/MarkdownFormatter.js.map +1 -0
  47. package/dist/documentation/types.d.ts +176 -0
  48. package/dist/documentation/types.d.ts.map +1 -0
  49. package/dist/documentation/types.js +5 -0
  50. package/dist/documentation/types.js.map +1 -0
  51. package/dist/embeddings/ConfigManager.d.ts +46 -0
  52. package/dist/embeddings/ConfigManager.d.ts.map +1 -0
  53. package/dist/embeddings/ConfigManager.js +177 -0
  54. package/dist/embeddings/ConfigManager.js.map +1 -0
  55. package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
  56. package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
  57. package/dist/embeddings/EmbeddingConfig.js +132 -0
  58. package/dist/embeddings/EmbeddingConfig.js.map +1 -0
  59. package/dist/embeddings/EmbeddingGenerator.d.ts +51 -0
  60. package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
  61. package/dist/embeddings/EmbeddingGenerator.js +157 -0
  62. package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
  63. package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
  64. package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
  65. package/dist/embeddings/EmbeddingProvider.js +6 -0
  66. package/dist/embeddings/EmbeddingProvider.js.map +1 -0
  67. package/dist/embeddings/ModelRegistry.d.ts +48 -0
  68. package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
  69. package/dist/embeddings/ModelRegistry.js +170 -0
  70. package/dist/embeddings/ModelRegistry.js.map +1 -0
  71. package/dist/embeddings/VectorStore.d.ts +114 -0
  72. package/dist/embeddings/VectorStore.d.ts.map +1 -0
  73. package/dist/embeddings/VectorStore.js +393 -0
  74. package/dist/embeddings/VectorStore.js.map +1 -0
  75. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
  76. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
  77. package/dist/embeddings/providers/OllamaEmbeddings.js +125 -0
  78. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
  79. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
  80. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
  81. package/dist/embeddings/providers/OpenAIEmbeddings.js +129 -0
  82. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
  83. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
  84. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
  85. package/dist/embeddings/providers/TransformersEmbeddings.js +115 -0
  86. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
  87. package/dist/handoff/SessionHandoffStore.d.ts +80 -0
  88. package/dist/handoff/SessionHandoffStore.d.ts.map +1 -0
  89. package/dist/handoff/SessionHandoffStore.js +314 -0
  90. package/dist/handoff/SessionHandoffStore.js.map +1 -0
  91. package/dist/index.d.ts +7 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +115 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/mcp-server.d.ts +27 -0
  96. package/dist/mcp-server.d.ts.map +1 -0
  97. package/dist/mcp-server.js +157 -0
  98. package/dist/mcp-server.js.map +1 -0
  99. package/dist/memory/WorkingMemoryStore.d.ts +83 -0
  100. package/dist/memory/WorkingMemoryStore.d.ts.map +1 -0
  101. package/dist/memory/WorkingMemoryStore.js +318 -0
  102. package/dist/memory/WorkingMemoryStore.js.map +1 -0
  103. package/dist/memory/types.d.ts +192 -0
  104. package/dist/memory/types.d.ts.map +1 -0
  105. package/dist/memory/types.js +8 -0
  106. package/dist/memory/types.js.map +1 -0
  107. package/dist/parsers/CodexConversationParser.d.ts +51 -0
  108. package/dist/parsers/CodexConversationParser.d.ts.map +1 -0
  109. package/dist/parsers/CodexConversationParser.js +301 -0
  110. package/dist/parsers/CodexConversationParser.js.map +1 -0
  111. package/dist/parsers/ConversationParser.d.ts +286 -0
  112. package/dist/parsers/ConversationParser.d.ts.map +1 -0
  113. package/dist/parsers/ConversationParser.js +795 -0
  114. package/dist/parsers/ConversationParser.js.map +1 -0
  115. package/dist/parsers/DecisionExtractor.d.ts +144 -0
  116. package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
  117. package/dist/parsers/DecisionExtractor.js +434 -0
  118. package/dist/parsers/DecisionExtractor.js.map +1 -0
  119. package/dist/parsers/GitIntegrator.d.ts +156 -0
  120. package/dist/parsers/GitIntegrator.d.ts.map +1 -0
  121. package/dist/parsers/GitIntegrator.js +348 -0
  122. package/dist/parsers/GitIntegrator.js.map +1 -0
  123. package/dist/parsers/MistakeExtractor.d.ts +151 -0
  124. package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
  125. package/dist/parsers/MistakeExtractor.js +460 -0
  126. package/dist/parsers/MistakeExtractor.js.map +1 -0
  127. package/dist/parsers/RequirementsExtractor.d.ts +166 -0
  128. package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
  129. package/dist/parsers/RequirementsExtractor.js +338 -0
  130. package/dist/parsers/RequirementsExtractor.js.map +1 -0
  131. package/dist/realtime/ConversationWatcher.d.ts +87 -0
  132. package/dist/realtime/ConversationWatcher.d.ts.map +1 -0
  133. package/dist/realtime/ConversationWatcher.js +204 -0
  134. package/dist/realtime/ConversationWatcher.js.map +1 -0
  135. package/dist/realtime/IncrementalParser.d.ts +83 -0
  136. package/dist/realtime/IncrementalParser.d.ts.map +1 -0
  137. package/dist/realtime/IncrementalParser.js +232 -0
  138. package/dist/realtime/IncrementalParser.js.map +1 -0
  139. package/dist/realtime/LiveExtractor.d.ts +72 -0
  140. package/dist/realtime/LiveExtractor.d.ts.map +1 -0
  141. package/dist/realtime/LiveExtractor.js +288 -0
  142. package/dist/realtime/LiveExtractor.js.map +1 -0
  143. package/dist/search/SemanticSearch.d.ts +121 -0
  144. package/dist/search/SemanticSearch.d.ts.map +1 -0
  145. package/dist/search/SemanticSearch.js +823 -0
  146. package/dist/search/SemanticSearch.js.map +1 -0
  147. package/dist/storage/BackupManager.d.ts +58 -0
  148. package/dist/storage/BackupManager.d.ts.map +1 -0
  149. package/dist/storage/BackupManager.js +223 -0
  150. package/dist/storage/BackupManager.js.map +1 -0
  151. package/dist/storage/ConversationStorage.d.ts +341 -0
  152. package/dist/storage/ConversationStorage.d.ts.map +1 -0
  153. package/dist/storage/ConversationStorage.js +792 -0
  154. package/dist/storage/ConversationStorage.js.map +1 -0
  155. package/dist/storage/DeletionService.d.ts +70 -0
  156. package/dist/storage/DeletionService.d.ts.map +1 -0
  157. package/dist/storage/DeletionService.js +253 -0
  158. package/dist/storage/DeletionService.js.map +1 -0
  159. package/dist/storage/GlobalIndex.d.ts +133 -0
  160. package/dist/storage/GlobalIndex.d.ts.map +1 -0
  161. package/dist/storage/GlobalIndex.js +310 -0
  162. package/dist/storage/GlobalIndex.js.map +1 -0
  163. package/dist/storage/SQLiteManager.d.ts +114 -0
  164. package/dist/storage/SQLiteManager.d.ts.map +1 -0
  165. package/dist/storage/SQLiteManager.js +636 -0
  166. package/dist/storage/SQLiteManager.js.map +1 -0
  167. package/dist/storage/migrations.d.ts +54 -0
  168. package/dist/storage/migrations.d.ts.map +1 -0
  169. package/dist/storage/migrations.js +285 -0
  170. package/dist/storage/migrations.js.map +1 -0
  171. package/dist/storage/schema.sql +436 -0
  172. package/dist/tools/ToolDefinitions.d.ts +946 -0
  173. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  174. package/dist/tools/ToolDefinitions.js +937 -0
  175. package/dist/tools/ToolDefinitions.js.map +1 -0
  176. package/dist/tools/ToolHandlers.d.ts +791 -0
  177. package/dist/tools/ToolHandlers.d.ts.map +1 -0
  178. package/dist/tools/ToolHandlers.js +3262 -0
  179. package/dist/tools/ToolHandlers.js.map +1 -0
  180. package/dist/types/ToolTypes.d.ts +824 -0
  181. package/dist/types/ToolTypes.d.ts.map +1 -0
  182. package/dist/types/ToolTypes.js +6 -0
  183. package/dist/types/ToolTypes.js.map +1 -0
  184. package/dist/utils/Logger.d.ts +70 -0
  185. package/dist/utils/Logger.d.ts.map +1 -0
  186. package/dist/utils/Logger.js +131 -0
  187. package/dist/utils/Logger.js.map +1 -0
  188. package/dist/utils/McpConfig.d.ts +54 -0
  189. package/dist/utils/McpConfig.d.ts.map +1 -0
  190. package/dist/utils/McpConfig.js +136 -0
  191. package/dist/utils/McpConfig.js.map +1 -0
  192. package/dist/utils/ProjectMigration.d.ts +82 -0
  193. package/dist/utils/ProjectMigration.d.ts.map +1 -0
  194. package/dist/utils/ProjectMigration.js +416 -0
  195. package/dist/utils/ProjectMigration.js.map +1 -0
  196. package/dist/utils/constants.d.ts +75 -0
  197. package/dist/utils/constants.d.ts.map +1 -0
  198. package/dist/utils/constants.js +105 -0
  199. package/dist/utils/constants.js.map +1 -0
  200. package/dist/utils/safeJson.d.ts +37 -0
  201. package/dist/utils/safeJson.d.ts.map +1 -0
  202. package/dist/utils/safeJson.js +48 -0
  203. package/dist/utils/safeJson.js.map +1 -0
  204. package/dist/utils/sanitization.d.ts +45 -0
  205. package/dist/utils/sanitization.d.ts.map +1 -0
  206. package/dist/utils/sanitization.js +153 -0
  207. package/dist/utils/sanitization.js.map +1 -0
  208. package/dist/utils/worktree.d.ts +15 -0
  209. package/dist/utils/worktree.d.ts.map +1 -0
  210. package/dist/utils/worktree.js +86 -0
  211. package/dist/utils/worktree.js.map +1 -0
  212. package/package.json +98 -0
  213. package/scripts/changelog-check.sh +62 -0
  214. package/scripts/check-node.js +17 -0
  215. package/scripts/dev-config.js +56 -0
  216. package/scripts/postinstall.js +117 -0
@@ -0,0 +1,416 @@
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, validateDatabasePath } 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, ".cccmemory.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, ".cccmemory.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, ".cccmemory.db");
190
+ const targetDb = join(targetFolder, ".cccmemory.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, ".cccmemory.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, ".cccmemory.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 (validate path to prevent SQL injection)
277
+ const safeSourcePath = validateDatabasePath(sourceDbPath);
278
+ target.exec(`ATTACH DATABASE '${safeSourcePath}' AS source`);
279
+ // Merge conversations (always exists)
280
+ target.exec(`
281
+ INSERT OR IGNORE INTO conversations
282
+ SELECT * FROM source.conversations
283
+ `);
284
+ // Merge other tables only if they exist in both databases
285
+ const tablesToMerge = [
286
+ "messages",
287
+ "tool_uses",
288
+ "decisions",
289
+ "mistakes",
290
+ "requirements",
291
+ "file_evolution",
292
+ "git_commits"
293
+ ];
294
+ for (const table of tablesToMerge) {
295
+ if (sourceTables.has(table) && targetTables.has(table)) {
296
+ target.exec(`
297
+ INSERT OR IGNORE INTO ${table}
298
+ SELECT * FROM source.${table}
299
+ `);
300
+ }
301
+ }
302
+ // Update project_path for newly merged conversations from source
303
+ const stmt = target.prepare(`
304
+ UPDATE conversations
305
+ SET project_path = ?
306
+ WHERE project_path = ?
307
+ `);
308
+ stmt.run(newProjectPath, oldProjectPath);
309
+ target.exec("COMMIT");
310
+ // Detach source after commit
311
+ target.exec("DETACH DATABASE source");
312
+ }
313
+ catch (error) {
314
+ try {
315
+ target.exec("ROLLBACK");
316
+ }
317
+ catch (_rollbackError) {
318
+ // Rollback might fail if transaction already ended
319
+ }
320
+ throw error;
321
+ }
322
+ finally {
323
+ target.close();
324
+ }
325
+ }
326
+ /**
327
+ * Update project_path in database (with transaction)
328
+ */
329
+ updateProjectPaths(dbPath, oldPath, newPath) {
330
+ const db = new Database(dbPath);
331
+ try {
332
+ db.exec("BEGIN TRANSACTION");
333
+ const stmt = db.prepare("UPDATE conversations SET project_path = ? WHERE project_path = ?");
334
+ const result = stmt.run(newPath, oldPath);
335
+ if (result.changes === 0) {
336
+ throw new Error("No conversations updated - path mismatch");
337
+ }
338
+ db.exec("COMMIT");
339
+ }
340
+ catch (error) {
341
+ db.exec("ROLLBACK");
342
+ db.close();
343
+ throw error;
344
+ }
345
+ db.close();
346
+ }
347
+ /**
348
+ * Score path similarity
349
+ */
350
+ scorePath(currentPath, oldPath) {
351
+ // Exact match
352
+ if (currentPath === oldPath) {
353
+ return 100;
354
+ }
355
+ // Split into components using platform-aware separator
356
+ // Handle both Unix (/) and Windows (\) paths
357
+ const pathSeparatorRegex = /[\\/]/;
358
+ const currentParts = currentPath.split(pathSeparatorRegex).filter(p => p.length > 0);
359
+ const oldParts = oldPath.split(pathSeparatorRegex).filter(p => p.length > 0);
360
+ // Count matching components
361
+ let matches = 0;
362
+ const minLength = Math.min(currentParts.length, oldParts.length);
363
+ for (let i = 0; i < minLength; i++) {
364
+ if (currentParts[i] === oldParts[i]) {
365
+ matches++;
366
+ }
367
+ }
368
+ // If only one component differs and same length, likely a rename
369
+ if (currentParts.length === oldParts.length &&
370
+ matches === currentParts.length - 1) {
371
+ return 80;
372
+ }
373
+ // General similarity score
374
+ return (matches / Math.max(currentParts.length, oldParts.length)) * 100;
375
+ }
376
+ /**
377
+ * Score folder name similarity
378
+ */
379
+ scoreFolderName(expected, actual) {
380
+ // Exact match
381
+ if (expected === actual) {
382
+ return 100;
383
+ }
384
+ // Split by dashes
385
+ const expectedParts = expected.split("-").filter(p => p.length > 0);
386
+ const actualParts = actual.split("-").filter(p => p.length > 0);
387
+ // Count matching parts
388
+ let matches = 0;
389
+ const minLength = Math.min(expectedParts.length, actualParts.length);
390
+ for (let i = 0; i < minLength; i++) {
391
+ if (expectedParts[i] === actualParts[i]) {
392
+ matches++;
393
+ }
394
+ }
395
+ // Calculate percentage
396
+ return (matches / Math.max(expectedParts.length, actualParts.length)) * 100;
397
+ }
398
+ /**
399
+ * Calculate overall score from multiple factors
400
+ */
401
+ calculateOverallScore(factors) {
402
+ let score = 0;
403
+ // Path similarity is most important (0-100 points)
404
+ score += factors.pathScore;
405
+ // Folder name similarity (weighted 50%)
406
+ score += factors.folderScore * 0.5;
407
+ // Having a database is good (20 points)
408
+ if (factors.hasDatabase) {
409
+ score += 20;
410
+ }
411
+ // More JSONL files = higher confidence (1 point per file, max 30)
412
+ score += Math.min(factors.jsonlCount, 30);
413
+ return score;
414
+ }
415
+ }
416
+ //# 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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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Application Constants
3
+ *
4
+ * Centralized location for magic numbers and configuration values.
5
+ * Extracted from scattered literals throughout the codebase.
6
+ */
7
+ export declare const DB_CONFIG: {
8
+ readonly CACHE_SIZE_KB: 64000;
9
+ readonly MMAP_SIZE: 30000000000;
10
+ readonly PAGE_SIZE: 4096;
11
+ readonly WAL_AUTOCHECKPOINT: 1000;
12
+ readonly DB_FILE_NAME: ".cccmemory.db";
13
+ readonly BACKUP_SUFFIX: ".bak";
14
+ };
15
+ export declare const EMBEDDING_CONFIG: {
16
+ readonly OLLAMA_DEFAULT_DIMENSIONS: 1024;
17
+ readonly TRANSFORMERS_DEFAULT_DIMENSIONS: 384;
18
+ readonly OPENAI_DEFAULT_DIMENSIONS: 1536;
19
+ readonly OLLAMA_DEFAULT_MODEL: "mxbai-embed-large";
20
+ readonly TRANSFORMERS_DEFAULT_MODEL: "Xenova/all-MiniLM-L6-v2";
21
+ readonly OPENAI_DEFAULT_MODEL: "text-embedding-ada-002";
22
+ readonly BATCH_SIZE: 100;
23
+ readonly DEFAULT_SIMILARITY_THRESHOLD: 0.7;
24
+ };
25
+ export declare const SEARCH_CONFIG: {
26
+ readonly DEFAULT_LIMIT: 10;
27
+ readonly MAX_LIMIT: 100;
28
+ readonly SNIPPET_CONTEXT_CHARS: 200;
29
+ readonly DEFAULT_DAYS_BACK: 30;
30
+ };
31
+ export declare const PATH_PATTERNS: {
32
+ readonly CLAUDE_DIR: ".claude";
33
+ readonly PROJECTS_DIR: "projects";
34
+ readonly LEGACY_PREFIX: "-Users-";
35
+ readonly CONFIG_FILE: ".claude-memory-config.jsonc";
36
+ };
37
+ export declare const TIME: {
38
+ readonly SECOND: 1000;
39
+ readonly MINUTE: number;
40
+ readonly HOUR: number;
41
+ readonly DAY: number;
42
+ readonly WEEK: number;
43
+ };
44
+ export declare const LIMITS: {
45
+ readonly MAX_MESSAGE_LENGTH: 100000;
46
+ readonly MAX_FILE_PATH_LENGTH: 4096;
47
+ readonly MAX_DECISION_LENGTH: 10000;
48
+ readonly MAX_BATCH_SIZE: 1000;
49
+ readonly MAX_SEARCH_RESULTS: 1000;
50
+ readonly MIN_SIMILARITY_SCORE: 0;
51
+ readonly MAX_SIMILARITY_SCORE: 1;
52
+ };
53
+ export declare const MIGRATION_CONFIG: {
54
+ readonly MIN_CONVERSATIONS_FOR_MIGRATION: 1;
55
+ readonly MIN_SIMILARITY_SCORE_FOR_MATCH: 0.7;
56
+ readonly AUTO_BACKUP: true;
57
+ readonly KEEP_SOURCE_FILES: true;
58
+ };
59
+ export declare const MCP_CONFIG: {
60
+ readonly TOOL_TIMEOUT_MS: 30000;
61
+ readonly BATCH_PROCESSING_SIZE: 50;
62
+ };
63
+ export declare const ERROR_MESSAGES: {
64
+ readonly NO_CONVERSATIONS_FOUND: "No conversations found";
65
+ readonly INDEX_REQUIRED: "Please index conversations first";
66
+ readonly INVALID_PROJECT_PATH: "Invalid project path";
67
+ readonly DATABASE_ERROR: "Database operation failed";
68
+ readonly EMBEDDING_ERROR: "Embedding generation failed";
69
+ };
70
+ export declare const SUCCESS_MESSAGES: {
71
+ readonly INDEX_COMPLETE: "Indexing complete";
72
+ readonly MIGRATION_COMPLETE: "Migration complete";
73
+ readonly BACKUP_CREATED: "Backup created successfully";
74
+ };
75
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,eAAO,MAAM,SAAS;;;;;;;CAYZ,CAAC;AAGX,eAAO,MAAM,gBAAgB;;;;;;;;;CAgBnB,CAAC;AAGX,eAAO,MAAM,aAAa;;;;;CAUhB,CAAC;AAGX,eAAO,MAAM,aAAa;;;;;CAUhB,CAAC;AAGX,eAAO,MAAM,IAAI;;;;;;CAMP,CAAC;AAGX,eAAO,MAAM,MAAM;;;;;;;;CAaT,CAAC;AAGX,eAAO,MAAM,gBAAgB;;;;;CAQnB,CAAC;AAGX,eAAO,MAAM,UAAU;;;CAMb,CAAC;AAGX,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAGX,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Application Constants
3
+ *
4
+ * Centralized location for magic numbers and configuration values.
5
+ * Extracted from scattered literals throughout the codebase.
6
+ */
7
+ // Database Configuration
8
+ export const DB_CONFIG = {
9
+ // Performance settings (from SQLiteManager)
10
+ CACHE_SIZE_KB: 64000, // 64MB cache
11
+ MMAP_SIZE: 30000000000, // 30GB memory-mapped I/O
12
+ PAGE_SIZE: 4096, // 4KB page size
13
+ WAL_AUTOCHECKPOINT: 1000, // Checkpoint WAL after 1000 pages
14
+ // Database file name
15
+ DB_FILE_NAME: '.cccmemory.db',
16
+ // Backup suffix
17
+ BACKUP_SUFFIX: '.bak',
18
+ };
19
+ // Embedding Configuration
20
+ export const EMBEDDING_CONFIG = {
21
+ // Default model dimensions
22
+ OLLAMA_DEFAULT_DIMENSIONS: 1024, // mxbai-embed-large
23
+ TRANSFORMERS_DEFAULT_DIMENSIONS: 384, // Xenova/all-MiniLM-L6-v2
24
+ OPENAI_DEFAULT_DIMENSIONS: 1536, // text-embedding-ada-002
25
+ // Default models
26
+ OLLAMA_DEFAULT_MODEL: 'mxbai-embed-large',
27
+ TRANSFORMERS_DEFAULT_MODEL: 'Xenova/all-MiniLM-L6-v2',
28
+ OPENAI_DEFAULT_MODEL: 'text-embedding-ada-002',
29
+ // Batch size for embedding generation
30
+ BATCH_SIZE: 100,
31
+ // Similarity threshold
32
+ DEFAULT_SIMILARITY_THRESHOLD: 0.7,
33
+ };
34
+ // Search Configuration
35
+ export const SEARCH_CONFIG = {
36
+ // Default result limits
37
+ DEFAULT_LIMIT: 10,
38
+ MAX_LIMIT: 100,
39
+ // Context window for snippets
40
+ SNIPPET_CONTEXT_CHARS: 200,
41
+ // Date range defaults
42
+ DEFAULT_DAYS_BACK: 30,
43
+ };
44
+ // File Path Patterns
45
+ export const PATH_PATTERNS = {
46
+ // Conversation directories
47
+ CLAUDE_DIR: '.claude',
48
+ PROJECTS_DIR: 'projects',
49
+ // Legacy patterns
50
+ LEGACY_PREFIX: '-Users-',
51
+ // Config file
52
+ CONFIG_FILE: '.claude-memory-config.jsonc',
53
+ };
54
+ // Time Constants (milliseconds)
55
+ export const TIME = {
56
+ SECOND: 1000,
57
+ MINUTE: 60 * 1000,
58
+ HOUR: 60 * 60 * 1000,
59
+ DAY: 24 * 60 * 60 * 1000,
60
+ WEEK: 7 * 24 * 60 * 60 * 1000,
61
+ };
62
+ // Validation Limits
63
+ export const LIMITS = {
64
+ // String length limits
65
+ MAX_MESSAGE_LENGTH: 100000,
66
+ MAX_FILE_PATH_LENGTH: 4096,
67
+ MAX_DECISION_LENGTH: 10000,
68
+ // Array size limits
69
+ MAX_BATCH_SIZE: 1000,
70
+ MAX_SEARCH_RESULTS: 1000,
71
+ // Numeric limits
72
+ MIN_SIMILARITY_SCORE: 0.0,
73
+ MAX_SIMILARITY_SCORE: 1.0,
74
+ };
75
+ // Migration Configuration
76
+ export const MIGRATION_CONFIG = {
77
+ // Validation thresholds
78
+ MIN_CONVERSATIONS_FOR_MIGRATION: 1,
79
+ MIN_SIMILARITY_SCORE_FOR_MATCH: 0.7,
80
+ // Backup behavior
81
+ AUTO_BACKUP: true,
82
+ KEEP_SOURCE_FILES: true,
83
+ };
84
+ // MCP Configuration
85
+ export const MCP_CONFIG = {
86
+ // Tool timeout
87
+ TOOL_TIMEOUT_MS: 30000, // 30 seconds
88
+ // Batch processing
89
+ BATCH_PROCESSING_SIZE: 50,
90
+ };
91
+ // Error Messages (commonly reused)
92
+ export const ERROR_MESSAGES = {
93
+ NO_CONVERSATIONS_FOUND: 'No conversations found',
94
+ INDEX_REQUIRED: 'Please index conversations first',
95
+ INVALID_PROJECT_PATH: 'Invalid project path',
96
+ DATABASE_ERROR: 'Database operation failed',
97
+ EMBEDDING_ERROR: 'Embedding generation failed',
98
+ };
99
+ // Success Messages (commonly reused)
100
+ export const SUCCESS_MESSAGES = {
101
+ INDEX_COMPLETE: 'Indexing complete',
102
+ MIGRATION_COMPLETE: 'Migration complete',
103
+ BACKUP_CREATED: 'Backup created successfully',
104
+ };
105
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Safe JSON parsing utilities
3
+ *
4
+ * Provides crash-safe JSON parsing with fallback values.
5
+ * Use this instead of raw JSON.parse() when parsing data from:
6
+ * - Database rows (may be corrupted)
7
+ * - User input
8
+ * - External sources
9
+ */
10
+ /**
11
+ * Safely parse JSON with a fallback value on error.
12
+ *
13
+ * Unlike JSON.parse(), this function:
14
+ * - Never throws
15
+ * - Handles null/undefined input
16
+ * - Handles non-string input
17
+ * - Returns the fallback on any parse error
18
+ *
19
+ * @param value - The JSON string to parse
20
+ * @param fallback - Value to return if parsing fails
21
+ * @returns Parsed value or fallback
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // Safe object parsing
26
+ * const data = safeJsonParse(row.metadata, {});
27
+ *
28
+ * // Safe array parsing
29
+ * const files = safeJsonParse(row.files_changed, []);
30
+ *
31
+ * // With specific type
32
+ * interface Config { debug: boolean }
33
+ * const config = safeJsonParse<Config>(jsonStr, { debug: false });
34
+ * ```
35
+ */
36
+ export declare function safeJsonParse<T>(value: string | null | undefined, fallback: T): T;
37
+ //# sourceMappingURL=safeJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeJson.d.ts","sourceRoot":"","sources":["../../src/utils/safeJson.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAWjF"}