@langadventurellc/task-trellis-mcp 1.0.1 → 1.1.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 (207) hide show
  1. package/README.md +47 -67
  2. package/dist/__tests__/e2e/crud/createObject.e2e.test.js +64 -12
  3. package/dist/__tests__/e2e/crud/createObject.e2e.test.js.map +1 -1
  4. package/dist/__tests__/e2e/crud/listObjects.e2e.test.js +260 -90
  5. package/dist/__tests__/e2e/crud/listObjects.e2e.test.js.map +1 -1
  6. package/dist/__tests__/e2e/utils/extractObjectIds.d.ts +5 -0
  7. package/dist/__tests__/e2e/utils/extractObjectIds.d.ts.map +1 -0
  8. package/dist/__tests__/e2e/utils/extractObjectIds.js +12 -0
  9. package/dist/__tests__/e2e/utils/extractObjectIds.js.map +1 -0
  10. package/dist/__tests__/e2e/utils/index.d.ts +1 -0
  11. package/dist/__tests__/e2e/utils/index.d.ts.map +1 -1
  12. package/dist/__tests__/e2e/utils/index.js +3 -1
  13. package/dist/__tests__/e2e/utils/index.js.map +1 -1
  14. package/dist/__tests__/e2e/utils/mcpTestClient.d.ts +2 -1
  15. package/dist/__tests__/e2e/utils/mcpTestClient.d.ts.map +1 -1
  16. package/dist/__tests__/e2e/utils/mcpTestClient.js +14 -8
  17. package/dist/__tests__/e2e/utils/mcpTestClient.js.map +1 -1
  18. package/dist/__tests__/e2e/utils/parseListObjectsResponse.d.ts +3 -1
  19. package/dist/__tests__/e2e/utils/parseListObjectsResponse.d.ts.map +1 -1
  20. package/dist/__tests__/e2e/utils/parseListObjectsResponse.js +1 -0
  21. package/dist/__tests__/e2e/utils/parseListObjectsResponse.js.map +1 -1
  22. package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.d.ts +2 -0
  23. package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.d.ts.map +1 -0
  24. package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.js +597 -0
  25. package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.js.map +1 -0
  26. package/dist/__tests__/e2e/workflow/claimTask.e2e.test.js +189 -0
  27. package/dist/__tests__/e2e/workflow/claimTask.e2e.test.js.map +1 -1
  28. package/dist/__tests__/e2e/workflow/completeTask.e2e.test.js +446 -0
  29. package/dist/__tests__/e2e/workflow/completeTask.e2e.test.js.map +1 -1
  30. package/dist/__tests__/e2e/workflow/taskLifecycle.e2e.test.js +3 -7
  31. package/dist/__tests__/e2e/workflow/taskLifecycle.e2e.test.js.map +1 -1
  32. package/dist/configuration/ServerConfig.d.ts +1 -0
  33. package/dist/configuration/ServerConfig.d.ts.map +1 -1
  34. package/dist/models/TrellisObjectSummary.d.ts +16 -0
  35. package/dist/models/TrellisObjectSummary.d.ts.map +1 -0
  36. package/dist/models/TrellisObjectSummary.js +3 -0
  37. package/dist/models/TrellisObjectSummary.js.map +1 -0
  38. package/dist/models/index.d.ts +1 -0
  39. package/dist/models/index.d.ts.map +1 -1
  40. package/dist/models/index.js.map +1 -1
  41. package/dist/repositories/local/__tests__/getObjectFilePath.test.js +9 -6
  42. package/dist/repositories/local/__tests__/getObjectFilePath.test.js.map +1 -1
  43. package/dist/repositories/local/__tests__/getObjects.test.js +40 -10
  44. package/dist/repositories/local/__tests__/getObjects.test.js.map +1 -1
  45. package/dist/repositories/local/getObjectFilePath.d.ts.map +1 -1
  46. package/dist/repositories/local/getObjectFilePath.js +8 -4
  47. package/dist/repositories/local/getObjectFilePath.js.map +1 -1
  48. package/dist/repositories/local/getObjects.d.ts.map +1 -1
  49. package/dist/repositories/local/getObjects.js +6 -1
  50. package/dist/repositories/local/getObjects.js.map +1 -1
  51. package/dist/server.js +23 -9
  52. package/dist/server.js.map +1 -1
  53. package/dist/services/TaskTrellisService.d.ts +87 -0
  54. package/dist/services/TaskTrellisService.d.ts.map +1 -0
  55. package/dist/services/TaskTrellisService.js +3 -0
  56. package/dist/services/TaskTrellisService.js.map +1 -0
  57. package/dist/services/local/LocalTaskTrellisService.d.ts +61 -0
  58. package/dist/services/local/LocalTaskTrellisService.d.ts.map +1 -0
  59. package/dist/services/local/LocalTaskTrellisService.js +77 -0
  60. package/dist/services/local/LocalTaskTrellisService.js.map +1 -0
  61. package/dist/services/local/__tests__/appendAffectedFiles.test.d.ts +2 -0
  62. package/dist/services/local/__tests__/appendAffectedFiles.test.d.ts.map +1 -0
  63. package/dist/services/local/__tests__/appendAffectedFiles.test.js +202 -0
  64. package/dist/services/local/__tests__/appendAffectedFiles.test.js.map +1 -0
  65. package/dist/services/local/__tests__/appendModifiedFiles.test.d.ts +2 -0
  66. package/dist/services/local/__tests__/appendModifiedFiles.test.d.ts.map +1 -0
  67. package/dist/services/local/__tests__/appendModifiedFiles.test.js +161 -0
  68. package/dist/services/local/__tests__/appendModifiedFiles.test.js.map +1 -0
  69. package/dist/services/local/__tests__/appendObjectLog.test.d.ts +2 -0
  70. package/dist/services/local/__tests__/appendObjectLog.test.d.ts.map +1 -0
  71. package/dist/services/local/__tests__/appendObjectLog.test.js +104 -0
  72. package/dist/services/local/__tests__/appendObjectLog.test.js.map +1 -0
  73. package/dist/services/local/__tests__/claimTask.test.d.ts +2 -0
  74. package/dist/services/local/__tests__/claimTask.test.d.ts.map +1 -0
  75. package/dist/services/local/__tests__/claimTask.test.js +463 -0
  76. package/dist/services/local/__tests__/claimTask.test.js.map +1 -0
  77. package/dist/services/local/__tests__/completeTask.test.d.ts +2 -0
  78. package/dist/services/local/__tests__/completeTask.test.d.ts.map +1 -0
  79. package/dist/services/local/__tests__/completeTask.test.js +468 -0
  80. package/dist/services/local/__tests__/completeTask.test.js.map +1 -0
  81. package/dist/services/local/__tests__/createObject.test.d.ts +2 -0
  82. package/dist/services/local/__tests__/createObject.test.d.ts.map +1 -0
  83. package/dist/services/local/__tests__/createObject.test.js +332 -0
  84. package/dist/services/local/__tests__/createObject.test.js.map +1 -0
  85. package/dist/services/local/__tests__/listObjects.test.d.ts +2 -0
  86. package/dist/services/local/__tests__/listObjects.test.d.ts.map +1 -0
  87. package/dist/services/local/__tests__/listObjects.test.js +226 -0
  88. package/dist/services/local/__tests__/listObjects.test.js.map +1 -0
  89. package/dist/services/local/__tests__/pruneClosed.test.d.ts +2 -0
  90. package/dist/services/local/__tests__/pruneClosed.test.d.ts.map +1 -0
  91. package/dist/services/local/__tests__/pruneClosed.test.js +213 -0
  92. package/dist/services/local/__tests__/pruneClosed.test.js.map +1 -0
  93. package/dist/services/local/__tests__/replaceObjectBodyRegex.test.d.ts +2 -0
  94. package/dist/services/local/__tests__/replaceObjectBodyRegex.test.d.ts.map +1 -0
  95. package/dist/services/local/__tests__/replaceObjectBodyRegex.test.js +283 -0
  96. package/dist/services/local/__tests__/replaceObjectBodyRegex.test.js.map +1 -0
  97. package/dist/services/local/__tests__/updateObject.test.d.ts +2 -0
  98. package/dist/services/local/__tests__/updateObject.test.d.ts.map +1 -0
  99. package/dist/services/local/__tests__/updateObject.test.js +314 -0
  100. package/dist/services/local/__tests__/updateObject.test.js.map +1 -0
  101. package/dist/services/local/appendAffectedFiles.d.ts +12 -0
  102. package/dist/services/local/appendAffectedFiles.d.ts.map +1 -0
  103. package/dist/services/local/appendAffectedFiles.js +34 -0
  104. package/dist/services/local/appendAffectedFiles.js.map +1 -0
  105. package/dist/services/local/appendModifiedFiles.d.ts +15 -0
  106. package/dist/services/local/appendModifiedFiles.d.ts.map +1 -0
  107. package/dist/services/local/appendModifiedFiles.js +39 -0
  108. package/dist/services/local/appendModifiedFiles.js.map +1 -0
  109. package/dist/services/local/appendObjectLog.d.ts +8 -0
  110. package/dist/services/local/appendObjectLog.d.ts.map +1 -0
  111. package/dist/services/local/appendObjectLog.js +45 -0
  112. package/dist/services/local/appendObjectLog.js.map +1 -0
  113. package/dist/services/local/claimTask.d.ts +8 -0
  114. package/dist/services/local/claimTask.d.ts.map +1 -0
  115. package/dist/services/local/claimTask.js +118 -0
  116. package/dist/services/local/claimTask.js.map +1 -0
  117. package/dist/services/local/completeTask.d.ts +9 -0
  118. package/dist/services/local/completeTask.d.ts.map +1 -0
  119. package/dist/services/local/completeTask.js +74 -0
  120. package/dist/services/local/completeTask.js.map +1 -0
  121. package/dist/services/local/createObject.d.ts +9 -0
  122. package/dist/services/local/createObject.d.ts.map +1 -0
  123. package/dist/services/local/createObject.js +44 -0
  124. package/dist/services/local/createObject.js.map +1 -0
  125. package/dist/services/local/listObjects.d.ts +9 -0
  126. package/dist/services/local/listObjects.d.ts.map +1 -0
  127. package/dist/services/local/listObjects.js +43 -0
  128. package/dist/services/local/listObjects.js.map +1 -0
  129. package/dist/services/local/pruneClosed.d.ts +8 -0
  130. package/dist/services/local/pruneClosed.d.ts.map +1 -0
  131. package/dist/services/local/pruneClosed.js +55 -0
  132. package/dist/services/local/pruneClosed.js.map +1 -0
  133. package/dist/services/local/replaceObjectBodyRegex.d.ts +8 -0
  134. package/dist/services/local/replaceObjectBodyRegex.d.ts.map +1 -0
  135. package/dist/services/local/replaceObjectBodyRegex.js +85 -0
  136. package/dist/services/local/replaceObjectBodyRegex.js.map +1 -0
  137. package/dist/services/local/updateObject.d.ts +9 -0
  138. package/dist/services/local/updateObject.d.ts.map +1 -0
  139. package/dist/services/local/updateObject.js +53 -0
  140. package/dist/services/local/updateObject.js.map +1 -0
  141. package/dist/tools/__tests__/appendModifiedFilesTool.test.d.ts +2 -0
  142. package/dist/tools/__tests__/appendModifiedFilesTool.test.d.ts.map +1 -0
  143. package/dist/tools/__tests__/appendModifiedFilesTool.test.js +177 -0
  144. package/dist/tools/__tests__/appendModifiedFilesTool.test.js.map +1 -0
  145. package/dist/tools/__tests__/appendObjectLogTool.test.js +33 -101
  146. package/dist/tools/__tests__/appendObjectLogTool.test.js.map +1 -1
  147. package/dist/tools/__tests__/claimTaskTool.test.js +98 -311
  148. package/dist/tools/__tests__/claimTaskTool.test.js.map +1 -1
  149. package/dist/tools/__tests__/completeTaskTool.test.js +134 -184
  150. package/dist/tools/__tests__/completeTaskTool.test.js.map +1 -1
  151. package/dist/tools/__tests__/createObjectTool.test.js +61 -325
  152. package/dist/tools/__tests__/createObjectTool.test.js.map +1 -1
  153. package/dist/tools/__tests__/listObjectsTool.test.js +70 -109
  154. package/dist/tools/__tests__/listObjectsTool.test.js.map +1 -1
  155. package/dist/tools/__tests__/pruneClosedTool.test.js +87 -146
  156. package/dist/tools/__tests__/pruneClosedTool.test.js.map +1 -1
  157. package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.js +56 -225
  158. package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.js.map +1 -1
  159. package/dist/tools/__tests__/updateObjectTool.test.js +48 -166
  160. package/dist/tools/__tests__/updateObjectTool.test.js.map +1 -1
  161. package/dist/tools/appendModifiedFilesTool.d.ts +30 -0
  162. package/dist/tools/appendModifiedFilesTool.d.ts.map +1 -0
  163. package/dist/tools/appendModifiedFilesTool.js +55 -0
  164. package/dist/tools/appendModifiedFilesTool.js.map +1 -0
  165. package/dist/tools/appendObjectLogTool.d.ts +4 -3
  166. package/dist/tools/appendObjectLogTool.d.ts.map +1 -1
  167. package/dist/tools/appendObjectLogTool.js +2 -40
  168. package/dist/tools/appendObjectLogTool.js.map +1 -1
  169. package/dist/tools/claimTaskTool.d.ts +4 -3
  170. package/dist/tools/claimTaskTool.d.ts.map +1 -1
  171. package/dist/tools/claimTaskTool.js +2 -80
  172. package/dist/tools/claimTaskTool.js.map +1 -1
  173. package/dist/tools/completeTaskTool.d.ts +5 -3
  174. package/dist/tools/completeTaskTool.d.ts.map +1 -1
  175. package/dist/tools/completeTaskTool.js +3 -29
  176. package/dist/tools/completeTaskTool.js.map +1 -1
  177. package/dist/tools/createObjectTool.d.ts +7 -6
  178. package/dist/tools/createObjectTool.d.ts.map +1 -1
  179. package/dist/tools/createObjectTool.js +11 -44
  180. package/dist/tools/createObjectTool.js.map +1 -1
  181. package/dist/tools/index.d.ts +1 -0
  182. package/dist/tools/index.d.ts.map +1 -1
  183. package/dist/tools/index.js +4 -1
  184. package/dist/tools/index.js.map +1 -1
  185. package/dist/tools/listObjectsTool.d.ts +5 -4
  186. package/dist/tools/listObjectsTool.d.ts.map +1 -1
  187. package/dist/tools/listObjectsTool.js +5 -13
  188. package/dist/tools/listObjectsTool.js.map +1 -1
  189. package/dist/tools/pruneClosedTool.d.ts +4 -3
  190. package/dist/tools/pruneClosedTool.d.ts.map +1 -1
  191. package/dist/tools/pruneClosedTool.js +2 -51
  192. package/dist/tools/pruneClosedTool.js.map +1 -1
  193. package/dist/tools/replaceObjectBodyRegexTool.d.ts +4 -3
  194. package/dist/tools/replaceObjectBodyRegexTool.d.ts.map +1 -1
  195. package/dist/tools/replaceObjectBodyRegexTool.js +2 -80
  196. package/dist/tools/replaceObjectBodyRegexTool.js.map +1 -1
  197. package/dist/tools/updateObjectTool.d.ts +5 -4
  198. package/dist/tools/updateObjectTool.d.ts.map +1 -1
  199. package/dist/tools/updateObjectTool.js +3 -49
  200. package/dist/tools/updateObjectTool.js.map +1 -1
  201. package/dist/validation/__tests__/validateParentType.test.js +5 -5
  202. package/dist/validation/__tests__/validateParentType.test.js.map +1 -1
  203. package/dist/validation/validateParentType.d.ts +1 -1
  204. package/dist/validation/validateParentType.d.ts.map +1 -1
  205. package/dist/validation/validateParentType.js +2 -5
  206. package/dist/validation/validateParentType.js.map +1 -1
  207. package/package.json +1 -1
@@ -4,6 +4,7 @@ const models_1 = require("../../models");
4
4
  const listObjectsTool_1 = require("../listObjectsTool");
5
5
  describe("listObjectsTool", () => {
6
6
  let mockRepository;
7
+ let mockService;
7
8
  beforeEach(() => {
8
9
  mockRepository = {
9
10
  getObjectById: jest.fn(),
@@ -11,91 +12,80 @@ describe("listObjectsTool", () => {
11
12
  saveObject: jest.fn(),
12
13
  deleteObject: jest.fn(),
13
14
  };
15
+ mockService = {
16
+ createObject: jest.fn(),
17
+ updateObject: jest.fn(),
18
+ claimTask: jest.fn(),
19
+ completeTask: jest.fn(),
20
+ listObjects: jest.fn(),
21
+ appendObjectLog: jest.fn(),
22
+ pruneClosed: jest.fn(),
23
+ replaceObjectBodyRegex: jest.fn(),
24
+ appendModifiedFiles: jest.fn(),
25
+ };
14
26
  // Reset mocks
15
27
  jest.clearAllMocks();
16
28
  });
17
29
  describe("handleListObjects", () => {
18
- const mockObjects = [
30
+ const mockSummaries = [
19
31
  {
20
32
  id: "P-project-1",
21
- type: models_1.TrellisObjectType.PROJECT,
33
+ type: "project",
22
34
  title: "Project 1",
23
- status: models_1.TrellisObjectStatus.OPEN,
24
- priority: models_1.TrellisObjectPriority.HIGH,
35
+ status: "open",
36
+ priority: "high",
25
37
  prerequisites: [],
26
- affectedFiles: new Map(),
27
- log: [],
28
- schema: "v1.0",
29
38
  childrenIds: [],
30
- body: "Project 1 body",
31
39
  created: "2025-01-15T10:00:00Z",
32
40
  updated: "2025-01-15T10:00:00Z",
33
41
  },
34
42
  {
35
43
  id: "T-task-1",
36
- type: models_1.TrellisObjectType.TASK,
44
+ type: "task",
37
45
  title: "Task 1",
38
- status: models_1.TrellisObjectStatus.IN_PROGRESS,
39
- priority: models_1.TrellisObjectPriority.MEDIUM,
46
+ status: "in-progress",
47
+ priority: "medium",
40
48
  parent: "F-feature-1",
41
49
  prerequisites: [],
42
- affectedFiles: new Map(),
43
- log: [],
44
- schema: "v1.0",
45
50
  childrenIds: [],
46
- body: "Task 1 body",
47
51
  created: "2025-01-15T10:00:00Z",
48
52
  updated: "2025-01-15T10:00:00Z",
49
53
  },
50
54
  ];
51
- it("should successfully list objects with valid type", async () => {
52
- mockRepository.getObjects.mockResolvedValue(mockObjects);
53
- const result = await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
55
+ const mockResponse = {
56
+ content: [
57
+ {
58
+ type: "text",
59
+ text: JSON.stringify(mockSummaries, null, 2),
60
+ },
61
+ ],
62
+ };
63
+ it("should call service.listObjects with correct parameters for type only", async () => {
64
+ mockService.listObjects.mockResolvedValue(mockResponse);
65
+ const result = await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
54
66
  type: "project",
55
67
  });
56
- expect(mockRepository.getObjects).toHaveBeenCalledWith(false, undefined, models_1.TrellisObjectType.PROJECT, undefined, undefined);
57
- expect(result).toEqual({
58
- content: [
59
- {
60
- type: "text",
61
- text: JSON.stringify(mockObjects, null, 2),
62
- },
63
- ],
64
- });
68
+ expect(mockService.listObjects).toHaveBeenCalledWith(mockRepository, models_1.TrellisObjectType.PROJECT, undefined, undefined, undefined, false);
69
+ expect(result).toEqual(mockResponse);
65
70
  });
66
- it("should list objects with all parameters provided", async () => {
67
- mockRepository.getObjects.mockResolvedValue(mockObjects);
68
- const result = await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
71
+ it("should call service.listObjects with all parameters provided", async () => {
72
+ mockService.listObjects.mockResolvedValue(mockResponse);
73
+ const result = await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
69
74
  type: "task",
70
75
  scope: "F-feature-1",
71
76
  status: "in-progress",
72
77
  priority: "high",
73
78
  includeClosed: true,
74
79
  });
75
- expect(mockRepository.getObjects).toHaveBeenCalledWith(true, "F-feature-1", models_1.TrellisObjectType.TASK, models_1.TrellisObjectStatus.IN_PROGRESS, models_1.TrellisObjectPriority.HIGH);
76
- expect(result).toEqual({
77
- content: [
78
- {
79
- type: "text",
80
- text: JSON.stringify(mockObjects, null, 2),
81
- },
82
- ],
83
- });
84
- });
85
- it("should handle includeClosed parameter correctly", async () => {
86
- mockRepository.getObjects.mockResolvedValue(mockObjects);
87
- await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
88
- type: "task",
89
- includeClosed: false,
90
- });
91
- expect(mockRepository.getObjects).toHaveBeenCalledWith(false, undefined, models_1.TrellisObjectType.TASK, undefined, undefined);
80
+ expect(mockService.listObjects).toHaveBeenCalledWith(mockRepository, models_1.TrellisObjectType.TASK, "F-feature-1", models_1.TrellisObjectStatus.IN_PROGRESS, models_1.TrellisObjectPriority.HIGH, true);
81
+ expect(result).toEqual(mockResponse);
92
82
  });
93
83
  it("should default includeClosed to false when not provided", async () => {
94
- mockRepository.getObjects.mockResolvedValue(mockObjects);
95
- await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
84
+ mockService.listObjects.mockResolvedValue(mockResponse);
85
+ await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
96
86
  type: "task",
97
87
  });
98
- expect(mockRepository.getObjects).toHaveBeenCalledWith(false, undefined, models_1.TrellisObjectType.TASK, undefined, undefined);
88
+ expect(mockService.listObjects).toHaveBeenCalledWith(mockRepository, models_1.TrellisObjectType.TASK, undefined, undefined, undefined, false);
99
89
  });
100
90
  describe("type parameter validation", () => {
101
91
  it.each([
@@ -104,12 +94,12 @@ describe("listObjectsTool", () => {
104
94
  { type: "feature", expectedType: models_1.TrellisObjectType.FEATURE },
105
95
  { type: "task", expectedType: models_1.TrellisObjectType.TASK },
106
96
  ])("should convert valid type string '$type' to enum", async ({ type, expectedType }) => {
107
- mockRepository.getObjects.mockResolvedValue(mockObjects);
108
- await (0, listObjectsTool_1.handleListObjects)(mockRepository, { type });
109
- expect(mockRepository.getObjects).toHaveBeenCalledWith(false, undefined, expectedType, undefined, undefined);
97
+ mockService.listObjects.mockResolvedValue(mockResponse);
98
+ await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, { type });
99
+ expect(mockService.listObjects).toHaveBeenCalledWith(mockRepository, expectedType, undefined, undefined, undefined, false);
110
100
  });
111
101
  it("should return error for invalid type", async () => {
112
- const result = await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
102
+ const result = await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
113
103
  type: "invalid-type",
114
104
  });
115
105
  expect(result).toEqual({
@@ -120,7 +110,7 @@ describe("listObjectsTool", () => {
120
110
  },
121
111
  ],
122
112
  });
123
- expect(mockRepository.getObjects).not.toHaveBeenCalled();
113
+ expect(mockService.listObjects).not.toHaveBeenCalled();
124
114
  });
125
115
  });
126
116
  describe("status parameter validation", () => {
@@ -134,15 +124,15 @@ describe("listObjectsTool", () => {
134
124
  { status: "done", expectedStatus: models_1.TrellisObjectStatus.DONE },
135
125
  { status: "wont-do", expectedStatus: models_1.TrellisObjectStatus.WONT_DO },
136
126
  ])("should convert valid status string '$status' to enum", async ({ status, expectedStatus }) => {
137
- mockRepository.getObjects.mockResolvedValue(mockObjects);
138
- await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
127
+ mockService.listObjects.mockResolvedValue(mockResponse);
128
+ await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
139
129
  type: "task",
140
130
  status,
141
131
  });
142
- expect(mockRepository.getObjects).toHaveBeenCalledWith(false, undefined, models_1.TrellisObjectType.TASK, expectedStatus, undefined);
132
+ expect(mockService.listObjects).toHaveBeenCalledWith(mockRepository, models_1.TrellisObjectType.TASK, undefined, expectedStatus, undefined, false);
143
133
  });
144
134
  it("should return error for invalid status", async () => {
145
- const result = await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
135
+ const result = await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
146
136
  type: "task",
147
137
  status: "invalid-status",
148
138
  });
@@ -154,7 +144,7 @@ describe("listObjectsTool", () => {
154
144
  },
155
145
  ],
156
146
  });
157
- expect(mockRepository.getObjects).not.toHaveBeenCalled();
147
+ expect(mockService.listObjects).not.toHaveBeenCalled();
158
148
  });
159
149
  });
160
150
  describe("priority parameter validation", () => {
@@ -163,15 +153,15 @@ describe("listObjectsTool", () => {
163
153
  { priority: "medium", expectedPriority: models_1.TrellisObjectPriority.MEDIUM },
164
154
  { priority: "low", expectedPriority: models_1.TrellisObjectPriority.LOW },
165
155
  ])("should convert valid priority string '$priority' to enum", async ({ priority, expectedPriority }) => {
166
- mockRepository.getObjects.mockResolvedValue(mockObjects);
167
- await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
156
+ mockService.listObjects.mockResolvedValue(mockResponse);
157
+ await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
168
158
  type: "task",
169
159
  priority,
170
160
  });
171
- expect(mockRepository.getObjects).toHaveBeenCalledWith(false, undefined, models_1.TrellisObjectType.TASK, undefined, expectedPriority);
161
+ expect(mockService.listObjects).toHaveBeenCalledWith(mockRepository, models_1.TrellisObjectType.TASK, undefined, undefined, expectedPriority, false);
172
162
  });
173
163
  it("should return error for invalid priority", async () => {
174
- const result = await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
164
+ const result = await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
175
165
  type: "task",
176
166
  priority: "invalid-priority",
177
167
  });
@@ -183,29 +173,22 @@ describe("listObjectsTool", () => {
183
173
  },
184
174
  ],
185
175
  });
186
- expect(mockRepository.getObjects).not.toHaveBeenCalled();
187
- });
188
- });
189
- it("should handle optional parameters as undefined when not provided", async () => {
190
- mockRepository.getObjects.mockResolvedValue(mockObjects);
191
- await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
192
- type: "task",
176
+ expect(mockService.listObjects).not.toHaveBeenCalled();
193
177
  });
194
- expect(mockRepository.getObjects).toHaveBeenCalledWith(false, undefined, models_1.TrellisObjectType.TASK, undefined, undefined);
195
178
  });
196
179
  it("should pass scope parameter through unchanged", async () => {
197
- mockRepository.getObjects.mockResolvedValue(mockObjects);
180
+ mockService.listObjects.mockResolvedValue(mockResponse);
198
181
  const scope = "P-my-project";
199
- await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
182
+ await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
200
183
  type: "epic",
201
184
  scope,
202
185
  });
203
- expect(mockRepository.getObjects).toHaveBeenCalledWith(false, scope, models_1.TrellisObjectType.EPIC, undefined, undefined);
186
+ expect(mockService.listObjects).toHaveBeenCalledWith(mockRepository, models_1.TrellisObjectType.EPIC, scope, undefined, undefined, false);
204
187
  });
205
- it("should handle repository errors gracefully", async () => {
206
- const errorMessage = "Database connection failed";
207
- mockRepository.getObjects.mockRejectedValue(new Error(errorMessage));
208
- const result = await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
188
+ it("should handle service errors gracefully", async () => {
189
+ const errorMessage = "Service error";
190
+ mockService.listObjects.mockRejectedValue(new Error(errorMessage));
191
+ const result = await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
209
192
  type: "task",
210
193
  });
211
194
  expect(result).toEqual({
@@ -217,9 +200,9 @@ describe("listObjectsTool", () => {
217
200
  ],
218
201
  });
219
202
  });
220
- it("should handle non-Error exceptions", async () => {
221
- mockRepository.getObjects.mockRejectedValue("String error");
222
- const result = await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
203
+ it("should handle non-Error exceptions from service", async () => {
204
+ mockService.listObjects.mockRejectedValue("String error");
205
+ const result = await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
223
206
  type: "task",
224
207
  });
225
208
  expect(result).toEqual({
@@ -231,39 +214,17 @@ describe("listObjectsTool", () => {
231
214
  ],
232
215
  });
233
216
  });
234
- it("should return empty array when repository returns no objects", async () => {
235
- mockRepository.getObjects.mockResolvedValue([]);
236
- const result = await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
237
- type: "task",
238
- });
239
- expect(result).toEqual({
240
- content: [
241
- {
242
- type: "text",
243
- text: JSON.stringify([], null, 2),
244
- },
245
- ],
246
- });
247
- });
248
- it("should handle complex filtering scenarios", async () => {
249
- const filteredObjects = [mockObjects[1]]; // Only the task
250
- mockRepository.getObjects.mockResolvedValue(filteredObjects);
251
- const result = await (0, listObjectsTool_1.handleListObjects)(mockRepository, {
217
+ it("should handle complex parameter scenarios", async () => {
218
+ mockService.listObjects.mockResolvedValue(mockResponse);
219
+ const result = await (0, listObjectsTool_1.handleListObjects)(mockService, mockRepository, {
252
220
  type: "task",
253
221
  scope: "F-feature-1",
254
222
  status: "in-progress",
255
223
  priority: "medium",
256
224
  includeClosed: true,
257
225
  });
258
- expect(mockRepository.getObjects).toHaveBeenCalledWith(true, "F-feature-1", models_1.TrellisObjectType.TASK, models_1.TrellisObjectStatus.IN_PROGRESS, models_1.TrellisObjectPriority.MEDIUM);
259
- expect(result).toEqual({
260
- content: [
261
- {
262
- type: "text",
263
- text: JSON.stringify(filteredObjects, null, 2),
264
- },
265
- ],
266
- });
226
+ expect(mockService.listObjects).toHaveBeenCalledWith(mockRepository, models_1.TrellisObjectType.TASK, "F-feature-1", models_1.TrellisObjectStatus.IN_PROGRESS, models_1.TrellisObjectPriority.MEDIUM, true);
227
+ expect(result).toEqual(mockResponse);
267
228
  });
268
229
  });
269
230
  });
@@ -1 +1 @@
1
- {"version":3,"file":"listObjectsTool.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/listObjectsTool.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"listObjectsTool.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/listObjectsTool.test.ts"],"names":[],"mappings":"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"}
@@ -1,170 +1,111 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const TrellisObjectStatus_1 = require("../../models/TrellisObjectStatus");
4
- const TrellisObjectType_1 = require("../../models/TrellisObjectType");
5
- const TrellisObjectPriority_1 = require("../../models/TrellisObjectPriority");
6
3
  const pruneClosedTool_1 = require("../pruneClosedTool");
7
- jest.mock("../../models/isClosed", () => ({
8
- isClosed: jest.fn(),
9
- }));
10
- const { isClosed } = require("../../models/isClosed");
11
4
  describe("pruneClosedTool", () => {
5
+ let mockService;
12
6
  let mockRepository;
7
+ let pruneClosedSpy;
13
8
  beforeEach(() => {
9
+ pruneClosedSpy = jest.fn();
10
+ mockService = {
11
+ pruneClosed: pruneClosedSpy,
12
+ };
14
13
  mockRepository = {
15
14
  getObjectById: jest.fn(),
16
15
  getObjects: jest.fn(),
17
16
  saveObject: jest.fn(),
18
17
  deleteObject: jest.fn(),
19
18
  };
20
- isClosed.mockClear();
19
+ jest.clearAllMocks();
21
20
  });
22
21
  describe("handlePruneClosed", () => {
23
- const createMockObject = (id, status, updatedTime) => ({
24
- id,
25
- type: TrellisObjectType_1.TrellisObjectType.TASK,
26
- title: `Test ${id}`,
27
- status,
28
- priority: TrellisObjectPriority_1.TrellisObjectPriority.MEDIUM,
29
- parent: undefined,
30
- prerequisites: [],
31
- affectedFiles: new Map(),
32
- log: [],
33
- schema: "1.0",
34
- childrenIds: [],
35
- created: new Date().toISOString(),
36
- updated: updatedTime,
37
- body: "",
38
- });
39
- it("should prune old closed objects", async () => {
40
- const oldClosedObject = createMockObject("T-old-closed", TrellisObjectStatus_1.TrellisObjectStatus.DONE, new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
41
- mockRepository.getObjects.mockResolvedValue([oldClosedObject]);
42
- isClosed.mockReturnValue(true);
43
- mockRepository.deleteObject.mockResolvedValue(undefined);
44
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 60 }); // 1 hour
45
- expect(mockRepository.getObjects).toHaveBeenCalledWith(true, undefined);
46
- expect(isClosed).toHaveBeenCalledWith(oldClosedObject, 0, [
47
- oldClosedObject,
48
- ]);
49
- expect(mockRepository.deleteObject).toHaveBeenCalledWith("T-old-closed", true);
50
- expect(result.content[0].text).toContain("Pruned 1 closed objects older than 60 minutes");
51
- expect(result.content[0].text).toContain("T-old-closed");
52
- });
53
- it("should not prune recent closed objects", async () => {
54
- const recentClosedObject = createMockObject("T-recent-closed", TrellisObjectStatus_1.TrellisObjectStatus.DONE, new Date(Date.now() - 30 * 60 * 1000).toISOString());
55
- mockRepository.getObjects.mockResolvedValue([recentClosedObject]);
56
- isClosed.mockReturnValue(true);
57
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 60 }); // 1 hour
58
- expect(mockRepository.getObjects).toHaveBeenCalledWith(true, undefined);
59
- expect(isClosed).toHaveBeenCalledWith(recentClosedObject, 0, [
60
- recentClosedObject,
61
- ]);
62
- expect(mockRepository.deleteObject).not.toHaveBeenCalled();
63
- expect(result.content[0].text).toContain("Pruned 0 closed objects older than 60 minutes");
64
- });
65
- it("should not prune open objects", async () => {
66
- const openObject = createMockObject("T-open", TrellisObjectStatus_1.TrellisObjectStatus.IN_PROGRESS, new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
67
- mockRepository.getObjects.mockResolvedValue([openObject]);
68
- isClosed.mockReturnValue(false);
69
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 60 }); // 1 hour
70
- expect(mockRepository.getObjects).toHaveBeenCalledWith(true, undefined);
71
- expect(isClosed).toHaveBeenCalledWith(openObject, 0, [openObject]);
72
- expect(mockRepository.deleteObject).not.toHaveBeenCalled();
73
- expect(result.content[0].text).toContain("Pruned 0 closed objects older than 60 minutes");
74
- });
75
- it("should handle scope parameter", async () => {
76
- const oldClosedObject = createMockObject("T-scoped-closed", TrellisObjectStatus_1.TrellisObjectStatus.DONE, new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
77
- mockRepository.getObjects.mockResolvedValue([oldClosedObject]);
78
- isClosed.mockReturnValue(true);
79
- mockRepository.deleteObject.mockResolvedValue(undefined);
80
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, {
22
+ it("should call service.pruneClosed with correct parameters", async () => {
23
+ const mockResult = {
24
+ content: [
25
+ {
26
+ type: "text",
27
+ text: "Pruned 2 closed objects older than 60 minutes",
28
+ },
29
+ ],
30
+ };
31
+ pruneClosedSpy.mockResolvedValue(mockResult);
32
+ const args = {
81
33
  age: 60,
82
34
  scope: "F-test-feature",
83
- });
84
- expect(mockRepository.getObjects).toHaveBeenCalledWith(true, "F-test-feature");
85
- expect(result.content[0].text).toContain("in scope F-test-feature");
35
+ };
36
+ const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockService, mockRepository, args);
37
+ expect(pruneClosedSpy).toHaveBeenCalledWith(mockRepository, 60, "F-test-feature");
38
+ expect(result).toBe(mockResult);
86
39
  });
87
- it("should handle mixed object types and statuses", async () => {
88
- const oldDoneTask = createMockObject("T-old-done", TrellisObjectStatus_1.TrellisObjectStatus.DONE, new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
89
- const oldWontDoTask = createMockObject("T-old-wont-do", TrellisObjectStatus_1.TrellisObjectStatus.WONT_DO, new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
90
- const recentDoneTask = createMockObject("T-recent-done", TrellisObjectStatus_1.TrellisObjectStatus.DONE, new Date(Date.now() - 30 * 60 * 1000).toISOString());
91
- const openTask = createMockObject("T-open", TrellisObjectStatus_1.TrellisObjectStatus.IN_PROGRESS, new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
92
- mockRepository.getObjects.mockResolvedValue([
93
- oldDoneTask,
94
- oldWontDoTask,
95
- recentDoneTask,
96
- openTask,
97
- ]);
98
- isClosed.mockImplementation((obj) => obj.status === TrellisObjectStatus_1.TrellisObjectStatus.DONE ||
99
- obj.status === TrellisObjectStatus_1.TrellisObjectStatus.WONT_DO);
100
- mockRepository.deleteObject.mockResolvedValue(undefined);
101
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 60 });
102
- expect(mockRepository.deleteObject).toHaveBeenCalledTimes(2);
103
- expect(mockRepository.deleteObject).toHaveBeenCalledWith("T-old-done", true);
104
- expect(mockRepository.deleteObject).toHaveBeenCalledWith("T-old-wont-do", true);
105
- expect(result.content[0].text).toContain("Pruned 2 closed objects");
106
- expect(result.content[0].text).toContain("T-old-done");
107
- expect(result.content[0].text).toContain("T-old-wont-do");
40
+ it("should call service.pruneClosed without scope parameter", async () => {
41
+ const mockResult = {
42
+ content: [
43
+ {
44
+ type: "text",
45
+ text: "Pruned 0 closed objects older than 120 minutes",
46
+ },
47
+ ],
48
+ };
49
+ pruneClosedSpy.mockResolvedValue(mockResult);
50
+ const args = {
51
+ age: 120,
52
+ };
53
+ const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockService, mockRepository, args);
54
+ expect(pruneClosedSpy).toHaveBeenCalledWith(mockRepository, 120, undefined);
55
+ expect(result).toBe(mockResult);
108
56
  });
109
- it("should handle deletion failures gracefully", async () => {
110
- const oldClosedObject1 = createMockObject("T-old-closed-1", TrellisObjectStatus_1.TrellisObjectStatus.DONE, new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
111
- const oldClosedObject2 = createMockObject("T-old-closed-2", TrellisObjectStatus_1.TrellisObjectStatus.DONE, new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString());
112
- mockRepository.getObjects.mockResolvedValue([
113
- oldClosedObject1,
114
- oldClosedObject2,
115
- ]);
116
- isClosed.mockReturnValue(true);
117
- // First deletion fails, second succeeds
118
- mockRepository.deleteObject
119
- .mockRejectedValueOnce(new Error("Permission denied"))
120
- .mockResolvedValueOnce(undefined);
121
- // Mock console.error to check error logging
122
- const consoleSpy = jest.spyOn(console, "error").mockImplementation();
123
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 60 });
124
- expect(mockRepository.deleteObject).toHaveBeenCalledTimes(2);
125
- expect(consoleSpy).toHaveBeenCalledWith("Failed to delete object T-old-closed-1:", expect.any(Error));
126
- expect(result.content[0].text).toContain("Pruned 1 closed objects");
127
- expect(result.content[0].text).toContain("T-old-closed-2");
128
- expect(result.content[0].text).not.toContain("T-old-closed-1");
129
- consoleSpy.mockRestore();
57
+ it("should handle arguments correctly with type coercion", async () => {
58
+ const mockResult = {
59
+ content: [
60
+ {
61
+ type: "text",
62
+ text: "Pruned 1 closed objects older than 30 minutes",
63
+ },
64
+ ],
65
+ };
66
+ pruneClosedSpy.mockResolvedValue(mockResult);
67
+ // Test that args are properly typed
68
+ const args = {
69
+ age: "30", // String that should be coerced to number in real usage
70
+ scope: "P-project-1",
71
+ };
72
+ const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockService, mockRepository, args);
73
+ expect(pruneClosedSpy).toHaveBeenCalledWith(mockRepository, "30", // The function passes through the value as-is, service handles conversion
74
+ "P-project-1");
75
+ expect(result).toBe(mockResult);
130
76
  });
131
- it("should handle repository getObjects error", async () => {
132
- const errorMessage = "Repository connection failed";
133
- mockRepository.getObjects.mockRejectedValue(new Error(errorMessage));
134
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 60 });
135
- expect(result.content[0].text).toContain("Error pruning closed objects");
136
- expect(result.content[0].text).toContain(errorMessage);
137
- });
138
- it("should handle empty object list", async () => {
139
- mockRepository.getObjects.mockResolvedValue([]);
140
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 60 });
141
- expect(mockRepository.deleteObject).not.toHaveBeenCalled();
142
- expect(result.content[0].text).toContain("Pruned 0 closed objects");
77
+ it("should propagate service results", async () => {
78
+ const mockResult = {
79
+ content: [
80
+ {
81
+ type: "text",
82
+ text: "Error pruning closed objects: Database connection failed",
83
+ },
84
+ ],
85
+ };
86
+ pruneClosedSpy.mockResolvedValue(mockResult);
87
+ const args = {
88
+ age: 60,
89
+ };
90
+ const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockService, mockRepository, args);
91
+ expect(result).toBe(mockResult);
143
92
  });
144
93
  it("should handle zero age parameter", async () => {
145
- const oldClosedObject = createMockObject("T-old-closed", TrellisObjectStatus_1.TrellisObjectStatus.DONE, new Date(Date.now() - 1000).toISOString());
146
- mockRepository.getObjects.mockResolvedValue([oldClosedObject]);
147
- isClosed.mockReturnValue(true);
148
- mockRepository.deleteObject.mockResolvedValue(undefined);
149
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 0 });
150
- expect(mockRepository.deleteObject).toHaveBeenCalledWith("T-old-closed", true);
151
- expect(result.content[0].text).toContain("Pruned 1 closed objects older than 0 minutes");
152
- });
153
- it("should handle large age parameter", async () => {
154
- const veryOldObject = createMockObject("T-ancient", TrellisObjectStatus_1.TrellisObjectStatus.DONE, new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString());
155
- mockRepository.getObjects.mockResolvedValue([veryOldObject]);
156
- isClosed.mockReturnValue(true);
157
- mockRepository.deleteObject.mockResolvedValue(undefined);
158
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 999999 });
159
- expect(mockRepository.deleteObject).not.toHaveBeenCalled();
160
- expect(result.content[0].text).toContain("Pruned 0 closed objects older than 999999 minutes");
161
- });
162
- it("should handle non-Error exceptions", async () => {
163
- const errorValue = "String error";
164
- mockRepository.getObjects.mockRejectedValue(errorValue);
165
- const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockRepository, { age: 60 });
166
- expect(result.content[0].text).toContain("Error pruning closed objects");
167
- expect(result.content[0].text).toContain(errorValue);
94
+ const mockResult = {
95
+ content: [
96
+ {
97
+ type: "text",
98
+ text: "Pruned 5 closed objects older than 0 minutes",
99
+ },
100
+ ],
101
+ };
102
+ pruneClosedSpy.mockResolvedValue(mockResult);
103
+ const args = {
104
+ age: 0,
105
+ };
106
+ const result = await (0, pruneClosedTool_1.handlePruneClosed)(mockService, mockRepository, args);
107
+ expect(pruneClosedSpy).toHaveBeenCalledWith(mockRepository, 0, undefined);
108
+ expect(result).toBe(mockResult);
168
109
  });
169
110
  });
170
111
  });