memobank-cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/LICENSE +21 -0
  3. package/README.md +300 -0
  4. package/dist/cli.d.ts +7 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +294 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/capture.d.ts +12 -0
  9. package/dist/commands/capture.d.ts.map +1 -0
  10. package/dist/commands/capture.js +191 -0
  11. package/dist/commands/capture.js.map +1 -0
  12. package/dist/commands/import.d.ts +28 -0
  13. package/dist/commands/import.d.ts.map +1 -0
  14. package/dist/commands/import.js +356 -0
  15. package/dist/commands/import.js.map +1 -0
  16. package/dist/commands/index.d.ts +12 -0
  17. package/dist/commands/index.d.ts.map +1 -0
  18. package/dist/commands/index.js +82 -0
  19. package/dist/commands/index.js.map +1 -0
  20. package/dist/commands/install.d.ts +16 -0
  21. package/dist/commands/install.d.ts.map +1 -0
  22. package/dist/commands/install.js +142 -0
  23. package/dist/commands/install.js.map +1 -0
  24. package/dist/commands/lifecycle.d.ts +21 -0
  25. package/dist/commands/lifecycle.d.ts.map +1 -0
  26. package/dist/commands/lifecycle.js +106 -0
  27. package/dist/commands/lifecycle.js.map +1 -0
  28. package/dist/commands/map.d.ts +10 -0
  29. package/dist/commands/map.d.ts.map +1 -0
  30. package/dist/commands/map.js +72 -0
  31. package/dist/commands/map.js.map +1 -0
  32. package/dist/commands/onboarding.d.ts +10 -0
  33. package/dist/commands/onboarding.d.ts.map +1 -0
  34. package/dist/commands/onboarding.js +420 -0
  35. package/dist/commands/onboarding.js.map +1 -0
  36. package/dist/commands/recall.d.ts +13 -0
  37. package/dist/commands/recall.d.ts.map +1 -0
  38. package/dist/commands/recall.js +89 -0
  39. package/dist/commands/recall.js.map +1 -0
  40. package/dist/commands/review.d.ts +11 -0
  41. package/dist/commands/review.d.ts.map +1 -0
  42. package/dist/commands/review.js +66 -0
  43. package/dist/commands/review.js.map +1 -0
  44. package/dist/commands/search.d.ts +13 -0
  45. package/dist/commands/search.d.ts.map +1 -0
  46. package/dist/commands/search.js +107 -0
  47. package/dist/commands/search.js.map +1 -0
  48. package/dist/commands/setup.d.ts +9 -0
  49. package/dist/commands/setup.d.ts.map +1 -0
  50. package/dist/commands/setup.js +354 -0
  51. package/dist/commands/setup.js.map +1 -0
  52. package/dist/commands/write.d.ts +14 -0
  53. package/dist/commands/write.d.ts.map +1 -0
  54. package/dist/commands/write.js +247 -0
  55. package/dist/commands/write.js.map +1 -0
  56. package/dist/config.d.ts +19 -0
  57. package/dist/config.d.ts.map +1 -0
  58. package/dist/config.js +147 -0
  59. package/dist/config.js.map +1 -0
  60. package/dist/core/decay-engine.d.ts +16 -0
  61. package/dist/core/decay-engine.d.ts.map +1 -0
  62. package/dist/core/decay-engine.js +91 -0
  63. package/dist/core/decay-engine.js.map +1 -0
  64. package/dist/core/embedding.d.ts +60 -0
  65. package/dist/core/embedding.d.ts.map +1 -0
  66. package/dist/core/embedding.js +169 -0
  67. package/dist/core/embedding.js.map +1 -0
  68. package/dist/core/lifecycle-manager.d.ts +105 -0
  69. package/dist/core/lifecycle-manager.d.ts.map +1 -0
  70. package/dist/core/lifecycle-manager.js +332 -0
  71. package/dist/core/lifecycle-manager.js.map +1 -0
  72. package/dist/core/memory-template.d.ts +70 -0
  73. package/dist/core/memory-template.d.ts.map +1 -0
  74. package/dist/core/memory-template.js +496 -0
  75. package/dist/core/memory-template.js.map +1 -0
  76. package/dist/core/noise-filter.d.ts +39 -0
  77. package/dist/core/noise-filter.d.ts.map +1 -0
  78. package/dist/core/noise-filter.js +168 -0
  79. package/dist/core/noise-filter.js.map +1 -0
  80. package/dist/core/retriever.d.ts +21 -0
  81. package/dist/core/retriever.d.ts.map +1 -0
  82. package/dist/core/retriever.js +77 -0
  83. package/dist/core/retriever.js.map +1 -0
  84. package/dist/core/sanitizer.d.ts +9 -0
  85. package/dist/core/sanitizer.d.ts.map +1 -0
  86. package/dist/core/sanitizer.js +57 -0
  87. package/dist/core/sanitizer.js.map +1 -0
  88. package/dist/core/smart-extractor.d.ts +12 -0
  89. package/dist/core/smart-extractor.d.ts.map +1 -0
  90. package/dist/core/smart-extractor.js +102 -0
  91. package/dist/core/smart-extractor.js.map +1 -0
  92. package/dist/core/store.d.ts +40 -0
  93. package/dist/core/store.d.ts.map +1 -0
  94. package/dist/core/store.js +233 -0
  95. package/dist/core/store.js.map +1 -0
  96. package/dist/core/tool-config.d.ts +33 -0
  97. package/dist/core/tool-config.d.ts.map +1 -0
  98. package/dist/core/tool-config.js +253 -0
  99. package/dist/core/tool-config.js.map +1 -0
  100. package/dist/engines/engine-adapter.d.ts +22 -0
  101. package/dist/engines/engine-adapter.d.ts.map +1 -0
  102. package/dist/engines/engine-adapter.js +7 -0
  103. package/dist/engines/engine-adapter.js.map +1 -0
  104. package/dist/engines/lancedb-engine.d.ts +55 -0
  105. package/dist/engines/lancedb-engine.d.ts.map +1 -0
  106. package/dist/engines/lancedb-engine.js +279 -0
  107. package/dist/engines/lancedb-engine.js.map +1 -0
  108. package/dist/engines/text-engine.d.ts +30 -0
  109. package/dist/engines/text-engine.d.ts.map +1 -0
  110. package/dist/engines/text-engine.js +100 -0
  111. package/dist/engines/text-engine.js.map +1 -0
  112. package/dist/platforms/claude-code.d.ts +13 -0
  113. package/dist/platforms/claude-code.d.ts.map +1 -0
  114. package/dist/platforms/claude-code.js +85 -0
  115. package/dist/platforms/claude-code.js.map +1 -0
  116. package/dist/platforms/codex.d.ts +9 -0
  117. package/dist/platforms/codex.d.ts.map +1 -0
  118. package/dist/platforms/codex.js +102 -0
  119. package/dist/platforms/codex.js.map +1 -0
  120. package/dist/platforms/cursor.d.ts +9 -0
  121. package/dist/platforms/cursor.d.ts.map +1 -0
  122. package/dist/platforms/cursor.js +112 -0
  123. package/dist/platforms/cursor.js.map +1 -0
  124. package/dist/types.d.ts +55 -0
  125. package/dist/types.d.ts.map +1 -0
  126. package/dist/types.js +6 -0
  127. package/dist/types.js.map +1 -0
  128. package/package.json +87 -0
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ /**
3
+ * LanceDB Engine
4
+ * Vector search engine using LanceDB with hybrid BM25 + vector search
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.LanceDbEngine = void 0;
41
+ const path = __importStar(require("path"));
42
+ const decay_engine_1 = require("../core/decay-engine");
43
+ // LanceDB types (dynamic import)
44
+ let lancedb = null;
45
+ class LanceDbEngine {
46
+ dbPath;
47
+ embeddingGenerator;
48
+ db = null;
49
+ table = null;
50
+ tableName = 'memories';
51
+ indexDirName = '.lancedb';
52
+ constructor(dbPath, embeddingGenerator) {
53
+ this.dbPath = dbPath;
54
+ this.embeddingGenerator = embeddingGenerator;
55
+ }
56
+ /**
57
+ * Initialize LanceDB connection and table
58
+ */
59
+ async init() {
60
+ if (this.db !== null) {
61
+ return;
62
+ }
63
+ try {
64
+ // Dynamic import for optional dependency
65
+ lancedb = await Promise.resolve().then(() => __importStar(require('@lancedb/lancedb')));
66
+ const uri = path.join(this.dbPath, this.indexDirName);
67
+ this.db = await lancedb.connect(uri);
68
+ // Try to open existing table
69
+ try {
70
+ this.table = await this.db.openTable(this.tableName);
71
+ }
72
+ catch {
73
+ // Table doesn't exist - will be created on first index
74
+ this.table = null;
75
+ }
76
+ }
77
+ catch (error) {
78
+ throw new Error(`Failed to initialize LanceDB: ${error.message}`);
79
+ }
80
+ }
81
+ /**
82
+ * Index memories into LanceDB
83
+ * @param memories - Memories to index
84
+ * @param incremental - Whether to update incrementally or rebuild
85
+ */
86
+ async index(memories, incremental) {
87
+ await this.init();
88
+ if (memories.length === 0) {
89
+ return;
90
+ }
91
+ // Generate embeddings for all memories
92
+ const texts = memories.map((m) => this.getEmbeddingText(m));
93
+ const embeddings = await this.embeddingGenerator.generateEmbeddings(texts);
94
+ // Prepare data for insertion (filter out undefined embeddings)
95
+ const dataToInsert = memories
96
+ .map((memory, i) => ({
97
+ id: this.memoryId(memory),
98
+ path: memory.path,
99
+ name: memory.name,
100
+ description: memory.description,
101
+ tags: memory.tags.join(', '),
102
+ content: memory.content,
103
+ vector: embeddings[i] ?? [],
104
+ created: memory.created,
105
+ updated: memory.updated || memory.created,
106
+ confidence: memory.confidence || 'medium',
107
+ }))
108
+ .filter((item) => item.vector.length > 0);
109
+ // Create table if it doesn't exist
110
+ if (this.table === null) {
111
+ if (dataToInsert.length === 0) {
112
+ console.log('No valid memories to index (embeddings failed)');
113
+ return;
114
+ }
115
+ this.table = await this.db.createTable(this.tableName, dataToInsert);
116
+ console.log(`Created table with ${dataToInsert.length} records`);
117
+ return;
118
+ }
119
+ // Get existing indexed paths for incremental update
120
+ let existingPaths = new Set();
121
+ if (incremental) {
122
+ try {
123
+ const allData = await this.table.query().limit(10000).toArray();
124
+ existingPaths = new Set(allData.map((row) => row.path));
125
+ }
126
+ catch {
127
+ // Table empty or error
128
+ }
129
+ }
130
+ // Filter memories that need indexing
131
+ const memoriesToIndex = memories.filter((m) => !incremental || !existingPaths.has(m.path) || this.isMemoryUpdated(m));
132
+ if (memoriesToIndex.length === 0) {
133
+ console.log('No new memories to index');
134
+ return;
135
+ }
136
+ // Generate embeddings for new/updated memories
137
+ const newTexts = memoriesToIndex.map((m) => this.getEmbeddingText(m));
138
+ const newEmbeddings = await this.embeddingGenerator.generateEmbeddings(newTexts);
139
+ // Prepare data for insertion (filter out undefined embeddings)
140
+ const newDataToInsert = memoriesToIndex
141
+ .map((memory, i) => ({
142
+ id: this.memoryId(memory),
143
+ path: memory.path,
144
+ name: memory.name,
145
+ description: memory.description,
146
+ tags: memory.tags.join(', '),
147
+ content: memory.content,
148
+ vector: newEmbeddings[i] ?? [],
149
+ created: memory.created,
150
+ updated: memory.updated || memory.created,
151
+ confidence: memory.confidence || 'medium',
152
+ }))
153
+ .filter((item) => item.vector.length > 0);
154
+ // Delete old entries for updated memories
155
+ if (incremental) {
156
+ const updatedPaths = memoriesToIndex
157
+ .filter((m) => this.isMemoryUpdated(m))
158
+ .map((m) => m.path);
159
+ for (const p of updatedPaths) {
160
+ try {
161
+ await this.table.delete(`path = '${p.replace(/'/g, "''")}'`);
162
+ }
163
+ catch {
164
+ // Ignore delete errors
165
+ }
166
+ }
167
+ }
168
+ // Insert new data
169
+ await this.table.add(newDataToInsert);
170
+ console.log(`Added ${newDataToInsert.length} records`);
171
+ // Create index for vector search (if not exists)
172
+ try {
173
+ await this.table.createIndex('vector', {
174
+ config: lancedb.Index.ivfPq({
175
+ numPartitions: Math.max(1, Math.floor(memories.length / 100)),
176
+ numSubVectors: Math.floor(this.embeddingGenerator['config'].dimensions / 8),
177
+ }),
178
+ });
179
+ }
180
+ catch {
181
+ // Index may already exist, ignore
182
+ }
183
+ }
184
+ /**
185
+ * Search for memories using hybrid vector + BM25 search
186
+ * @param query - Search query string
187
+ * @param memories - All memories (fallback for text search)
188
+ * @param topK - Maximum number of results
189
+ * @returns Array of recall results sorted by score
190
+ */
191
+ async search(query, memories, topK) {
192
+ await this.init();
193
+ // If table doesn't exist yet, return empty results
194
+ if (this.table === null) {
195
+ return [];
196
+ }
197
+ try {
198
+ // Generate query embedding
199
+ const queryEmbedding = await this.embeddingGenerator.generateEmbedding(query);
200
+ // Vector search using nearestTo
201
+ const queryResult = await this.table
202
+ .query()
203
+ .nearestTo(queryEmbedding)
204
+ .limit(topK * 2)
205
+ .toArray();
206
+ // Convert to RecallResult with hybrid scoring
207
+ const results = queryResult.map((row) => {
208
+ const memory = this.rowToMemory(row);
209
+ const vectorScore = 1 - (row._distance || 0); // Convert distance to similarity
210
+ // Combine with decay score
211
+ const decayScore = (0, decay_engine_1.computeDecayScore)(memory);
212
+ const finalScore = vectorScore * 0.7 + decayScore * 0.3;
213
+ return { memory, score: finalScore };
214
+ });
215
+ // Sort by score descending
216
+ results.sort((a, b) => b.score - a.score);
217
+ // Return top-K
218
+ return results.slice(0, topK);
219
+ }
220
+ catch (error) {
221
+ console.warn(`LanceDB search failed, falling back to text engine: ${error.message}`);
222
+ // Return empty results, caller should handle fallback
223
+ return [];
224
+ }
225
+ }
226
+ /**
227
+ * Get combined text for embedding generation
228
+ */
229
+ getEmbeddingText(memory) {
230
+ return `${memory.name} ${memory.description} ${memory.tags.join(' ')} ${memory.content}`.slice(0, 8000);
231
+ }
232
+ /**
233
+ * Generate unique memory ID
234
+ */
235
+ memoryId(memory) {
236
+ const hash = require('crypto').createHash('md5').update(memory.path).digest('hex');
237
+ return hash.slice(0, 16);
238
+ }
239
+ /**
240
+ * Check if memory has been updated since last indexing
241
+ */
242
+ isMemoryUpdated(memory) {
243
+ // Simple check based on updated timestamp
244
+ return memory.updated !== undefined && memory.updated !== memory.created;
245
+ }
246
+ /**
247
+ * Convert LanceDB row to MemoryFile
248
+ */
249
+ rowToMemory(row) {
250
+ return {
251
+ path: row.path,
252
+ name: row.name,
253
+ type: this.inferType(row.name),
254
+ description: row.description,
255
+ tags: row.tags.split(', ').filter((t) => t.length > 0),
256
+ created: row.created,
257
+ updated: row.updated,
258
+ confidence: row.confidence,
259
+ content: row.content,
260
+ };
261
+ }
262
+ /**
263
+ * Infer memory type from name/path
264
+ */
265
+ inferType(name) {
266
+ const lower = name.toLowerCase();
267
+ if (lower.includes('lesson'))
268
+ return 'lesson';
269
+ if (lower.includes('decision'))
270
+ return 'decision';
271
+ if (lower.includes('workflow'))
272
+ return 'workflow';
273
+ if (lower.includes('architecture'))
274
+ return 'architecture';
275
+ return 'lesson'; // default
276
+ }
277
+ }
278
+ exports.LanceDbEngine = LanceDbEngine;
279
+ //# sourceMappingURL=lancedb-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lancedb-engine.js","sourceRoot":"","sources":["../../src/engines/lancedb-engine.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGH,2CAA6B;AAK7B,uDAAyD;AAEzD,iCAAiC;AACjC,IAAI,OAAO,GAAQ,IAAI,CAAC;AAexB,MAAa,aAAa;IAChB,MAAM,CAAS;IACf,kBAAkB,CAAqB;IACvC,EAAE,GAAQ,IAAI,CAAC;IACf,KAAK,GAAQ,IAAI,CAAC;IACT,SAAS,GAAG,UAAU,CAAC;IACvB,YAAY,GAAG,UAAU,CAAC;IAE3C,YAAY,MAAc,EAAE,kBAAsC;QAChE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,yCAAyC;YACzC,OAAO,GAAG,wDAAa,kBAAkB,GAAC,CAAC;YAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACtD,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAErC,6BAA6B;YAC7B,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,uDAAuD;gBACvD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAkC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,QAAsB,EAAE,WAAoB;QACtD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,uCAAuC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE3E,+DAA+D;QAC/D,MAAM,YAAY,GAAoB,QAAQ;aAC3C,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACnB,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;YACzC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,QAAQ;SAC1C,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE5C,mCAAmC;QACnC,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,sBAAsB,YAAY,CAAC,MAAM,UAAU,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,oDAAoD;QACpD,IAAI,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;gBAChE,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAC7E,CAAC;QAEF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEjF,+DAA+D;QAC/D,MAAM,eAAe,GAAoB,eAAe;aACrD,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACnB,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE;YAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;YACzC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,QAAQ;SAC1C,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE5C,0CAA0C;QAC1C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,YAAY,GAAG,eAAe;iBACjC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;iBACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAEtB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC/D,CAAC;gBAAC,MAAM,CAAC;oBACP,uBAAuB;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,SAAS,eAAe,CAAC,MAAM,UAAU,CAAC,CAAC;QAEvD,iDAAiD;QACjD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE;gBACrC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;oBAC1B,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;oBAC7D,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;iBAC5E,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,QAAsB,EAAE,IAAY;QAC9D,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,mDAAmD;QACnD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAE9E,gCAAgC;YAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK;iBACjC,KAAK,EAAE;iBACP,SAAS,CAAC,cAAc,CAAC;iBACzB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;iBACf,OAAO,EAAE,CAAC;YAEb,8CAA8C;YAC9C,MAAM,OAAO,GAAmB,WAAW,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE;gBAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACrC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,iCAAiC;gBAE/E,2BAA2B;gBAC3B,MAAM,UAAU,GAAG,IAAA,gCAAiB,EAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,UAAU,GAAG,WAAW,GAAG,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC;gBAExD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YACvC,CAAC,CAAC,CAAC;YAEH,2BAA2B;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAE1C,eAAe;YACf,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,uDAAwD,KAAe,CAAC,OAAO,EAAE,CAClF,CAAC;YACF,sDAAsD;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,MAAkB;QACzC,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAC5F,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,MAAkB;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,MAAkB;QACxC,0CAA0C;QAC1C,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC;IAC3E,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,GAAQ;QAC1B,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9D,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,UAAU,EAAE,GAAG,CAAC,UAAuC;YACvD,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,IAAY;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC9C,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;QAClD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;QAClD,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO,cAAc,CAAC;QAC1D,OAAO,QAAQ,CAAC,CAAC,UAAU;IAC7B,CAAC;CACF;AAtQD,sCAsQC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Text-based search engine
3
+ * Uses keyword matching, tag filtering, and decay scoring
4
+ * Zero external dependencies
5
+ */
6
+ import { MemoryFile, RecallResult } from '../types';
7
+ import { EngineAdapter } from './engine-adapter';
8
+ export declare class TextEngine implements EngineAdapter {
9
+ /**
10
+ * Search for memories using keyword matching + decay scoring
11
+ */
12
+ search(query: string, memories: MemoryFile[], topK: number): Promise<RecallResult[]>;
13
+ /**
14
+ * Tokenize a string into lowercase words
15
+ */
16
+ private tokenize;
17
+ /**
18
+ * Compute text match score for a memory (0-1)
19
+ */
20
+ private computeTextScore;
21
+ /**
22
+ * Compute match score for query tokens against field tokens (0-1)
23
+ */
24
+ private computeFieldMatchScore;
25
+ /**
26
+ * Index is a no-op for text engine - searches live files directly
27
+ */
28
+ index(memories: MemoryFile[], incremental: boolean): Promise<void>;
29
+ }
30
+ //# sourceMappingURL=text-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-engine.d.ts","sourceRoot":"","sources":["../../src/engines/text-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,qBAAa,UAAW,YAAW,aAAa;IAC9C;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA6B1F;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzE"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * Text-based search engine
4
+ * Uses keyword matching, tag filtering, and decay scoring
5
+ * Zero external dependencies
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.TextEngine = void 0;
9
+ const decay_engine_1 = require("../core/decay-engine");
10
+ class TextEngine {
11
+ /**
12
+ * Search for memories using keyword matching + decay scoring
13
+ */
14
+ async search(query, memories, topK) {
15
+ // 1. Tokenize query
16
+ const queryTokens = this.tokenize(query);
17
+ if (queryTokens.length === 0) {
18
+ return memories.slice(0, topK).map((memory) => ({
19
+ memory,
20
+ score: (0, decay_engine_1.computeDecayScore)(memory),
21
+ }));
22
+ }
23
+ // 2. Score each memory
24
+ const scored = memories.map((memory) => {
25
+ const textScore = this.computeTextScore(memory, queryTokens);
26
+ const decayScore = (0, decay_engine_1.computeDecayScore)(memory);
27
+ // Final: (text_score × 0.6) + (decay_score × 0.4)
28
+ const finalScore = textScore * 0.6 + decayScore * 0.4;
29
+ return { memory, score: finalScore };
30
+ });
31
+ // 3. Sort by score descending
32
+ scored.sort((a, b) => b.score - a.score);
33
+ // 4. Return top-K
34
+ return scored.slice(0, topK);
35
+ }
36
+ /**
37
+ * Tokenize a string into lowercase words
38
+ */
39
+ tokenize(text) {
40
+ return text
41
+ .toLowerCase()
42
+ .replace(/[^\w\s-]/g, ' ')
43
+ .split(/\s+/)
44
+ .filter((token) => token.length > 0);
45
+ }
46
+ /**
47
+ * Compute text match score for a memory (0-1)
48
+ */
49
+ computeTextScore(memory, queryTokens) {
50
+ let totalScore = 0;
51
+ let totalWeight = 0;
52
+ // Search fields with their weights
53
+ const fields = [
54
+ { text: memory.name, weight: 1.0 },
55
+ { text: memory.description, weight: 0.8 },
56
+ { text: memory.tags.join(' '), weight: 0.9 },
57
+ { text: memory.content, weight: 0.5 },
58
+ ];
59
+ for (const field of fields) {
60
+ const fieldTokens = this.tokenize(field.text);
61
+ const fieldScore = this.computeFieldMatchScore(queryTokens, fieldTokens);
62
+ totalScore += fieldScore * field.weight;
63
+ totalWeight += field.weight;
64
+ }
65
+ return totalWeight > 0 ? totalScore / totalWeight : 0;
66
+ }
67
+ /**
68
+ * Compute match score for query tokens against field tokens (0-1)
69
+ */
70
+ computeFieldMatchScore(queryTokens, fieldTokens) {
71
+ if (queryTokens.length === 0) {
72
+ return 0;
73
+ }
74
+ let matchedTokens = 0;
75
+ const fieldTokenSet = new Set(fieldTokens);
76
+ for (const queryToken of queryTokens) {
77
+ // Check for exact match
78
+ if (fieldTokenSet.has(queryToken)) {
79
+ matchedTokens++;
80
+ continue;
81
+ }
82
+ // Check for partial match (contains)
83
+ for (const fieldToken of fieldTokens) {
84
+ if (fieldToken.includes(queryToken) || queryToken.includes(fieldToken)) {
85
+ matchedTokens += 0.5; // Partial match gets half credit
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ return Math.min(1, matchedTokens / queryTokens.length);
91
+ }
92
+ /**
93
+ * Index is a no-op for text engine - searches live files directly
94
+ */
95
+ async index(memories, incremental) {
96
+ // No-op - text engine doesn't need indexing
97
+ }
98
+ }
99
+ exports.TextEngine = TextEngine;
100
+ //# sourceMappingURL=text-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-engine.js","sourceRoot":"","sources":["../../src/engines/text-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Claude Code platform install helper
3
+ * Sets autoMemoryDirectory in ~/.claude/settings.json
4
+ */
5
+ export interface ClaudeCodeSettings {
6
+ autoMemoryDirectory?: string;
7
+ [key: string]: any;
8
+ }
9
+ /**
10
+ * Install memobank for Claude Code
11
+ */
12
+ export declare function installClaudeCode(repoRoot: string): Promise<boolean>;
13
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/platforms/claude-code.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAUD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkC1E"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Claude Code platform install helper
4
+ * Sets autoMemoryDirectory in ~/.claude/settings.json
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.installClaudeCode = installClaudeCode;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ /**
44
+ * Get Claude Code settings path
45
+ */
46
+ function getSettingsPath() {
47
+ const home = process.env.HOME || process.env.USERPROFILE || '';
48
+ return path.join(home, '.claude', 'settings.json');
49
+ }
50
+ /**
51
+ * Install memobank for Claude Code
52
+ */
53
+ async function installClaudeCode(repoRoot) {
54
+ const settingsPath = getSettingsPath();
55
+ const settingsDir = path.dirname(settingsPath);
56
+ // Ensure .claude directory exists
57
+ if (!fs.existsSync(settingsDir)) {
58
+ fs.mkdirSync(settingsDir, { recursive: true });
59
+ }
60
+ // Read or create settings
61
+ let settings = {};
62
+ if (fs.existsSync(settingsPath)) {
63
+ try {
64
+ const content = fs.readFileSync(settingsPath, 'utf-8');
65
+ settings = JSON.parse(content);
66
+ }
67
+ catch (error) {
68
+ console.warn(`Could not read Claude settings: ${error.message}`);
69
+ return false;
70
+ }
71
+ }
72
+ // Set autoMemoryDirectory
73
+ settings.autoMemoryDirectory = path.join(repoRoot, 'memory');
74
+ // Write settings
75
+ try {
76
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
77
+ console.log(`✓ Claude Code: autoMemoryDirectory configured`);
78
+ return true;
79
+ }
80
+ catch (error) {
81
+ console.error(`Could not write Claude settings: ${error.message}`);
82
+ return false;
83
+ }
84
+ }
85
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/platforms/claude-code.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBH,8CAkCC;AArDD,uCAAyB;AACzB,2CAA6B;AAO7B;;GAEG;AACH,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/C,kCAAkC;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,0BAA0B;IAC1B,IAAI,QAAQ,GAAuB,EAAE,CAAC;IAEtC,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACvD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,QAAQ,CAAC,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE7D,iBAAiB;IACjB,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oCAAqC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Codex platform install helper
3
+ * Injects memory protocol into AGENTS.md
4
+ */
5
+ /**
6
+ * Install memobank for Codex
7
+ */
8
+ export declare function installCodex(cwd: string): Promise<boolean>;
9
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/platforms/codex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwCH;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BhE"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /**
3
+ * Codex platform install helper
4
+ * Injects memory protocol into AGENTS.md
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.installCodex = installCodex;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const MEMORY_PROTOCOL_SECTION = `
44
+ ## Memory Protocol
45
+
46
+ This project uses memobank for persistent memory. Before starting work, recall relevant context:
47
+
48
+ \`\`\`bash
49
+ memo recall "project context"
50
+ \`\`\`
51
+
52
+ After finishing significant work, capture learnings:
53
+
54
+ \`\`\`bash
55
+ memo capture --auto
56
+ \`\`\`
57
+
58
+ For more information, run: \`memo --help\`
59
+ `;
60
+ /**
61
+ * Find AGENTS.md in current directory or parents
62
+ */
63
+ function findAgentsMd(startDir) {
64
+ let current = startDir;
65
+ while (current !== path.dirname(current)) {
66
+ const agentsPath = path.join(current, 'AGENTS.md');
67
+ if (fs.existsSync(agentsPath)) {
68
+ return agentsPath;
69
+ }
70
+ current = path.dirname(current);
71
+ }
72
+ return null;
73
+ }
74
+ /**
75
+ * Install memobank for Codex
76
+ */
77
+ async function installCodex(cwd) {
78
+ const agentsPath = findAgentsMd(cwd);
79
+ if (!agentsPath) {
80
+ console.log('⊘ Codex: AGENTS.md not found (skipping)');
81
+ return false;
82
+ }
83
+ // Read AGENTS.md
84
+ const content = fs.readFileSync(agentsPath, 'utf-8');
85
+ // Check if memobank is already present
86
+ if (content.includes('## Memory Protocol') && content.includes('memo recall')) {
87
+ console.log('⊘ Codex: Memory protocol already exists in AGENTS.md');
88
+ return true;
89
+ }
90
+ // Append memory protocol
91
+ const updated = content + MEMORY_PROTOCOL_SECTION;
92
+ try {
93
+ fs.writeFileSync(agentsPath, updated, 'utf-8');
94
+ console.log(`✓ Codex: Memory protocol added to AGENTS.md`);
95
+ return true;
96
+ }
97
+ catch (error) {
98
+ console.error(`Could not write AGENTS.md: ${error.message}`);
99
+ return false;
100
+ }
101
+ }
102
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/platforms/codex.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CH,oCA4BC;AArED,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;CAgB/B,CAAC;AAEF;;GAEG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,OAAO,GAAG,QAAQ,CAAC;IAEvB,OAAO,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB;IACjB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAErD,uCAAuC;IACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAG,OAAO,GAAG,uBAAuB,CAAC;IAElD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA+B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}