@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,289 @@
1
+ import { describe, it, expect, beforeEach } from "vitest";
2
+ import { createRouter } from "../router.js";
3
+ import { SQLiteStore } from "../storage/sqlite.js";
4
+ import { StubVectorStore } from "../storage/vectors.stub.js";
5
+ describe("MCP Local Memory - Task Management Workflow E2E", () => {
6
+ let db;
7
+ let vectors;
8
+ let router;
9
+ const REPO = "workflow-test-repo";
10
+ beforeEach(() => {
11
+ db = new SQLiteStore(":memory:");
12
+ vectors = new StubVectorStore(db);
13
+ router = createRouter(db, vectors);
14
+ });
15
+ it("should follow the complete task management lifecycle: Plan -> Execute -> Verify", async () => {
16
+ // ---- 1. INITIAL CHECK ----
17
+ const initialRes = await router("resources/read", {
18
+ uri: `tasks://current?repo=${REPO}`
19
+ });
20
+ const initialTasks = JSON.parse(initialRes.contents[0].text);
21
+ expect(initialTasks.length).toBe(0);
22
+ // ---- 2. PLANNING PHASE ----
23
+ const taskARes = await router("tools/call", {
24
+ name: "task-create",
25
+ arguments: {
26
+ repo: REPO,
27
+ task_code: "TASK-001",
28
+ phase: "research",
29
+ title: "Research Architecture",
30
+ description: "Analyze the current system architecture and propose changes",
31
+ status: "pending",
32
+ priority: 5,
33
+ est_tokens: 120
34
+ }
35
+ });
36
+ const taskAId = db.getTasksByRepo(REPO)[0].id;
37
+ const taskBRes = await router("tools/call", {
38
+ name: "task-create",
39
+ arguments: {
40
+ repo: REPO,
41
+ task_code: "TASK-002",
42
+ phase: "implementation",
43
+ title: "Implement Core Logic",
44
+ description: "Write the core implementation based on research",
45
+ status: "backlog",
46
+ depends_on: taskAId,
47
+ priority: 4,
48
+ est_tokens: 240
49
+ }
50
+ });
51
+ const taskBId = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-002").id;
52
+ // Verify both are pending
53
+ const plannedRes = await router("resources/read", { uri: `tasks://current?repo=${REPO}` });
54
+ const plannedTasks = JSON.parse(plannedRes.contents[0].text);
55
+ expect(plannedTasks.length).toBe(2);
56
+ // Verify task-list tool works
57
+ const listToolRes = await router("tools/call", {
58
+ name: "task-list",
59
+ arguments: { repo: REPO }
60
+ });
61
+ const listToolTasks = JSON.parse(listToolRes.content[0].text);
62
+ expect(listToolTasks.length).toBe(2);
63
+ // ---- 3. EXECUTION PHASE ----
64
+ await router("tools/call", {
65
+ name: "task-update",
66
+ arguments: {
67
+ repo: REPO,
68
+ id: taskAId,
69
+ status: "in_progress",
70
+ comment: "Started architecture review",
71
+ agent: "Agent A",
72
+ role: "backend",
73
+ model: "gpt-5.4",
74
+ est_tokens: 180
75
+ }
76
+ });
77
+ const inProgressRes = await router("resources/read", { uri: `tasks://current?repo=${REPO}` });
78
+ const inProgressTasks = JSON.parse(inProgressRes.contents[0].text);
79
+ expect(inProgressTasks.find((t) => t.id === taskAId).status).toBe("in_progress");
80
+ // ---- 4. VALIDATION PHASE (Task A) ----
81
+ await router("tools/call", {
82
+ name: "task-update",
83
+ arguments: {
84
+ repo: REPO,
85
+ id: taskAId,
86
+ status: "completed",
87
+ comment: "Architecture review finished and documented",
88
+ agent: "Agent A",
89
+ role: "backend",
90
+ model: "gpt-5.4",
91
+ est_tokens: 180
92
+ }
93
+ });
94
+ const afterARes = await router("resources/read", { uri: `tasks://current?repo=${REPO}` });
95
+ const afterATasks = JSON.parse(afterARes.contents[0].text);
96
+ expect(afterATasks.length).toBe(1);
97
+ expect(afterATasks[0].id).toBe(taskBId);
98
+ // ---- 5. RESUME WORKFLOW (Task B) ----
99
+ await router("tools/call", {
100
+ name: "task-update",
101
+ arguments: {
102
+ repo: REPO,
103
+ id: taskBId,
104
+ status: "in_progress",
105
+ comment: "Implementation started after dependency was cleared",
106
+ agent: "Agent B",
107
+ role: "frontend",
108
+ model: "gpt-5.4-mini",
109
+ est_tokens: 320
110
+ }
111
+ });
112
+ const finalCheckRes = await router("resources/read", { uri: `tasks://current?repo=${REPO}` });
113
+ const finalCheckTasks = JSON.parse(finalCheckRes.contents[0].text);
114
+ expect(finalCheckTasks[0].status).toBe("in_progress");
115
+ const updatedTask = db.getTaskById(taskBId);
116
+ expect(updatedTask.comments).toHaveLength(1);
117
+ expect(updatedTask.comments[0].comment).toContain("Implementation started");
118
+ expect(updatedTask.comments[0].agent).toBe("Agent B");
119
+ expect(updatedTask.comments[0].model).toBe("gpt-5.4-mini");
120
+ expect(updatedTask.comments[0].previous_status).toBe("backlog");
121
+ expect(updatedTask.comments[0].next_status).toBe("in_progress");
122
+ });
123
+ it("requires comment when status changes", async () => {
124
+ await router("tools/call", {
125
+ name: "task-create",
126
+ arguments: {
127
+ repo: REPO,
128
+ task_code: "TASK-003",
129
+ phase: "implementation",
130
+ title: "Comment enforcement",
131
+ description: "Task used to verify status change comment enforcement",
132
+ status: "pending",
133
+ priority: 3,
134
+ est_tokens: 90
135
+ }
136
+ });
137
+ const taskId = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-003")?.id;
138
+ expect(taskId).toBeDefined();
139
+ await expect(router("tools/call", {
140
+ name: "task-update",
141
+ arguments: {
142
+ repo: REPO,
143
+ id: taskId,
144
+ status: "in_progress",
145
+ agent: "TestAgent",
146
+ role: "testing",
147
+ est_tokens: 50
148
+ }
149
+ })).rejects.toThrow("comment is required when changing task status");
150
+ });
151
+ it("allows task-create without est_tokens", async () => {
152
+ await router("tools/call", {
153
+ name: "task-create",
154
+ arguments: {
155
+ repo: REPO,
156
+ task_code: "TASK-003A",
157
+ phase: "implementation",
158
+ title: "Create without token estimate",
159
+ description: "Should still be accepted during planning",
160
+ status: "pending",
161
+ priority: 3
162
+ }
163
+ });
164
+ const task = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-003A");
165
+ expect(task).toBeDefined();
166
+ expect(task?.est_tokens).toBe(0);
167
+ });
168
+ it("requires est_tokens when changing task status to completed", async () => {
169
+ await router("tools/call", {
170
+ name: "task-create",
171
+ arguments: {
172
+ repo: REPO,
173
+ task_code: "TASK-003B",
174
+ phase: "implementation",
175
+ title: "Completion requires token estimate",
176
+ description: "Used to verify completed status analytics requirement",
177
+ status: "backlog",
178
+ priority: 3
179
+ }
180
+ });
181
+ const taskId = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-003B")?.id;
182
+ expect(taskId).toBeDefined();
183
+ await router("tools/call", {
184
+ name: "task-update",
185
+ arguments: {
186
+ repo: REPO,
187
+ id: taskId,
188
+ status: "in_progress",
189
+ comment: "Starting work",
190
+ agent: "Agent E",
191
+ role: "backend"
192
+ }
193
+ });
194
+ await expect(router("tools/call", {
195
+ name: "task-update",
196
+ arguments: {
197
+ repo: REPO,
198
+ id: taskId,
199
+ status: "completed",
200
+ comment: "Finished work but forgot token estimate",
201
+ agent: "Agent E",
202
+ role: "backend"
203
+ }
204
+ })).rejects.toThrow("est_tokens is required when changing task status to completed");
205
+ });
206
+ it("stores standalone comments without mutating description", async () => {
207
+ await router("tools/call", {
208
+ name: "task-create",
209
+ arguments: {
210
+ repo: REPO,
211
+ task_code: "TASK-004",
212
+ phase: "implementation",
213
+ title: "Standalone comments",
214
+ description: "Original description",
215
+ status: "pending",
216
+ priority: 3,
217
+ est_tokens: 90,
218
+ agent: "Seeder",
219
+ role: "user"
220
+ }
221
+ });
222
+ const taskId = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-004")?.id;
223
+ expect(taskId).toBeDefined();
224
+ await router("tools/call", {
225
+ name: "task-update",
226
+ arguments: {
227
+ repo: REPO,
228
+ id: taskId,
229
+ comment: "Investigated root cause and prepared next steps",
230
+ agent: "Agent C",
231
+ role: "security",
232
+ model: "gpt-5.4",
233
+ est_tokens: 75,
234
+ }
235
+ });
236
+ const task = db.getTaskById(taskId);
237
+ expect(task.description).toBe("Original description");
238
+ expect(task.comments).toHaveLength(1);
239
+ expect(task.comments[0].previous_status).toBeNull();
240
+ expect(task.comments[0].next_status).toBeNull();
241
+ });
242
+ it("auto-populates timestamps from status so agents do not need to send them manually", async () => {
243
+ await router("tools/call", {
244
+ name: "task-create",
245
+ arguments: {
246
+ repo: REPO,
247
+ task_code: "TASK-005",
248
+ phase: "implementation",
249
+ title: "Auto timestamp on create",
250
+ description: "Created as backlog then moved to in progress",
251
+ status: "backlog",
252
+ priority: 3,
253
+ est_tokens: 110
254
+ }
255
+ });
256
+ const createdTask = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-005");
257
+ expect(createdTask?.in_progress_at).toBeNull();
258
+ expect(createdTask?.finished_at).toBeNull();
259
+ await router("tools/call", {
260
+ name: "task-update",
261
+ arguments: {
262
+ repo: REPO,
263
+ id: createdTask.id,
264
+ status: "in_progress",
265
+ comment: "Starting work",
266
+ agent: "Agent D",
267
+ role: "backend"
268
+ }
269
+ });
270
+ const inProgressTask = db.getTaskById(createdTask.id);
271
+ expect(inProgressTask.in_progress_at).toBeTruthy();
272
+ await router("tools/call", {
273
+ name: "task-update",
274
+ arguments: {
275
+ repo: REPO,
276
+ id: createdTask.id,
277
+ status: "completed",
278
+ comment: "Done without providing timestamps manually",
279
+ agent: "Agent D",
280
+ role: "backend",
281
+ est_tokens: 210
282
+ }
283
+ });
284
+ const completedTask = db.getTaskById(createdTask.id);
285
+ expect(completedTask.in_progress_at).toBeTruthy();
286
+ expect(completedTask.finished_at).toBeTruthy();
287
+ });
288
+ });
289
+ //# sourceMappingURL=tasks.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.e2e.test.js","sourceRoot":"","sources":["../../../src/mcp/tests/tasks.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tasks.pending-limit-refined.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.pending-limit-refined.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tests/tasks.pending-limit-refined.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,72 @@
1
+ import { describe, it, expect, beforeEach, vi } from "vitest";
2
+ import { handleTaskCreate, handleTaskUpdate } from "../tools/task.manage.js";
3
+ import { SQLiteStore } from "../storage/sqlite.js";
4
+ describe("Task Pending Limit Refined Validation", () => {
5
+ let db;
6
+ let mockVectors;
7
+ const REPO = "test-repo";
8
+ beforeEach(() => {
9
+ db = new SQLiteStore(":memory:");
10
+ mockVectors = {
11
+ upsert: vi.fn().mockResolvedValue(undefined),
12
+ remove: vi.fn().mockResolvedValue(undefined),
13
+ search: vi.fn().mockResolvedValue([])
14
+ };
15
+ });
16
+ async function createManyPending(count) {
17
+ for (let i = 0; i < count; i++) {
18
+ await handleTaskCreate({
19
+ repo: REPO,
20
+ task_code: `TASK-${i}`,
21
+ phase: "test",
22
+ title: "Test Task",
23
+ description: "Test Description",
24
+ status: "pending",
25
+ agent: "test-agent",
26
+ role: "test-role"
27
+ }, db);
28
+ }
29
+ }
30
+ it("should block creating the 11th pending task", async () => {
31
+ await createManyPending(10);
32
+ await expect(handleTaskCreate({
33
+ repo: REPO,
34
+ task_code: "TASK-11",
35
+ phase: "test",
36
+ title: "11th Task",
37
+ description: "Should fail",
38
+ status: "pending",
39
+ agent: "test-agent",
40
+ role: "test-role"
41
+ }, db)).rejects.toThrow(/Maximum of 10 pending tasks reached/);
42
+ });
43
+ it("should ALLOW moving from backlog to pending even if limit reached", async () => {
44
+ await createManyPending(10);
45
+ // Create one backlog task (allowed)
46
+ await handleTaskCreate({
47
+ repo: REPO,
48
+ task_code: "TASK-BACKLOG",
49
+ phase: "test",
50
+ title: "Backlog Task",
51
+ description: "In backlog",
52
+ status: "backlog",
53
+ agent: "test-agent",
54
+ role: "test-role"
55
+ }, db);
56
+ const task = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-BACKLOG");
57
+ // Move to pending (should be ALLOWED now)
58
+ await handleTaskUpdate({
59
+ repo: REPO,
60
+ id: task.id,
61
+ status: "pending",
62
+ comment: "ready to start",
63
+ agent: "test-agent",
64
+ role: "test-role"
65
+ }, db, mockVectors);
66
+ const updatedTask = db.getTaskById(task.id);
67
+ expect(updatedTask.status).toBe("pending");
68
+ const stats = db.getTaskStats(REPO);
69
+ expect(stats.todo).toBe(11);
70
+ });
71
+ });
72
+ //# sourceMappingURL=tasks.pending-limit-refined.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.pending-limit-refined.test.js","sourceRoot":"","sources":["../../../src/mcp/tests/tasks.pending-limit-refined.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,IAAI,EAAe,CAAC;IACpB,IAAI,WAAwB,CAAC;IAC7B,MAAM,IAAI,GAAG,WAAW,CAAC;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;QACjC,WAAW,GAAG;YACZ,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;YAC5C,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;YAC5C,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;SACtC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,iBAAiB,CAAC,KAAa;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,gBAAgB,CAAC;gBACrB,IAAI,EAAE,IAAI;gBACV,SAAS,EAAE,QAAQ,CAAC,EAAE;gBACtB,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,WAAW;gBAClB,WAAW,EAAE,kBAAkB;gBAC/B,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,YAAY;gBACnB,IAAI,EAAE,WAAW;aAClB,EAAE,EAAE,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IAED,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAE5B,MAAM,MAAM,CAAC,gBAAgB,CAAC;YAC5B,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,aAAa;YAC1B,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW;SAClB,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAE5B,oCAAoC;QACpC,MAAM,gBAAgB,CAAC;YACrB,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,cAAc;YACzB,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW;SAClB,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,IAAI,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC;QAE/E,0CAA0C;QAC1C,MAAM,gBAAgB,CAAC;YACrB,IAAI,EAAE,IAAI;YACV,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,gBAAgB;YACzB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW;SAClB,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEpB,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=v2-features.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-features.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tests/v2-features.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,209 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { SQLiteStore } from "../storage/sqlite.js";
3
+ import { handleMemoryStore } from "../tools/memory.store.js";
4
+ import { handleMemorySearch } from "../tools/memory.search.js";
5
+ import { handleMemoryAcknowledge } from "../tools/memory.acknowledge.js";
6
+ import { handleMemoryUpdate } from "../tools/memory.update.js";
7
+ const VALID_UUID_1 = "11111111-1111-4111-a111-111111111111";
8
+ const VALID_UUID_2 = "22222222-2222-4222-a222-222222222222";
9
+ const mockVectors = {
10
+ upsert: vi.fn().mockResolvedValue(undefined),
11
+ remove: vi.fn().mockResolvedValue(undefined),
12
+ search: vi.fn().mockResolvedValue([]),
13
+ };
14
+ function makeEntry(overrides) {
15
+ return {
16
+ id: overrides.id || VALID_UUID_1,
17
+ type: overrides.type || "decision",
18
+ title: overrides.title || "Test Title",
19
+ content: overrides.content || "Test content for memory",
20
+ importance: overrides.importance || 3,
21
+ agent: overrides.agent || "test-agent",
22
+ role: "unknown",
23
+ model: overrides.model || "test-model",
24
+ scope: { repo: overrides.repo || "test-repo" },
25
+ created_at: new Date().toISOString(),
26
+ updated_at: new Date().toISOString(),
27
+ completed_at: null,
28
+ hit_count: 0,
29
+ recall_count: 0,
30
+ last_used_at: null,
31
+ expires_at: null,
32
+ supersedes: overrides.supersedes || null,
33
+ status: overrides.status || "active",
34
+ tags: overrides.tags || [],
35
+ metadata: overrides.metadata || {},
36
+ is_global: overrides.is_global || false,
37
+ };
38
+ }
39
+ describe("V2 Enhanced Memory Features", () => {
40
+ describe("1. Conflict Detection & Supersedes", () => {
41
+ it("should store memories with the file_claim type", async () => {
42
+ const db = new SQLiteStore(":memory:");
43
+ const repo = "file-claim-repo";
44
+ const response = await handleMemoryStore({
45
+ type: "file_claim",
46
+ title: "Claim ownership of migration file",
47
+ content: "Agent A is working on src/storage/sqlite.ts migration changes.",
48
+ importance: 4,
49
+ scope: { repo },
50
+ agent: "test-agent",
51
+ model: "test-model"
52
+ }, db, mockVectors);
53
+ const stored = db.getById(response.data.id);
54
+ expect(stored?.type).toBe("file_claim");
55
+ db.close();
56
+ });
57
+ it("should store structured metadata on memories", async () => {
58
+ const db = new SQLiteStore(":memory:");
59
+ const repo = "metadata-repo";
60
+ const response = await handleMemoryStore({
61
+ type: "decision",
62
+ title: "JSON:API response standard restored",
63
+ content: "Responses must use the JSON:API envelope for consistency.",
64
+ importance: 4,
65
+ scope: { repo },
66
+ agent: "codex",
67
+ role: "rules-optimizer",
68
+ model: "gpt-5.4",
69
+ metadata: {
70
+ source_agent: "codex",
71
+ source_role: "rules-optimizer",
72
+ source_timestamp: "2026-04-03T00:00:00.000Z"
73
+ }
74
+ }, db, mockVectors);
75
+ const stored = db.getById(response.data.id);
76
+ expect(stored?.metadata).toEqual({
77
+ source_agent: "codex",
78
+ source_role: "rules-optimizer",
79
+ source_timestamp: "2026-04-03T00:00:00.000Z"
80
+ });
81
+ db.close();
82
+ });
83
+ it("should reject titles that look like embedded metadata", async () => {
84
+ const db = new SQLiteStore(":memory:");
85
+ await expect(handleMemoryStore({
86
+ type: "decision",
87
+ title: "[agent: codex | role: rules-optimizer | 2026-04-03] JSON:API response standard restored",
88
+ content: "Responses must use the JSON:API envelope for consistency.",
89
+ importance: 4,
90
+ scope: { repo: "metadata-guard-repo" },
91
+ agent: "codex",
92
+ role: "rules-optimizer",
93
+ model: "gpt-5.4"
94
+ }, db, mockVectors)).rejects.toThrow("Title appears to contain metadata");
95
+ db.close();
96
+ });
97
+ it("should reject a new memory if a similar one exists (>0.85) and no supersedes is provided", async () => {
98
+ const db = new SQLiteStore(":memory:");
99
+ const repo = "conflict-repo";
100
+ db.insert(makeEntry({ id: VALID_UUID_1, repo, content: "React frontend" }));
101
+ mockVectors.search = vi.fn().mockResolvedValue([{ id: VALID_UUID_1, score: 0.9 }]);
102
+ const params = {
103
+ type: "decision",
104
+ title: "Conflict Test",
105
+ content: "React frontend again",
106
+ importance: 5,
107
+ scope: { repo },
108
+ agent: "test-agent",
109
+ model: "test-model"
110
+ };
111
+ const response = await handleMemoryStore(params, db, mockVectors);
112
+ expect(response.content[0].text).toContain("conflict");
113
+ db.close();
114
+ });
115
+ it("should archive old memory when superseded", async () => {
116
+ const db = new SQLiteStore(":memory:");
117
+ const repo = "supersede-repo";
118
+ db.insert(makeEntry({ id: VALID_UUID_1, repo }));
119
+ const params = {
120
+ type: "decision",
121
+ title: "New One",
122
+ content: "Better content",
123
+ importance: 5,
124
+ scope: { repo },
125
+ agent: "test-agent",
126
+ model: "test-model",
127
+ supersedes: VALID_UUID_1
128
+ };
129
+ await handleMemoryStore(params, db, mockVectors);
130
+ const old = db.getById(VALID_UUID_1);
131
+ expect(old?.status).toBe("archived");
132
+ db.close();
133
+ });
134
+ });
135
+ describe("2. Strict Search Threshold (0.72)", () => {
136
+ it("should filter out results using dynamic threshold", async () => {
137
+ const db = new SQLiteStore(":memory:");
138
+ const repo = "threshold-repo";
139
+ db.insert(makeEntry({ id: VALID_UUID_1, repo, content: "Target" }));
140
+ db.insert(makeEntry({ id: VALID_UUID_2, repo, content: "Noisy" }));
141
+ // Adding more memories to force a stricter threshold (> 5 memories)
142
+ for (let i = 0; i < 5; i++) {
143
+ db.insert(makeEntry({ id: `00000000-0000-4000-a000-00000000000${i + 3}`, repo, content: "Irrelevant" }));
144
+ }
145
+ mockVectors.search = vi.fn().mockResolvedValue([
146
+ { id: VALID_UUID_1, score: 0.8 },
147
+ { id: VALID_UUID_2, score: 0.2 }, // Should be filtered out if threshold is high
148
+ { id: "00000000-0000-4000-a000-000000000003", score: 0.1 }
149
+ ]);
150
+ const params = { query: "Target", repo };
151
+ const response = await handleMemorySearch(params, db, mockVectors);
152
+ const text = response.content[0].text;
153
+ // With > 5 memories, threshold should be 0.40
154
+ expect(text).toContain("Found 1 memories");
155
+ db.close();
156
+ });
157
+ });
158
+ describe("3. Feedback Loop", () => {
159
+ it("should allow updating memory type to file_claim", async () => {
160
+ const db = new SQLiteStore(":memory:");
161
+ db.insert(makeEntry({ id: VALID_UUID_1, type: "decision" }));
162
+ await handleMemoryUpdate({
163
+ id: VALID_UUID_1,
164
+ type: "file_claim"
165
+ }, db, mockVectors);
166
+ const updated = db.getById(VALID_UUID_1);
167
+ expect(updated?.type).toBe("file_claim");
168
+ db.close();
169
+ });
170
+ it("should allow updating memory metadata", async () => {
171
+ const db = new SQLiteStore(":memory:");
172
+ db.insert(makeEntry({ id: VALID_UUID_1, metadata: { source_agent: "old-agent" } }));
173
+ await handleMemoryUpdate({
174
+ id: VALID_UUID_1,
175
+ metadata: {
176
+ source_agent: "codex",
177
+ source_role: "rules-optimizer"
178
+ }
179
+ }, db, mockVectors);
180
+ const updated = db.getById(VALID_UUID_1);
181
+ expect(updated?.metadata).toEqual({
182
+ source_agent: "codex",
183
+ source_role: "rules-optimizer"
184
+ });
185
+ db.close();
186
+ });
187
+ it("should reject metadata-like titles on update", async () => {
188
+ const db = new SQLiteStore(":memory:");
189
+ db.insert(makeEntry({ id: VALID_UUID_1, title: "Clean title" }));
190
+ await expect(handleMemoryUpdate({
191
+ id: VALID_UUID_1,
192
+ title: "[agent: codex | role: rules-optimizer | 2026-04-03] Noisy title"
193
+ }, db, mockVectors)).rejects.toThrow("Title appears to contain metadata");
194
+ db.close();
195
+ });
196
+ it("should increment recall_count on 'used'", async () => {
197
+ const db = new SQLiteStore(":memory:");
198
+ db.insert(makeEntry({ id: VALID_UUID_1 }));
199
+ await handleMemoryAcknowledge({
200
+ memory_id: VALID_UUID_1,
201
+ status: "used"
202
+ }, db);
203
+ const updated = db.getById(VALID_UUID_1);
204
+ expect(updated?.recall_count).toBe(1);
205
+ db.close();
206
+ });
207
+ });
208
+ });
209
+ //# sourceMappingURL=v2-features.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-features.test.js","sourceRoot":"","sources":["../../../src/mcp/tests/v2-features.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { SQLiteStore } from "../storage/sqlite.js";
2
+ import { McpResponse } from "../utils/mcp-response.js";
3
+ export declare function handleMemoryAcknowledge(params: any, db: SQLiteStore): Promise<McpResponse>;
4
+ //# sourceMappingURL=memory.acknowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.acknowledge.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.acknowledge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,WAAW,CAAC,CA6BtB"}