@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.
@@ -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":"AAAA,4CAA4C;AAC5C,8CAA8C;AAE9C;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACpD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,mBAAmB,GAAG;IAC1B,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ;IACzF,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ;IAClE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU;CAChF,CAAC;AAEF;;;GAGG;AACH,SAAS,YAAY;IACnB,qEAAqE;IACrE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB;IACvB,uCAAuC;IACvC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,oBAAoB;IAC3B,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEpD,oCAAoC;IACpC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,4BAA4B,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IAEzC,+BAA+B;IAC/B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,kCAAkC,aAAa,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,qCAAqC;IACrC,IAAI,MAAM,GAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACrC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,MAAM,CAAC,UAAU,CAAC,SAAS,GAAG;QAC5B,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;KAC/B,CAAC;IAEF,0BAA0B;IAC1B,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,eAAe;IACf,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,4BAA4B;IACnC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC;;;;;;;kBAOI,OAAO,CAAC,aAAa,CAAC;;;;;;CAMvC,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,iCAAiC;IACjC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;IAED,mBAAmB;IACnB,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM;QAER,KAAK,QAAQ;YACX,MAAM,UAAU,EAAE,CAAC;YACnB,MAAM;QAER,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,4BAA4B;YAC5B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;YACjC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC7D,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM;QACR,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,2BAA2B;YAC3B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC5D,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM;QACR,CAAC;QAED,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,SAAS,EAAE,CAAC;YACZ,MAAM;QAER;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC"}