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.
- package/CHANGELOG.md +139 -0
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +294 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/capture.d.ts +12 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +191 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/import.d.ts +28 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +356 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index.d.ts +12 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +82 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +142 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/lifecycle.d.ts +21 -0
- package/dist/commands/lifecycle.d.ts.map +1 -0
- package/dist/commands/lifecycle.js +106 -0
- package/dist/commands/lifecycle.js.map +1 -0
- package/dist/commands/map.d.ts +10 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +72 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/onboarding.d.ts +10 -0
- package/dist/commands/onboarding.d.ts.map +1 -0
- package/dist/commands/onboarding.js +420 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/recall.d.ts +13 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +89 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/review.d.ts +11 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +66 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/search.d.ts +13 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +107 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup.d.ts +9 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +354 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/write.d.ts +14 -0
- package/dist/commands/write.d.ts.map +1 -0
- package/dist/commands/write.js +247 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +147 -0
- package/dist/config.js.map +1 -0
- package/dist/core/decay-engine.d.ts +16 -0
- package/dist/core/decay-engine.d.ts.map +1 -0
- package/dist/core/decay-engine.js +91 -0
- package/dist/core/decay-engine.js.map +1 -0
- package/dist/core/embedding.d.ts +60 -0
- package/dist/core/embedding.d.ts.map +1 -0
- package/dist/core/embedding.js +169 -0
- package/dist/core/embedding.js.map +1 -0
- package/dist/core/lifecycle-manager.d.ts +105 -0
- package/dist/core/lifecycle-manager.d.ts.map +1 -0
- package/dist/core/lifecycle-manager.js +332 -0
- package/dist/core/lifecycle-manager.js.map +1 -0
- package/dist/core/memory-template.d.ts +70 -0
- package/dist/core/memory-template.d.ts.map +1 -0
- package/dist/core/memory-template.js +496 -0
- package/dist/core/memory-template.js.map +1 -0
- package/dist/core/noise-filter.d.ts +39 -0
- package/dist/core/noise-filter.d.ts.map +1 -0
- package/dist/core/noise-filter.js +168 -0
- package/dist/core/noise-filter.js.map +1 -0
- package/dist/core/retriever.d.ts +21 -0
- package/dist/core/retriever.d.ts.map +1 -0
- package/dist/core/retriever.js +77 -0
- package/dist/core/retriever.js.map +1 -0
- package/dist/core/sanitizer.d.ts +9 -0
- package/dist/core/sanitizer.d.ts.map +1 -0
- package/dist/core/sanitizer.js +57 -0
- package/dist/core/sanitizer.js.map +1 -0
- package/dist/core/smart-extractor.d.ts +12 -0
- package/dist/core/smart-extractor.d.ts.map +1 -0
- package/dist/core/smart-extractor.js +102 -0
- package/dist/core/smart-extractor.js.map +1 -0
- package/dist/core/store.d.ts +40 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +233 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/tool-config.d.ts +33 -0
- package/dist/core/tool-config.d.ts.map +1 -0
- package/dist/core/tool-config.js +253 -0
- package/dist/core/tool-config.js.map +1 -0
- package/dist/engines/engine-adapter.d.ts +22 -0
- package/dist/engines/engine-adapter.d.ts.map +1 -0
- package/dist/engines/engine-adapter.js +7 -0
- package/dist/engines/engine-adapter.js.map +1 -0
- package/dist/engines/lancedb-engine.d.ts +55 -0
- package/dist/engines/lancedb-engine.d.ts.map +1 -0
- package/dist/engines/lancedb-engine.js +279 -0
- package/dist/engines/lancedb-engine.js.map +1 -0
- package/dist/engines/text-engine.d.ts +30 -0
- package/dist/engines/text-engine.d.ts.map +1 -0
- package/dist/engines/text-engine.js +100 -0
- package/dist/engines/text-engine.js.map +1 -0
- package/dist/platforms/claude-code.d.ts +13 -0
- package/dist/platforms/claude-code.d.ts.map +1 -0
- package/dist/platforms/claude-code.js +85 -0
- package/dist/platforms/claude-code.js.map +1 -0
- package/dist/platforms/codex.d.ts +9 -0
- package/dist/platforms/codex.d.ts.map +1 -0
- package/dist/platforms/codex.js +102 -0
- package/dist/platforms/codex.js.map +1 -0
- package/dist/platforms/cursor.d.ts +9 -0
- package/dist/platforms/cursor.d.ts.map +1 -0
- package/dist/platforms/cursor.js +112 -0
- package/dist/platforms/cursor.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* File I/O layer for memobank
|
|
4
|
+
* Reads and writes .md files with YAML frontmatter
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.findRepoRoot = findRepoRoot;
|
|
44
|
+
exports.loadAll = loadAll;
|
|
45
|
+
exports.loadFile = loadFile;
|
|
46
|
+
exports.writeMemory = writeMemory;
|
|
47
|
+
exports.writeMemoryMd = writeMemoryMd;
|
|
48
|
+
exports.readMemoryMd = readMemoryMd;
|
|
49
|
+
const fs = __importStar(require("fs"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
52
|
+
const glob_1 = require("glob");
|
|
53
|
+
const MEMORY_TYPES = ['lesson', 'decision', 'workflow', 'architecture'];
|
|
54
|
+
/**
|
|
55
|
+
* Find memobank root directory
|
|
56
|
+
* Resolution order:
|
|
57
|
+
* 1. --repo CLI flag (passed as parameter)
|
|
58
|
+
* 2. MEMOBANK_REPO env var
|
|
59
|
+
* 3. meta/config.yaml in cwd or parent dirs (walk up)
|
|
60
|
+
* 4. ~/.memobank/<git-repo-name>/
|
|
61
|
+
* 5. ~/.memobank/default/
|
|
62
|
+
*/
|
|
63
|
+
function findRepoRoot(cwd, repoFlag) {
|
|
64
|
+
// 1. CLI flag
|
|
65
|
+
if (repoFlag) {
|
|
66
|
+
return path.resolve(repoFlag);
|
|
67
|
+
}
|
|
68
|
+
// 2. Environment variable
|
|
69
|
+
const envRepo = process.env.MEMOBANK_REPO;
|
|
70
|
+
if (envRepo) {
|
|
71
|
+
return path.resolve(envRepo);
|
|
72
|
+
}
|
|
73
|
+
// 3. Walk up looking for meta/config.yaml
|
|
74
|
+
let current = cwd;
|
|
75
|
+
while (current !== path.dirname(current)) {
|
|
76
|
+
const configPath = path.join(current, 'meta', 'config.yaml');
|
|
77
|
+
if (fs.existsSync(configPath)) {
|
|
78
|
+
return current;
|
|
79
|
+
}
|
|
80
|
+
current = path.dirname(current);
|
|
81
|
+
}
|
|
82
|
+
// 4. Try to detect git repo name for ~/.memobank/<project>/
|
|
83
|
+
try {
|
|
84
|
+
// Check if we're in a git repo
|
|
85
|
+
const gitRoot = path.join(cwd, '.git');
|
|
86
|
+
if (fs.existsSync(gitRoot)) {
|
|
87
|
+
// Try to get repo name from remote or use directory name
|
|
88
|
+
const repoName = path.basename(cwd);
|
|
89
|
+
const memobankPath = path.join(osHomeDir(), '.memobank', repoName);
|
|
90
|
+
if (fs.existsSync(memobankPath)) {
|
|
91
|
+
return memobankPath;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
// Ignore git detection errors
|
|
97
|
+
}
|
|
98
|
+
// 5. Default: ~/.memobank/default/
|
|
99
|
+
return path.join(osHomeDir(), '.memobank', 'default');
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get home directory across platforms
|
|
103
|
+
*/
|
|
104
|
+
function osHomeDir() {
|
|
105
|
+
return process.env.HOME || process.env.USERPROFILE || '';
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Load all memory files from a repo
|
|
109
|
+
*/
|
|
110
|
+
function loadAll(repoRoot) {
|
|
111
|
+
const memories = [];
|
|
112
|
+
for (const type of MEMORY_TYPES) {
|
|
113
|
+
const pattern = path.join(repoRoot, type, '**', '*.md');
|
|
114
|
+
const files = glob_1.glob.sync(pattern);
|
|
115
|
+
for (const filePath of files) {
|
|
116
|
+
try {
|
|
117
|
+
const memory = loadFile(filePath);
|
|
118
|
+
memories.push(memory);
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
// Skip files that can't be parsed
|
|
122
|
+
console.warn(`Warning: Could not load ${filePath}: ${e.message}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return memories;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Load a single memory file
|
|
130
|
+
*/
|
|
131
|
+
function loadFile(filePath) {
|
|
132
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
133
|
+
const parsed = (0, gray_matter_1.default)(fileContent);
|
|
134
|
+
const data = parsed.data;
|
|
135
|
+
// Validate required fields
|
|
136
|
+
if (!data.name || !data.type || !data.description || !data.created) {
|
|
137
|
+
throw new Error(`Missing required frontmatter fields in ${filePath}`);
|
|
138
|
+
}
|
|
139
|
+
if (!MEMORY_TYPES.includes(data.type)) {
|
|
140
|
+
throw new Error(`Invalid memory type "${data.type}" in ${filePath}`);
|
|
141
|
+
}
|
|
142
|
+
const memory = {
|
|
143
|
+
path: filePath,
|
|
144
|
+
name: data.name,
|
|
145
|
+
type: data.type,
|
|
146
|
+
description: data.description,
|
|
147
|
+
tags: Array.isArray(data.tags) ? data.tags : [],
|
|
148
|
+
created: data.created,
|
|
149
|
+
updated: data.updated,
|
|
150
|
+
review_after: data.review_after,
|
|
151
|
+
confidence: data.confidence,
|
|
152
|
+
content: parsed.content,
|
|
153
|
+
};
|
|
154
|
+
return memory;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Write a new memory file
|
|
158
|
+
* Creates filename from name + created date
|
|
159
|
+
*/
|
|
160
|
+
function writeMemory(repoRoot, memory) {
|
|
161
|
+
const typeDir = path.join(repoRoot, memory.type);
|
|
162
|
+
// Ensure directory exists
|
|
163
|
+
if (!fs.existsSync(typeDir)) {
|
|
164
|
+
fs.mkdirSync(typeDir, { recursive: true });
|
|
165
|
+
}
|
|
166
|
+
// Generate filename: YYYY-MM-DD-name.md
|
|
167
|
+
const date = new Date(memory.created);
|
|
168
|
+
const dateStr = date.toISOString().split('T')[0];
|
|
169
|
+
const slug = memory.name
|
|
170
|
+
.toLowerCase()
|
|
171
|
+
.replace(/\s+/g, '-')
|
|
172
|
+
.replace(/[^a-z0-9-]/g, '');
|
|
173
|
+
const filename = `${dateStr}-${slug}.md`;
|
|
174
|
+
const filePath = path.join(typeDir, filename);
|
|
175
|
+
// Build frontmatter
|
|
176
|
+
const frontmatter = {
|
|
177
|
+
name: memory.name,
|
|
178
|
+
type: memory.type,
|
|
179
|
+
description: memory.description,
|
|
180
|
+
tags: memory.tags,
|
|
181
|
+
created: memory.created,
|
|
182
|
+
};
|
|
183
|
+
if (memory.updated)
|
|
184
|
+
frontmatter.updated = memory.updated;
|
|
185
|
+
if (memory.review_after)
|
|
186
|
+
frontmatter.review_after = memory.review_after;
|
|
187
|
+
if (memory.confidence)
|
|
188
|
+
frontmatter.confidence = memory.confidence;
|
|
189
|
+
// Write file
|
|
190
|
+
const fileContent = gray_matter_1.default.stringify(memory.content, frontmatter);
|
|
191
|
+
fs.writeFileSync(filePath, fileContent, 'utf-8');
|
|
192
|
+
return filePath;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Update MEMORY.md with recall results
|
|
196
|
+
*/
|
|
197
|
+
function writeMemoryMd(repoRoot, results, query, engine) {
|
|
198
|
+
const memoryDir = path.join(repoRoot, 'memory');
|
|
199
|
+
if (!fs.existsSync(memoryDir)) {
|
|
200
|
+
fs.mkdirSync(memoryDir, { recursive: true });
|
|
201
|
+
}
|
|
202
|
+
const filePath = path.join(memoryDir, 'MEMORY.md');
|
|
203
|
+
let markdown = `<!-- Last updated: ${new Date().toISOString()} | query: "${query}" | engine: ${engine} | top ${results.length} -->\n\n`;
|
|
204
|
+
markdown += `## Recalled Memory\n\n`;
|
|
205
|
+
if (results.length === 0) {
|
|
206
|
+
markdown += `*No memories found for "${query}"*\n`;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
for (const result of results) {
|
|
210
|
+
const { memory, score } = result;
|
|
211
|
+
const relativePath = path.relative(repoRoot, memory.path);
|
|
212
|
+
const confidenceStr = memory.confidence ? ` · ${memory.confidence} confidence` : '';
|
|
213
|
+
const tagStr = memory.tags.length > 0 ? ` · tags: ${memory.tags.join(', ')}` : '';
|
|
214
|
+
markdown += `### [${memory.type}] ${memory.name}${confidenceStr}\n`;
|
|
215
|
+
markdown += `> ${memory.description}\n`;
|
|
216
|
+
markdown += `> \`${relativePath}\`${tagStr}\n\n`;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
markdown += `---\n`;
|
|
220
|
+
markdown += `*${results.length} memories · engine: ${engine}*`;
|
|
221
|
+
fs.writeFileSync(filePath, markdown, 'utf-8');
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Read MEMORY.md content
|
|
225
|
+
*/
|
|
226
|
+
function readMemoryMd(repoRoot) {
|
|
227
|
+
const filePath = path.join(repoRoot, 'memory', 'MEMORY.md');
|
|
228
|
+
if (!fs.existsSync(filePath)) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Configuration Module
|
|
3
|
+
* Configures AI coding tools to use memobank for memory
|
|
4
|
+
*/
|
|
5
|
+
export interface ToolConfig {
|
|
6
|
+
name: string;
|
|
7
|
+
scope: 'global' | 'project';
|
|
8
|
+
projectPath?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Configure Claude Code to use memobank
|
|
12
|
+
*/
|
|
13
|
+
export declare function configureClaudeCode(config: ToolConfig): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Configure Gemini CLI to use memobank
|
|
16
|
+
*/
|
|
17
|
+
export declare function configureGeminiCli(config: ToolConfig): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Configure Qwen Code to use memobank
|
|
20
|
+
*/
|
|
21
|
+
export declare function configureQwenCode(config: ToolConfig): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Configure all selected tools
|
|
24
|
+
*/
|
|
25
|
+
export declare function configureTools(tools: ToolConfig[]): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Check which tools are installed
|
|
28
|
+
*/
|
|
29
|
+
export declare function detectInstalledTools(): {
|
|
30
|
+
name: string;
|
|
31
|
+
installed: boolean;
|
|
32
|
+
}[];
|
|
33
|
+
//# sourceMappingURL=tool-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-config.d.ts","sourceRoot":"","sources":["../../src/core/tool-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAaD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B3E;AAaD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D1E;AAaD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DzE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,EAAE,CAW7E"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tool Configuration Module
|
|
4
|
+
* Configures AI coding tools to use memobank for memory
|
|
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.configureClaudeCode = configureClaudeCode;
|
|
41
|
+
exports.configureGeminiCli = configureGeminiCli;
|
|
42
|
+
exports.configureQwenCode = configureQwenCode;
|
|
43
|
+
exports.configureTools = configureTools;
|
|
44
|
+
exports.detectInstalledTools = detectInstalledTools;
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const os = __importStar(require("os"));
|
|
48
|
+
/**
|
|
49
|
+
* Get Claude Code settings path
|
|
50
|
+
*/
|
|
51
|
+
function getClaudeSettingsPath(scope, projectPath) {
|
|
52
|
+
if (scope === 'global') {
|
|
53
|
+
return path.join(os.homedir(), '.claude', 'settings.local.json');
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return path.join(projectPath || process.cwd(), '.claude', 'settings.local.json');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Configure Claude Code to use memobank
|
|
61
|
+
*/
|
|
62
|
+
async function configureClaudeCode(config) {
|
|
63
|
+
const settingsPath = getClaudeSettingsPath(config.scope, config.projectPath);
|
|
64
|
+
const settingsDir = path.dirname(settingsPath);
|
|
65
|
+
// Ensure directory exists
|
|
66
|
+
if (!fs.existsSync(settingsDir)) {
|
|
67
|
+
fs.mkdirSync(settingsDir, { recursive: true });
|
|
68
|
+
}
|
|
69
|
+
// Load existing settings or create new
|
|
70
|
+
let settings = {};
|
|
71
|
+
if (fs.existsSync(settingsPath)) {
|
|
72
|
+
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
73
|
+
}
|
|
74
|
+
// Get memobank path
|
|
75
|
+
const projectName = config.projectPath ? path.basename(config.projectPath) : 'default';
|
|
76
|
+
const memobankPath = path.join(os.homedir(), '.memobank', projectName);
|
|
77
|
+
// Configure autoMemoryDirectory
|
|
78
|
+
settings.autoMemoryDirectory = memobankPath;
|
|
79
|
+
// Write settings
|
|
80
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
81
|
+
console.log(`✓ Claude Code configured (${config.scope})`);
|
|
82
|
+
console.log(` Settings: ${settingsPath}`);
|
|
83
|
+
console.log(` Memory: ${memobankPath}`);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get Gemini CLI config path
|
|
87
|
+
*/
|
|
88
|
+
function getGeminiConfigPath(scope, projectPath) {
|
|
89
|
+
if (scope === 'global') {
|
|
90
|
+
return path.join(os.homedir(), '.gemini', 'settings.json');
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return path.join(projectPath || process.cwd(), '.gemini', 'settings.json');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Configure Gemini CLI to use memobank
|
|
98
|
+
*/
|
|
99
|
+
async function configureGeminiCli(config) {
|
|
100
|
+
const configPath = getGeminiConfigPath(config.scope, config.projectPath);
|
|
101
|
+
const configDir = path.dirname(configPath);
|
|
102
|
+
// Ensure directory exists
|
|
103
|
+
if (!fs.existsSync(configDir)) {
|
|
104
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
// Load existing config or create new
|
|
107
|
+
let geminiConfig = {};
|
|
108
|
+
if (fs.existsSync(configPath)) {
|
|
109
|
+
geminiConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
110
|
+
}
|
|
111
|
+
// Get memobank path
|
|
112
|
+
const projectName = config.projectPath ? path.basename(config.projectPath) : 'default';
|
|
113
|
+
const memobankPath = path.join(os.homedir(), '.memobank', projectName);
|
|
114
|
+
// Configure memory path
|
|
115
|
+
geminiConfig.memoryPath = memobankPath;
|
|
116
|
+
geminiConfig.useMemobank = true;
|
|
117
|
+
// Write config
|
|
118
|
+
fs.writeFileSync(configPath, JSON.stringify(geminiConfig, null, 2), 'utf-8');
|
|
119
|
+
// Create GEMINI.md that references memobank
|
|
120
|
+
const geminiMdPath = config.scope === 'global'
|
|
121
|
+
? path.join(os.homedir(), '.gemini', 'GEMINI.md')
|
|
122
|
+
: path.join(config.projectPath || process.cwd(), 'GEMINI.md');
|
|
123
|
+
const memobankRef = `# Gemini CLI Memory via Memobank
|
|
124
|
+
|
|
125
|
+
This project uses memobank for persistent memory.
|
|
126
|
+
|
|
127
|
+
## Memory Location
|
|
128
|
+
|
|
129
|
+
\`${memobankPath}\`
|
|
130
|
+
|
|
131
|
+
## Commands
|
|
132
|
+
|
|
133
|
+
- Run \`memo recall "query"\` to search memories
|
|
134
|
+
- Run \`memo write lesson\` to create new memories
|
|
135
|
+
- Run \`memo import\` to import from other AI tools
|
|
136
|
+
|
|
137
|
+
## Auto-Memory
|
|
138
|
+
|
|
139
|
+
Memories are automatically recalled at session start and captured at session end.
|
|
140
|
+
`;
|
|
141
|
+
if (!fs.existsSync(geminiMdPath)) {
|
|
142
|
+
fs.writeFileSync(geminiMdPath, memobankRef, 'utf-8');
|
|
143
|
+
console.log(`✓ Created ${geminiMdPath}`);
|
|
144
|
+
}
|
|
145
|
+
console.log(`✓ Gemini CLI configured (${config.scope})`);
|
|
146
|
+
console.log(` Config: ${configPath}`);
|
|
147
|
+
console.log(` Memory: ${memobankPath}`);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get Qwen Code config path
|
|
151
|
+
*/
|
|
152
|
+
function getQwenConfigPath(scope, projectPath) {
|
|
153
|
+
if (scope === 'global') {
|
|
154
|
+
return path.join(os.homedir(), '.qwen', 'settings.json');
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
return path.join(projectPath || process.cwd(), '.qwen', 'settings.json');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Configure Qwen Code to use memobank
|
|
162
|
+
*/
|
|
163
|
+
async function configureQwenCode(config) {
|
|
164
|
+
const configPath = getQwenConfigPath(config.scope, config.projectPath);
|
|
165
|
+
const configDir = path.dirname(configPath);
|
|
166
|
+
// Ensure directory exists
|
|
167
|
+
if (!fs.existsSync(configDir)) {
|
|
168
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
169
|
+
}
|
|
170
|
+
// Load existing config or create new
|
|
171
|
+
let qwenConfig = {};
|
|
172
|
+
if (fs.existsSync(configPath)) {
|
|
173
|
+
qwenConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
174
|
+
}
|
|
175
|
+
// Get memobank path
|
|
176
|
+
const projectName = config.projectPath ? path.basename(config.projectPath) : 'default';
|
|
177
|
+
const memobankPath = path.join(os.homedir(), '.memobank', projectName);
|
|
178
|
+
// Configure context file to use memobank
|
|
179
|
+
qwenConfig.contextFileName = path.join(memobankPath, 'memory', 'MEMORY.md');
|
|
180
|
+
qwenConfig.useMemobank = true;
|
|
181
|
+
qwenConfig.memobankPath = memobankPath;
|
|
182
|
+
// Write config
|
|
183
|
+
fs.writeFileSync(configPath, JSON.stringify(qwenConfig, null, 2), 'utf-8');
|
|
184
|
+
// Create QWEN.md that references memobank
|
|
185
|
+
const qwenMdPath = config.scope === 'global'
|
|
186
|
+
? path.join(os.homedir(), '.qwen', 'QWEN.md')
|
|
187
|
+
: path.join(config.projectPath || process.cwd(), 'QWEN.md');
|
|
188
|
+
const memobankRef = `# Qwen Code Memory via Memobank
|
|
189
|
+
|
|
190
|
+
This project uses memobank for persistent memory.
|
|
191
|
+
|
|
192
|
+
## Memory Location
|
|
193
|
+
|
|
194
|
+
\`${memobankPath}\`
|
|
195
|
+
|
|
196
|
+
## Commands
|
|
197
|
+
|
|
198
|
+
- Run \`memo recall "query"\` to search memories
|
|
199
|
+
- Run \`memo write lesson\` to create new memories
|
|
200
|
+
- Run \`memo import\` to import from other AI tools
|
|
201
|
+
|
|
202
|
+
## Auto-Memory
|
|
203
|
+
|
|
204
|
+
Memories are automatically recalled at session start and captured at session end.
|
|
205
|
+
`;
|
|
206
|
+
if (!fs.existsSync(qwenMdPath)) {
|
|
207
|
+
fs.writeFileSync(qwenMdPath, memobankRef, 'utf-8');
|
|
208
|
+
console.log(`✓ Created ${qwenMdPath}`);
|
|
209
|
+
}
|
|
210
|
+
console.log(`✓ Qwen Code configured (${config.scope})`);
|
|
211
|
+
console.log(` Config: ${configPath}`);
|
|
212
|
+
console.log(` Memory: ${memobankPath}`);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Configure all selected tools
|
|
216
|
+
*/
|
|
217
|
+
async function configureTools(tools) {
|
|
218
|
+
for (const tool of tools) {
|
|
219
|
+
try {
|
|
220
|
+
switch (tool.name) {
|
|
221
|
+
case 'Claude Code':
|
|
222
|
+
await configureClaudeCode(tool);
|
|
223
|
+
break;
|
|
224
|
+
case 'Gemini CLI':
|
|
225
|
+
await configureGeminiCli(tool);
|
|
226
|
+
break;
|
|
227
|
+
case 'Qwen Code':
|
|
228
|
+
await configureQwenCode(tool);
|
|
229
|
+
break;
|
|
230
|
+
default:
|
|
231
|
+
console.log(`⚠ Unknown tool: ${tool.name}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.log(`✗ Failed to configure ${tool.name}: ${error.message}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Check which tools are installed
|
|
241
|
+
*/
|
|
242
|
+
function detectInstalledTools() {
|
|
243
|
+
const tools = [
|
|
244
|
+
{ name: 'Claude Code', checkPath: path.join(os.homedir(), '.claude') },
|
|
245
|
+
{ name: 'Gemini CLI', checkPath: path.join(os.homedir(), '.gemini') },
|
|
246
|
+
{ name: 'Qwen Code', checkPath: path.join(os.homedir(), '.qwen') },
|
|
247
|
+
];
|
|
248
|
+
return tools.map((tool) => ({
|
|
249
|
+
name: tool.name,
|
|
250
|
+
installed: fs.existsSync(tool.checkPath),
|
|
251
|
+
}));
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=tool-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../src/core/tool-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared engine adapter interface
|
|
3
|
+
* All search engines must implement this interface
|
|
4
|
+
*/
|
|
5
|
+
import { MemoryFile, RecallResult } from '../types';
|
|
6
|
+
export interface EngineAdapter {
|
|
7
|
+
/**
|
|
8
|
+
* Search for memories matching a query
|
|
9
|
+
* @param query - Search query string
|
|
10
|
+
* @param memories - All memories to search through
|
|
11
|
+
* @param topK - Maximum number of results to return
|
|
12
|
+
* @returns Array of recall results sorted by score (descending)
|
|
13
|
+
*/
|
|
14
|
+
search(query: string, memories: MemoryFile[], topK: number): Promise<RecallResult[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Index memories (optional - some engines don't need pre-indexing)
|
|
17
|
+
* @param memories - Memories to index
|
|
18
|
+
* @param incremental - Whether to update incrementally or rebuild
|
|
19
|
+
*/
|
|
20
|
+
index?(memories: MemoryFile[], incremental: boolean): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=engine-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-adapter.d.ts","sourceRoot":"","sources":["../../src/engines/engine-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAErF;;;;OAIG;IACH,KAAK,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-adapter.js","sourceRoot":"","sources":["../../src/engines/engine-adapter.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LanceDB Engine
|
|
3
|
+
* Vector search engine using LanceDB with hybrid BM25 + vector search
|
|
4
|
+
*/
|
|
5
|
+
import { MemoryFile, RecallResult } from '../types';
|
|
6
|
+
import { EngineAdapter } from './engine-adapter';
|
|
7
|
+
import { EmbeddingGenerator } from '../core/embedding';
|
|
8
|
+
export declare class LanceDbEngine implements EngineAdapter {
|
|
9
|
+
private dbPath;
|
|
10
|
+
private embeddingGenerator;
|
|
11
|
+
private db;
|
|
12
|
+
private table;
|
|
13
|
+
private readonly tableName;
|
|
14
|
+
private readonly indexDirName;
|
|
15
|
+
constructor(dbPath: string, embeddingGenerator: EmbeddingGenerator);
|
|
16
|
+
/**
|
|
17
|
+
* Initialize LanceDB connection and table
|
|
18
|
+
*/
|
|
19
|
+
private init;
|
|
20
|
+
/**
|
|
21
|
+
* Index memories into LanceDB
|
|
22
|
+
* @param memories - Memories to index
|
|
23
|
+
* @param incremental - Whether to update incrementally or rebuild
|
|
24
|
+
*/
|
|
25
|
+
index(memories: MemoryFile[], incremental: boolean): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Search for memories using hybrid vector + BM25 search
|
|
28
|
+
* @param query - Search query string
|
|
29
|
+
* @param memories - All memories (fallback for text search)
|
|
30
|
+
* @param topK - Maximum number of results
|
|
31
|
+
* @returns Array of recall results sorted by score
|
|
32
|
+
*/
|
|
33
|
+
search(query: string, memories: MemoryFile[], topK: number): Promise<RecallResult[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Get combined text for embedding generation
|
|
36
|
+
*/
|
|
37
|
+
private getEmbeddingText;
|
|
38
|
+
/**
|
|
39
|
+
* Generate unique memory ID
|
|
40
|
+
*/
|
|
41
|
+
private memoryId;
|
|
42
|
+
/**
|
|
43
|
+
* Check if memory has been updated since last indexing
|
|
44
|
+
*/
|
|
45
|
+
private isMemoryUpdated;
|
|
46
|
+
/**
|
|
47
|
+
* Convert LanceDB row to MemoryFile
|
|
48
|
+
*/
|
|
49
|
+
private rowToMemory;
|
|
50
|
+
/**
|
|
51
|
+
* Infer memory type from name/path
|
|
52
|
+
*/
|
|
53
|
+
private inferType;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=lancedb-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lancedb-engine.d.ts","sourceRoot":"","sources":["../../src/engines/lancedb-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAmBvD,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;gBAE/B,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,kBAAkB;IAKlE;;OAEG;YACW,IAAI;IAwBlB;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA+GxE;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA6C1F;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAKhB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,SAAS;CAQlB"}
|