@memextend/cursor 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/README.md +411 -0
- package/dist/cli/capture.cjs +776 -0
- package/dist/cli/capture.d.ts +2 -0
- package/dist/cli/capture.d.ts.map +1 -0
- package/dist/cli/capture.js +222 -0
- package/dist/cli/capture.js.map +1 -0
- package/dist/cli/index.cjs +245 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +252 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/inject.cjs +1029 -0
- package/dist/cli/inject.d.ts +2 -0
- package/dist/cli/inject.d.ts.map +1 -0
- package/dist/cli/inject.js +279 -0
- package/dist/cli/inject.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +13 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +15 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.cjs +14865 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +384 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/utils/index.d.ts +44 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +123 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +65 -0
- package/scripts/build-cli.js +59 -0
- package/scripts/build-mcp.js +46 -0
- package/scripts/postinstall.js +57 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// packages/adapters/cursor/src/cli/index.ts
|
|
2
|
+
// Copyright (c) 2026 ZodTTD LLC. MIT License.
|
|
3
|
+
/**
|
|
4
|
+
* Main CLI entry point for Cursor adapter
|
|
5
|
+
*
|
|
6
|
+
* Provides a unified interface for memextend-cursor operations.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* memextend-cursor <command> [options]
|
|
10
|
+
*
|
|
11
|
+
* Commands:
|
|
12
|
+
* capture - Capture session content to memory
|
|
13
|
+
* inject - Retrieve context for session start
|
|
14
|
+
* setup - Configure Cursor for memextend
|
|
15
|
+
* status - Check memextend status
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync } from 'fs';
|
|
18
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
19
|
+
import { join, dirname, resolve } from 'path';
|
|
20
|
+
import { homedir } from 'os';
|
|
21
|
+
import { spawn } from 'child_process';
|
|
22
|
+
const MEMEXTEND_DIR = join(homedir(), '.memextend');
|
|
23
|
+
const DB_PATH = join(MEMEXTEND_DIR, 'memextend.db');
|
|
24
|
+
// Cursor MCP config locations
|
|
25
|
+
const CURSOR_CONFIG_PATHS = [
|
|
26
|
+
join(homedir(), '.cursor', 'mcp.json'),
|
|
27
|
+
join(homedir(), 'Library', 'Application Support', 'Cursor', 'User', 'mcp.json'), // macOS
|
|
28
|
+
join(homedir(), '.config', 'Cursor', 'User', 'mcp.json'), // Linux
|
|
29
|
+
join(homedir(), 'AppData', 'Roaming', 'Cursor', 'User', 'mcp.json'), // Windows
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Get the directory containing this script.
|
|
33
|
+
* When bundled with esbuild as CJS, __dirname is injected.
|
|
34
|
+
*/
|
|
35
|
+
function getScriptDir() {
|
|
36
|
+
// @ts-ignore - __dirname is injected by esbuild when bundling as CJS
|
|
37
|
+
return __dirname;
|
|
38
|
+
}
|
|
39
|
+
function getMcpServerPath() {
|
|
40
|
+
// Get the path to the built MCP server
|
|
41
|
+
const scriptDir = getScriptDir();
|
|
42
|
+
return join(scriptDir, '..', 'mcp', 'server.cjs');
|
|
43
|
+
}
|
|
44
|
+
function findCursorConfigPath() {
|
|
45
|
+
for (const configPath of CURSOR_CONFIG_PATHS) {
|
|
46
|
+
const configDir = dirname(configPath);
|
|
47
|
+
if (existsSync(configDir)) {
|
|
48
|
+
return configPath;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
async function setupCursor() {
|
|
54
|
+
console.log('Setting up memextend for Cursor...\n');
|
|
55
|
+
// Check if memextend is initialized
|
|
56
|
+
if (!existsSync(DB_PATH)) {
|
|
57
|
+
console.log('Warning: memextend not initialized. Run `memextend init` first.\n');
|
|
58
|
+
}
|
|
59
|
+
const configPath = findCursorConfigPath();
|
|
60
|
+
if (!configPath) {
|
|
61
|
+
console.log('Could not find Cursor configuration directory.');
|
|
62
|
+
console.log('Please ensure Cursor is installed and has been run at least once.\n');
|
|
63
|
+
console.log('Manual setup instructions:');
|
|
64
|
+
printManualSetupInstructions();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const mcpServerPath = getMcpServerPath();
|
|
68
|
+
// Verify the MCP server exists
|
|
69
|
+
if (!existsSync(mcpServerPath)) {
|
|
70
|
+
console.log(`Error: MCP server not found at ${mcpServerPath}`);
|
|
71
|
+
console.log('Please run `npm run build` in the @memextend/cursor package first.\n');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Read existing config or create new
|
|
75
|
+
let config = { mcpServers: {} };
|
|
76
|
+
if (existsSync(configPath)) {
|
|
77
|
+
try {
|
|
78
|
+
const content = await readFile(configPath, 'utf-8');
|
|
79
|
+
config = JSON.parse(content);
|
|
80
|
+
if (!config.mcpServers) {
|
|
81
|
+
config.mcpServers = {};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.log('Warning: Could not parse existing mcp.json, creating new one');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Check if already configured
|
|
89
|
+
if (config.mcpServers.memextend) {
|
|
90
|
+
console.log('memextend is already configured in Cursor.');
|
|
91
|
+
console.log(`Current path: ${config.mcpServers.memextend.args?.[0] || 'unknown'}`);
|
|
92
|
+
console.log('\nTo update, remove the existing entry and run setup again.');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Add memextend MCP server
|
|
96
|
+
config.mcpServers.memextend = {
|
|
97
|
+
command: 'node',
|
|
98
|
+
args: [resolve(mcpServerPath)],
|
|
99
|
+
};
|
|
100
|
+
// Ensure directory exists
|
|
101
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
102
|
+
// Write config
|
|
103
|
+
await writeFile(configPath, JSON.stringify(config, null, 2));
|
|
104
|
+
console.log('Success! memextend MCP server added to Cursor.\n');
|
|
105
|
+
console.log(`Configuration file: ${configPath}`);
|
|
106
|
+
console.log(`MCP server path: ${resolve(mcpServerPath)}\n`);
|
|
107
|
+
console.log('Next steps:');
|
|
108
|
+
console.log('1. Restart Cursor to load the new MCP server');
|
|
109
|
+
console.log('2. In Cursor, ask Claude to use memextend tools');
|
|
110
|
+
console.log('3. Try: "Search my memories for [topic]" or "Save this to memory"');
|
|
111
|
+
}
|
|
112
|
+
function printManualSetupInstructions() {
|
|
113
|
+
const mcpServerPath = getMcpServerPath();
|
|
114
|
+
console.log(`
|
|
115
|
+
Create or edit ~/.cursor/mcp.json with the following content:
|
|
116
|
+
|
|
117
|
+
{
|
|
118
|
+
"mcpServers": {
|
|
119
|
+
"memextend": {
|
|
120
|
+
"command": "node",
|
|
121
|
+
"args": ["${resolve(mcpServerPath)}"]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
Then restart Cursor to load the MCP server.
|
|
127
|
+
`);
|
|
128
|
+
}
|
|
129
|
+
async function showStatus() {
|
|
130
|
+
console.log('memextend Cursor Adapter Status\n');
|
|
131
|
+
// Check memextend initialization
|
|
132
|
+
if (existsSync(DB_PATH)) {
|
|
133
|
+
console.log('[OK] memextend initialized');
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log('[!] memextend not initialized - run `memextend init`');
|
|
137
|
+
}
|
|
138
|
+
// Check Cursor config
|
|
139
|
+
const configPath = findCursorConfigPath();
|
|
140
|
+
if (configPath && existsSync(configPath)) {
|
|
141
|
+
try {
|
|
142
|
+
const content = await readFile(configPath, 'utf-8');
|
|
143
|
+
const config = JSON.parse(content);
|
|
144
|
+
if (config.mcpServers?.memextend) {
|
|
145
|
+
console.log('[OK] Cursor MCP configured');
|
|
146
|
+
console.log(` Config: ${configPath}`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log('[!] Cursor MCP not configured - run `memextend-cursor setup`');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
console.log('[!] Could not read Cursor config');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.log('[!] Cursor config not found');
|
|
158
|
+
}
|
|
159
|
+
// Check MCP server
|
|
160
|
+
const mcpServerPath = getMcpServerPath();
|
|
161
|
+
if (existsSync(mcpServerPath)) {
|
|
162
|
+
console.log('[OK] MCP server built');
|
|
163
|
+
console.log(` Path: ${resolve(mcpServerPath)}`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
console.log('[!] MCP server not built - run `npm run build`');
|
|
167
|
+
}
|
|
168
|
+
console.log('');
|
|
169
|
+
}
|
|
170
|
+
function printHelp() {
|
|
171
|
+
console.log(`
|
|
172
|
+
memextend-cursor - Cursor IDE adapter for memextend
|
|
173
|
+
|
|
174
|
+
USAGE:
|
|
175
|
+
memextend-cursor <command> [options]
|
|
176
|
+
|
|
177
|
+
COMMANDS:
|
|
178
|
+
setup Configure Cursor to use memextend MCP server
|
|
179
|
+
status Check memextend and Cursor configuration status
|
|
180
|
+
capture Capture content to memory (alias for memextend-cursor-capture)
|
|
181
|
+
inject Get context for session (alias for memextend-cursor-inject)
|
|
182
|
+
help Show this help message
|
|
183
|
+
|
|
184
|
+
EXAMPLES:
|
|
185
|
+
# Initial setup
|
|
186
|
+
memextend-cursor setup
|
|
187
|
+
|
|
188
|
+
# Check status
|
|
189
|
+
memextend-cursor status
|
|
190
|
+
|
|
191
|
+
# Capture a memory
|
|
192
|
+
memextend-cursor capture -c "Implemented user auth with JWT"
|
|
193
|
+
|
|
194
|
+
# Get session context
|
|
195
|
+
memextend-cursor inject
|
|
196
|
+
|
|
197
|
+
For more details on capture and inject commands:
|
|
198
|
+
memextend-cursor capture --help
|
|
199
|
+
memextend-cursor inject --help
|
|
200
|
+
|
|
201
|
+
DOCUMENTATION:
|
|
202
|
+
See the README.md for complete setup and usage instructions.
|
|
203
|
+
`);
|
|
204
|
+
}
|
|
205
|
+
async function main() {
|
|
206
|
+
const args = process.argv.slice(2);
|
|
207
|
+
const command = args[0];
|
|
208
|
+
switch (command) {
|
|
209
|
+
case 'setup':
|
|
210
|
+
await setupCursor();
|
|
211
|
+
break;
|
|
212
|
+
case 'status':
|
|
213
|
+
await showStatus();
|
|
214
|
+
break;
|
|
215
|
+
case 'capture': {
|
|
216
|
+
// Forward to capture script
|
|
217
|
+
const scriptDir = getScriptDir();
|
|
218
|
+
const captureScript = join(scriptDir, 'capture.cjs');
|
|
219
|
+
const child = spawn('node', [captureScript, ...args.slice(1)], {
|
|
220
|
+
stdio: 'inherit',
|
|
221
|
+
});
|
|
222
|
+
child.on('close', (code) => process.exit(code ?? 0));
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
case 'inject': {
|
|
226
|
+
// Forward to inject script
|
|
227
|
+
const scriptDir = getScriptDir();
|
|
228
|
+
const injectScript = join(scriptDir, 'inject.cjs');
|
|
229
|
+
const child = spawn('node', [injectScript, ...args.slice(1)], {
|
|
230
|
+
stdio: 'inherit',
|
|
231
|
+
});
|
|
232
|
+
child.on('close', (code) => process.exit(code ?? 0));
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
case 'help':
|
|
236
|
+
case '--help':
|
|
237
|
+
case '-h':
|
|
238
|
+
case undefined:
|
|
239
|
+
printHelp();
|
|
240
|
+
break;
|
|
241
|
+
default:
|
|
242
|
+
console.error(`Unknown command: ${command}`);
|
|
243
|
+
console.error('Run `memextend-cursor help` for usage information.');
|
|
244
|
+
process.exit(1);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
main().catch(error => {
|
|
248
|
+
console.error('Error:', error.message);
|
|
249
|
+
process.exit(1);
|
|
250
|
+
});
|
|
251
|
+
export { setupCursor, showStatus };
|
|
252
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|