@vheins/local-memory-mcp 0.4.12 → 0.5.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.
Files changed (201) hide show
  1. package/README.md +21 -0
  2. package/bin/mcp-memory-server.js +1 -1
  3. package/dist/dashboard/public/assets/index-KxrQ6fPK.css +1 -0
  4. package/dist/dashboard/public/assets/index-Lu37nzOi.js +72 -0
  5. package/dist/dashboard/public/index.html +11 -1772
  6. package/dist/dashboard/server.js +115 -5
  7. package/dist/dashboard/server.js.map +1 -1
  8. package/dist/mcp/capabilities.d.ts +22 -0
  9. package/dist/mcp/capabilities.d.ts.map +1 -0
  10. package/dist/mcp/capabilities.js +38 -0
  11. package/dist/mcp/capabilities.js.map +1 -0
  12. package/dist/mcp/client.js +3 -3
  13. package/dist/mcp/client.js.map +1 -1
  14. package/dist/mcp/completion.d.ts +25 -0
  15. package/dist/mcp/completion.d.ts.map +1 -0
  16. package/dist/mcp/completion.js +127 -0
  17. package/dist/mcp/completion.js.map +1 -0
  18. package/dist/mcp/prompts/registry.d.ts +314 -0
  19. package/dist/mcp/prompts/registry.d.ts.map +1 -0
  20. package/dist/mcp/prompts/registry.js +936 -0
  21. package/dist/mcp/prompts/registry.js.map +1 -0
  22. package/dist/mcp/resources/index.d.ts +68 -0
  23. package/dist/mcp/resources/index.d.ts.map +1 -0
  24. package/dist/mcp/resources/index.js +323 -0
  25. package/dist/mcp/resources/index.js.map +1 -0
  26. package/dist/mcp/router.d.ts +14 -0
  27. package/dist/mcp/router.d.ts.map +1 -0
  28. package/dist/mcp/router.js +242 -0
  29. package/dist/mcp/router.js.map +1 -0
  30. package/dist/mcp/server.d.ts +3 -0
  31. package/dist/mcp/server.d.ts.map +1 -0
  32. package/dist/mcp/server.js +338 -0
  33. package/dist/mcp/server.js.map +1 -0
  34. package/dist/mcp/storage/sqlite.d.ts +83 -0
  35. package/dist/mcp/storage/sqlite.d.ts.map +1 -0
  36. package/dist/mcp/storage/sqlite.js +1237 -0
  37. package/dist/mcp/storage/sqlite.js.map +1 -0
  38. package/dist/mcp/storage/vectors.d.ts +19 -0
  39. package/dist/mcp/storage/vectors.d.ts.map +1 -0
  40. package/dist/mcp/storage/vectors.js +74 -0
  41. package/dist/mcp/storage/vectors.js.map +1 -0
  42. package/dist/mcp/storage/vectors.stub.d.ts +12 -0
  43. package/dist/mcp/storage/vectors.stub.d.ts.map +1 -0
  44. package/dist/mcp/storage/vectors.stub.js +88 -0
  45. package/dist/mcp/storage/vectors.stub.js.map +1 -0
  46. package/dist/mcp/tests/client.test.d.ts +2 -0
  47. package/dist/mcp/tests/client.test.d.ts.map +1 -0
  48. package/dist/mcp/tests/client.test.js +130 -0
  49. package/dist/mcp/tests/client.test.js.map +1 -0
  50. package/dist/mcp/tests/dashboard.test.d.ts +2 -0
  51. package/dist/mcp/tests/dashboard.test.d.ts.map +1 -0
  52. package/dist/mcp/tests/dashboard.test.js +370 -0
  53. package/dist/mcp/tests/dashboard.test.js.map +1 -0
  54. package/dist/mcp/tests/e2e.test.d.ts +2 -0
  55. package/dist/mcp/tests/e2e.test.d.ts.map +1 -0
  56. package/dist/mcp/tests/e2e.test.js +250 -0
  57. package/dist/mcp/tests/e2e.test.js.map +1 -0
  58. package/dist/mcp/tests/index.test.d.ts +2 -0
  59. package/dist/mcp/tests/index.test.d.ts.map +1 -0
  60. package/dist/mcp/tests/index.test.js +185 -0
  61. package/dist/mcp/tests/index.test.js.map +1 -0
  62. package/dist/mcp/tests/logger.test.d.ts +2 -0
  63. package/dist/mcp/tests/logger.test.d.ts.map +1 -0
  64. package/dist/mcp/tests/logger.test.js +104 -0
  65. package/dist/mcp/tests/logger.test.js.map +1 -0
  66. package/dist/mcp/tests/memory.bulk.test.d.ts +2 -0
  67. package/dist/mcp/tests/memory.bulk.test.d.ts.map +1 -0
  68. package/dist/mcp/tests/memory.bulk.test.js +52 -0
  69. package/dist/mcp/tests/memory.bulk.test.js.map +1 -0
  70. package/dist/mcp/tests/memory.search.test.d.ts +2 -0
  71. package/dist/mcp/tests/memory.search.test.d.ts.map +1 -0
  72. package/dist/mcp/tests/memory.search.test.js +181 -0
  73. package/dist/mcp/tests/memory.search.test.js.map +1 -0
  74. package/dist/mcp/tests/normalize.test.d.ts +2 -0
  75. package/dist/mcp/tests/normalize.test.d.ts.map +1 -0
  76. package/dist/mcp/tests/normalize.test.js +181 -0
  77. package/dist/mcp/tests/normalize.test.js.map +1 -0
  78. package/dist/mcp/tests/query-expander.test.d.ts +2 -0
  79. package/dist/mcp/tests/query-expander.test.d.ts.map +1 -0
  80. package/dist/mcp/tests/query-expander.test.js +33 -0
  81. package/dist/mcp/tests/query-expander.test.js.map +1 -0
  82. package/dist/mcp/tests/router.test.d.ts +2 -0
  83. package/dist/mcp/tests/router.test.d.ts.map +1 -0
  84. package/dist/mcp/tests/router.test.js +470 -0
  85. package/dist/mcp/tests/router.test.js.map +1 -0
  86. package/dist/mcp/tests/sqlite.test.d.ts +2 -0
  87. package/dist/mcp/tests/sqlite.test.d.ts.map +1 -0
  88. package/dist/mcp/tests/sqlite.test.js +367 -0
  89. package/dist/mcp/tests/sqlite.test.js.map +1 -0
  90. package/dist/mcp/tests/tasks-search.test.d.ts +2 -0
  91. package/dist/mcp/tests/tasks-search.test.d.ts.map +1 -0
  92. package/dist/mcp/tests/tasks-search.test.js +154 -0
  93. package/dist/mcp/tests/tasks-search.test.js.map +1 -0
  94. package/dist/mcp/tests/tasks-transition.test.d.ts +2 -0
  95. package/dist/mcp/tests/tasks-transition.test.d.ts.map +1 -0
  96. package/dist/mcp/tests/tasks-transition.test.js +174 -0
  97. package/dist/mcp/tests/tasks-transition.test.js.map +1 -0
  98. package/dist/mcp/tests/tasks.bulk.test.d.ts +2 -0
  99. package/dist/mcp/tests/tasks.bulk.test.d.ts.map +1 -0
  100. package/dist/mcp/tests/tasks.bulk.test.js +254 -0
  101. package/dist/mcp/tests/tasks.bulk.test.js.map +1 -0
  102. package/dist/mcp/tests/tasks.e2e.test.d.ts +2 -0
  103. package/dist/mcp/tests/tasks.e2e.test.d.ts.map +1 -0
  104. package/dist/mcp/tests/tasks.e2e.test.js +289 -0
  105. package/dist/mcp/tests/tasks.e2e.test.js.map +1 -0
  106. package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts +2 -0
  107. package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts.map +1 -0
  108. package/dist/mcp/tests/tasks.pending-limit-refined.test.js +72 -0
  109. package/dist/mcp/tests/tasks.pending-limit-refined.test.js.map +1 -0
  110. package/dist/mcp/tests/v2-features.test.d.ts +2 -0
  111. package/dist/mcp/tests/v2-features.test.d.ts.map +1 -0
  112. package/dist/mcp/tests/v2-features.test.js +209 -0
  113. package/dist/mcp/tests/v2-features.test.js.map +1 -0
  114. package/dist/mcp/tools/memory.acknowledge.d.ts +4 -0
  115. package/dist/mcp/tools/memory.acknowledge.d.ts.map +1 -0
  116. package/dist/mcp/tools/memory.acknowledge.js +30 -0
  117. package/dist/mcp/tools/memory.acknowledge.js.map +1 -0
  118. package/dist/mcp/tools/memory.bulk-delete.d.ts +4 -0
  119. package/dist/mcp/tools/memory.bulk-delete.d.ts.map +1 -0
  120. package/dist/mcp/tools/memory.bulk-delete.js +39 -0
  121. package/dist/mcp/tools/memory.bulk-delete.js.map +1 -0
  122. package/dist/mcp/tools/memory.delete.d.ts +9 -0
  123. package/dist/mcp/tools/memory.delete.d.ts.map +1 -0
  124. package/dist/mcp/tools/memory.delete.js +39 -0
  125. package/dist/mcp/tools/memory.delete.js.map +1 -0
  126. package/dist/mcp/tools/memory.recap.d.ts +4 -0
  127. package/dist/mcp/tools/memory.recap.d.ts.map +1 -0
  128. package/dist/mcp/tools/memory.recap.js +90 -0
  129. package/dist/mcp/tools/memory.recap.js.map +1 -0
  130. package/dist/mcp/tools/memory.search.d.ts +5 -0
  131. package/dist/mcp/tools/memory.search.d.ts.map +1 -0
  132. package/dist/mcp/tools/memory.search.js +134 -0
  133. package/dist/mcp/tools/memory.search.js.map +1 -0
  134. package/dist/mcp/tools/memory.store.d.ts +5 -0
  135. package/dist/mcp/tools/memory.store.d.ts.map +1 -0
  136. package/dist/mcp/tools/memory.store.js +117 -0
  137. package/dist/mcp/tools/memory.store.js.map +1 -0
  138. package/dist/mcp/tools/memory.summarize.d.ts +4 -0
  139. package/dist/mcp/tools/memory.summarize.d.ts.map +1 -0
  140. package/dist/mcp/tools/memory.summarize.js +31 -0
  141. package/dist/mcp/tools/memory.summarize.js.map +1 -0
  142. package/dist/mcp/tools/memory.synthesize.d.ts +14 -0
  143. package/dist/mcp/tools/memory.synthesize.d.ts.map +1 -0
  144. package/dist/mcp/tools/memory.synthesize.js +228 -0
  145. package/dist/mcp/tools/memory.synthesize.js.map +1 -0
  146. package/dist/mcp/tools/memory.update.d.ts +5 -0
  147. package/dist/mcp/tools/memory.update.d.ts.map +1 -0
  148. package/dist/mcp/tools/memory.update.js +73 -0
  149. package/dist/mcp/tools/memory.update.js.map +1 -0
  150. package/dist/mcp/tools/schemas.d.ts +2762 -0
  151. package/dist/mcp/tools/schemas.d.ts.map +1 -0
  152. package/dist/mcp/tools/schemas.js +952 -0
  153. package/dist/mcp/tools/schemas.js.map +1 -0
  154. package/dist/mcp/tools/task.bulk-manage.d.ts +4 -0
  155. package/dist/mcp/tools/task.bulk-manage.d.ts.map +1 -0
  156. package/dist/mcp/tools/task.bulk-manage.js +146 -0
  157. package/dist/mcp/tools/task.bulk-manage.js.map +1 -0
  158. package/dist/mcp/tools/task.manage.d.ts +16 -0
  159. package/dist/mcp/tools/task.manage.d.ts.map +1 -0
  160. package/dist/mcp/tools/task.manage.js +395 -0
  161. package/dist/mcp/tools/task.manage.js.map +1 -0
  162. package/dist/mcp/types.d.ts +87 -0
  163. package/dist/mcp/types.d.ts.map +1 -0
  164. package/dist/mcp/types.js +3 -0
  165. package/dist/mcp/types.js.map +1 -0
  166. package/dist/mcp/utils/completion.d.ts +2 -0
  167. package/dist/mcp/utils/completion.d.ts.map +1 -0
  168. package/dist/mcp/utils/completion.js +28 -0
  169. package/dist/mcp/utils/completion.js.map +1 -0
  170. package/dist/mcp/utils/git-scope.d.ts +8 -0
  171. package/dist/mcp/utils/git-scope.d.ts.map +1 -0
  172. package/dist/mcp/utils/git-scope.js +38 -0
  173. package/dist/mcp/utils/git-scope.js.map +1 -0
  174. package/dist/mcp/utils/logger.d.ts +25 -0
  175. package/dist/mcp/utils/logger.d.ts.map +1 -0
  176. package/dist/mcp/utils/logger.js +152 -0
  177. package/dist/mcp/utils/logger.js.map +1 -0
  178. package/dist/mcp/utils/mcp-response.d.ts +96 -0
  179. package/dist/mcp/utils/mcp-response.d.ts.map +1 -0
  180. package/dist/mcp/utils/mcp-response.js +131 -0
  181. package/dist/mcp/utils/mcp-response.js.map +1 -0
  182. package/dist/mcp/utils/normalize.d.ts +9 -0
  183. package/dist/mcp/utils/normalize.d.ts.map +1 -0
  184. package/dist/mcp/utils/normalize.js +62 -0
  185. package/dist/mcp/utils/normalize.js.map +1 -0
  186. package/dist/mcp/utils/pagination.d.ts +6 -0
  187. package/dist/mcp/utils/pagination.d.ts.map +1 -0
  188. package/dist/mcp/utils/pagination.js +32 -0
  189. package/dist/mcp/utils/pagination.js.map +1 -0
  190. package/dist/mcp/utils/query-expander.d.ts +2 -0
  191. package/dist/mcp/utils/query-expander.d.ts.map +1 -0
  192. package/dist/mcp/utils/query-expander.js +29 -0
  193. package/dist/mcp/utils/query-expander.js.map +1 -0
  194. package/dist/storage/sqlite.d.ts +3 -0
  195. package/dist/storage/sqlite.d.ts.map +1 -1
  196. package/dist/storage/sqlite.js +38 -9
  197. package/dist/storage/sqlite.js.map +1 -1
  198. package/package.json +17 -5
  199. package/dist/dashboard/public/app.js +0 -2779
  200. package/dist/dashboard/public/chart.js +0 -0
  201. package/dist/dashboard/public/screenshot.png +0 -0
@@ -0,0 +1,952 @@
1
+ import { z } from "zod";
2
+ import { normalizeRepo } from "../utils/normalize.js";
3
+ // Shared schema components
4
+ export const MemoryScopeSchema = z.object({
5
+ repo: z.string().min(1).transform(normalizeRepo),
6
+ branch: z.string().optional(),
7
+ folder: z.string().optional(),
8
+ language: z.string().optional()
9
+ });
10
+ export const MemoryTypeSchema = z.enum(["code_fact", "decision", "mistake", "pattern", "agent_handoff", "agent_registered", "file_claim", "task_archive"]);
11
+ // Tool schemas
12
+ export const MemoryStoreSchema = z.object({
13
+ type: MemoryTypeSchema,
14
+ title: z.string().min(3).max(100),
15
+ content: z.string().min(10),
16
+ importance: z.number().min(1).max(5),
17
+ agent: z.string().min(1),
18
+ role: z.string().optional().default("unknown"),
19
+ model: z.string().min(1),
20
+ scope: MemoryScopeSchema,
21
+ ttlDays: z.number().min(1).optional(),
22
+ supersedes: z.string().uuid().optional(),
23
+ tags: z.array(z.string()).optional(),
24
+ metadata: z.record(z.string(), z.any()).optional(),
25
+ is_global: z.boolean().default(false)
26
+ });
27
+ export const MemoryUpdateSchema = z.object({
28
+ id: z.string().uuid(),
29
+ type: MemoryTypeSchema.optional(),
30
+ title: z.string().min(3).max(100).optional(),
31
+ content: z.string().min(10).optional(),
32
+ importance: z.number().min(1).max(5).optional(),
33
+ agent: z.string().optional(),
34
+ role: z.string().optional(),
35
+ status: z.enum(["active", "archived"]).optional(),
36
+ supersedes: z.string().uuid().optional(),
37
+ tags: z.array(z.string()).optional(),
38
+ metadata: z.record(z.string(), z.any()).optional(),
39
+ is_global: z.boolean().optional(),
40
+ completed_at: z.string().optional()
41
+ }).refine((data) => data.type !== undefined || data.content !== undefined || data.title !== undefined || data.importance !== undefined || data.status !== undefined || data.supersedes !== undefined || data.tags !== undefined || data.metadata !== undefined || data.is_global !== undefined || data.agent !== undefined || data.role !== undefined || data.completed_at !== undefined, { message: "At least one field must be provided for update" });
42
+ export const MemorySearchSchema = z.object({
43
+ query: z.string().min(3),
44
+ prompt: z.string().optional(),
45
+ repo: z.string().min(1).transform(normalizeRepo),
46
+ types: z.array(MemoryTypeSchema).optional(),
47
+ minImportance: z.number().min(1).max(5).optional(),
48
+ limit: z.number().min(1).max(100).default(5),
49
+ includeRecap: z.boolean().default(false),
50
+ current_file_path: z.string().optional(),
51
+ include_archived: z.boolean().default(false),
52
+ current_tags: z.array(z.string()).optional(),
53
+ scope: MemoryScopeSchema.partial().optional()
54
+ });
55
+ export const MemoryAcknowledgeSchema = z.object({
56
+ memory_id: z.string().uuid(),
57
+ status: z.enum(["used", "irrelevant", "contradictory"]),
58
+ application_context: z.string().min(10).optional()
59
+ });
60
+ export const MemoryRecapSchema = z.object({
61
+ repo: z.string().min(1).transform(normalizeRepo),
62
+ limit: z.number().min(1).max(50).default(20),
63
+ offset: z.number().min(0).default(0)
64
+ });
65
+ export const MemoryBulkDeleteSchema = z.object({
66
+ repo: z.string().min(1).transform(normalizeRepo),
67
+ ids: z.array(z.string().uuid()).min(1)
68
+ });
69
+ export const MemorySummarizeSchema = z.object({
70
+ repo: z.string().min(1).transform(normalizeRepo),
71
+ signals: z.array(z.string().max(200)).min(1)
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
+ });
83
+ export const TaskStatusSchema = z.enum(["backlog", "pending", "in_progress", "completed", "canceled", "blocked"]);
84
+ export const TaskPrioritySchema = z.number().min(1).max(5);
85
+ export const TaskCreateSchema = z.object({
86
+ repo: z.string().min(1).transform(normalizeRepo),
87
+ task_code: z.string().min(1),
88
+ phase: z.string().min(1),
89
+ title: z.string().min(3).max(100),
90
+ description: z.string().min(1),
91
+ status: TaskStatusSchema.default("backlog"),
92
+ priority: TaskPrioritySchema.default(3),
93
+ agent: z.string().optional(),
94
+ role: z.string().optional(),
95
+ doc_path: z.string().optional(),
96
+ tags: z.array(z.string()).optional(),
97
+ metadata: z.record(z.string(), z.any()).optional(),
98
+ parent_id: z.string().uuid().optional(),
99
+ depends_on: z.string().uuid().optional(),
100
+ est_tokens: z.number().int().min(0).optional()
101
+ });
102
+ export const TaskCreateInteractiveSchema = TaskCreateSchema.partial().extend({
103
+ repo: z.string().min(1).transform(normalizeRepo).optional(),
104
+ });
105
+ export const TaskUpdateSchema = z.object({
106
+ repo: z.string().min(1).transform(normalizeRepo),
107
+ id: z.string().uuid(),
108
+ task_code: z.string().optional(),
109
+ phase: z.string().optional(),
110
+ title: z.string().min(3).max(100).optional(),
111
+ description: z.string().optional(),
112
+ status: TaskStatusSchema.optional(),
113
+ priority: TaskPrioritySchema.optional(),
114
+ agent: z.string().min(1, "agent name is required"),
115
+ role: z.string().min(1, "agent role is required"),
116
+ model: z.string().optional(),
117
+ comment: z.string().min(1).optional(),
118
+ doc_path: z.string().optional(),
119
+ tags: z.array(z.string()).optional(),
120
+ metadata: z.record(z.string(), z.any()).optional(),
121
+ parent_id: z.string().uuid().optional(),
122
+ depends_on: z.string().uuid().optional(),
123
+ est_tokens: z.number().int().min(0).optional()
124
+ }).refine((data) => Object.keys(data).length > 2, { message: "At least one field besides repo and id must be provided for update" });
125
+ export const TaskListSchema = z.object({
126
+ repo: z.string().min(1).transform(normalizeRepo),
127
+ status: z.string().optional(),
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(),
137
+ limit: z.number().min(1).max(100).default(15),
138
+ offset: z.number().min(0).default(0)
139
+ });
140
+ export const TaskBulkManageSchema = z.object({
141
+ action: z.enum(["bulk_create", "bulk_delete"]),
142
+ repo: z.string().min(1).transform(normalizeRepo),
143
+ tasks: z.array(z.object({
144
+ task_code: z.string().min(1),
145
+ phase: z.string().min(1),
146
+ title: z.string().min(3).max(100),
147
+ description: z.string().min(1),
148
+ status: TaskStatusSchema.default("backlog"),
149
+ priority: TaskPrioritySchema.optional(),
150
+ agent: z.string().optional(),
151
+ role: z.string().optional(),
152
+ doc_path: z.string().optional(),
153
+ tags: z.array(z.string()).optional(),
154
+ metadata: z.record(z.string(), z.any()).optional(),
155
+ parent_id: z.string().uuid().optional(),
156
+ depends_on: z.string().uuid().optional(),
157
+ est_tokens: z.number().int().min(0).optional()
158
+ })).min(1).optional(),
159
+ ids: z.array(z.string().uuid()).min(1).optional()
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" });
161
+ export const TaskDeleteSchema = z.object({
162
+ repo: z.string().min(1).transform(normalizeRepo),
163
+ id: z.string().uuid()
164
+ });
165
+ // Tool definitions for MCP
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
+ },
245
+ {
246
+ name: "memory-store",
247
+ title: "Memory Store",
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
+ },
255
+ inputSchema: {
256
+ type: "object",
257
+ properties: {
258
+ type: {
259
+ type: "string",
260
+ enum: ["code_fact", "decision", "mistake", "pattern", "agent_handoff", "agent_registered", "file_claim", "task_archive"],
261
+ description: "Type of memory being stored"
262
+ },
263
+ title: {
264
+ type: "string",
265
+ minLength: 3,
266
+ maxLength: 100,
267
+ description: "Short human-readable title for the memory. Do not embed bracketed metadata like agent/role/date prefixes here."
268
+ },
269
+ content: {
270
+ type: "string",
271
+ minLength: 10,
272
+ description: "The memory content"
273
+ },
274
+ importance: {
275
+ type: "number",
276
+ minimum: 1,
277
+ maximum: 5,
278
+ description: "Importance score (1-5)"
279
+ },
280
+ agent: {
281
+ type: "string",
282
+ description: "Name of the agent creating this memory"
283
+ },
284
+ model: {
285
+ type: "string",
286
+ description: "AI model used by the agent"
287
+ },
288
+ scope: {
289
+ type: "object",
290
+ properties: {
291
+ repo: { type: "string", description: "Repository name" },
292
+ branch: { type: "string" },
293
+ folder: { type: "string" },
294
+ language: { type: "string" }
295
+ },
296
+ required: ["repo"]
297
+ },
298
+ tags: {
299
+ type: "array",
300
+ items: { type: "string" },
301
+ description: "Technology stack tags (e.g., ['filament', 'laravel'])"
302
+ },
303
+ metadata: {
304
+ type: "object",
305
+ description: "Structured metadata for non-title context such as source agent, claim fields, or timestamps"
306
+ },
307
+ is_global: {
308
+ type: "boolean",
309
+ description: "If true, this memory is shared across all repositories"
310
+ },
311
+ ttlDays: { type: "number", minimum: 1 },
312
+ supersedes: { type: "string", format: "uuid" }
313
+ },
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"]
328
+ }
329
+ },
330
+ {
331
+ name: "memory-acknowledge",
332
+ title: "Memory Acknowledge",
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
+ },
339
+ inputSchema: {
340
+ type: "object",
341
+ properties: {
342
+ memory_id: { type: "string", format: "uuid" },
343
+ status: { type: "string", enum: ["used", "irrelevant", "contradictory"] },
344
+ application_context: { type: "string", minLength: 10 }
345
+ },
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"]
356
+ }
357
+ },
358
+ {
359
+ name: "memory-update",
360
+ title: "Memory Update",
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
+ },
368
+ inputSchema: {
369
+ type: "object",
370
+ properties: {
371
+ id: { type: "string", format: "uuid" },
372
+ type: { type: "string", enum: ["code_fact", "decision", "mistake", "pattern", "agent_handoff", "agent_registered", "file_claim", "task_archive"] },
373
+ title: { type: "string", minLength: 3, maxLength: 100 },
374
+ content: { type: "string", minLength: 10 },
375
+ importance: { type: "number", minimum: 1, maximum: 5 },
376
+ status: { type: "string", enum: ["active", "archived"] },
377
+ supersedes: { type: "string", format: "uuid" },
378
+ tags: { type: "array", items: { type: "string" } },
379
+ metadata: { type: "object" },
380
+ is_global: { type: "boolean" }
381
+ },
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"]
396
+ }
397
+ },
398
+ {
399
+ name: "memory-search",
400
+ title: "Memory Search",
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
+ },
407
+ inputSchema: {
408
+ type: "object",
409
+ properties: {
410
+ query: { type: "string", minLength: 3 },
411
+ repo: { type: "string" },
412
+ current_tags: {
413
+ type: "array",
414
+ items: { type: "string" },
415
+ description: "Active tech stack tags (e.g., ['filament', 'react'])"
416
+ },
417
+ types: {
418
+ type: "array",
419
+ items: { type: "string", enum: ["code_fact", "decision", "mistake", "pattern", "agent_handoff", "agent_registered", "file_claim", "task_archive"] }
420
+ },
421
+ minImportance: { type: "number", minimum: 1, maximum: 5 },
422
+ limit: { type: "number", minimum: 1, maximum: 100, default: 5 },
423
+ includeRecap: { type: "boolean", default: false },
424
+ current_file_path: { type: "string" },
425
+ include_archived: { type: "boolean", default: false }
426
+ },
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"]
450
+ }
451
+ },
452
+ {
453
+ name: "memory-summarize",
454
+ title: "Memory Summarize",
455
+ description: "Update the summary for a repository",
456
+ annotations: {
457
+ readOnlyHint: false,
458
+ idempotentHint: false,
459
+ openWorldHint: false
460
+ },
461
+ inputSchema: {
462
+ type: "object",
463
+ properties: {
464
+ repo: { type: "string", description: "Repository name" },
465
+ signals: {
466
+ type: "array",
467
+ items: { type: "string", maxLength: 200 },
468
+ minItems: 1,
469
+ description: "High-level signals to include in summary"
470
+ }
471
+ },
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"]
483
+ }
484
+ },
485
+ {
486
+ name: "memory-delete",
487
+ title: "Memory Delete",
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
+ },
495
+ inputSchema: {
496
+ type: "object",
497
+ properties: {
498
+ id: { type: "string", format: "uuid", description: "Memory entry ID to delete" }
499
+ },
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"]
510
+ }
511
+ },
512
+ {
513
+ name: "memory-bulk-delete",
514
+ title: "Memory Bulk Delete",
515
+ description: "Delete multiple memory entries at once.",
516
+ annotations: {
517
+ readOnlyHint: false,
518
+ idempotentHint: false,
519
+ destructiveHint: true,
520
+ openWorldHint: false
521
+ },
522
+ inputSchema: {
523
+ type: "object",
524
+ properties: {
525
+ repo: { type: "string", description: "Repository name" },
526
+ ids: { type: "array", items: { type: "string", format: "uuid" }, minItems: 1, description: "Array of memory IDs to delete" }
527
+ },
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"]
542
+ }
543
+ },
544
+ {
545
+ name: "memory-recap",
546
+ title: "Memory Recap",
547
+ description: "Get the last 20 memories from a repository for context",
548
+ annotations: {
549
+ readOnlyHint: true,
550
+ idempotentHint: true,
551
+ openWorldHint: false
552
+ },
553
+ inputSchema: {
554
+ type: "object",
555
+ properties: {
556
+ repo: { type: "string", description: "Repository name (required)" },
557
+ limit: {
558
+ type: "number",
559
+ minimum: 1,
560
+ maximum: 50,
561
+ default: 20,
562
+ description: "Maximum number of memories to retrieve"
563
+ },
564
+ offset: {
565
+ type: "number",
566
+ minimum: 0,
567
+ default: 0,
568
+ description: "Number of memories to skip for pagination (optional, default 0)"
569
+ }
570
+ },
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"]
612
+ }
613
+ },
614
+ {
615
+ name: "task-create",
616
+ title: "Task Create",
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
+ },
623
+ inputSchema: {
624
+ type: "object",
625
+ properties: {
626
+ repo: { type: "string", description: "Repository name" },
627
+ task_code: { type: "string", description: "Unique task code (e.g. TASK-001)" },
628
+ phase: { type: "string", description: "Project phase" },
629
+ title: { type: "string", minLength: 3, maxLength: 100 },
630
+ description: { type: "string" },
631
+ status: { type: "string", enum: ["backlog", "pending"], description: "New tasks MUST start in 'backlog' if there are already 10 pending tasks. Otherwise can start in 'pending'." },
632
+ priority: { type: "number", minimum: 1, maximum: 5, default: 3 },
633
+ agent: { type: "string" },
634
+ role: { type: "string" },
635
+ doc_path: { type: "string" },
636
+ tags: { type: "array", items: { type: "string" } },
637
+ metadata: { type: "object" },
638
+ parent_id: { type: "string", format: "uuid" },
639
+ depends_on: { type: "string", format: "uuid" },
640
+ est_tokens: { type: "number", minimum: 0, description: "Estimated tokens budget for this task" }
641
+ },
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"]
657
+ }
658
+ },
659
+ {
660
+ name: "task-update",
661
+ title: "Task Update",
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
+ },
668
+ inputSchema: {
669
+ type: "object",
670
+ properties: {
671
+ repo: { type: "string", description: "Repository name" },
672
+ id: { type: "string", format: "uuid", description: "Task ID" },
673
+ task_code: { type: "string" },
674
+ phase: { type: "string" },
675
+ title: { type: "string", minLength: 3, maxLength: 100 },
676
+ description: { type: "string" },
677
+ status: { type: "string", enum: ["backlog", "pending", "in_progress", "completed", "canceled", "blocked"], description: "New status. Transitions from 'backlog', 'pending' or 'blocked' to 'completed' are NOT allowed." },
678
+ priority: { type: "number", minimum: 1, maximum: 5 },
679
+ agent: { type: "string" },
680
+ role: { type: "string" },
681
+ model: { type: "string" },
682
+ comment: { type: "string", description: "REQUIRED when changing task status. Explain WHY the status is changing (e.g., 'Starting implementation', 'Blocked by missing API docs', 'Verified fix')." },
683
+ doc_path: { type: "string" },
684
+ tags: { type: "array", items: { type: "string" } },
685
+ metadata: { type: "object" },
686
+ parent_id: { type: "string", format: "uuid" },
687
+ depends_on: { type: "string", format: "uuid" },
688
+ est_tokens: { type: "number", minimum: 0, description: "Estimated total tokens actually used for this task. Required when status changes to 'completed'." }
689
+ },
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"]
706
+ }
707
+ },
708
+ {
709
+ name: "task-delete",
710
+ title: "Task Delete",
711
+ description: "Delete a task from a repository.",
712
+ annotations: {
713
+ readOnlyHint: false,
714
+ idempotentHint: false,
715
+ destructiveHint: true,
716
+ openWorldHint: false
717
+ },
718
+ inputSchema: {
719
+ type: "object",
720
+ properties: {
721
+ repo: { type: "string", description: "Repository name" },
722
+ id: { type: "string", format: "uuid", description: "Task ID" }
723
+ },
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"]
734
+ }
735
+ },
736
+ {
737
+ name: "task-list",
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
+ },
745
+ inputSchema: {
746
+ type: "object",
747
+ properties: {
748
+ repo: {
749
+ type: "string",
750
+ description: "Repository name"
751
+ },
752
+ status: {
753
+ type: "string",
754
+ description: "Filter by status (e.g. 'pending,in_progress' or 'completed'). Defaults to active tasks if omitted."
755
+ },
756
+ phase: {
757
+ type: "string",
758
+ description: "Filter by phase"
759
+ },
760
+ search: {
761
+ type: "string",
762
+ description: "Search query to filter by task code, title, or description"
763
+ },
764
+ limit: {
765
+ type: "number",
766
+ minimum: 1,
767
+ maximum: 100,
768
+ default: 15,
769
+ description: "Maximum number of tasks to return (default 15)"
770
+ },
771
+ offset: {
772
+ type: "number",
773
+ minimum: 0,
774
+ default: 0,
775
+ description: "Offset for pagination"
776
+ }
777
+ },
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"]
874
+ }
875
+ },
876
+ {
877
+ name: "task-bulk-manage",
878
+ title: "Task Bulk Manage",
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
+ },
886
+ inputSchema: {
887
+ type: "object",
888
+ properties: {
889
+ action: {
890
+ type: "string",
891
+ enum: ["bulk_create", "bulk_delete"],
892
+ description: "Action to perform in bulk"
893
+ },
894
+ repo: {
895
+ type: "string",
896
+ description: "Repository name"
897
+ },
898
+ tasks: {
899
+ type: "array",
900
+ items: {
901
+ type: "object",
902
+ properties: {
903
+ task_code: { type: "string" },
904
+ phase: { type: "string" },
905
+ title: { type: "string", minLength: 3, maxLength: 100 },
906
+ description: { type: "string" },
907
+ status: { type: "string", enum: ["backlog", "pending", "in_progress", "completed", "canceled", "blocked"] },
908
+ priority: { type: "number", minimum: 1, maximum: 5 },
909
+ agent: { type: "string" },
910
+ role: { type: "string" },
911
+ doc_path: { type: "string" },
912
+ tags: { type: "array", items: { type: "string" } },
913
+ metadata: { type: "object" },
914
+ parent_id: { type: "string", format: "uuid" },
915
+ depends_on: { type: "string", format: "uuid" },
916
+ est_tokens: { type: "number", minimum: 0, description: "Estimated tokens budget for this task" }
917
+ },
918
+ required: ["task_code", "title", "phase", "description", "status"]
919
+ },
920
+ minItems: 1
921
+ },
922
+ ids: {
923
+ type: "array",
924
+ items: { type: "string", format: "uuid" },
925
+ minItems: 1,
926
+ description: "Task IDs to delete (for bulk_delete)"
927
+ }
928
+ },
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"]
949
+ }
950
+ }
951
+ ];
952
+ //# sourceMappingURL=schemas.js.map