@vheins/local-memory-mcp 0.4.8 → 0.4.11

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.
Files changed (164) hide show
  1. package/dist/capabilities.d.ts +7 -7
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +7 -7
  4. package/dist/capabilities.js.map +1 -1
  5. package/dist/completion.d.ts +25 -0
  6. package/dist/completion.d.ts.map +1 -0
  7. package/dist/completion.js +127 -0
  8. package/dist/completion.js.map +1 -0
  9. package/dist/mcp/client.d.ts.map +1 -1
  10. package/dist/mcp/client.js +8 -1
  11. package/dist/mcp/client.js.map +1 -1
  12. package/dist/mcp/elicitation.d.ts +24 -0
  13. package/dist/mcp/elicitation.d.ts.map +1 -0
  14. package/dist/mcp/elicitation.js +13 -0
  15. package/dist/mcp/elicitation.js.map +1 -0
  16. package/dist/mcp/sampling.d.ts +69 -0
  17. package/dist/mcp/sampling.d.ts.map +1 -0
  18. package/dist/mcp/sampling.js +13 -0
  19. package/dist/mcp/sampling.js.map +1 -0
  20. package/dist/mcp/session.d.ts +28 -0
  21. package/dist/mcp/session.d.ts.map +1 -0
  22. package/dist/mcp/session.js +106 -0
  23. package/dist/mcp/session.js.map +1 -0
  24. package/dist/prompts/registry.d.ts +55 -0
  25. package/dist/prompts/registry.d.ts.map +1 -1
  26. package/dist/prompts/registry.js +455 -7
  27. package/dist/prompts/registry.js.map +1 -1
  28. package/dist/resources/index.d.ts +55 -4
  29. package/dist/resources/index.d.ts.map +1 -1
  30. package/dist/resources/index.js +222 -52
  31. package/dist/resources/index.js.map +1 -1
  32. package/dist/router.d.ts +11 -1
  33. package/dist/router.d.ts.map +1 -1
  34. package/dist/router.js +151 -34
  35. package/dist/router.js.map +1 -1
  36. package/dist/server.js +212 -13
  37. package/dist/server.js.map +1 -1
  38. package/dist/tests/client.test.d.ts +2 -0
  39. package/dist/tests/client.test.d.ts.map +1 -0
  40. package/dist/tests/client.test.js +130 -0
  41. package/dist/tests/client.test.js.map +1 -0
  42. package/dist/tests/dashboard.test.d.ts +2 -0
  43. package/dist/tests/dashboard.test.d.ts.map +1 -0
  44. package/dist/tests/dashboard.test.js +370 -0
  45. package/dist/tests/dashboard.test.js.map +1 -0
  46. package/dist/tests/e2e.test.d.ts +2 -0
  47. package/dist/tests/e2e.test.d.ts.map +1 -0
  48. package/dist/tests/e2e.test.js +250 -0
  49. package/dist/tests/e2e.test.js.map +1 -0
  50. package/dist/tests/index.test.d.ts +2 -0
  51. package/dist/tests/index.test.d.ts.map +1 -0
  52. package/dist/tests/index.test.js +185 -0
  53. package/dist/tests/index.test.js.map +1 -0
  54. package/dist/tests/logger.test.d.ts +2 -0
  55. package/dist/tests/logger.test.d.ts.map +1 -0
  56. package/dist/tests/logger.test.js +104 -0
  57. package/dist/tests/logger.test.js.map +1 -0
  58. package/dist/tests/memory.bulk.test.d.ts +2 -0
  59. package/dist/tests/memory.bulk.test.d.ts.map +1 -0
  60. package/dist/tests/memory.bulk.test.js +52 -0
  61. package/dist/tests/memory.bulk.test.js.map +1 -0
  62. package/dist/tests/memory.search.test.d.ts +2 -0
  63. package/dist/tests/memory.search.test.d.ts.map +1 -0
  64. package/dist/tests/memory.search.test.js +181 -0
  65. package/dist/tests/memory.search.test.js.map +1 -0
  66. package/dist/tests/normalize.test.d.ts +2 -0
  67. package/dist/tests/normalize.test.d.ts.map +1 -0
  68. package/dist/tests/normalize.test.js +181 -0
  69. package/dist/tests/normalize.test.js.map +1 -0
  70. package/dist/tests/query-expander.test.d.ts +2 -0
  71. package/dist/tests/query-expander.test.d.ts.map +1 -0
  72. package/dist/tests/query-expander.test.js +33 -0
  73. package/dist/tests/query-expander.test.js.map +1 -0
  74. package/dist/tests/router.test.d.ts +2 -0
  75. package/dist/tests/router.test.d.ts.map +1 -0
  76. package/dist/tests/router.test.js +470 -0
  77. package/dist/tests/router.test.js.map +1 -0
  78. package/dist/tests/sqlite.test.d.ts +2 -0
  79. package/dist/tests/sqlite.test.d.ts.map +1 -0
  80. package/dist/tests/sqlite.test.js +367 -0
  81. package/dist/tests/sqlite.test.js.map +1 -0
  82. package/dist/tests/tasks-search.test.d.ts +2 -0
  83. package/dist/tests/tasks-search.test.d.ts.map +1 -0
  84. package/dist/tests/tasks-search.test.js +154 -0
  85. package/dist/tests/tasks-search.test.js.map +1 -0
  86. package/dist/tests/tasks-transition.test.d.ts +2 -0
  87. package/dist/tests/tasks-transition.test.d.ts.map +1 -0
  88. package/dist/tests/tasks-transition.test.js +174 -0
  89. package/dist/tests/tasks-transition.test.js.map +1 -0
  90. package/dist/tests/tasks.bulk.test.d.ts +2 -0
  91. package/dist/tests/tasks.bulk.test.d.ts.map +1 -0
  92. package/dist/tests/tasks.bulk.test.js +254 -0
  93. package/dist/tests/tasks.bulk.test.js.map +1 -0
  94. package/dist/tests/tasks.e2e.test.d.ts +2 -0
  95. package/dist/tests/tasks.e2e.test.d.ts.map +1 -0
  96. package/dist/tests/tasks.e2e.test.js +289 -0
  97. package/dist/tests/tasks.e2e.test.js.map +1 -0
  98. package/dist/tests/tasks.pending-limit-refined.test.d.ts +2 -0
  99. package/dist/tests/tasks.pending-limit-refined.test.d.ts.map +1 -0
  100. package/dist/tests/tasks.pending-limit-refined.test.js +72 -0
  101. package/dist/tests/tasks.pending-limit-refined.test.js.map +1 -0
  102. package/dist/tests/v2-features.test.d.ts +2 -0
  103. package/dist/tests/v2-features.test.d.ts.map +1 -0
  104. package/dist/tests/v2-features.test.js +209 -0
  105. package/dist/tests/v2-features.test.js.map +1 -0
  106. package/dist/tools/memory.bulk-delete.d.ts +1 -7
  107. package/dist/tools/memory.bulk-delete.d.ts.map +1 -1
  108. package/dist/tools/memory.bulk-delete.js +30 -8
  109. package/dist/tools/memory.bulk-delete.js.map +1 -1
  110. package/dist/tools/memory.delete.d.ts.map +1 -1
  111. package/dist/tools/memory.delete.js +18 -1
  112. package/dist/tools/memory.delete.js.map +1 -1
  113. package/dist/tools/memory.recap.d.ts.map +1 -1
  114. package/dist/tools/memory.recap.js +24 -1
  115. package/dist/tools/memory.recap.js.map +1 -1
  116. package/dist/tools/memory.search.d.ts.map +1 -1
  117. package/dist/tools/memory.search.js +16 -1
  118. package/dist/tools/memory.search.js.map +1 -1
  119. package/dist/tools/memory.store.d.ts.map +1 -1
  120. package/dist/tools/memory.store.js +31 -1
  121. package/dist/tools/memory.store.js.map +1 -1
  122. package/dist/tools/memory.summarize.d.ts.map +1 -1
  123. package/dist/tools/memory.summarize.js +19 -1
  124. package/dist/tools/memory.summarize.js.map +1 -1
  125. package/dist/tools/memory.synthesize.d.ts +14 -0
  126. package/dist/tools/memory.synthesize.d.ts.map +1 -0
  127. package/dist/tools/memory.synthesize.js +228 -0
  128. package/dist/tools/memory.synthesize.js.map +1 -0
  129. package/dist/tools/memory.update.d.ts.map +1 -1
  130. package/dist/tools/memory.update.js +19 -1
  131. package/dist/tools/memory.update.js.map +1 -1
  132. package/dist/tools/schemas.d.ts +1750 -263
  133. package/dist/tools/schemas.d.ts.map +1 -1
  134. package/dist/tools/schemas.js +482 -14
  135. package/dist/tools/schemas.js.map +1 -1
  136. package/dist/tools/task.bulk-manage.d.ts +1 -7
  137. package/dist/tools/task.bulk-manage.d.ts.map +1 -1
  138. package/dist/tools/task.bulk-manage.js +60 -15
  139. package/dist/tools/task.bulk-manage.js.map +1 -1
  140. package/dist/tools/task.manage.d.ts +12 -28
  141. package/dist/tools/task.manage.d.ts.map +1 -1
  142. package/dist/tools/task.manage.js +198 -31
  143. package/dist/tools/task.manage.js.map +1 -1
  144. package/dist/utils/completion.d.ts +2 -0
  145. package/dist/utils/completion.d.ts.map +1 -0
  146. package/dist/utils/completion.js +28 -0
  147. package/dist/utils/completion.js.map +1 -0
  148. package/dist/utils/logger.d.ts +18 -0
  149. package/dist/utils/logger.d.ts.map +1 -1
  150. package/dist/utils/logger.js +101 -29
  151. package/dist/utils/logger.js.map +1 -1
  152. package/dist/utils/mcp-response.d.ts +50 -0
  153. package/dist/utils/mcp-response.d.ts.map +1 -1
  154. package/dist/utils/mcp-response.js +54 -7
  155. package/dist/utils/mcp-response.js.map +1 -1
  156. package/dist/utils/normalize.d.ts +5 -0
  157. package/dist/utils/normalize.d.ts.map +1 -1
  158. package/dist/utils/normalize.js +11 -0
  159. package/dist/utils/normalize.js.map +1 -1
  160. package/dist/utils/pagination.d.ts +6 -0
  161. package/dist/utils/pagination.d.ts.map +1 -0
  162. package/dist/utils/pagination.js +32 -0
  163. package/dist/utils/pagination.js.map +1 -0
  164. package/package.json +1 -1
@@ -1,7 +1,8 @@
1
1
  import { z } from "zod";
2
+ import { normalizeRepo } from "../utils/normalize.js";
2
3
  // Shared schema components
3
4
  export const MemoryScopeSchema = z.object({
4
- repo: z.string().min(1),
5
+ repo: z.string().min(1).transform(normalizeRepo),
5
6
  branch: z.string().optional(),
6
7
  folder: z.string().optional(),
7
8
  language: z.string().optional()
@@ -41,7 +42,7 @@ export const MemoryUpdateSchema = z.object({
41
42
  export const MemorySearchSchema = z.object({
42
43
  query: z.string().min(3),
43
44
  prompt: z.string().optional(),
44
- repo: z.string().min(1),
45
+ repo: z.string().min(1).transform(normalizeRepo),
45
46
  types: z.array(MemoryTypeSchema).optional(),
46
47
  minImportance: z.number().min(1).max(5).optional(),
47
48
  limit: z.number().min(1).max(100).default(5),
@@ -57,22 +58,32 @@ export const MemoryAcknowledgeSchema = z.object({
57
58
  application_context: z.string().min(10).optional()
58
59
  });
59
60
  export const MemoryRecapSchema = z.object({
60
- repo: z.string().min(1),
61
+ repo: z.string().min(1).transform(normalizeRepo),
61
62
  limit: z.number().min(1).max(50).default(20),
62
63
  offset: z.number().min(0).default(0)
63
64
  });
64
65
  export const MemoryBulkDeleteSchema = z.object({
65
- repo: z.string().min(1),
66
+ repo: z.string().min(1).transform(normalizeRepo),
66
67
  ids: z.array(z.string().uuid()).min(1)
67
68
  });
68
69
  export const MemorySummarizeSchema = z.object({
69
- repo: z.string().min(1),
70
+ repo: z.string().min(1).transform(normalizeRepo),
70
71
  signals: z.array(z.string().max(200)).min(1)
71
72
  });
73
+ export const MemorySynthesizeSchema = z.object({
74
+ repo: z.string().min(1).transform(normalizeRepo).optional(),
75
+ objective: z.string().min(5),
76
+ current_file_path: z.string().optional(),
77
+ include_summary: z.boolean().default(true),
78
+ include_tasks: z.boolean().default(true),
79
+ use_tools: z.boolean().default(true),
80
+ max_iterations: z.number().int().min(1).max(5).default(3),
81
+ max_tokens: z.number().int().min(128).max(4000).default(1200)
82
+ });
72
83
  export const TaskStatusSchema = z.enum(["backlog", "pending", "in_progress", "completed", "canceled", "blocked"]);
73
84
  export const TaskPrioritySchema = z.number().min(1).max(5);
74
85
  export const TaskCreateSchema = z.object({
75
- repo: z.string().min(1),
86
+ repo: z.string().min(1).transform(normalizeRepo),
76
87
  task_code: z.string().min(1),
77
88
  phase: z.string().min(1),
78
89
  title: z.string().min(3).max(100),
@@ -88,8 +99,11 @@ export const TaskCreateSchema = z.object({
88
99
  depends_on: z.string().uuid().optional(),
89
100
  est_tokens: z.number().int().min(0).optional()
90
101
  });
102
+ export const TaskCreateInteractiveSchema = TaskCreateSchema.partial().extend({
103
+ repo: z.string().min(1).transform(normalizeRepo).optional(),
104
+ });
91
105
  export const TaskUpdateSchema = z.object({
92
- repo: z.string().min(1),
106
+ repo: z.string().min(1).transform(normalizeRepo),
93
107
  id: z.string().uuid(),
94
108
  task_code: z.string().optional(),
95
109
  phase: z.string().optional(),
@@ -109,15 +123,23 @@ export const TaskUpdateSchema = z.object({
109
123
  est_tokens: z.number().int().min(0).optional()
110
124
  }).refine((data) => Object.keys(data).length > 2, { message: "At least one field besides repo and id must be provided for update" });
111
125
  export const TaskListSchema = z.object({
112
- repo: z.string().min(1),
113
- status: TaskStatusSchema.optional(),
126
+ repo: z.string().min(1).transform(normalizeRepo),
127
+ status: z.string().optional(),
114
128
  phase: z.string().optional(),
129
+ search: z.string().optional(),
130
+ limit: z.number().min(1).max(100).default(15),
131
+ offset: z.number().min(0).default(0)
132
+ });
133
+ export const TaskSearchSchema = z.object({
134
+ repo: z.string().min(1).transform(normalizeRepo),
135
+ query: z.string().min(1),
136
+ status: z.string().optional(),
115
137
  limit: z.number().min(1).max(100).default(15),
116
138
  offset: z.number().min(0).default(0)
117
139
  });
118
140
  export const TaskBulkManageSchema = z.object({
119
141
  action: z.enum(["bulk_create", "bulk_delete"]),
120
- repo: z.string().min(1),
142
+ repo: z.string().min(1).transform(normalizeRepo),
121
143
  tasks: z.array(z.object({
122
144
  task_code: z.string().min(1),
123
145
  phase: z.string().min(1),
@@ -137,14 +159,99 @@ export const TaskBulkManageSchema = z.object({
137
159
  ids: z.array(z.string().uuid()).min(1).optional()
138
160
  }).refine((data) => (data.action === "bulk_create" && data.tasks) || (data.action === "bulk_delete" && data.ids), { message: "tasks is required for bulk_create, ids is required for bulk_delete" });
139
161
  export const TaskDeleteSchema = z.object({
140
- repo: z.string().min(1),
162
+ repo: z.string().min(1).transform(normalizeRepo),
141
163
  id: z.string().uuid()
142
164
  });
143
165
  // Tool definitions for MCP
144
166
  export const TOOL_DEFINITIONS = [
167
+ {
168
+ name: "memory-synthesize",
169
+ title: "Memory Synthesize",
170
+ description: "Use client sampling to synthesize a grounded answer from local memory and tasks. Best for project briefings, tradeoff summaries, and context-aware answers.",
171
+ annotations: {
172
+ readOnlyHint: true,
173
+ idempotentHint: true,
174
+ openWorldHint: false
175
+ },
176
+ execution: {
177
+ taskSupport: "optional"
178
+ },
179
+ inputSchema: {
180
+ type: "object",
181
+ properties: {
182
+ repo: { type: "string", description: "Repository name. Optional when a single MCP root is active." },
183
+ objective: { type: "string", minLength: 5, description: "Question or synthesis objective." },
184
+ current_file_path: { type: "string", description: "Optional absolute file path for workspace-local grounding." },
185
+ include_summary: { type: "boolean", default: true },
186
+ include_tasks: { type: "boolean", default: true },
187
+ use_tools: { type: "boolean", default: true, description: "Allow the sampled model to call local memory/task tools during synthesis when the client supports sampling.tools." },
188
+ max_iterations: { type: "number", minimum: 1, maximum: 5, default: 3 },
189
+ max_tokens: { type: "number", minimum: 128, maximum: 4000, default: 1200 }
190
+ },
191
+ required: ["objective"]
192
+ },
193
+ outputSchema: {
194
+ type: "object",
195
+ properties: {
196
+ repo: { type: "string" },
197
+ objective: { type: "string" },
198
+ answer: { type: "string" },
199
+ model: { type: "string" },
200
+ stopReason: { type: "string" },
201
+ iterations: { type: "number" },
202
+ toolCalls: { type: "number" }
203
+ },
204
+ required: ["repo", "objective", "answer", "iterations", "toolCalls"]
205
+ }
206
+ },
207
+ {
208
+ name: "task-create-interactive",
209
+ title: "Interactive Task Create",
210
+ description: "Create a task with MCP elicitation fallback for any missing required fields. Best when an agent knows a task is needed but still needs user confirmation for repo, title, or phase.",
211
+ annotations: {
212
+ readOnlyHint: false,
213
+ idempotentHint: false,
214
+ destructiveHint: false,
215
+ openWorldHint: false
216
+ },
217
+ inputSchema: {
218
+ type: "object",
219
+ properties: {
220
+ repo: { type: "string", description: "Repository name. Optional when it can be inferred from MCP roots or elicited from the user." },
221
+ task_code: { type: "string" },
222
+ phase: { type: "string" },
223
+ title: { type: "string", minLength: 3, maxLength: 100 },
224
+ description: { type: "string", minLength: 1 },
225
+ status: { type: "string", enum: ["backlog", "pending"], default: "backlog" },
226
+ priority: { type: "number", minimum: 1, maximum: 5, default: 3 },
227
+ agent: { type: "string" },
228
+ role: { type: "string" },
229
+ doc_path: { type: "string" }
230
+ }
231
+ },
232
+ outputSchema: {
233
+ type: "object",
234
+ properties: {
235
+ repo: { type: "string" },
236
+ task_code: { type: "string" },
237
+ phase: { type: "string" },
238
+ title: { type: "string" },
239
+ status: { type: "string" },
240
+ priority: { type: "number" }
241
+ },
242
+ required: ["repo", "task_code", "phase", "title", "status", "priority"]
243
+ }
244
+ },
145
245
  {
146
246
  name: "memory-store",
247
+ title: "Memory Store",
147
248
  description: "Store a new memory entry. Keep 'title' concise and human-readable; do not embed agent/role/date metadata in the title. Put auxiliary context into 'metadata'. Use 'tags' for tech-stack and 'is_global' for universal rules.",
249
+ annotations: {
250
+ readOnlyHint: false,
251
+ idempotentHint: false,
252
+ destructiveHint: false,
253
+ openWorldHint: false
254
+ },
148
255
  inputSchema: {
149
256
  type: "object",
150
257
  properties: {
@@ -205,11 +312,30 @@ export const TOOL_DEFINITIONS = [
205
312
  supersedes: { type: "string", format: "uuid" }
206
313
  },
207
314
  required: ["type", "title", "content", "importance", "scope", "agent", "model"]
315
+ },
316
+ outputSchema: {
317
+ type: "object",
318
+ properties: {
319
+ success: { type: "boolean" },
320
+ id: { type: "string" },
321
+ repo: { type: "string" },
322
+ type: { type: "string" },
323
+ title: { type: "string" },
324
+ error: { type: "string" },
325
+ message: { type: "string" }
326
+ },
327
+ required: ["success"]
208
328
  }
209
329
  },
210
330
  {
211
331
  name: "memory-acknowledge",
332
+ title: "Memory Acknowledge",
212
333
  description: "Acknowledge the use of a memory or report its irrelevance/contradiction. Mandatory after using memory to generate code.",
334
+ annotations: {
335
+ readOnlyHint: false,
336
+ idempotentHint: false,
337
+ openWorldHint: false
338
+ },
213
339
  inputSchema: {
214
340
  type: "object",
215
341
  properties: {
@@ -218,11 +344,27 @@ export const TOOL_DEFINITIONS = [
218
344
  application_context: { type: "string", minLength: 10 }
219
345
  },
220
346
  required: ["memory_id", "status"]
347
+ },
348
+ outputSchema: {
349
+ type: "object",
350
+ properties: {
351
+ success: { type: "boolean" },
352
+ id: { type: "string" },
353
+ status: { type: "string" }
354
+ },
355
+ required: ["success", "id", "status"]
221
356
  }
222
357
  },
223
358
  {
224
359
  name: "memory-update",
360
+ title: "Memory Update",
225
361
  description: "Update an existing memory entry. Keep 'title' concise and move agent/role/date or claim context into 'metadata' instead of the title.",
362
+ annotations: {
363
+ readOnlyHint: false,
364
+ idempotentHint: false,
365
+ destructiveHint: false,
366
+ openWorldHint: false
367
+ },
226
368
  inputSchema: {
227
369
  type: "object",
228
370
  properties: {
@@ -238,11 +380,30 @@ export const TOOL_DEFINITIONS = [
238
380
  is_global: { type: "boolean" }
239
381
  },
240
382
  required: ["id"]
383
+ },
384
+ outputSchema: {
385
+ type: "object",
386
+ properties: {
387
+ success: { type: "boolean" },
388
+ id: { type: "string" },
389
+ repo: { type: "string" },
390
+ updatedFields: {
391
+ type: "array",
392
+ items: { type: "string" }
393
+ }
394
+ },
395
+ required: ["success", "id", "repo", "updatedFields"]
241
396
  }
242
397
  },
243
398
  {
244
399
  name: "memory-search",
400
+ title: "Memory Search",
245
401
  description: "Search for relevant memories. Use 'current_tags' to find tech-stack specific knowledge from other projects.",
402
+ annotations: {
403
+ readOnlyHint: true,
404
+ idempotentHint: true,
405
+ openWorldHint: false
406
+ },
246
407
  inputSchema: {
247
408
  type: "object",
248
409
  properties: {
@@ -264,11 +425,39 @@ export const TOOL_DEFINITIONS = [
264
425
  include_archived: { type: "boolean", default: false }
265
426
  },
266
427
  required: ["query", "repo"]
428
+ },
429
+ outputSchema: {
430
+ type: "object",
431
+ properties: {
432
+ query: { type: "string" },
433
+ recapContext: { type: "string" },
434
+ results: {
435
+ type: "array",
436
+ items: {
437
+ type: "object",
438
+ properties: {
439
+ id: { type: "string" },
440
+ type: { type: "string" },
441
+ title: { type: "string" },
442
+ content: { type: "string" },
443
+ importance: { type: "number" }
444
+ },
445
+ required: ["id", "type", "content", "importance"]
446
+ }
447
+ }
448
+ },
449
+ required: ["query", "results"]
267
450
  }
268
451
  },
269
452
  {
270
453
  name: "memory-summarize",
454
+ title: "Memory Summarize",
271
455
  description: "Update the summary for a repository",
456
+ annotations: {
457
+ readOnlyHint: false,
458
+ idempotentHint: false,
459
+ openWorldHint: false
460
+ },
272
461
  inputSchema: {
273
462
  type: "object",
274
463
  properties: {
@@ -281,22 +470,55 @@ export const TOOL_DEFINITIONS = [
281
470
  }
282
471
  },
283
472
  required: ["repo", "signals"]
473
+ },
474
+ outputSchema: {
475
+ type: "object",
476
+ properties: {
477
+ success: { type: "boolean" },
478
+ repo: { type: "string" },
479
+ summary: { type: "string" },
480
+ signalCount: { type: "number" }
481
+ },
482
+ required: ["success", "repo", "summary", "signalCount"]
284
483
  }
285
484
  },
286
485
  {
287
486
  name: "memory-delete",
487
+ title: "Memory Delete",
288
488
  description: "Soft-delete a memory entry (remove from active use)",
489
+ annotations: {
490
+ readOnlyHint: false,
491
+ idempotentHint: false,
492
+ destructiveHint: true,
493
+ openWorldHint: false
494
+ },
289
495
  inputSchema: {
290
496
  type: "object",
291
497
  properties: {
292
498
  id: { type: "string", format: "uuid", description: "Memory entry ID to delete" }
293
499
  },
294
500
  required: ["id"]
501
+ },
502
+ outputSchema: {
503
+ type: "object",
504
+ properties: {
505
+ success: { type: "boolean" },
506
+ id: { type: "string" },
507
+ repo: { type: "string" }
508
+ },
509
+ required: ["success", "id", "repo"]
295
510
  }
296
511
  },
297
512
  {
298
513
  name: "memory-bulk-delete",
514
+ title: "Memory Bulk Delete",
299
515
  description: "Delete multiple memory entries at once.",
516
+ annotations: {
517
+ readOnlyHint: false,
518
+ idempotentHint: false,
519
+ destructiveHint: true,
520
+ openWorldHint: false
521
+ },
300
522
  inputSchema: {
301
523
  type: "object",
302
524
  properties: {
@@ -304,11 +526,30 @@ export const TOOL_DEFINITIONS = [
304
526
  ids: { type: "array", items: { type: "string", format: "uuid" }, minItems: 1, description: "Array of memory IDs to delete" }
305
527
  },
306
528
  required: ["repo", "ids"]
529
+ },
530
+ outputSchema: {
531
+ type: "object",
532
+ properties: {
533
+ success: { type: "boolean" },
534
+ repo: { type: "string" },
535
+ deletedCount: { type: "number" },
536
+ ids: {
537
+ type: "array",
538
+ items: { type: "string" }
539
+ }
540
+ },
541
+ required: ["success", "repo", "deletedCount", "ids"]
307
542
  }
308
543
  },
309
544
  {
310
545
  name: "memory-recap",
546
+ title: "Memory Recap",
311
547
  description: "Get the last 20 memories from a repository for context",
548
+ annotations: {
549
+ readOnlyHint: true,
550
+ idempotentHint: true,
551
+ openWorldHint: false
552
+ },
312
553
  inputSchema: {
313
554
  type: "object",
314
555
  properties: {
@@ -328,11 +569,57 @@ export const TOOL_DEFINITIONS = [
328
569
  }
329
570
  },
330
571
  required: ["repo"]
572
+ },
573
+ outputSchema: {
574
+ type: "object",
575
+ properties: {
576
+ repo: { type: "string" },
577
+ count: { type: "number" },
578
+ total: { type: "number" },
579
+ offset: { type: "number" },
580
+ summary: { type: "string" },
581
+ memories: {
582
+ type: "array",
583
+ items: {
584
+ type: "object",
585
+ properties: {
586
+ number: { type: "number" },
587
+ id: { type: "string" },
588
+ type: { type: "string" },
589
+ importance: { type: "number" },
590
+ preview: { type: "string" },
591
+ created_at: { type: "string" }
592
+ },
593
+ required: ["number", "id", "type", "importance", "preview", "created_at"]
594
+ }
595
+ },
596
+ tasks: {
597
+ type: "array",
598
+ items: {
599
+ type: "object",
600
+ properties: {
601
+ id: { type: "string" },
602
+ task_code: { type: "string" },
603
+ title: { type: "string" },
604
+ status: { type: "string" },
605
+ priority: { type: "number" }
606
+ },
607
+ required: ["id", "task_code", "title", "status", "priority"]
608
+ }
609
+ }
610
+ },
611
+ required: ["repo", "count", "total", "offset", "memories", "tasks", "summary"]
331
612
  }
332
613
  },
333
614
  {
334
615
  name: "task-create",
616
+ title: "Task Create",
335
617
  description: "Create a new task in a repository. task_code must be unique within the repository. 'est_tokens' is optional during planning/creation.",
618
+ annotations: {
619
+ readOnlyHint: false,
620
+ idempotentHint: false,
621
+ openWorldHint: false
622
+ },
336
623
  inputSchema: {
337
624
  type: "object",
338
625
  properties: {
@@ -353,11 +640,31 @@ export const TOOL_DEFINITIONS = [
353
640
  est_tokens: { type: "number", minimum: 0, description: "Estimated tokens budget for this task" }
354
641
  },
355
642
  required: ["repo", "task_code", "phase", "title", "description", "status"]
643
+ },
644
+ outputSchema: {
645
+ type: "object",
646
+ properties: {
647
+ success: { type: "boolean" },
648
+ id: { type: "string" },
649
+ repo: { type: "string" },
650
+ task_code: { type: "string" },
651
+ phase: { type: "string" },
652
+ title: { type: "string" },
653
+ status: { type: "string" },
654
+ priority: { type: "number" }
655
+ },
656
+ required: ["success", "id", "repo", "task_code", "phase", "title", "status", "priority"]
356
657
  }
357
658
  },
358
659
  {
359
660
  name: "task-update",
661
+ title: "Task Update",
360
662
  description: "Update an existing task. Provide only the fields that need to be changed. MANDATORY WORKFLOW: You cannot move a task from 'pending' or 'blocked' directly to 'completed'. You MUST move it to 'in_progress' first. When changing status to 'completed', include 'est_tokens' with the estimated total tokens actually used for the task.",
663
+ annotations: {
664
+ readOnlyHint: false,
665
+ idempotentHint: false,
666
+ openWorldHint: false
667
+ },
361
668
  inputSchema: {
362
669
  type: "object",
363
670
  properties: {
@@ -381,11 +688,33 @@ export const TOOL_DEFINITIONS = [
381
688
  est_tokens: { type: "number", minimum: 0, description: "Estimated total tokens actually used for this task. Required when status changes to 'completed'." }
382
689
  },
383
690
  required: ["repo", "id"]
691
+ },
692
+ outputSchema: {
693
+ type: "object",
694
+ properties: {
695
+ success: { type: "boolean" },
696
+ id: { type: "string" },
697
+ repo: { type: "string" },
698
+ status: { type: "string" },
699
+ archivedToMemory: { type: "boolean" },
700
+ updatedFields: {
701
+ type: "array",
702
+ items: { type: "string" }
703
+ }
704
+ },
705
+ required: ["success", "id", "repo", "status", "archivedToMemory", "updatedFields"]
384
706
  }
385
707
  },
386
708
  {
387
709
  name: "task-delete",
710
+ title: "Task Delete",
388
711
  description: "Delete a task from a repository.",
712
+ annotations: {
713
+ readOnlyHint: false,
714
+ idempotentHint: false,
715
+ destructiveHint: true,
716
+ openWorldHint: false
717
+ },
389
718
  inputSchema: {
390
719
  type: "object",
391
720
  properties: {
@@ -393,11 +722,26 @@ export const TOOL_DEFINITIONS = [
393
722
  id: { type: "string", format: "uuid", description: "Task ID" }
394
723
  },
395
724
  required: ["repo", "id"]
725
+ },
726
+ outputSchema: {
727
+ type: "object",
728
+ properties: {
729
+ success: { type: "boolean" },
730
+ id: { type: "string" },
731
+ repo: { type: "string" }
732
+ },
733
+ required: ["success", "id", "repo"]
396
734
  }
397
735
  },
398
736
  {
399
737
  name: "task-list",
400
- description: "List tasks for a repository to understand current progress and next steps. MANDATORY: Always call this at the start of a session to sync with other agents.",
738
+ title: "Task List",
739
+ description: "List or search tasks for a repository. Use 'search' to filter by code, title, or description. Use 'status' (comma-separated) to filter by status (backlog, pending, in_progress, completed, canceled, blocked). Defaults to active tasks.",
740
+ annotations: {
741
+ readOnlyHint: true,
742
+ idempotentHint: true,
743
+ openWorldHint: false
744
+ },
401
745
  inputSchema: {
402
746
  type: "object",
403
747
  properties: {
@@ -407,13 +751,16 @@ export const TOOL_DEFINITIONS = [
407
751
  },
408
752
  status: {
409
753
  type: "string",
410
- enum: ["pending", "in_progress", "completed", "canceled", "blocked"],
411
- description: "Filter by status"
754
+ description: "Filter by status (e.g. 'pending,in_progress' or 'completed'). Defaults to active tasks if omitted."
412
755
  },
413
756
  phase: {
414
757
  type: "string",
415
758
  description: "Filter by phase"
416
759
  },
760
+ search: {
761
+ type: "string",
762
+ description: "Search query to filter by task code, title, or description"
763
+ },
417
764
  limit: {
418
765
  type: "number",
419
766
  minimum: 1,
@@ -429,11 +776,113 @@ export const TOOL_DEFINITIONS = [
429
776
  }
430
777
  },
431
778
  required: ["repo"]
779
+ },
780
+ outputSchema: {
781
+ type: "object",
782
+ properties: {
783
+ repo: { type: "string" },
784
+ count: { type: "number" },
785
+ offset: { type: "number" },
786
+ limit: { type: "number" },
787
+ tasks: {
788
+ type: "array",
789
+ items: {
790
+ type: "object",
791
+ properties: {
792
+ id: { type: "string" },
793
+ repo: { type: "string" },
794
+ task_code: { type: "string" },
795
+ phase: { type: "string" },
796
+ title: { type: "string" },
797
+ description: { type: "string" },
798
+ status: { type: "string" },
799
+ priority: { type: "number" }
800
+ },
801
+ required: ["id", "repo", "task_code", "phase", "title", "description", "status", "priority"]
802
+ }
803
+ }
804
+ },
805
+ required: ["repo", "count", "offset", "limit", "tasks"]
806
+ }
807
+ },
808
+ {
809
+ name: "task-search",
810
+ title: "Task Search",
811
+ description: "Search for tasks by code, title, or description across any status.",
812
+ annotations: {
813
+ readOnlyHint: true,
814
+ idempotentHint: true,
815
+ openWorldHint: false
816
+ },
817
+ inputSchema: {
818
+ type: "object",
819
+ properties: {
820
+ repo: {
821
+ type: "string",
822
+ description: "Repository name"
823
+ },
824
+ query: {
825
+ type: "string",
826
+ description: "Search query"
827
+ },
828
+ status: {
829
+ type: "string",
830
+ description: "Optional status filter (comma-separated). Defaults to 'all' if omitted."
831
+ },
832
+ limit: {
833
+ type: "number",
834
+ minimum: 1,
835
+ maximum: 100,
836
+ default: 15,
837
+ description: "Maximum number of tasks to return"
838
+ },
839
+ offset: {
840
+ type: "number",
841
+ minimum: 0,
842
+ default: 0,
843
+ description: "Offset for pagination"
844
+ }
845
+ },
846
+ required: ["repo", "query"]
847
+ },
848
+ outputSchema: {
849
+ type: "object",
850
+ properties: {
851
+ repo: { type: "string" },
852
+ count: { type: "number" },
853
+ offset: { type: "number" },
854
+ limit: { type: "number" },
855
+ tasks: {
856
+ type: "array",
857
+ items: {
858
+ type: "object",
859
+ properties: {
860
+ id: { type: "string" },
861
+ repo: { type: "string" },
862
+ task_code: { type: "string" },
863
+ phase: { type: "string" },
864
+ title: { type: "string" },
865
+ description: { type: "string" },
866
+ status: { type: "string" },
867
+ priority: { type: "number" }
868
+ },
869
+ required: ["id", "repo", "task_code", "phase", "title", "description", "status", "priority"]
870
+ }
871
+ }
872
+ },
873
+ required: ["repo", "count", "offset", "limit", "tasks"]
432
874
  }
433
875
  },
434
876
  {
435
877
  name: "task-bulk-manage",
878
+ title: "Task Bulk Manage",
436
879
  description: "Perform bulk operations on tasks (e.g., bulk creation, bulk deletion). For bulk_create, 'est_tokens' is optional and can be filled later when the task is completed.",
880
+ annotations: {
881
+ readOnlyHint: false,
882
+ idempotentHint: false,
883
+ destructiveHint: false,
884
+ openWorldHint: false
885
+ },
437
886
  inputSchema: {
438
887
  type: "object",
439
888
  properties: {
@@ -478,6 +927,25 @@ export const TOOL_DEFINITIONS = [
478
927
  }
479
928
  },
480
929
  required: ["action", "repo"]
930
+ },
931
+ outputSchema: {
932
+ type: "object",
933
+ properties: {
934
+ success: { type: "boolean" },
935
+ action: { type: "string" },
936
+ repo: { type: "string" },
937
+ createdCount: { type: "number" },
938
+ deletedCount: { type: "number" },
939
+ taskCodes: {
940
+ type: "array",
941
+ items: { type: "string" }
942
+ },
943
+ ids: {
944
+ type: "array",
945
+ items: { type: "string" }
946
+ }
947
+ },
948
+ required: ["success", "action", "repo"]
481
949
  }
482
950
  }
483
951
  ];