mcp-task-server 0.2.6 → 1.0.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 CHANGED
@@ -12,7 +12,26 @@ This script (in `~/scripts/`) bumps version, builds, and publishes to npm. Requi
12
12
 
13
13
  ## Cursor IDE Integration
14
14
 
15
- Add to your project's `.cursor/mcp.json`:
15
+ ### Global Config (Recommended)
16
+
17
+ Add to `~/.cursor/mcp.json` for all projects:
18
+
19
+ ```json
20
+ {
21
+ "mcpServers": {
22
+ "task-server": {
23
+ "command": "npx",
24
+ "args": ["-y", "mcp-task-server"]
25
+ }
26
+ }
27
+ }
28
+ ```
29
+
30
+ The server auto-detects your workspace. No per-project config needed.
31
+
32
+ ### Per-Project Config (Optional)
33
+
34
+ For explicit control, add to `.cursor/mcp.json` in your project:
16
35
 
17
36
  ```json
18
37
  {
@@ -28,8 +47,6 @@ Add to your project's `.cursor/mcp.json`:
28
47
  }
29
48
  ```
30
49
 
31
- **Important**: Use `TASK_WORKSPACE` to set your project path. This is more reliable than `cwd`. See [Workspace Configuration](#workspace-path-configuration) for details.
32
-
33
50
  After adding, reload Cursor: `Cmd+Shift+P` → "Developer: Reload Window"
34
51
 
35
52
  ---
@@ -41,7 +58,7 @@ flowchart TB
41
58
  end
42
59
 
43
60
  subgraph MCP Task Server
44
- B[22 Tools]
61
+ B[27 Tools]
45
62
  C[Preferences Engine]
46
63
  end
47
64
 
@@ -61,7 +78,8 @@ flowchart TB
61
78
 
62
79
  ## Features
63
80
 
64
- - **22 MCP Tools**: Comprehensive task management and coordination
81
+ - **27 MCP Tools**: Comprehensive task management and coordination
82
+ - **Auto Workspace Detection**: Works globally without per-project config
65
83
  - **Multi-Agent Coordination**: Support for Planner, Worker, and Judge roles
66
84
  - **Dependency Tracking**: Tasks can depend on other tasks
67
85
  - **Priority Levels**: Critical, High, Medium, Low
@@ -122,30 +140,73 @@ flowchart TB
122
140
 
123
141
  ### Syncing Cursor Memories
124
142
 
125
- The `sync` action makes it easy to transfer memories from Cursor to shared context:
143
+ The `sync` action transfers memories from Cursor to shared context, preserving IDs:
126
144
 
127
145
  ```mermaid
128
146
  flowchart TD
129
- A[Agent sees Cursor memory] --> B["update_memory(action: sync)"]
130
- B --> C{Title exists?}
147
+ A["Agent sees Cursor memory (ID: 13502615)"] --> B["update_memory(action: sync, id: 13502615)"]
148
+ B --> C{ID or title exists?}
131
149
  C -->|Yes| D[Update existing memory]
132
- C -->|No| E[Create new memory]
150
+ C -->|No| E[Create with Cursor ID]
133
151
  D --> F[Save to shared-context.json]
134
152
  E --> F
135
153
  ```
136
154
 
137
- When Cursor shows you its memories, use `sync` to save them without worrying about IDs:
155
+ Always include the Cursor memory ID to keep IDs consistent:
138
156
 
139
157
  ```typescript
140
- // Sync finds by title (case-insensitive) and creates or updates
158
+ // Sync with Cursor ID (recommended)
141
159
  update_memory({
142
- action: "sync",
160
+ action: "sync",
161
+ id: "13502615", // Cursor's memory ID
143
162
  title: "Writing preferences",
144
163
  content: "British English, ISO dates, no emojis..."
145
164
  })
146
- // Returns: { status: "synced_existing" } or { status: "synced_new" }
165
+ // Returns: { status: "synced_existing", memory: { id: "13502615", ... } }
166
+ ```
167
+
168
+ ### Why Shared Context Exists
169
+
170
+ Cursor's memory system has limitations that make shared context necessary:
171
+
172
+ ```mermaid
173
+ flowchart TB
174
+ subgraph cursor [Cursor IDE]
175
+ A[AI Assistant]
176
+ B[Internal Memory DB]
177
+ end
178
+
179
+ subgraph mcp [MCP Server]
180
+ C[Task Tools]
181
+ D[Memory Tools]
182
+ end
183
+
184
+ subgraph problem [The Problem]
185
+ E["AI can READ Cursor memories"]
186
+ F["MCP cannot ACCESS Cursor memories"]
187
+ end
188
+
189
+ A -->|can see| B
190
+ A -->|can call| C
191
+ C -.-x|no access| B
192
+
193
+ E --> G[Need bridge]
194
+ F --> G
147
195
  ```
148
196
 
197
+ | Cursor Memory Limitation | Impact | Solution |
198
+ |-------------------------|--------|----------|
199
+ | No API access | MCP tools can't read Cursor's memory database | `~/.cursor/shared-context.json` as shared store |
200
+ | Isolated per conversation | Memories don't persist across all contexts | Shared file accessible to all MCP servers |
201
+ | No programmatic sync | Can't auto-export memories | `update_memory` sync action with Cursor ID |
202
+ | Different ID systems | Cursor IDs vs generated IDs cause duplicates | Pass Cursor ID to sync to preserve consistency |
203
+
204
+ **Workflow:**
205
+ 1. Cursor creates a memory (you see it in chat with ID like `13502615`)
206
+ 2. Ask agent to sync it: `update_memory({ action: "sync", id: "13502615", title: "...", content: "..." })`
207
+ 3. Memory saved to `~/.cursor/shared-context.json` with same ID
208
+ 4. All MCP servers can now read it
209
+
149
210
  ### Where Preferences Are Used
150
211
 
151
212
  | Tool Type | How Preferences Are Applied |
@@ -198,29 +259,46 @@ npm start
198
259
 
199
260
  ## Workspace Path Configuration
200
261
 
201
- The server needs to know your project's root directory. There are two ways to configure this:
262
+ The server automatically detects your project's root directory using multiple strategies.
202
263
 
203
- **Option 1: TASK_WORKSPACE environment variable (recommended)**
264
+ ### Detection Order
204
265
 
205
- This is the most reliable method:
266
+ ```mermaid
267
+ flowchart TD
268
+ A[Start] --> B{TASK_WORKSPACE set?}
269
+ B -->|Yes| C[Use TASK_WORKSPACE]
270
+ B -->|No| D{WORKSPACE_FOLDER_PATHS set?}
271
+ D -->|Yes| E[Use Cursor workspace path]
272
+ D -->|No| F{Project markers found?}
273
+ F -->|Yes| G["Use directory with .git, package.json, or memory_bank"]
274
+ F -->|No| H[Fall back to cwd]
275
+ ```
206
276
 
207
- ```json
208
- {
209
- "mcpServers": {
210
- "task-server": {
211
- "command": "npx",
212
- "args": ["-y", "mcp-task-server"],
213
- "env": {
214
- "TASK_WORKSPACE": "/Users/yourname/Projects/my-project"
215
- }
216
- }
217
- }
218
- }
277
+ | Priority | Method | When Used |
278
+ |----------|--------|-----------|
279
+ | 1 | `TASK_WORKSPACE` env | Explicit per-project override |
280
+ | 2 | `WORKSPACE_FOLDER_PATHS` env | Auto-set by Cursor (undocumented) |
281
+ | 3 | Project marker detection | Walks up from cwd looking for `.git`, `package.json`, `memory_bank` |
282
+ | 4 | `process.cwd()` | Final fallback |
283
+
284
+ ### Debugging
285
+
286
+ Run `get_version` to see how the workspace was detected:
287
+
288
+ ```typescript
289
+ get_version()
290
+ // Returns: { workspace: { root: "/path/to/project", source: "found .git" } }
219
291
  ```
220
292
 
221
- **Option 2: cwd parameter**
293
+ Possible sources:
294
+ - `"TASK_WORKSPACE env"` - Explicit override
295
+ - `"WORKSPACE_FOLDER_PATHS env"` - Detected from Cursor
296
+ - `"found .git"` / `"found package.json"` / `"found memory_bank"` - Project marker
297
+ - `"process.cwd() fallback"` - No detection, using current directory
222
298
 
223
- The `cwd` parameter sets the working directory, but has limitations in Cursor:
299
+ ### Explicit Override
300
+
301
+ If auto-detection isn't working, set `TASK_WORKSPACE` in per-project config:
224
302
 
225
303
  ```json
226
304
  {
@@ -228,28 +306,14 @@ The `cwd` parameter sets the working directory, but has limitations in Cursor:
228
306
  "task-server": {
229
307
  "command": "npx",
230
308
  "args": ["-y", "mcp-task-server"],
231
- "cwd": "/Users/yourname/Projects/my-project"
309
+ "env": {
310
+ "TASK_WORKSPACE": "/absolute/path/to/project"
311
+ }
232
312
  }
233
313
  }
234
314
  }
235
315
  ```
236
316
 
237
- **cwd Limitations:**
238
- - Must be an absolute path (no `~` expansion)
239
- - May not work reliably with npx in all cases
240
- - Each project needs its own `.cursor/mcp.json`
241
-
242
- **Debugging workspace issues:**
243
-
244
- Run `get_version` to see where the server thinks the workspace is:
245
-
246
- ```typescript
247
- get_version()
248
- // Returns: { workspace: { root: "/path/to/project", source: "TASK_WORKSPACE env" } }
249
- ```
250
-
251
- If files are being created in the wrong location (e.g., home directory), add `TASK_WORKSPACE` to your MCP config.
252
-
253
317
  ## Configuration
254
318
 
255
319
  Configure via environment variables:
@@ -385,14 +449,28 @@ init_project({ force: true })
385
449
 
386
450
  | Tool | Description |
387
451
  |------|-------------|
388
- | `get_version` | Get the current version of the MCP task server |
452
+ | `help` | List all available tools with descriptions and parameters |
453
+ | `get_version` | Get server version and workspace detection info |
454
+ | `diagnose` | Diagnose MCP configuration, paths, and workspace detection |
389
455
  | `show_memory` | Show shared context memories from `~/.cursor/shared-context.json` |
390
- | `update_memory` | Create, update, sync, or delete memories in shared context |
456
+ | `update_memory` | Create, update, sync, or delete memories (sync preserves Cursor IDs) |
391
457
 
392
458
  ```typescript
393
- // Check the server version
459
+ // List all tools
460
+ help()
461
+ // Returns: { server, version, tool_count: 27, tools: [...] }
462
+
463
+ // Get help for specific tool
464
+ help({ tool: "update_memory" })
465
+ // Returns: { name, description, parameters: { action: {...}, id: {...}, ... } }
466
+
467
+ // Check version and workspace
394
468
  get_version()
395
- // Returns: { name: "mcp-task-server", version: "x.x.x", description: "..." }
469
+ // Returns: { version: "x.x.x", workspace: { root: "/path", source: "found .git" } }
470
+
471
+ // Diagnose configuration
472
+ diagnose() // Basic info
473
+ diagnose({ verbose: true }) // Include env vars and file checks
396
474
 
397
475
  // Show all memories
398
476
  show_memory()
@@ -403,30 +481,31 @@ show_memory({ search: "writing" })
403
481
  // Force reload from file (clears cache)
404
482
  show_memory({ reload: true })
405
483
 
406
- // Create a new memory
484
+ // Sync a Cursor memory (preserves Cursor ID)
407
485
  update_memory({
408
- action: "create",
409
- title: "Project conventions",
410
- content: "Use TypeScript strict mode. Prefer functional components."
486
+ action: "sync",
487
+ id: "13502615", // Cursor's memory ID
488
+ title: "Writing preferences",
489
+ content: "British English, ISO dates, no emojis..."
411
490
  })
412
491
 
413
- // Sync a memory (finds by title, creates or updates)
492
+ // Create a new memory (generates ID)
414
493
  update_memory({
415
- action: "sync",
416
- title: "Writing preferences",
417
- content: "British English, ISO dates, no emojis..."
494
+ action: "create",
495
+ title: "Project conventions",
496
+ content: "Use TypeScript strict mode."
418
497
  })
419
498
 
420
499
  // Update an existing memory by ID
421
500
  update_memory({
422
501
  action: "update",
423
- id: "mem_123",
502
+ id: "13502615",
424
503
  title: "Writing preferences",
425
504
  content: "Updated content..."
426
505
  })
427
506
 
428
507
  // Delete a memory
429
- update_memory({ action: "delete", id: "mem_123" })
508
+ update_memory({ action: "delete", id: "13502615" })
430
509
 
431
510
  // Analyse project and get suggestions for memory_bank
432
511
  analyse_project()
package/dist/config.d.ts CHANGED
@@ -1,13 +1,28 @@
1
1
  import { Config } from "./types.js";
2
+ export interface WorkspaceDetection {
3
+ root: string;
4
+ source: string;
5
+ }
2
6
  /**
3
- * Get configuration from environment variables with sensible defaults
4
- *
5
- * Workspace resolution order:
6
- * 1. TASK_WORKSPACE environment variable (explicit override)
7
- * 2. process.cwd() (current working directory from MCP cwd setting)
7
+ * Detect the workspace root using multiple strategies
8
8
  *
9
- * Note: When using MCP, the cwd from mcp.json should set process.cwd().
10
- * If that's not working, use TASK_WORKSPACE as a fallback.
9
+ * Detection priority:
10
+ * 1. TASK_WORKSPACE - Explicit override (for per-project config)
11
+ * 2. WORKSPACE_FOLDER_PATHS - Cursor's env var (colon-separated list)
12
+ * 3. Project marker detection - Walk up from cwd looking for .git, package.json, or memory_bank
13
+ * 4. process.cwd() - Final fallback
14
+ */
15
+ export declare function detectWorkspaceRoot(): WorkspaceDetection;
16
+ /**
17
+ * Get the detected workspace (cached)
18
+ */
19
+ export declare function getWorkspace(): WorkspaceDetection;
20
+ /**
21
+ * Clear the workspace cache (useful for testing)
22
+ */
23
+ export declare function clearWorkspaceCache(): void;
24
+ /**
25
+ * Get configuration from environment variables with sensible defaults
11
26
  */
12
27
  export declare function getConfig(): Config;
13
28
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC;;;;;;;;;GASG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAiBlC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAKxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,kBAAkB,CA8BxD;AAKD;;GAEG;AACH,wBAAgB,YAAY,IAAI,kBAAkB,CAKjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAmBlC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAKxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtE"}
package/dist/config.js CHANGED
@@ -1,26 +1,76 @@
1
+ import { existsSync } from "fs";
2
+ import { dirname, join } from "path";
1
3
  /**
2
- * Get configuration from environment variables with sensible defaults
3
- *
4
- * Workspace resolution order:
5
- * 1. TASK_WORKSPACE environment variable (explicit override)
6
- * 2. process.cwd() (current working directory from MCP cwd setting)
4
+ * Detect the workspace root using multiple strategies
7
5
  *
8
- * Note: When using MCP, the cwd from mcp.json should set process.cwd().
9
- * If that's not working, use TASK_WORKSPACE as a fallback.
6
+ * Detection priority:
7
+ * 1. TASK_WORKSPACE - Explicit override (for per-project config)
8
+ * 2. WORKSPACE_FOLDER_PATHS - Cursor's env var (colon-separated list)
9
+ * 3. Project marker detection - Walk up from cwd looking for .git, package.json, or memory_bank
10
+ * 4. process.cwd() - Final fallback
11
+ */
12
+ export function detectWorkspaceRoot() {
13
+ // 1. Explicit override
14
+ if (process.env.TASK_WORKSPACE) {
15
+ return { root: process.env.TASK_WORKSPACE, source: "TASK_WORKSPACE env" };
16
+ }
17
+ // 2. Cursor's workspace paths (undocumented but reported to work)
18
+ if (process.env.WORKSPACE_FOLDER_PATHS) {
19
+ const paths = process.env.WORKSPACE_FOLDER_PATHS.split(":");
20
+ if (paths[0]) {
21
+ return { root: paths[0], source: "WORKSPACE_FOLDER_PATHS env" };
22
+ }
23
+ }
24
+ // 3. Walk up from cwd looking for project markers
25
+ const markers = [".git", "package.json", "memory_bank"];
26
+ let dir = process.cwd();
27
+ const root = "/";
28
+ while (dir !== root && dir !== dirname(dir)) {
29
+ for (const marker of markers) {
30
+ if (existsSync(join(dir, marker))) {
31
+ return { root: dir, source: `found ${marker}` };
32
+ }
33
+ }
34
+ dir = dirname(dir);
35
+ }
36
+ // 4. Fallback
37
+ return { root: process.cwd(), source: "process.cwd() fallback" };
38
+ }
39
+ // Cache the workspace detection result
40
+ let cachedWorkspace = null;
41
+ /**
42
+ * Get the detected workspace (cached)
43
+ */
44
+ export function getWorkspace() {
45
+ if (!cachedWorkspace) {
46
+ cachedWorkspace = detectWorkspaceRoot();
47
+ }
48
+ return cachedWorkspace;
49
+ }
50
+ /**
51
+ * Clear the workspace cache (useful for testing)
52
+ */
53
+ export function clearWorkspaceCache() {
54
+ cachedWorkspace = null;
55
+ }
56
+ /**
57
+ * Get configuration from environment variables with sensible defaults
10
58
  */
11
59
  export function getConfig() {
12
- const workspaceRoot = process.env.TASK_WORKSPACE || process.cwd();
60
+ const workspace = getWorkspace();
13
61
  // Debug: log where we think the workspace is
14
62
  if (process.env.DEBUG_TASK_SERVER) {
15
- console.error(`[mcp-task-server] Workspace root: ${workspaceRoot}`);
63
+ console.error(`[mcp-task-server] Workspace root: ${workspace.root}`);
64
+ console.error(`[mcp-task-server] Detection source: ${workspace.source}`);
16
65
  console.error(`[mcp-task-server] TASK_WORKSPACE: ${process.env.TASK_WORKSPACE || '(not set)'}`);
66
+ console.error(`[mcp-task-server] WORKSPACE_FOLDER_PATHS: ${process.env.WORKSPACE_FOLDER_PATHS || '(not set)'}`);
17
67
  console.error(`[mcp-task-server] process.cwd(): ${process.cwd()}`);
18
68
  }
19
69
  return {
20
70
  markdownPath: process.env.TASK_MD_PATH || "memory_bank/execution/progress.md",
21
71
  jsonPath: process.env.TASK_JSON_PATH || "memory_bank/tasks/tasks.json",
22
72
  tasksDir: process.env.TASK_DIR || "memory_bank/tasks",
23
- workspaceRoot,
73
+ workspaceRoot: workspace.root,
24
74
  };
25
75
  }
26
76
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAElE,6CAA6C;IAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,qCAAqC,aAAa,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,KAAK,CAAC,qCAAqC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,WAAW,EAAE,CAAC,CAAC;QAChG,OAAO,CAAC,KAAK,CAAC,oCAAoC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACL,YAAY,EACV,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,mCAAmC;QACjE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,8BAA8B;QACtE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,mBAAmB;QACrD,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,YAAoB;IAC9D,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,aAAa,IAAI,YAAY,EAAE,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,MAAc;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,WAAW,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,SAAS,QAAQ,MAAM,CAAC,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/context.d.ts CHANGED
@@ -46,8 +46,12 @@ export declare function upsertMemory(memory: CursorMemory): SharedContext;
46
46
  /**
47
47
  * Add or update a memory by title (case-insensitive match)
48
48
  * If a memory with the same title exists, updates it. Otherwise creates new.
49
+ *
50
+ * @param title - Memory title
51
+ * @param content - Memory content
52
+ * @param cursorId - Optional Cursor memory ID to use (preserves original ID from Cursor)
49
53
  */
50
- export declare function upsertMemoryByTitle(title: string, content: string): {
54
+ export declare function upsertMemoryByTitle(title: string, content: string, cursorId?: string): {
51
55
  memory: CursorMemory;
52
56
  wasUpdated: boolean;
53
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,YAAY,EAAE,CAAC;CACjC;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAgBxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAKxE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAOvD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAGrD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAGtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAW9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAiBhE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAqBjH;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAA;CAAE,CAgB5F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,YAAY,EAAE,CAAC;CACjC;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAgBxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAKxE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAOvD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAGrD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAGtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAW9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAiBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAoC/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAA;CAAE,CAgB5F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
package/dist/context.js CHANGED
@@ -101,20 +101,38 @@ export function upsertMemory(memory) {
101
101
  /**
102
102
  * Add or update a memory by title (case-insensitive match)
103
103
  * If a memory with the same title exists, updates it. Otherwise creates new.
104
+ *
105
+ * @param title - Memory title
106
+ * @param content - Memory content
107
+ * @param cursorId - Optional Cursor memory ID to use (preserves original ID from Cursor)
104
108
  */
105
- export function upsertMemoryByTitle(title, content) {
109
+ export function upsertMemoryByTitle(title, content, cursorId) {
106
110
  let ctx = loadSharedContext() || { cursor_memories: [] };
107
- // Case-insensitive title match
108
- const existingIndex = ctx.cursor_memories.findIndex((m) => m.title.toLowerCase() === title.toLowerCase());
109
- if (existingIndex >= 0) {
110
- // Update existing - keep the ID
111
- ctx.cursor_memories[existingIndex].content = content;
112
- ctx.cursor_memories[existingIndex].title = title; // preserve casing from new input
111
+ // First check if we have a memory with this exact Cursor ID
112
+ if (cursorId) {
113
+ const existingByIdIndex = ctx.cursor_memories.findIndex((m) => m.id === cursorId);
114
+ if (existingByIdIndex >= 0) {
115
+ // Update existing by ID - also update title in case it changed
116
+ ctx.cursor_memories[existingByIdIndex].content = content;
117
+ ctx.cursor_memories[existingByIdIndex].title = title;
118
+ saveSharedContext(ctx);
119
+ return { memory: ctx.cursor_memories[existingByIdIndex], wasUpdated: true };
120
+ }
121
+ }
122
+ // Fall back to case-insensitive title match
123
+ const existingByTitleIndex = ctx.cursor_memories.findIndex((m) => m.title.toLowerCase() === title.toLowerCase());
124
+ if (existingByTitleIndex >= 0) {
125
+ // Update existing - use provided cursorId if available, otherwise keep existing ID
126
+ if (cursorId) {
127
+ ctx.cursor_memories[existingByTitleIndex].id = cursorId;
128
+ }
129
+ ctx.cursor_memories[existingByTitleIndex].content = content;
130
+ ctx.cursor_memories[existingByTitleIndex].title = title;
113
131
  saveSharedContext(ctx);
114
- return { memory: ctx.cursor_memories[existingIndex], wasUpdated: true };
132
+ return { memory: ctx.cursor_memories[existingByTitleIndex], wasUpdated: true };
115
133
  }
116
- // Create new
117
- const memory = { id: generateMemoryId(), title, content };
134
+ // Create new - use cursorId if provided, otherwise generate
135
+ const memory = { id: cursorId || generateMemoryId(), title, content };
118
136
  ctx.cursor_memories.push(memory);
119
137
  saveSharedContext(ctx);
120
138
  return { memory, wasUpdated: false };
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}