@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
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.claimTask = claimTask;
4
+ const models_1 = require("../../models");
5
+ const checkPrerequisitesComplete_1 = require("../../utils/checkPrerequisitesComplete");
6
+ const filterUnavailableObjects_1 = require("../../utils/filterUnavailableObjects");
7
+ const sortTrellisObjects_1 = require("../../utils/sortTrellisObjects");
8
+ async function claimTask(repository, scope, taskId, force = false) {
9
+ try {
10
+ let claimedTask;
11
+ if (taskId) {
12
+ claimedTask = await claimSpecificTask(taskId, force, repository);
13
+ }
14
+ else {
15
+ claimedTask = await findNextAvailableTask(scope, repository);
16
+ }
17
+ const updatedTask = await updateTaskStatus(claimedTask, repository);
18
+ return {
19
+ content: [
20
+ {
21
+ type: "text",
22
+ text: `Successfully claimed task: ${JSON.stringify(updatedTask, null, 2)}`,
23
+ },
24
+ ],
25
+ };
26
+ }
27
+ catch (error) {
28
+ return {
29
+ content: [
30
+ {
31
+ type: "text",
32
+ text: `Error claiming task: ${error instanceof Error ? error.message : String(error)}`,
33
+ },
34
+ ],
35
+ };
36
+ }
37
+ }
38
+ async function claimSpecificTask(taskId, force, repository) {
39
+ const object = await repository.getObjectById(taskId);
40
+ if (!object) {
41
+ throw new Error(`Task with ID "${taskId}" not found`);
42
+ }
43
+ await validateTaskForClaiming(object, taskId, force, repository);
44
+ return object;
45
+ }
46
+ async function findNextAvailableTask(scope, repository) {
47
+ const objects = await repository.getObjects(false, // includeClosed
48
+ scope, models_1.TrellisObjectType.TASK);
49
+ // Filter to get only available tasks
50
+ const availableTasks = (0, filterUnavailableObjects_1.filterUnavailableObjects)(objects);
51
+ if (availableTasks.length === 0) {
52
+ throw new Error("No available tasks to claim");
53
+ }
54
+ // Sort by priority and return the top one
55
+ const sortedTasks = (0, sortTrellisObjects_1.sortTrellisObjects)(availableTasks);
56
+ return sortedTasks[0];
57
+ }
58
+ async function updateTaskStatus(task, repository) {
59
+ const updatedTask = {
60
+ ...task,
61
+ status: models_1.TrellisObjectStatus.IN_PROGRESS,
62
+ };
63
+ await repository.saveObject(updatedTask);
64
+ // Update parent hierarchy to in-progress (don't let errors fail the task claim)
65
+ try {
66
+ await updateParentHierarchy(task.parent, repository);
67
+ }
68
+ catch (error) {
69
+ // Log but don't propagate parent hierarchy update errors
70
+ console.warn("Failed to update parent hierarchy:", error);
71
+ }
72
+ return updatedTask;
73
+ }
74
+ async function validateTaskForClaiming(task, taskId, force, repository) {
75
+ // Validate it's a task
76
+ if (task.type !== models_1.TrellisObjectType.TASK) {
77
+ throw new Error(`Object with ID "${taskId}" is not a task (type: ${task.type})`);
78
+ }
79
+ if (!force) {
80
+ // Validate status is draft or open
81
+ if (!(0, models_1.isClaimable)(task)) {
82
+ throw new Error(`Task "${taskId}" cannot be claimed (status: ${task.status}). Task must be in draft or open status.`);
83
+ }
84
+ // Validate all prerequisites are complete
85
+ const prerequisitesComplete = await (0, checkPrerequisitesComplete_1.checkPrerequisitesComplete)(task, repository);
86
+ if (!prerequisitesComplete) {
87
+ throw new Error(`Task "${taskId}" cannot be claimed. Not all prerequisites are complete.`);
88
+ }
89
+ }
90
+ }
91
+ async function updateParentHierarchy(parentId, repository, visitedIds = new Set()) {
92
+ if (!parentId) {
93
+ return;
94
+ }
95
+ // Prevent infinite recursion by checking if we've already visited this ID
96
+ if (visitedIds.has(parentId)) {
97
+ return;
98
+ }
99
+ visitedIds.add(parentId);
100
+ const parent = await repository.getObjectById(parentId);
101
+ if (!parent) {
102
+ return;
103
+ }
104
+ // If parent is already in progress, we can stop here since we assume
105
+ // its parent is already in progress too
106
+ if (parent.status === models_1.TrellisObjectStatus.IN_PROGRESS) {
107
+ return;
108
+ }
109
+ // Update parent to in-progress
110
+ const updatedParent = {
111
+ ...parent,
112
+ status: models_1.TrellisObjectStatus.IN_PROGRESS,
113
+ };
114
+ await repository.saveObject(updatedParent);
115
+ // Continue up the hierarchy
116
+ await updateParentHierarchy(parent.parent, repository, visitedIds);
117
+ }
118
+ //# sourceMappingURL=claimTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claimTask.js","sourceRoot":"","sources":["../../../src/services/local/claimTask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ServerConfig } from "../../configuration";
2
+ import { Repository } from "../../repositories";
3
+ export declare function completeTask(repository: Repository, taskId: string, summary: string, filesChanged: Record<string, string>, serverConfig?: ServerConfig): Promise<{
4
+ content: Array<{
5
+ type: string;
6
+ text: string;
7
+ }>;
8
+ }>;
9
+ //# sourceMappingURL=completeTask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeTask.d.ts","sourceRoot":"","sources":["../../../src/services/local/completeTask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAuC7D"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.completeTask = completeTask;
4
+ const models_1 = require("../../models");
5
+ const appendAffectedFiles_js_1 = require("./appendAffectedFiles.js");
6
+ async function completeTask(repository, taskId, summary, filesChanged, serverConfig) {
7
+ // Get the task object from repository
8
+ const task = await repository.getObjectById(taskId);
9
+ if (!task) {
10
+ throw new Error(`Task with ID "${taskId}" not found`);
11
+ }
12
+ // Check if task is in progress
13
+ if (task.status !== models_1.TrellisObjectStatus.IN_PROGRESS) {
14
+ throw new Error(`Task "${taskId}" is not in progress (current status: ${task.status})`);
15
+ }
16
+ // Update task status to done
17
+ task.status = models_1.TrellisObjectStatus.DONE;
18
+ // Append to affected files map
19
+ await (0, appendAffectedFiles_js_1.appendAffectedFiles)(repository, task, filesChanged);
20
+ // Append summary to log
21
+ task.log.push(summary);
22
+ // Save the updated task
23
+ await repository.saveObject(task);
24
+ // If auto-complete parent is enabled, check if we should complete parent objects
25
+ if (serverConfig?.autoCompleteParent) {
26
+ await autoCompleteParentHierarchy(repository, task);
27
+ }
28
+ return {
29
+ content: [
30
+ {
31
+ type: "text",
32
+ text: `Task "${taskId}" completed successfully. Updated ${Object.keys(filesChanged).length} affected files.`,
33
+ },
34
+ ],
35
+ };
36
+ }
37
+ async function autoCompleteParentHierarchy(repository, completedObject) {
38
+ // If the completed object has no parent, nothing to do
39
+ if (!completedObject.parent) {
40
+ return;
41
+ }
42
+ // Get the parent object
43
+ const parent = await repository.getObjectById(completedObject.parent);
44
+ if (!parent) {
45
+ return;
46
+ }
47
+ // Check if all children of the parent are done
48
+ const siblings = await Promise.all(parent.childrenIds.map((id) => repository.getObjectById(id)));
49
+ // Filter out null results and check if all are done
50
+ const validSiblings = siblings.filter((sibling) => sibling !== null);
51
+ const allChildrenDone = validSiblings.every((sibling) => sibling.status === models_1.TrellisObjectStatus.DONE ||
52
+ sibling.status === models_1.TrellisObjectStatus.WONT_DO);
53
+ // If all children are done, mark the parent as done and recurse up the hierarchy
54
+ if (allChildrenDone && parent.status !== models_1.TrellisObjectStatus.DONE) {
55
+ parent.status = models_1.TrellisObjectStatus.DONE;
56
+ parent.log.push(`Auto-completed: All child ${getChildTypeName(parent.type)} are complete`);
57
+ await repository.saveObject(parent);
58
+ // Recursively check the parent's parent
59
+ await autoCompleteParentHierarchy(repository, parent);
60
+ }
61
+ }
62
+ function getChildTypeName(parentType) {
63
+ switch (parentType) {
64
+ case models_1.TrellisObjectType.PROJECT:
65
+ return "epics";
66
+ case models_1.TrellisObjectType.EPIC:
67
+ return "features";
68
+ case models_1.TrellisObjectType.FEATURE:
69
+ return "tasks";
70
+ default:
71
+ return "children";
72
+ }
73
+ }
74
+ //# sourceMappingURL=completeTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeTask.js","sourceRoot":"","sources":["../../../src/services/local/completeTask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { TrellisObjectPriority, TrellisObjectStatus, TrellisObjectType } from "../../models";
2
+ import { Repository } from "../../repositories";
3
+ export declare function createObject(repository: Repository, type: TrellisObjectType, title: string, parent?: string, priority?: TrellisObjectPriority, status?: TrellisObjectStatus, prerequisites?: string[], description?: string): Promise<{
4
+ content: Array<{
5
+ type: string;
6
+ text: string;
7
+ }>;
8
+ }>;
9
+ //# sourceMappingURL=createObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createObject.d.ts","sourceRoot":"","sources":["../../../src/services/local/createObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,GAAE,qBAAoD,EAC9D,MAAM,GAAE,mBAA8C,EACtD,aAAa,GAAE,MAAM,EAAO,EAC5B,WAAW,GAAE,MAAW,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAyC7D"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createObject = createObject;
4
+ const models_1 = require("../../models");
5
+ const utils_1 = require("../../utils");
6
+ const validateObjectCreation_1 = require("../../validation/validateObjectCreation");
7
+ async function createObject(repository, type, title, parent, priority = models_1.TrellisObjectPriority.MEDIUM, status = models_1.TrellisObjectStatus.OPEN, prerequisites = [], description = "") {
8
+ // Get existing objects to generate unique ID
9
+ const existingObjects = await repository.getObjects(true);
10
+ const existingIds = existingObjects.map((obj) => obj.id);
11
+ // Generate unique ID
12
+ const id = (0, utils_1.generateUniqueId)(title, type, existingIds);
13
+ // Create TrellisObject with current timestamp
14
+ const now = new Date().toISOString();
15
+ const trellisObject = {
16
+ id,
17
+ type,
18
+ title,
19
+ status,
20
+ priority,
21
+ parent,
22
+ prerequisites,
23
+ affectedFiles: new Map(),
24
+ log: [],
25
+ schema: "v1.0",
26
+ childrenIds: [],
27
+ created: now,
28
+ updated: now,
29
+ body: description,
30
+ };
31
+ // Validate object before saving
32
+ await (0, validateObjectCreation_1.validateObjectCreation)(trellisObject, repository);
33
+ // Save through repository
34
+ await repository.saveObject(trellisObject);
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Created object with ID: ${id}`,
40
+ },
41
+ ],
42
+ };
43
+ }
44
+ //# sourceMappingURL=createObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createObject.js","sourceRoot":"","sources":["../../../src/services/local/createObject.ts"],"names":[],"mappings":";;AAUA,oCAkDC;AA5DD,yCAKsB;AAEtB,uCAA+C;AAC/C,oFAAiF;AAE1E,KAAK,UAAU,YAAY,CAChC,UAAsB,EACtB,IAAuB,EACvB,KAAa,EACb,MAAe,EACf,WAAkC,8BAAqB,CAAC,MAAM,EAC9D,SAA8B,4BAAmB,CAAC,IAAI,EACtD,gBAA0B,EAAE,EAC5B,cAAsB,EAAE;IAExB,6CAA6C;IAC7C,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEzD,qBAAqB;IACrB,MAAM,EAAE,GAAG,IAAA,wBAAgB,EAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAEtD,8CAA8C;IAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,aAAa,GAAkB;QACnC,EAAE;QACF,IAAI;QACJ,KAAK;QACL,MAAM;QACN,QAAQ;QACR,MAAM;QACN,aAAa;QACb,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,GAAG,EAAE,EAAE;QACP,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,WAAW;KAClB,CAAC;IAEF,gCAAgC;IAChC,MAAM,IAAA,+CAAsB,EAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAExD,0BAA0B;IAC1B,MAAM,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAE3C,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,2BAA2B,EAAE,EAAE;aACtC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { TrellisObjectPriority, TrellisObjectStatus, TrellisObjectType } from "../../models";
2
+ import { Repository } from "../../repositories";
3
+ export declare function listObjects(repository: Repository, type: TrellisObjectType, scope?: string, status?: TrellisObjectStatus, priority?: TrellisObjectPriority, includeClosed?: boolean): Promise<{
4
+ content: Array<{
5
+ type: string;
6
+ text: string;
7
+ }>;
8
+ }>;
9
+ //# sourceMappingURL=listObjects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listObjects.d.ts","sourceRoot":"","sources":["../../../src/services/local/listObjects.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,mBAAmB,EAEnB,iBAAiB,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAiBhD,wBAAsB,WAAW,CAC/B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,iBAAiB,EACvB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,mBAAmB,EAC5B,QAAQ,CAAC,EAAE,qBAAqB,EAChC,aAAa,GAAE,OAAe,GAC7B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA+B7D"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listObjects = listObjects;
4
+ function convertToSummary(obj) {
5
+ return {
6
+ id: obj.id,
7
+ type: obj.type,
8
+ title: obj.title,
9
+ status: obj.status,
10
+ priority: obj.priority,
11
+ parent: obj.parent,
12
+ prerequisites: obj.prerequisites,
13
+ childrenIds: obj.childrenIds,
14
+ created: obj.created,
15
+ updated: obj.updated,
16
+ };
17
+ }
18
+ async function listObjects(repository, type, scope, status, priority, includeClosed = false) {
19
+ try {
20
+ // Get objects from repository
21
+ const objects = await repository.getObjects(includeClosed, scope, type, status, priority);
22
+ const objectSummaries = objects.map(convertToSummary);
23
+ return {
24
+ content: [
25
+ {
26
+ type: "text",
27
+ text: JSON.stringify(objectSummaries, null, 2),
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ catch (error) {
33
+ return {
34
+ content: [
35
+ {
36
+ type: "text",
37
+ text: `Error listing objects: ${error instanceof Error ? error.message : String(error)}`,
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ }
43
+ //# sourceMappingURL=listObjects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listObjects.js","sourceRoot":"","sources":["../../../src/services/local/listObjects.ts"],"names":[],"mappings":";;AAwBA,kCAsCC;AArDD,SAAS,gBAAgB,CAAC,GAAkB;IAC1C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,UAAsB,EACtB,IAAuB,EACvB,KAAc,EACd,MAA4B,EAC5B,QAAgC,EAChC,gBAAyB,KAAK;IAE9B,IAAI,CAAC;QACH,8BAA8B;QAC9B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,CACzC,aAAa,EACb,KAAK,EACL,IAAI,EACJ,MAAM,EACN,QAAQ,CACT,CAAC;QAEF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAEtD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC/C;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBACzF;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Repository } from "../../repositories";
2
+ export declare function pruneClosed(repository: Repository, age: number, scope?: string): Promise<{
3
+ content: Array<{
4
+ type: string;
5
+ text: string;
6
+ }>;
7
+ }>;
8
+ //# sourceMappingURL=pruneClosed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pruneClosed.d.ts","sourceRoot":"","sources":["../../../src/services/local/pruneClosed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,wBAAsB,WAAW,CAC/B,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAuD7D"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pruneClosed = pruneClosed;
4
+ const models_1 = require("../../models");
5
+ async function pruneClosed(repository, age, scope) {
6
+ try {
7
+ // Get all objects including closed ones
8
+ const objects = await repository.getObjects(true, scope);
9
+ // Filter to only closed objects
10
+ const closedObjects = objects.filter(models_1.isClosed);
11
+ // Calculate cutoff time (age in minutes ago)
12
+ const cutoffTime = new Date(Date.now() - age * 60 * 1000);
13
+ // Filter to objects older than cutoff
14
+ const objectsToDelete = closedObjects.filter((obj) => {
15
+ const updatedTime = new Date(obj.updated);
16
+ return updatedTime < cutoffTime;
17
+ });
18
+ // Delete each object
19
+ const deletedIds = [];
20
+ for (const obj of objectsToDelete) {
21
+ try {
22
+ await repository.deleteObject(obj.id, true);
23
+ deletedIds.push(obj.id);
24
+ }
25
+ catch (error) {
26
+ // Continue with other objects even if one fails
27
+ console.error(`Failed to delete object ${obj.id}:`, error);
28
+ }
29
+ }
30
+ const message = scope
31
+ ? `Pruned ${deletedIds.length} closed objects older than ${age} minutes in scope ${scope}`
32
+ : `Pruned ${deletedIds.length} closed objects older than ${age} minutes`;
33
+ return {
34
+ content: [
35
+ {
36
+ type: "text",
37
+ text: `${message}${deletedIds.length > 0
38
+ ? `\nDeleted objects: ${deletedIds.join(", ")}`
39
+ : ""}`,
40
+ },
41
+ ],
42
+ };
43
+ }
44
+ catch (error) {
45
+ return {
46
+ content: [
47
+ {
48
+ type: "text",
49
+ text: `Error pruning closed objects: ${error instanceof Error ? error.message : String(error)}`,
50
+ },
51
+ ],
52
+ };
53
+ }
54
+ }
55
+ //# sourceMappingURL=pruneClosed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pruneClosed.js","sourceRoot":"","sources":["../../../src/services/local/pruneClosed.ts"],"names":[],"mappings":";;AAGA,kCA2DC;AA9DD,yCAAwC;AAGjC,KAAK,UAAU,WAAW,CAC/B,UAAsB,EACtB,GAAW,EACX,KAAc;IAEd,IAAI,CAAC;QACH,wCAAwC;QACxC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEzD,gCAAgC;QAChC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAQ,CAAC,CAAC;QAE/C,6CAA6C;QAC7C,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE1D,sCAAsC;QACtC,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACnD,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,WAAW,GAAG,UAAU,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC5C,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,gDAAgD;gBAChD,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,KAAK;YACnB,CAAC,CAAC,UAAU,UAAU,CAAC,MAAM,8BAA8B,GAAG,qBAAqB,KAAK,EAAE;YAC1F,CAAC,CAAC,UAAU,UAAU,CAAC,MAAM,8BAA8B,GAAG,UAAU,CAAC;QAE3E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,GAAG,OAAO,GACd,UAAU,CAAC,MAAM,GAAG,CAAC;wBACnB,CAAC,CAAC,sBAAsB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;wBAC/C,CAAC,CAAC,EACN,EAAE;iBACH;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAChG;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Repository } from "../../repositories";
2
+ export declare function replaceObjectBodyRegex(repository: Repository, id: string, regex: string, replacement: string, allowMultipleOccurrences?: boolean): Promise<{
3
+ content: Array<{
4
+ type: string;
5
+ text: string;
6
+ }>;
7
+ }>;
8
+ //# sourceMappingURL=replaceObjectBodyRegex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replaceObjectBodyRegex.d.ts","sourceRoot":"","sources":["../../../src/services/local/replaceObjectBodyRegex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,wBAAwB,GAAE,OAAe,GACxC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAoF7D"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.replaceObjectBodyRegex = replaceObjectBodyRegex;
4
+ const MultipleMatchesError_1 = require("../../utils/MultipleMatchesError");
5
+ const replaceStringWithRegex_1 = require("../../utils/replaceStringWithRegex");
6
+ async function replaceObjectBodyRegex(repository, id, regex, replacement, allowMultipleOccurrences = false) {
7
+ try {
8
+ // Load the existing object
9
+ const existingObject = await repository.getObjectById(id);
10
+ if (!existingObject) {
11
+ return {
12
+ content: [
13
+ {
14
+ type: "text",
15
+ text: `Error: Object with ID '${id}' not found`,
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ // Check if the object has a body to replace
21
+ if (!existingObject.body) {
22
+ return {
23
+ content: [
24
+ {
25
+ type: "text",
26
+ text: `Error: Object with ID '${id}' has no body content to replace`,
27
+ },
28
+ ],
29
+ };
30
+ }
31
+ // Perform the regex replacement on the body
32
+ const updatedBody = (0, replaceStringWithRegex_1.replaceStringWithRegex)(existingObject.body, {
33
+ regex,
34
+ replacement,
35
+ allowMultipleOccurrences,
36
+ });
37
+ // If the body didn't change, inform the user
38
+ if (updatedBody === existingObject.body) {
39
+ return {
40
+ content: [
41
+ {
42
+ type: "text",
43
+ text: `No matches found for pattern "${regex}" in object body. Body remains unchanged.`,
44
+ },
45
+ ],
46
+ };
47
+ }
48
+ // Create updated object with the new body
49
+ const updatedObject = {
50
+ ...existingObject,
51
+ body: updatedBody,
52
+ };
53
+ // Save the updated object
54
+ await repository.saveObject(updatedObject);
55
+ return {
56
+ content: [
57
+ {
58
+ type: "text",
59
+ text: `Successfully replaced content in object body using pattern "${regex}". Object ID: ${id}`,
60
+ },
61
+ ],
62
+ };
63
+ }
64
+ catch (error) {
65
+ if (error instanceof MultipleMatchesError_1.MultipleMatchesError) {
66
+ return {
67
+ content: [
68
+ {
69
+ type: "text",
70
+ text: `Error: ${error.message}`,
71
+ },
72
+ ],
73
+ };
74
+ }
75
+ return {
76
+ content: [
77
+ {
78
+ type: "text",
79
+ text: `Error replacing object body: ${error instanceof Error ? error.message : String(error)}`,
80
+ },
81
+ ],
82
+ };
83
+ }
84
+ }
85
+ //# sourceMappingURL=replaceObjectBodyRegex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replaceObjectBodyRegex.js","sourceRoot":"","sources":["../../../src/services/local/replaceObjectBodyRegex.ts"],"names":[],"mappings":";;AAKA,wDA0FC;AA7FD,2EAAwE;AACxE,+EAA4E;AAErE,KAAK,UAAU,sBAAsB,CAC1C,UAAsB,EACtB,EAAU,EACV,KAAa,EACb,WAAmB,EACnB,2BAAoC,KAAK;IAEzC,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,0BAA0B,EAAE,aAAa;qBAChD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,0BAA0B,EAAE,kCAAkC;qBACrE;iBACF;aACF,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,MAAM,WAAW,GAAG,IAAA,+CAAsB,EAAC,cAAc,CAAC,IAAI,EAAE;YAC9D,KAAK;YACL,WAAW;YACX,wBAAwB;SACzB,CAAC,CAAC;QAEH,6CAA6C;QAC7C,IAAI,WAAW,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,iCAAiC,KAAK,2CAA2C;qBACxF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,0CAA0C;QAC1C,MAAM,aAAa,GAAkB;YACnC,GAAG,cAAc;YACjB,IAAI,EAAE,WAAW;SAClB,CAAC;QAEF,0BAA0B;QAC1B,MAAM,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,+DAA+D,KAAK,iBAAiB,EAAE,EAAE;iBAChG;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,2CAAoB,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE;qBAChC;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAC/F;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { TrellisObjectPriority, TrellisObjectStatus } from "../../models";
2
+ import { Repository } from "../../repositories";
3
+ export declare function updateObject(repository: Repository, id: string, priority?: TrellisObjectPriority, prerequisites?: string[], body?: string, status?: TrellisObjectStatus, force?: boolean): Promise<{
4
+ content: Array<{
5
+ type: string;
6
+ text: string;
7
+ }>;
8
+ }>;
9
+ //# sourceMappingURL=updateObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateObject.d.ts","sourceRoot":"","sources":["../../../src/services/local/updateObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,MAAM,EACV,QAAQ,CAAC,EAAE,qBAAqB,EAChC,aAAa,CAAC,EAAE,MAAM,EAAE,EACxB,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,mBAAmB,EAC5B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAsD7D"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateObject = updateObject;
4
+ const validateStatusTransition_1 = require("../../validation/validateStatusTransition");
5
+ async function updateObject(repository, id, priority, prerequisites, body, status, force = false) {
6
+ try {
7
+ // Load the existing object
8
+ const existingObject = await repository.getObjectById(id);
9
+ if (!existingObject) {
10
+ return {
11
+ content: [
12
+ {
13
+ type: "text",
14
+ text: `Error: Object with ID '${id}' not found`,
15
+ },
16
+ ],
17
+ };
18
+ }
19
+ // Create updated object with new properties, ensuring proper typing
20
+ const updatedObject = {
21
+ ...existingObject,
22
+ ...(priority && { priority }),
23
+ ...(prerequisites && { prerequisites }),
24
+ ...(body && { body }),
25
+ ...(status && { status }),
26
+ };
27
+ // Validate status transition
28
+ if (status && !force) {
29
+ await (0, validateStatusTransition_1.validateStatusTransition)(updatedObject, repository);
30
+ }
31
+ // Save the updated object
32
+ await repository.saveObject(updatedObject);
33
+ return {
34
+ content: [
35
+ {
36
+ type: "text",
37
+ text: `Successfully updated object: ${JSON.stringify(updatedObject, null, 2)}`,
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ catch (error) {
43
+ return {
44
+ content: [
45
+ {
46
+ type: "text",
47
+ text: `Error updating object: ${error instanceof Error ? error.message : String(error)}`,
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ }
53
+ //# sourceMappingURL=updateObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateObject.js","sourceRoot":"","sources":["../../../src/services/local/updateObject.ts"],"names":[],"mappings":";;AAQA,oCA8DC;AAhED,wFAAqF;AAE9E,KAAK,UAAU,YAAY,CAChC,UAAsB,EACtB,EAAU,EACV,QAAgC,EAChC,aAAwB,EACxB,IAAa,EACb,MAA4B,EAC5B,QAAiB,KAAK;IAEtB,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,0BAA0B,EAAE,aAAa;qBAChD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,oEAAoE;QACpE,MAAM,aAAa,GAAkB;YACnC,GAAG,cAAc;YACjB,GAAG,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC7B,GAAG,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1B,CAAC;QAEF,6BAA6B;QAC7B,IAAI,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,IAAA,mDAAwB,EAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC5D,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,gCAAgC,IAAI,CAAC,SAAS,CAClD,aAAa,EACb,IAAI,EACJ,CAAC,CACF,EAAE;iBACJ;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBACzF;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=appendModifiedFilesTool.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appendModifiedFilesTool.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/appendModifiedFilesTool.test.ts"],"names":[],"mappings":""}