memextend 0.1.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/dist/commands/edit.d.ts +2 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +84 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/export.d.ts +8 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +88 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/forget.d.ts +10 -0
- package/dist/commands/forget.d.ts.map +1 -0
- package/dist/commands/forget.js +199 -0
- package/dist/commands/forget.js.map +1 -0
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +437 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/import.d.ts +7 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +138 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +258 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +7 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +67 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/save.d.ts +8 -0
- package/dist/commands/save.d.ts.map +1 -0
- package/dist/commands/save.js +95 -0
- package/dist/commands/save.js.map +1 -0
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +82 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +231 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +7 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +188 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/webui.d.ts +7 -0
- package/dist/commands/webui.d.ts.map +1 -0
- package/dist/commands/webui.js +314 -0
- package/dist/commands/webui.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
// apps/cli/src/commands/status.ts
|
|
2
|
+
// Copyright (c) 2026 ZodTTD LLC. MIT License.
|
|
3
|
+
import { existsSync, statSync } from 'fs';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { homedir } from 'os';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
const MEMEXTEND_DIR = join(homedir(), '.memextend');
|
|
9
|
+
const CONFIG_PATH = join(MEMEXTEND_DIR, 'config.json');
|
|
10
|
+
const DB_PATH = join(MEMEXTEND_DIR, 'memextend.db');
|
|
11
|
+
const VECTORS_PATH = join(MEMEXTEND_DIR, 'vectors');
|
|
12
|
+
const MODELS_PATH = join(MEMEXTEND_DIR, 'models');
|
|
13
|
+
const MODEL_FILENAME = 'nomic-embed-text-v1.5.Q8_0.gguf';
|
|
14
|
+
export async function statusCommand(options) {
|
|
15
|
+
// If --check-embeddings, run embedding diagnostics
|
|
16
|
+
if (options.checkEmbeddings) {
|
|
17
|
+
await runEmbeddingDiagnostics();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
console.log(chalk.bold('\n memextend Status\n'));
|
|
21
|
+
// Check initialization
|
|
22
|
+
if (!existsSync(DB_PATH)) {
|
|
23
|
+
console.log(chalk.yellow(' ⚠ Not initialized. Run `memextend init` first.\n'));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const { SQLiteStorage, LanceDBStorage, getProjectId } = await import('@memextend/core');
|
|
28
|
+
const sqlite = new SQLiteStorage(DB_PATH);
|
|
29
|
+
const lancedb = await LanceDBStorage.create(VECTORS_PATH);
|
|
30
|
+
// Get counts
|
|
31
|
+
const memoryCount = sqlite.getMemoryCount();
|
|
32
|
+
const vectorCount = await lancedb.getVectorCount();
|
|
33
|
+
// Get project info if requested
|
|
34
|
+
let projectInfo = '';
|
|
35
|
+
if (options.project) {
|
|
36
|
+
const cwd = process.cwd();
|
|
37
|
+
const projectId = getProjectId(cwd);
|
|
38
|
+
const project = sqlite.getProject(projectId);
|
|
39
|
+
const projectMemories = sqlite.getAllMemories(projectId, 1000);
|
|
40
|
+
projectInfo = `
|
|
41
|
+
${chalk.bold('Current Project')}
|
|
42
|
+
├─ Name: ${project?.name ?? 'Unknown'}
|
|
43
|
+
├─ ID: ${projectId}
|
|
44
|
+
└─ Memories: ${projectMemories.length}
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
// Get database sizes
|
|
48
|
+
const dbSize = existsSync(DB_PATH) ? formatBytes(statSync(DB_PATH).size) : '0 B';
|
|
49
|
+
const vectorsSize = existsSync(VECTORS_PATH) ? getDirSize(VECTORS_PATH) : '0 B';
|
|
50
|
+
const modelExists = existsSync(join(MODELS_PATH, 'nomic-embed-text-v1.5.Q8_0.gguf'));
|
|
51
|
+
// Close connections
|
|
52
|
+
sqlite.close();
|
|
53
|
+
await lancedb.close();
|
|
54
|
+
// Print status
|
|
55
|
+
console.log(` ${chalk.bold('Storage')}`);
|
|
56
|
+
console.log(` ├─ Directory: ${MEMEXTEND_DIR}`);
|
|
57
|
+
console.log(` ├─ Database: ${dbSize}`);
|
|
58
|
+
console.log(` └─ Vectors: ${vectorsSize}`);
|
|
59
|
+
console.log();
|
|
60
|
+
console.log(` ${chalk.bold('Memories')}`);
|
|
61
|
+
console.log(` ├─ Total memories: ${memoryCount}`);
|
|
62
|
+
console.log(` └─ Vector embeddings: ${vectorCount}`);
|
|
63
|
+
console.log();
|
|
64
|
+
console.log(` ${chalk.bold('Embedding Model')}`);
|
|
65
|
+
console.log(` └─ nomic-embed-text: ${modelExists ? chalk.green('Downloaded') : chalk.yellow('Not downloaded (will download on first use)')}`);
|
|
66
|
+
if (projectInfo) {
|
|
67
|
+
console.log();
|
|
68
|
+
console.log(projectInfo);
|
|
69
|
+
}
|
|
70
|
+
console.log();
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error(chalk.red(` Error: ${error instanceof Error ? error.message : error}\n`));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function formatBytes(bytes) {
|
|
78
|
+
if (bytes === 0)
|
|
79
|
+
return '0 B';
|
|
80
|
+
const k = 1024;
|
|
81
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
82
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
83
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
84
|
+
}
|
|
85
|
+
function getDirSize(dir) {
|
|
86
|
+
try {
|
|
87
|
+
const result = execSync(`du -sh "${dir}" 2>/dev/null | cut -f1`, {
|
|
88
|
+
encoding: 'utf-8'
|
|
89
|
+
}).trim();
|
|
90
|
+
return result || '0 B';
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return '0 B';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function runEmbeddingDiagnostics() {
|
|
97
|
+
console.log(chalk.bold('\n Embedding Model Diagnostics\n'));
|
|
98
|
+
const modelPath = join(MODELS_PATH, MODEL_FILENAME);
|
|
99
|
+
let allPassed = true;
|
|
100
|
+
// Check 1: Model file exists
|
|
101
|
+
console.log(chalk.bold(' [1/5] Checking model file...'));
|
|
102
|
+
if (existsSync(modelPath)) {
|
|
103
|
+
const size = statSync(modelPath).size;
|
|
104
|
+
const sizeStr = formatBytes(size);
|
|
105
|
+
if (size < 100 * 1024 * 1024) {
|
|
106
|
+
console.log(chalk.red(` ✗ Model file too small (${sizeStr}), may be corrupted`));
|
|
107
|
+
console.log(chalk.yellow(` → Delete and re-download: rm "${modelPath}"`));
|
|
108
|
+
allPassed = false;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.log(chalk.green(` ✓ Model file exists (${sizeStr})`));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.log(chalk.yellow(' ⚠ Model not downloaded'));
|
|
116
|
+
console.log(chalk.dim(` → Will download on first use (~274MB)`));
|
|
117
|
+
console.log(chalk.dim(` → Or manually: npx memextend status --check-embeddings`));
|
|
118
|
+
// Offer to download now
|
|
119
|
+
console.log();
|
|
120
|
+
console.log(chalk.bold(' Downloading model now...'));
|
|
121
|
+
try {
|
|
122
|
+
const { LocalEmbedding } = await import('@memextend/core');
|
|
123
|
+
await LocalEmbedding.create(MODELS_PATH);
|
|
124
|
+
console.log(chalk.green(' ✓ Model downloaded successfully'));
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
console.log(chalk.red(` ✗ Download failed: ${error instanceof Error ? error.message : error}`));
|
|
128
|
+
allPassed = false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Check 2: Can load model
|
|
132
|
+
console.log();
|
|
133
|
+
console.log(chalk.bold(' [2/5] Loading model...'));
|
|
134
|
+
let embedding = null;
|
|
135
|
+
try {
|
|
136
|
+
const { LocalEmbedding } = await import('@memextend/core');
|
|
137
|
+
const startLoad = Date.now();
|
|
138
|
+
embedding = await LocalEmbedding.create(MODELS_PATH);
|
|
139
|
+
const loadTime = Date.now() - startLoad;
|
|
140
|
+
console.log(chalk.green(` ✓ Model loaded successfully (${loadTime}ms)`));
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
console.log(chalk.red(` ✗ Failed to load model: ${error instanceof Error ? error.message : error}`));
|
|
144
|
+
allPassed = false;
|
|
145
|
+
}
|
|
146
|
+
if (!embedding) {
|
|
147
|
+
console.log(chalk.red('\n Cannot continue diagnostics without model.\n'));
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
// Check 3: Generate document embedding
|
|
151
|
+
console.log();
|
|
152
|
+
console.log(chalk.bold(' [3/5] Generating document embedding...'));
|
|
153
|
+
try {
|
|
154
|
+
const testDoc = 'This is a test document for embedding generation.';
|
|
155
|
+
const startEmbed = Date.now();
|
|
156
|
+
const docVector = await embedding.embed(testDoc);
|
|
157
|
+
const embedTime = Date.now() - startEmbed;
|
|
158
|
+
if (docVector.length === 384) {
|
|
159
|
+
console.log(chalk.green(` ✓ Document embedding generated (${embedTime}ms, ${docVector.length} dimensions)`));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.log(chalk.red(` ✗ Unexpected dimensions: ${docVector.length} (expected 384)`));
|
|
163
|
+
allPassed = false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.log(chalk.red(` ✗ Failed: ${error instanceof Error ? error.message : error}`));
|
|
168
|
+
allPassed = false;
|
|
169
|
+
}
|
|
170
|
+
// Check 4: Generate query embedding
|
|
171
|
+
console.log();
|
|
172
|
+
console.log(chalk.bold(' [4/5] Generating query embedding...'));
|
|
173
|
+
try {
|
|
174
|
+
const testQuery = 'test query';
|
|
175
|
+
const startQuery = Date.now();
|
|
176
|
+
const queryVector = await embedding.embedQuery(testQuery);
|
|
177
|
+
const queryTime = Date.now() - startQuery;
|
|
178
|
+
if (queryVector.length === 384) {
|
|
179
|
+
console.log(chalk.green(` ✓ Query embedding generated (${queryTime}ms, ${queryVector.length} dimensions)`));
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(chalk.red(` ✗ Unexpected dimensions: ${queryVector.length} (expected 384)`));
|
|
183
|
+
allPassed = false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
console.log(chalk.red(` ✗ Failed: ${error instanceof Error ? error.message : error}`));
|
|
188
|
+
allPassed = false;
|
|
189
|
+
}
|
|
190
|
+
// Check 5: Semantic similarity test
|
|
191
|
+
console.log();
|
|
192
|
+
console.log(chalk.bold(' [5/5] Testing semantic similarity...'));
|
|
193
|
+
try {
|
|
194
|
+
const { cosineSimilarity } = await import('@memextend/core');
|
|
195
|
+
const doc1 = await embedding.embed('The cat sat on the mat.');
|
|
196
|
+
const doc2 = await embedding.embed('A feline rested on the rug.');
|
|
197
|
+
const doc3 = await embedding.embed('Python is a programming language.');
|
|
198
|
+
const query = await embedding.embedQuery('cat sitting');
|
|
199
|
+
const sim1 = cosineSimilarity(query, doc1);
|
|
200
|
+
const sim2 = cosineSimilarity(query, doc2);
|
|
201
|
+
const sim3 = cosineSimilarity(query, doc3);
|
|
202
|
+
console.log(chalk.dim(` Query: "cat sitting"`));
|
|
203
|
+
console.log(chalk.dim(` Doc 1: "The cat sat on the mat." → similarity: ${sim1.toFixed(4)}`));
|
|
204
|
+
console.log(chalk.dim(` Doc 2: "A feline rested on the rug." → similarity: ${sim2.toFixed(4)}`));
|
|
205
|
+
console.log(chalk.dim(` Doc 3: "Python is a programming language." → similarity: ${sim3.toFixed(4)}`));
|
|
206
|
+
// Semantic test: doc1 and doc2 should be more similar to query than doc3
|
|
207
|
+
if (sim1 > sim3 && sim2 > sim3) {
|
|
208
|
+
console.log(chalk.green(' ✓ Semantic similarity working correctly'));
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
console.log(chalk.yellow(' ⚠ Semantic similarity may not be working as expected'));
|
|
212
|
+
allPassed = false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
console.log(chalk.red(` ✗ Failed: ${error instanceof Error ? error.message : error}`));
|
|
217
|
+
allPassed = false;
|
|
218
|
+
}
|
|
219
|
+
// Clean up
|
|
220
|
+
await embedding.close();
|
|
221
|
+
// Summary
|
|
222
|
+
console.log();
|
|
223
|
+
if (allPassed) {
|
|
224
|
+
console.log(chalk.green.bold(' ✓ All embedding diagnostics passed!\n'));
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
console.log(chalk.yellow.bold(' ⚠ Some diagnostics had issues. See above for details.\n'));
|
|
228
|
+
process.exit(1);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAqBA,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAgBD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0E/E"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// apps/cli/src/commands/uninstall.ts
|
|
2
|
+
// Copyright (c) 2026 ZodTTD LLC. MIT License.
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { readFile, writeFile, rm } from 'fs/promises';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { homedir } from 'os';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import ora from 'ora';
|
|
9
|
+
import { createInterface } from 'readline';
|
|
10
|
+
const MEMEXTEND_DIR = join(homedir(), '.memextend');
|
|
11
|
+
const CLAUDE_DIR = join(homedir(), '.claude');
|
|
12
|
+
const CLAUDE_SETTINGS_PATH = join(CLAUDE_DIR, 'settings.json');
|
|
13
|
+
const CLAUDE_MD_PATH = join(CLAUDE_DIR, 'CLAUDE.md');
|
|
14
|
+
const SHELL_CONFIGS = [
|
|
15
|
+
join(homedir(), '.zshrc'),
|
|
16
|
+
join(homedir(), '.bashrc'),
|
|
17
|
+
join(homedir(), '.config', 'fish', 'config.fish'),
|
|
18
|
+
];
|
|
19
|
+
async function confirm(message) {
|
|
20
|
+
const rl = createInterface({
|
|
21
|
+
input: process.stdin,
|
|
22
|
+
output: process.stdout,
|
|
23
|
+
});
|
|
24
|
+
return new Promise((resolve) => {
|
|
25
|
+
rl.question(message, (answer) => {
|
|
26
|
+
rl.close();
|
|
27
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export async function uninstallCommand(options) {
|
|
32
|
+
console.log(chalk.bold('\n memextend Uninstall\n'));
|
|
33
|
+
// Check if memextend is installed
|
|
34
|
+
if (!existsSync(MEMEXTEND_DIR)) {
|
|
35
|
+
console.log(chalk.yellow(' memextend is not installed (no ~/.memextend directory found).\n'));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Show what will be removed
|
|
39
|
+
console.log(' This will remove:');
|
|
40
|
+
console.log(chalk.cyan(' - Claude Code hooks (SessionStart, Stop, PreCompact)'));
|
|
41
|
+
console.log(chalk.cyan(' - Claude Code MCP server registration'));
|
|
42
|
+
console.log(chalk.cyan(' - memextend section from ~/.claude/CLAUDE.md'));
|
|
43
|
+
console.log(chalk.cyan(' - PATH entries from shell config (.zshrc, .bashrc, fish)'));
|
|
44
|
+
if (!options.keepData) {
|
|
45
|
+
console.log(chalk.red(' - All memories and data in ~/.memextend/'));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(chalk.yellow(' - (keeping data in ~/.memextend/ due to --keep-data flag)'));
|
|
49
|
+
}
|
|
50
|
+
console.log('');
|
|
51
|
+
// Confirm unless --force
|
|
52
|
+
if (!options.force) {
|
|
53
|
+
const confirmed = await confirm(' Are you sure you want to uninstall? (y/N): ');
|
|
54
|
+
if (!confirmed) {
|
|
55
|
+
console.log(chalk.yellow('\n Uninstall cancelled.\n'));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const spinner = ora();
|
|
60
|
+
try {
|
|
61
|
+
// Step 1: Remove from Claude Code settings
|
|
62
|
+
spinner.start('Removing Claude Code integration...');
|
|
63
|
+
await removeFromClaudeSettings();
|
|
64
|
+
spinner.succeed('Removed hooks and MCP server from Claude Code');
|
|
65
|
+
// Step 2: Remove memextend section from CLAUDE.md
|
|
66
|
+
spinner.start('Cleaning up CLAUDE.md...');
|
|
67
|
+
await cleanupClaudeMd();
|
|
68
|
+
spinner.succeed('Removed memextend section from CLAUDE.md');
|
|
69
|
+
// Step 3: Remove PATH from shell configs
|
|
70
|
+
spinner.start('Cleaning up shell PATH...');
|
|
71
|
+
const cleanedShells = await cleanupShellConfigs();
|
|
72
|
+
if (cleanedShells.length > 0) {
|
|
73
|
+
spinner.succeed(`Removed PATH from: ${cleanedShells.join(', ')}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
spinner.info('No shell configs needed cleanup');
|
|
77
|
+
}
|
|
78
|
+
// Step 4: Remove data directory (unless --keep-data)
|
|
79
|
+
if (!options.keepData) {
|
|
80
|
+
spinner.start('Removing memextend data...');
|
|
81
|
+
await rm(MEMEXTEND_DIR, { recursive: true, force: true });
|
|
82
|
+
spinner.succeed('Removed ~/.memextend/ directory');
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
spinner.info('Keeping ~/.memextend/ data directory');
|
|
86
|
+
}
|
|
87
|
+
console.log(chalk.green('\n ✅ memextend has been uninstalled.\n'));
|
|
88
|
+
if (options.keepData) {
|
|
89
|
+
console.log(chalk.yellow(' Your memories are preserved in ~/.memextend/'));
|
|
90
|
+
console.log(chalk.yellow(' Run `memextend init` to reinstall and reconnect.\n'));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
spinner.fail('Uninstall failed');
|
|
95
|
+
console.error(chalk.red(`\n Error: ${error instanceof Error ? error.message : error}\n`));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function removeFromClaudeSettings() {
|
|
100
|
+
if (!existsSync(CLAUDE_SETTINGS_PATH)) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const content = await readFile(CLAUDE_SETTINGS_PATH, 'utf-8');
|
|
105
|
+
const settings = JSON.parse(content);
|
|
106
|
+
// Remove hooks
|
|
107
|
+
if (settings.hooks) {
|
|
108
|
+
delete settings.hooks.SessionStart;
|
|
109
|
+
delete settings.hooks.Stop;
|
|
110
|
+
delete settings.hooks.PreCompact;
|
|
111
|
+
// Remove empty hooks object
|
|
112
|
+
if (Object.keys(settings.hooks).length === 0) {
|
|
113
|
+
delete settings.hooks;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Remove MCP server
|
|
117
|
+
if (settings.mcpServers) {
|
|
118
|
+
delete settings.mcpServers.memextend;
|
|
119
|
+
// Remove empty mcpServers object
|
|
120
|
+
if (Object.keys(settings.mcpServers).length === 0) {
|
|
121
|
+
delete settings.mcpServers;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
await writeFile(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2));
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Ignore errors - settings file might be malformed
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function cleanupClaudeMd() {
|
|
131
|
+
if (!existsSync(CLAUDE_MD_PATH)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const content = await readFile(CLAUDE_MD_PATH, 'utf-8');
|
|
136
|
+
// Remove memextend section (from "# memextend" to the next top-level heading or end)
|
|
137
|
+
const memextendSectionRegex = /# memextend - AI Memory Extension[\s\S]*?(?=\n# [^#]|$)/;
|
|
138
|
+
let cleaned = content.replace(memextendSectionRegex, '');
|
|
139
|
+
// Clean up extra whitespace
|
|
140
|
+
cleaned = cleaned.replace(/\n{3,}/g, '\n\n').trim();
|
|
141
|
+
if (cleaned.length === 0) {
|
|
142
|
+
// File is now empty, remove it
|
|
143
|
+
await rm(CLAUDE_MD_PATH);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
await writeFile(CLAUDE_MD_PATH, cleaned + '\n');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Ignore errors
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async function cleanupShellConfigs() {
|
|
154
|
+
const cleaned = [];
|
|
155
|
+
for (const configPath of SHELL_CONFIGS) {
|
|
156
|
+
if (!existsSync(configPath)) {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const content = await readFile(configPath, 'utf-8');
|
|
161
|
+
// Check if memextend is in this config
|
|
162
|
+
if (!content.includes('.memextend')) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
// Remove memextend lines (comment and PATH export)
|
|
166
|
+
const lines = content.split('\n');
|
|
167
|
+
const filteredLines = lines.filter(line => {
|
|
168
|
+
// Remove "# Added by memextend installer" comment
|
|
169
|
+
if (line.includes('Added by memextend installer'))
|
|
170
|
+
return false;
|
|
171
|
+
// Remove PATH export with .memextend/bin
|
|
172
|
+
if (line.includes('.memextend/bin'))
|
|
173
|
+
return false;
|
|
174
|
+
return true;
|
|
175
|
+
});
|
|
176
|
+
// Clean up extra blank lines
|
|
177
|
+
let newContent = filteredLines.join('\n');
|
|
178
|
+
newContent = newContent.replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
|
|
179
|
+
await writeFile(configPath, newContent);
|
|
180
|
+
cleaned.push(configPath.split('/').pop() || configPath);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Ignore errors for individual files
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return cleaned;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webui.d.ts","sourceRoot":"","sources":["../../src/commands/webui.ts"],"names":[],"mappings":"AAeA,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDvE"}
|