@vheins/local-memory-mcp 0.4.11 → 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 (204) 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 -1744
  6. package/dist/dashboard/server.js +219 -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/prompts/registry.d.ts.map +1 -1
  195. package/dist/prompts/registry.js +22 -33
  196. package/dist/prompts/registry.js.map +1 -1
  197. package/dist/storage/sqlite.d.ts +7 -0
  198. package/dist/storage/sqlite.d.ts.map +1 -1
  199. package/dist/storage/sqlite.js +84 -2
  200. package/dist/storage/sqlite.js.map +1 -1
  201. package/package.json +16 -5
  202. package/dist/dashboard/public/app.js +0 -2521
  203. package/dist/dashboard/public/chart.js +0 -0
  204. package/dist/dashboard/public/screenshot.png +0 -0
@@ -0,0 +1,174 @@
1
+ import { describe, it, expect, beforeEach, vi } from "vitest";
2
+ import { handleTaskUpdate, handleTaskCreate } from "../tools/task.manage.js";
3
+ import { SQLiteStore } from "../storage/sqlite.js";
4
+ describe("Task Status Transitions", () => {
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 createTask(taskCode, status) {
17
+ return await handleTaskCreate({
18
+ repo: REPO,
19
+ task_code: taskCode,
20
+ phase: "test",
21
+ title: "Test Task",
22
+ description: "Test Description",
23
+ status: status,
24
+ agent: "test-agent",
25
+ role: "test-role"
26
+ }, db);
27
+ }
28
+ it("should block transition from backlog to completed", async () => {
29
+ await createTask("TASK-001", "backlog");
30
+ const task = db.getTasksByRepo(REPO)[0];
31
+ await expect(handleTaskUpdate({
32
+ repo: REPO,
33
+ id: task.id,
34
+ status: "completed",
35
+ comment: "finishing",
36
+ est_tokens: 100,
37
+ agent: "test-agent",
38
+ role: "test-role"
39
+ }, db, mockVectors)).rejects.toThrow("Cannot transition directly from 'backlog' to 'completed'. Task must be 'in_progress' first.");
40
+ });
41
+ it("should allow transition from backlog to pending", async () => {
42
+ await createTask("TASK-001", "backlog");
43
+ const task = db.getTasksByRepo(REPO)[0];
44
+ await handleTaskUpdate({
45
+ repo: REPO,
46
+ id: task.id,
47
+ status: "pending",
48
+ comment: "ready for execution",
49
+ agent: "test-agent",
50
+ role: "test-role"
51
+ }, db, mockVectors);
52
+ const updatedTask = db.getTaskById(task.id);
53
+ expect(updatedTask.status).toBe("pending");
54
+ });
55
+ it("should block transition from pending to completed", async () => {
56
+ await createTask("TASK-001", "pending");
57
+ const task = db.getTasksByRepo(REPO)[0];
58
+ await expect(handleTaskUpdate({
59
+ repo: REPO,
60
+ id: task.id,
61
+ status: "completed",
62
+ comment: "finishing",
63
+ est_tokens: 100,
64
+ agent: "test-agent",
65
+ role: "test-role"
66
+ }, db, mockVectors)).rejects.toThrow("Cannot transition directly from 'pending' to 'completed'. Task must be 'in_progress' first.");
67
+ });
68
+ it("should allow transition from pending to in_progress", async () => {
69
+ await createTask("TASK-001", "pending");
70
+ const task = db.getTasksByRepo(REPO)[0];
71
+ await handleTaskUpdate({
72
+ repo: REPO,
73
+ id: task.id,
74
+ status: "in_progress",
75
+ comment: "starting",
76
+ agent: "test-agent",
77
+ role: "test-role"
78
+ }, db, mockVectors);
79
+ const updatedTask = db.getTaskById(task.id);
80
+ expect(updatedTask.status).toBe("in_progress");
81
+ });
82
+ it("should allow transition from in_progress to completed", async () => {
83
+ await createTask("TASK-001", "pending");
84
+ const task = db.getTasksByRepo(REPO)[0];
85
+ // to in_progress first
86
+ await handleTaskUpdate({
87
+ repo: REPO,
88
+ id: task.id,
89
+ status: "in_progress",
90
+ comment: "starting",
91
+ agent: "test-agent",
92
+ role: "test-role"
93
+ }, db, mockVectors);
94
+ await handleTaskUpdate({
95
+ repo: REPO,
96
+ id: task.id,
97
+ status: "completed",
98
+ comment: "done",
99
+ est_tokens: 100,
100
+ agent: "test-agent",
101
+ role: "test-role"
102
+ }, db, mockVectors);
103
+ const updatedTask = db.getTaskById(task.id);
104
+ expect(updatedTask.status).toBe("completed");
105
+ });
106
+ it("should allow transition to blocked and back", async () => {
107
+ await createTask("TASK-001", "pending");
108
+ const task = db.getTasksByRepo(REPO)[0];
109
+ // to in_progress first
110
+ await handleTaskUpdate({
111
+ repo: REPO,
112
+ id: task.id,
113
+ status: "in_progress",
114
+ comment: "starting",
115
+ agent: "test-agent",
116
+ role: "test-role"
117
+ }, db, mockVectors);
118
+ // to blocked
119
+ await handleTaskUpdate({
120
+ repo: REPO,
121
+ id: task.id,
122
+ status: "blocked",
123
+ comment: "waiting for feedback",
124
+ agent: "test-agent",
125
+ role: "test-role"
126
+ }, db, mockVectors);
127
+ expect(db.getTaskById(task.id).status).toBe("blocked");
128
+ // back to in_progress
129
+ await handleTaskUpdate({
130
+ repo: REPO,
131
+ id: task.id,
132
+ status: "in_progress",
133
+ comment: "feedback received",
134
+ agent: "test-agent",
135
+ role: "test-role"
136
+ }, db, mockVectors);
137
+ expect(db.getTaskById(task.id).status).toBe("in_progress");
138
+ // to blocked from pending
139
+ await createTask("TASK-002", "pending");
140
+ const task2 = db.getTasksByRepo(REPO).find(t => t.task_code === "TASK-002");
141
+ await handleTaskUpdate({
142
+ repo: REPO,
143
+ id: task2.id,
144
+ status: "blocked",
145
+ comment: "blocked early",
146
+ agent: "test-agent",
147
+ role: "test-role"
148
+ }, db, mockVectors);
149
+ expect(db.getTaskById(task2.id).status).toBe("blocked");
150
+ });
151
+ it("should block transition from blocked to completed", async () => {
152
+ await createTask("TASK-001", "pending");
153
+ const task = db.getTasksByRepo(REPO)[0];
154
+ // to blocked
155
+ await handleTaskUpdate({
156
+ repo: REPO,
157
+ id: task.id,
158
+ status: "blocked",
159
+ comment: "blocked",
160
+ agent: "test-agent",
161
+ role: "test-role"
162
+ }, db, mockVectors);
163
+ await expect(handleTaskUpdate({
164
+ repo: REPO,
165
+ id: task.id,
166
+ status: "completed",
167
+ comment: "finishing anyway",
168
+ est_tokens: 100,
169
+ agent: "test-agent",
170
+ role: "test-role"
171
+ }, db, mockVectors)).rejects.toThrow("Cannot transition directly from 'blocked' to 'completed'. Task must be 'in_progress' first.");
172
+ });
173
+ });
174
+ //# sourceMappingURL=tasks-transition.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks-transition.test.js","sourceRoot":"","sources":["../../../src/mcp/tests/tasks-transition.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tasks.bulk.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.bulk.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tests/tasks.bulk.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,254 @@
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
+ function getTextContent(result) {
6
+ const entry = result.content[0];
7
+ return entry?.type === "text" ? entry.text : "";
8
+ }
9
+ describe("MCP Local Memory - Bulk Task Management", () => {
10
+ let db;
11
+ let vectors;
12
+ let router;
13
+ const REPO = "bulk-test-repo";
14
+ beforeEach(() => {
15
+ db = new SQLiteStore(":memory:");
16
+ vectors = new StubVectorStore(db);
17
+ router = createRouter(db, vectors);
18
+ });
19
+ it("should create multiple tasks in one call", async () => {
20
+ const res = await router("tools/call", {
21
+ name: "task-bulk-manage",
22
+ arguments: {
23
+ action: "bulk_create",
24
+ repo: REPO,
25
+ tasks: [
26
+ {
27
+ task_code: "BULK-001",
28
+ title: "First Bulk Task",
29
+ description: "Description 1",
30
+ phase: "research",
31
+ status: "pending",
32
+ priority: 1,
33
+ est_tokens: 50
34
+ },
35
+ {
36
+ task_code: "BULK-002",
37
+ title: "Second Bulk Task",
38
+ description: "Description 2",
39
+ phase: "implementation",
40
+ status: "pending",
41
+ priority: 2,
42
+ est_tokens: 75
43
+ }
44
+ ]
45
+ }
46
+ });
47
+ expect(res.isError).toBe(false);
48
+ expect(getTextContent(res)).toContain("Successfully created 2 tasks");
49
+ const tasks = db.getTasksByRepo(REPO);
50
+ expect(tasks.length).toBe(2);
51
+ expect(tasks.find(t => t.task_code === "BULK-001")).toBeDefined();
52
+ expect(tasks.find(t => t.task_code === "BULK-002")).toBeDefined();
53
+ });
54
+ it("should allow bulk create without est_tokens", async () => {
55
+ const res = await router("tools/call", {
56
+ name: "task-bulk-manage",
57
+ arguments: {
58
+ action: "bulk_create",
59
+ repo: REPO,
60
+ tasks: [
61
+ {
62
+ task_code: "BULK-NO-TOKENS",
63
+ title: "Bulk task without estimate",
64
+ description: "Accepted during planning",
65
+ phase: "research",
66
+ status: "pending"
67
+ }
68
+ ]
69
+ }
70
+ });
71
+ expect(res.isError).toBe(false);
72
+ const task = db.getTasksByRepo(REPO).find(t => t.task_code === "BULK-NO-TOKENS");
73
+ expect(task?.est_tokens).toBe(0);
74
+ });
75
+ it("should enforce default limit of 15 and support pagination", async () => {
76
+ // Create 20 tasks
77
+ const manyTasks = Array.from({ length: 20 }, (_, i) => ({
78
+ task_code: `LIMIT-${i.toString().padStart(3, '0')}`,
79
+ title: `Task ${i}`,
80
+ description: `Description ${i}`,
81
+ phase: "research",
82
+ status: "backlog",
83
+ est_tokens: 20 + i
84
+ }));
85
+ await router("tools/call", {
86
+ name: "task-bulk-manage",
87
+ arguments: {
88
+ action: "bulk_create",
89
+ repo: REPO,
90
+ tasks: manyTasks
91
+ }
92
+ });
93
+ // Test default limit (15)
94
+ const defaultRes = await router("tools/call", {
95
+ name: "task-list",
96
+ arguments: { repo: REPO }
97
+ });
98
+ const defaultTasks = JSON.parse(getTextContent(defaultRes));
99
+ expect(defaultTasks.length).toBe(15);
100
+ // Test explicit limit
101
+ const limitRes = await router("tools/call", {
102
+ name: "task-list",
103
+ arguments: { repo: REPO, limit: 5 }
104
+ });
105
+ const limitedTasks = JSON.parse(getTextContent(limitRes));
106
+ expect(limitedTasks.length).toBe(5);
107
+ // Test offset (last page)
108
+ const offsetRes = await router("tools/call", {
109
+ name: "task-list",
110
+ arguments: { repo: REPO, limit: 15, offset: 15 }
111
+ });
112
+ const offsetTasks = JSON.parse(getTextContent(offsetRes));
113
+ expect(offsetTasks.length).toBe(5); // 20 total - 15 offset = 5 remaining
114
+ });
115
+ it("should prevent duplicate task_codes in the same request", async () => {
116
+ const promise = router("tools/call", {
117
+ name: "task-bulk-manage",
118
+ arguments: {
119
+ action: "bulk_create",
120
+ repo: REPO,
121
+ tasks: [
122
+ { task_code: "DUP-001", title: "Task 1", description: "D", phase: "p", status: "pending", est_tokens: 10 },
123
+ { task_code: "DUP-001", title: "Task 2", description: "D", phase: "p", status: "pending", est_tokens: 12 }
124
+ ]
125
+ }
126
+ });
127
+ await expect(promise).rejects.toThrow("Duplicate task_code in request");
128
+ });
129
+ it("should prevent duplicate task_codes against existing tasks", async () => {
130
+ // Create first task
131
+ await router("tools/call", {
132
+ name: "task-create",
133
+ arguments: {
134
+ repo: REPO,
135
+ task_code: "EXISTING-001",
136
+ title: "Initial",
137
+ description: "D",
138
+ phase: "p",
139
+ status: "pending",
140
+ est_tokens: 25
141
+ }
142
+ });
143
+ // Try to create another one with same code (via bulk)
144
+ const bulkPromise = router("tools/call", {
145
+ name: "task-bulk-manage",
146
+ arguments: {
147
+ action: "bulk_create",
148
+ repo: REPO,
149
+ tasks: [
150
+ { task_code: "EXISTING-001", title: "Duplicate", description: "D", phase: "p", status: "pending", est_tokens: 30 }
151
+ ]
152
+ }
153
+ });
154
+ await expect(bulkPromise).rejects.toThrow("already exists");
155
+ // Try via single create
156
+ const singlePromise = router("tools/call", {
157
+ name: "task-create",
158
+ arguments: {
159
+ repo: REPO,
160
+ task_code: "EXISTING-001",
161
+ title: "Duplicate",
162
+ description: "D",
163
+ phase: "p",
164
+ status: "pending",
165
+ est_tokens: 30
166
+ }
167
+ });
168
+ await expect(singlePromise).rejects.toThrow("already exists");
169
+ });
170
+ it("should bulk delete tasks", async () => {
171
+ // Create 3 tasks
172
+ await router("tools/call", {
173
+ name: "task-bulk-manage",
174
+ arguments: {
175
+ action: "bulk_create",
176
+ repo: REPO,
177
+ tasks: [
178
+ { task_code: "DEL-1", title: "Task 1", description: "Desc 1", phase: "p", status: "pending", est_tokens: 15 },
179
+ { task_code: "DEL-2", title: "Task 2", description: "Desc 2", phase: "p", status: "pending", est_tokens: 16 },
180
+ { task_code: "DEL-3", title: "Task 3", description: "Desc 3", phase: "p", status: "pending", est_tokens: 17 }
181
+ ]
182
+ }
183
+ });
184
+ const tasks = db.getTasksByRepo(REPO);
185
+ const idsToDelete = [tasks[0].id, tasks[1].id];
186
+ const delRes = await router("tools/call", {
187
+ name: "task-bulk-manage",
188
+ arguments: {
189
+ action: "bulk_delete",
190
+ repo: REPO,
191
+ ids: idsToDelete
192
+ }
193
+ });
194
+ expect(getTextContent(delRes)).toContain("Successfully deleted 2 tasks");
195
+ const remainingTasks = db.getTasksByRepo(REPO);
196
+ expect(remainingTasks.length).toBe(1);
197
+ });
198
+ it("auto-populates timestamps from status so agents do not need to send them manually", async () => {
199
+ await router("tools/call", {
200
+ name: "task-bulk-manage",
201
+ arguments: {
202
+ action: "bulk_create",
203
+ repo: REPO,
204
+ tasks: [
205
+ { task_code: "TS-1", title: "To Start", description: "Desc", phase: "p", status: "backlog", est_tokens: 40 },
206
+ { task_code: "TS-2", title: "To Finish", description: "Desc", phase: "p", status: "backlog", est_tokens: 60 }
207
+ ]
208
+ }
209
+ });
210
+ const tasks = db.getTasksByRepo(REPO);
211
+ const ts1 = tasks.find(t => t.task_code === "TS-1");
212
+ const ts2 = tasks.find(t => t.task_code === "TS-2");
213
+ await router("tools/call", {
214
+ name: "task-update",
215
+ arguments: {
216
+ repo: REPO,
217
+ id: ts1.id,
218
+ status: "in_progress",
219
+ comment: "Starting TS-1",
220
+ agent: "Agent-1",
221
+ role: "tester"
222
+ }
223
+ });
224
+ await router("tools/call", {
225
+ name: "task-update",
226
+ arguments: {
227
+ repo: REPO,
228
+ id: ts2.id,
229
+ status: "in_progress",
230
+ comment: "Starting TS-2",
231
+ agent: "Agent-1",
232
+ role: "tester"
233
+ }
234
+ });
235
+ await router("tools/call", {
236
+ name: "task-update",
237
+ arguments: {
238
+ repo: REPO,
239
+ id: ts2.id,
240
+ status: "completed",
241
+ comment: "Finishing TS-2",
242
+ agent: "Agent-1",
243
+ role: "tester",
244
+ est_tokens: 100
245
+ }
246
+ });
247
+ const started = db.getTaskById(ts1.id);
248
+ const done = db.getTaskById(ts2.id);
249
+ expect(started?.in_progress_at).toBeTruthy();
250
+ expect(started?.finished_at).toBeNull();
251
+ expect(done?.finished_at).toBeTruthy();
252
+ });
253
+ });
254
+ //# sourceMappingURL=tasks.bulk.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.bulk.test.js","sourceRoot":"","sources":["../../../src/mcp/tests/tasks.bulk.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tasks.e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tests/tasks.e2e.test.ts"],"names":[],"mappings":""}