@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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,384 @@
1
+ // packages/adapters/cursor/src/mcp/server.ts
2
+ // Copyright (c) 2026 ZodTTD LLC. MIT License.
3
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
6
+ import { randomUUID } from 'crypto';
7
+ import { existsSync } from 'fs';
8
+ import { join, basename } from 'path';
9
+ import { homedir } from 'os';
10
+ import { SQLiteStorage, LanceDBStorage, MemoryRetriever, createEmbedFunction, formatContextForInjection, getProjectId } from '@memextend/core';
11
+ const MEMEXTEND_DIR = join(homedir(), '.memextend');
12
+ const DB_PATH = join(MEMEXTEND_DIR, 'memextend.db');
13
+ const VECTORS_PATH = join(MEMEXTEND_DIR, 'vectors');
14
+ const MODELS_PATH = join(MEMEXTEND_DIR, 'models');
15
+ // Lazy-loaded storage instances
16
+ let sqlite = null;
17
+ let lancedb = null;
18
+ let retriever = null;
19
+ let embedder = null;
20
+ async function getStorage() {
21
+ if (!sqlite || !lancedb || !retriever || !embedder) {
22
+ if (!existsSync(DB_PATH)) {
23
+ throw new Error('memextend not initialized. Run `memextend init` first.');
24
+ }
25
+ sqlite = new SQLiteStorage(DB_PATH);
26
+ lancedb = await LanceDBStorage.create(VECTORS_PATH);
27
+ embedder = await createEmbedFunction(MODELS_PATH);
28
+ retriever = new MemoryRetriever(sqlite, lancedb, embedder.embedQuery);
29
+ }
30
+ return { sqlite, lancedb, retriever, embedder };
31
+ }
32
+ /**
33
+ * Get current workspace from environment or cwd
34
+ */
35
+ function getCurrentWorkspace() {
36
+ // Cursor may set these environment variables
37
+ return process.env.CURSOR_WORKSPACE_PATH ||
38
+ process.env.VSCODE_WORKSPACE_PATH ||
39
+ process.env.PWD ||
40
+ process.cwd();
41
+ }
42
+ const server = new Server({
43
+ name: 'memextend',
44
+ version: '0.1.0',
45
+ }, {
46
+ capabilities: {
47
+ tools: {},
48
+ resources: {},
49
+ },
50
+ });
51
+ // List available tools
52
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
53
+ return {
54
+ tools: [
55
+ {
56
+ name: 'memextend_search',
57
+ description: 'Search through your memories. Use this to recall past work, decisions, patterns, or context from previous sessions.',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ query: {
62
+ type: 'string',
63
+ description: 'Search query - natural language works best (e.g., "Redis caching setup", "authentication patterns")',
64
+ },
65
+ limit: {
66
+ type: 'number',
67
+ description: 'Maximum number of results (default: 5, max: 20)',
68
+ },
69
+ project_only: {
70
+ type: 'boolean',
71
+ description: 'Only search within current project (default: false)',
72
+ },
73
+ },
74
+ required: ['query'],
75
+ },
76
+ },
77
+ {
78
+ name: 'memextend_save',
79
+ description: 'Save a memory for this project. Use this to remember important decisions, architectural patterns, code conventions, or context that should persist across sessions.',
80
+ inputSchema: {
81
+ type: 'object',
82
+ properties: {
83
+ content: {
84
+ type: 'string',
85
+ description: 'The memory content to save - be descriptive and include relevant context',
86
+ },
87
+ tags: {
88
+ type: 'array',
89
+ items: { type: 'string' },
90
+ description: 'Optional tags for categorization (e.g., ["architecture", "decision"])',
91
+ },
92
+ },
93
+ required: ['content'],
94
+ },
95
+ },
96
+ {
97
+ name: 'memextend_save_global',
98
+ description: 'Save a global preference or fact that applies across ALL projects (e.g., coding style preferences, common patterns you use).',
99
+ inputSchema: {
100
+ type: 'object',
101
+ properties: {
102
+ content: {
103
+ type: 'string',
104
+ description: 'The preference or fact to remember globally',
105
+ },
106
+ type: {
107
+ type: 'string',
108
+ enum: ['preference', 'pattern', 'fact'],
109
+ description: 'Type of global memory: preference (coding style), pattern (reusable approach), fact (general info)',
110
+ },
111
+ },
112
+ required: ['content', 'type'],
113
+ },
114
+ },
115
+ {
116
+ name: 'memextend_recall',
117
+ description: 'Get recent context for the current project. Call this at the start of a session to recall what you worked on previously.',
118
+ inputSchema: {
119
+ type: 'object',
120
+ properties: {
121
+ days: {
122
+ type: 'number',
123
+ description: 'Number of days to look back (default: 7)',
124
+ },
125
+ include_global: {
126
+ type: 'boolean',
127
+ description: 'Include global preferences (default: true)',
128
+ },
129
+ },
130
+ },
131
+ },
132
+ {
133
+ name: 'memextend_forget',
134
+ description: 'Delete a specific memory by ID. Use with caution.',
135
+ inputSchema: {
136
+ type: 'object',
137
+ properties: {
138
+ memoryId: {
139
+ type: 'string',
140
+ description: 'The ID of the memory to delete',
141
+ },
142
+ },
143
+ required: ['memoryId'],
144
+ },
145
+ },
146
+ {
147
+ name: 'memextend_status',
148
+ description: 'Get memextend status and memory statistics for the current project.',
149
+ inputSchema: {
150
+ type: 'object',
151
+ properties: {},
152
+ },
153
+ },
154
+ ],
155
+ };
156
+ });
157
+ // List resources (provides context about the memory system)
158
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
159
+ return {
160
+ resources: [
161
+ {
162
+ uri: 'memextend://context',
163
+ name: 'Session Context',
164
+ description: 'Recent memories and preferences for context injection',
165
+ mimeType: 'text/plain',
166
+ },
167
+ {
168
+ uri: 'memextend://status',
169
+ name: 'Memory Status',
170
+ description: 'Current memory database status',
171
+ mimeType: 'application/json',
172
+ },
173
+ ],
174
+ };
175
+ });
176
+ // Read resources
177
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
178
+ const { uri } = request.params;
179
+ try {
180
+ const { sqlite, retriever } = await getStorage();
181
+ const workspace = getCurrentWorkspace();
182
+ const projectId = getProjectId(workspace);
183
+ if (uri === 'memextend://context') {
184
+ const context = await retriever.getContextForSession(projectId, {
185
+ includeGlobal: true
186
+ });
187
+ const formatted = formatContextForInjection(context);
188
+ return {
189
+ contents: [
190
+ {
191
+ uri,
192
+ mimeType: 'text/plain',
193
+ text: formatted,
194
+ },
195
+ ],
196
+ };
197
+ }
198
+ if (uri === 'memextend://status') {
199
+ const memoryCount = sqlite.getMemoryCount();
200
+ return {
201
+ contents: [
202
+ {
203
+ uri,
204
+ mimeType: 'application/json',
205
+ text: JSON.stringify({
206
+ initialized: true,
207
+ memoryCount,
208
+ projectId,
209
+ workspace,
210
+ }, null, 2),
211
+ },
212
+ ],
213
+ };
214
+ }
215
+ throw new Error(`Unknown resource: ${uri}`);
216
+ }
217
+ catch (error) {
218
+ const message = error instanceof Error ? error.message : 'Unknown error';
219
+ return {
220
+ contents: [
221
+ {
222
+ uri,
223
+ mimeType: 'text/plain',
224
+ text: `Error: ${message}`,
225
+ },
226
+ ],
227
+ };
228
+ }
229
+ });
230
+ // Handle tool calls
231
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
232
+ const { name, arguments: args } = request.params;
233
+ try {
234
+ const workspace = getCurrentWorkspace();
235
+ const projectId = getProjectId(workspace);
236
+ switch (name) {
237
+ case 'memextend_search': {
238
+ const { retriever, sqlite } = await getStorage();
239
+ const query = args?.query;
240
+ const limit = Math.min(args?.limit ?? 5, 20);
241
+ const projectOnly = args?.project_only ?? false;
242
+ const results = await retriever.hybridSearch(query, {
243
+ limit,
244
+ projectId: projectOnly ? projectId : undefined,
245
+ });
246
+ if (results.length === 0) {
247
+ return { content: [{ type: 'text', text: 'No memories found matching your query. Try different keywords or broader terms.' }] };
248
+ }
249
+ const formatted = results.map((r, i) => {
250
+ const date = new Date(r.memory.createdAt).toLocaleDateString();
251
+ const projectInfo = r.memory.projectId === projectId ? '[this project]' : '[other project]';
252
+ const preview = r.memory.content.split('\n').slice(0, 3).join('\n');
253
+ return `${i + 1}. ${projectInfo} [${date}] (relevance: ${(r.score * 100).toFixed(0)}%)\nID: ${r.memory.id}\n${preview}`;
254
+ }).join('\n\n---\n\n');
255
+ return { content: [{ type: 'text', text: `Found ${results.length} memories:\n\n${formatted}` }] };
256
+ }
257
+ case 'memextend_save': {
258
+ const { sqlite, lancedb, embedder } = await getStorage();
259
+ const content = args?.content;
260
+ const tags = args?.tags ?? [];
261
+ if (!content || content.length < 10) {
262
+ return { content: [{ type: 'text', text: 'Memory content too short. Please provide more context (at least 10 characters).' }], isError: true };
263
+ }
264
+ if (content.length > 50000) {
265
+ return { content: [{ type: 'text', text: 'Memory content too long (maximum 50KB).' }], isError: true };
266
+ }
267
+ // Ensure project is registered
268
+ const project = sqlite.getProject(projectId);
269
+ if (!project) {
270
+ sqlite.insertProject({
271
+ id: projectId,
272
+ name: basename(workspace),
273
+ path: workspace,
274
+ createdAt: new Date().toISOString()
275
+ });
276
+ }
277
+ const memoryId = randomUUID();
278
+ const memoryContent = tags.length > 0 ? `[Tags: ${tags.join(', ')}]\n${content}` : content;
279
+ sqlite.insertMemory({
280
+ id: memoryId,
281
+ projectId,
282
+ content: memoryContent,
283
+ type: 'manual',
284
+ sourceTool: null,
285
+ createdAt: new Date().toISOString(),
286
+ sessionId: null,
287
+ metadata: tags.length > 0 ? { tags } : null,
288
+ });
289
+ const vector = await embedder.embed(content);
290
+ await lancedb.insertVector(memoryId, vector);
291
+ return { content: [{ type: 'text', text: `Memory saved successfully!\nID: ${memoryId}\nProject: ${basename(workspace)}` }] };
292
+ }
293
+ case 'memextend_save_global': {
294
+ const { sqlite } = await getStorage();
295
+ const content = args?.content;
296
+ const type = args?.type;
297
+ if (!content || content.length < 5) {
298
+ return { content: [{ type: 'text', text: 'Content too short. Please provide more detail.' }], isError: true };
299
+ }
300
+ if (content.length > 10000) {
301
+ return { content: [{ type: 'text', text: 'Content too long (maximum 10KB for global profiles).' }], isError: true };
302
+ }
303
+ const profileId = randomUUID();
304
+ sqlite.insertGlobalProfile({
305
+ id: profileId,
306
+ key: type,
307
+ content,
308
+ createdAt: new Date().toISOString(),
309
+ });
310
+ return { content: [{ type: 'text', text: `Global ${type} saved: "${content}"` }] };
311
+ }
312
+ case 'memextend_recall': {
313
+ const { retriever } = await getStorage();
314
+ const days = args?.days ?? 7;
315
+ const includeGlobal = args?.include_global ?? true;
316
+ const context = await retriever.getContextForSession(projectId, {
317
+ recentDays: days,
318
+ includeGlobal,
319
+ });
320
+ if (context.recentMemories.length === 0 && context.globalProfile.length === 0) {
321
+ return { content: [{ type: 'text', text: `No memories found for this project in the last ${days} days. This might be a new project or you haven't saved any memories yet.` }] };
322
+ }
323
+ const formatted = formatContextForInjection(context);
324
+ return { content: [{ type: 'text', text: formatted }] };
325
+ }
326
+ case 'memextend_forget': {
327
+ const { sqlite, lancedb } = await getStorage();
328
+ const memoryId = args?.memoryId;
329
+ if (!memoryId) {
330
+ return { content: [{ type: 'text', text: 'Memory ID is required.' }], isError: true };
331
+ }
332
+ const deleted = sqlite.deleteMemory(memoryId);
333
+ if (deleted) {
334
+ // Also delete the vector embedding
335
+ await lancedb.deleteVector(memoryId);
336
+ return { content: [{ type: 'text', text: `Memory ${memoryId} deleted successfully.` }] };
337
+ }
338
+ else {
339
+ return { content: [{ type: 'text', text: `Memory ${memoryId} not found.` }] };
340
+ }
341
+ }
342
+ case 'memextend_status': {
343
+ const { sqlite, lancedb, embedder } = await getStorage();
344
+ const memoryCount = sqlite.getMemoryCount();
345
+ const vectorCount = await lancedb.getVectorCount();
346
+ const projectMemories = sqlite.getAllMemories(projectId, 1000);
347
+ const projectMemoryCount = projectMemories.length;
348
+ return {
349
+ content: [{
350
+ type: 'text',
351
+ text: `memextend Status
352
+ ================
353
+ Project: ${basename(workspace)}
354
+ Project ID: ${projectId}
355
+ Project memories: ${projectMemoryCount}
356
+
357
+ Global Stats:
358
+ - Total memories: ${memoryCount}
359
+ - Vector embeddings: ${vectorCount}
360
+ - Semantic search: ${embedder.isReal ? 'Enabled (real embeddings)' : 'Fallback mode (hash-based)'}
361
+
362
+ Storage:
363
+ - Database: ${DB_PATH}
364
+ - Vectors: ${VECTORS_PATH}
365
+ - Models: ${MODELS_PATH}`
366
+ }]
367
+ };
368
+ }
369
+ default:
370
+ return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
371
+ }
372
+ }
373
+ catch (error) {
374
+ const message = error instanceof Error ? error.message : 'Unknown error';
375
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
376
+ }
377
+ });
378
+ // Start server
379
+ async function main() {
380
+ const transport = new StdioServerTransport();
381
+ await server.connect(transport);
382
+ }
383
+ main().catch(console.error);
384
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * memextend directory paths
3
+ */
4
+ export declare const MEMEXTEND_DIR: string;
5
+ export declare const DB_PATH: string;
6
+ export declare const VECTORS_PATH: string;
7
+ export declare const MODELS_PATH: string;
8
+ export declare const CONFIG_PATH: string;
9
+ /**
10
+ * Cursor configuration file paths (platform-specific)
11
+ */
12
+ export declare const CURSOR_CONFIG_PATHS: {
13
+ mcp: string[];
14
+ settings: string[];
15
+ };
16
+ /**
17
+ * Get a stable project ID from workspace path
18
+ */
19
+ export declare function getProjectId(workspacePath: string): string;
20
+ /**
21
+ * Check if memextend is initialized
22
+ */
23
+ export declare function isMemextendInitialized(): boolean;
24
+ /**
25
+ * Find the first existing Cursor MCP config path
26
+ */
27
+ export declare function findCursorMcpConfigPath(): string | null;
28
+ /**
29
+ * Load memextend configuration
30
+ */
31
+ export declare function loadConfig(): Promise<Record<string, any>>;
32
+ /**
33
+ * Format a relative date string
34
+ */
35
+ export declare function formatRelativeDate(isoDate: string): string;
36
+ /**
37
+ * Truncate a string with ellipsis
38
+ */
39
+ export declare function truncate(str: string, maxLen: number): string;
40
+ /**
41
+ * Generate MCP configuration for Cursor
42
+ */
43
+ export declare function generateMcpConfig(serverPath: string): object;
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,eAAO,MAAM,aAAa,QAAgC,CAAC;AAC3D,eAAO,MAAM,OAAO,QAAsC,CAAC;AAC3D,eAAO,MAAM,YAAY,QAAiC,CAAC;AAC3D,eAAO,MAAM,WAAW,QAAgC,CAAC;AACzD,eAAO,MAAM,WAAW,QAAqC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;CAY/B,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAa1D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAQvD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAU/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAW1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAS5D"}
@@ -0,0 +1,123 @@
1
+ // packages/adapters/cursor/src/utils/index.ts
2
+ // Copyright (c) 2026 ZodTTD LLC. MIT License.
3
+ import { createHash } from 'crypto';
4
+ import { existsSync } from 'fs';
5
+ import { readFile } from 'fs/promises';
6
+ import { join, dirname } from 'path';
7
+ import { homedir } from 'os';
8
+ import { execSync } from 'child_process';
9
+ /**
10
+ * memextend directory paths
11
+ */
12
+ export const MEMEXTEND_DIR = join(homedir(), '.memextend');
13
+ export const DB_PATH = join(MEMEXTEND_DIR, 'memextend.db');
14
+ export const VECTORS_PATH = join(MEMEXTEND_DIR, 'vectors');
15
+ export const MODELS_PATH = join(MEMEXTEND_DIR, 'models');
16
+ export const CONFIG_PATH = join(MEMEXTEND_DIR, 'config.json');
17
+ /**
18
+ * Cursor configuration file paths (platform-specific)
19
+ */
20
+ export const CURSOR_CONFIG_PATHS = {
21
+ mcp: [
22
+ join(homedir(), '.cursor', 'mcp.json'),
23
+ join(homedir(), 'Library', 'Application Support', 'Cursor', 'User', 'mcp.json'), // macOS
24
+ join(homedir(), '.config', 'Cursor', 'User', 'mcp.json'), // Linux
25
+ join(homedir(), 'AppData', 'Roaming', 'Cursor', 'User', 'mcp.json'), // Windows
26
+ ],
27
+ settings: [
28
+ join(homedir(), 'Library', 'Application Support', 'Cursor', 'User', 'settings.json'), // macOS
29
+ join(homedir(), '.config', 'Cursor', 'User', 'settings.json'), // Linux
30
+ join(homedir(), 'AppData', 'Roaming', 'Cursor', 'User', 'settings.json'), // Windows
31
+ ],
32
+ };
33
+ /**
34
+ * Get a stable project ID from workspace path
35
+ */
36
+ export function getProjectId(workspacePath) {
37
+ try {
38
+ // Try to get git root for consistent project ID across different paths
39
+ const gitRoot = execSync('git rev-parse --show-toplevel', {
40
+ cwd: workspacePath,
41
+ encoding: 'utf-8',
42
+ stdio: ['pipe', 'pipe', 'pipe']
43
+ }).trim();
44
+ return createHash('sha256').update(gitRoot).digest('hex').slice(0, 16);
45
+ }
46
+ catch {
47
+ // Not a git repo, use the workspace path
48
+ return createHash('sha256').update(workspacePath).digest('hex').slice(0, 16);
49
+ }
50
+ }
51
+ /**
52
+ * Check if memextend is initialized
53
+ */
54
+ export function isMemextendInitialized() {
55
+ return existsSync(DB_PATH);
56
+ }
57
+ /**
58
+ * Find the first existing Cursor MCP config path
59
+ */
60
+ export function findCursorMcpConfigPath() {
61
+ for (const configPath of CURSOR_CONFIG_PATHS.mcp) {
62
+ const configDir = dirname(configPath);
63
+ if (existsSync(configDir)) {
64
+ return configPath;
65
+ }
66
+ }
67
+ return null;
68
+ }
69
+ /**
70
+ * Load memextend configuration
71
+ */
72
+ export async function loadConfig() {
73
+ try {
74
+ if (existsSync(CONFIG_PATH)) {
75
+ const content = await readFile(CONFIG_PATH, 'utf-8');
76
+ return JSON.parse(content);
77
+ }
78
+ }
79
+ catch {
80
+ // Ignore config errors
81
+ }
82
+ return {};
83
+ }
84
+ /**
85
+ * Format a relative date string
86
+ */
87
+ export function formatRelativeDate(isoDate) {
88
+ const date = new Date(isoDate);
89
+ const now = new Date();
90
+ const diffMs = now.getTime() - date.getTime();
91
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
92
+ if (diffDays === 0)
93
+ return 'today';
94
+ if (diffDays === 1)
95
+ return 'yesterday';
96
+ if (diffDays < 7)
97
+ return `${diffDays} days ago`;
98
+ if (diffDays < 30)
99
+ return `${Math.floor(diffDays / 7)} weeks ago`;
100
+ return `${Math.floor(diffDays / 30)} months ago`;
101
+ }
102
+ /**
103
+ * Truncate a string with ellipsis
104
+ */
105
+ export function truncate(str, maxLen) {
106
+ if (str.length <= maxLen)
107
+ return str;
108
+ return str.slice(0, maxLen - 3) + '...';
109
+ }
110
+ /**
111
+ * Generate MCP configuration for Cursor
112
+ */
113
+ export function generateMcpConfig(serverPath) {
114
+ return {
115
+ mcpServers: {
116
+ memextend: {
117
+ command: 'node',
118
+ args: [serverPath],
119
+ },
120
+ },
121
+ };
122
+ }
123
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@memextend/cursor",
3
+ "version": "0.1.0",
4
+ "description": "Cursor IDE adapter for memextend - persistent AI memory via MCP",
5
+ "author": "ZodTTD LLC <repo@zodttd.com>",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "bin": {
17
+ "memextend-cursor": "./dist/cli/index.cjs",
18
+ "memextend-cursor-capture": "./dist/cli/capture.cjs",
19
+ "memextend-cursor-inject": "./dist/cli/inject.cjs"
20
+ },
21
+ "scripts": {
22
+ "build": "tsc && npm run build:mcp && npm run build:cli",
23
+ "build:mcp": "node scripts/build-mcp.js",
24
+ "build:cli": "node scripts/build-cli.js",
25
+ "test": "vitest run",
26
+ "postinstall": "node scripts/postinstall.js || true"
27
+ },
28
+ "dependencies": {
29
+ "@memextend/core": "^0.1.0",
30
+ "@modelcontextprotocol/sdk": "^1.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "esbuild": "^0.20.0"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/zodttd/memextend.git",
38
+ "directory": "packages/adapters/cursor"
39
+ },
40
+ "bugs": {
41
+ "url": "https://github.com/zodttd/memextend/issues"
42
+ },
43
+ "homepage": "https://github.com/zodttd/memextend#readme",
44
+ "keywords": [
45
+ "memextend",
46
+ "cursor",
47
+ "cursor-ide",
48
+ "ai-memory",
49
+ "mcp",
50
+ "model-context-protocol",
51
+ "llm",
52
+ "claude"
53
+ ],
54
+ "files": [
55
+ "dist",
56
+ "scripts",
57
+ "README.md"
58
+ ],
59
+ "engines": {
60
+ "node": ">=18.0.0"
61
+ },
62
+ "publishConfig": {
63
+ "access": "public"
64
+ }
65
+ }