@langadventurellc/task-trellis-mcp 1.1.0 → 1.2.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 (262) hide show
  1. package/README.md +21 -212
  2. package/dist/__tests__/e2e/autoPrune.e2e.test.d.ts +2 -0
  3. package/dist/__tests__/e2e/autoPrune.e2e.test.d.ts.map +1 -0
  4. package/dist/__tests__/e2e/autoPrune.e2e.test.js +533 -0
  5. package/dist/__tests__/e2e/autoPrune.e2e.test.js.map +1 -0
  6. package/dist/__tests__/e2e/configuration/activation.e2e.test.js +6 -6
  7. package/dist/__tests__/e2e/configuration/activation.e2e.test.js.map +1 -1
  8. package/dist/__tests__/e2e/configuration/commandLineArgs.e2e.test.js +55 -6
  9. package/dist/__tests__/e2e/configuration/commandLineArgs.e2e.test.js.map +1 -1
  10. package/dist/__tests__/e2e/configuration/directorySetup.e2e.test.js +19 -19
  11. package/dist/__tests__/e2e/configuration/directorySetup.e2e.test.js.map +1 -1
  12. package/dist/__tests__/e2e/configuration/invalidConfig.e2e.test.js +9 -9
  13. package/dist/__tests__/e2e/configuration/invalidConfig.e2e.test.js.map +1 -1
  14. package/dist/__tests__/e2e/configuration/preActivation.e2e.test.js +15 -15
  15. package/dist/__tests__/e2e/configuration/preActivation.e2e.test.js.map +1 -1
  16. package/dist/__tests__/e2e/crud/createObject.e2e.test.js +34 -34
  17. package/dist/__tests__/e2e/crud/createObject.e2e.test.js.map +1 -1
  18. package/dist/__tests__/e2e/crud/deleteObject.e2e.test.js +19 -19
  19. package/dist/__tests__/e2e/crud/deleteObject.e2e.test.js.map +1 -1
  20. package/dist/__tests__/e2e/crud/fileValidation.e2e.test.js +32 -32
  21. package/dist/__tests__/e2e/crud/fileValidation.e2e.test.js.map +1 -1
  22. package/dist/__tests__/e2e/crud/getObject.e2e.test.js +143 -22
  23. package/dist/__tests__/e2e/crud/getObject.e2e.test.js.map +1 -1
  24. package/dist/__tests__/e2e/crud/listObjects.e2e.test.js +561 -42
  25. package/dist/__tests__/e2e/crud/listObjects.e2e.test.js.map +1 -1
  26. package/dist/__tests__/e2e/crud/updateObject.e2e.test.js +497 -25
  27. package/dist/__tests__/e2e/crud/updateObject.e2e.test.js.map +1 -1
  28. package/dist/__tests__/e2e/hierarchicalPrerequisites.e2e.test.d.ts +2 -0
  29. package/dist/__tests__/e2e/hierarchicalPrerequisites.e2e.test.d.ts.map +1 -0
  30. package/dist/__tests__/e2e/hierarchicalPrerequisites.e2e.test.js +319 -0
  31. package/dist/__tests__/e2e/hierarchicalPrerequisites.e2e.test.js.map +1 -0
  32. package/dist/__tests__/e2e/infrastructure/client.e2e.test.js +4 -4
  33. package/dist/__tests__/e2e/infrastructure/client.e2e.test.js.map +1 -1
  34. package/dist/__tests__/e2e/infrastructure/server.e2e.test.js +6 -6
  35. package/dist/__tests__/e2e/infrastructure/server.e2e.test.js.map +1 -1
  36. package/dist/__tests__/e2e/utils/extractObjectIds.d.ts +1 -1
  37. package/dist/__tests__/e2e/utils/extractObjectIds.js +1 -1
  38. package/dist/__tests__/e2e/utils/mcpTestClient.d.ts.map +1 -1
  39. package/dist/__tests__/e2e/utils/mcpTestClient.js +3 -2
  40. package/dist/__tests__/e2e/utils/mcpTestClient.js.map +1 -1
  41. package/dist/__tests__/e2e/utils/parseListObjectsResponse.d.ts +1 -1
  42. package/dist/__tests__/e2e/utils/parseListObjectsResponse.js +1 -1
  43. package/dist/__tests__/e2e/utils/parseUpdateObjectResponse.d.ts +1 -1
  44. package/dist/__tests__/e2e/utils/parseUpdateObjectResponse.js +1 -1
  45. package/dist/__tests__/e2e/workflow/appendLog.e2e.test.js +4 -4
  46. package/dist/__tests__/e2e/workflow/appendLog.e2e.test.js.map +1 -1
  47. package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.js +15 -15
  48. package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.js.map +1 -1
  49. package/dist/__tests__/e2e/workflow/claimTask.e2e.test.js +44 -0
  50. package/dist/__tests__/e2e/workflow/claimTask.e2e.test.js.map +1 -1
  51. package/dist/__tests__/e2e/workflow/completeTask.e2e.test.js +4 -4
  52. package/dist/__tests__/e2e/workflow/completeTask.e2e.test.js.map +1 -1
  53. package/dist/__tests__/e2e/workflow/prerequisites.e2e.test.js +43 -43
  54. package/dist/__tests__/e2e/workflow/prerequisites.e2e.test.js.map +1 -1
  55. package/dist/__tests__/e2e/workflow/taskLifecycle.e2e.test.js +19 -19
  56. package/dist/__tests__/e2e/workflow/taskLifecycle.e2e.test.js.map +1 -1
  57. package/dist/__tests__/serverStartup.test.d.ts +2 -0
  58. package/dist/__tests__/serverStartup.test.d.ts.map +1 -0
  59. package/dist/__tests__/serverStartup.test.js +171 -0
  60. package/dist/__tests__/serverStartup.test.js.map +1 -0
  61. package/dist/configuration/ServerConfig.d.ts +2 -1
  62. package/dist/configuration/ServerConfig.d.ts.map +1 -1
  63. package/dist/repositories/Repository.d.ts +2 -1
  64. package/dist/repositories/Repository.d.ts.map +1 -1
  65. package/dist/repositories/local/LocalRepository.d.ts +2 -1
  66. package/dist/repositories/local/LocalRepository.d.ts.map +1 -1
  67. package/dist/repositories/local/LocalRepository.js +4 -0
  68. package/dist/repositories/local/LocalRepository.js.map +1 -1
  69. package/dist/repositories/local/__tests__/getChildrenOf.test.d.ts +2 -0
  70. package/dist/repositories/local/__tests__/getChildrenOf.test.d.ts.map +1 -0
  71. package/dist/repositories/local/__tests__/getChildrenOf.test.js +306 -0
  72. package/dist/repositories/local/__tests__/getChildrenOf.test.js.map +1 -0
  73. package/dist/repositories/local/__tests__/getObjects.test.js +309 -0
  74. package/dist/repositories/local/__tests__/getObjects.test.js.map +1 -1
  75. package/dist/repositories/local/deleteObjectById.d.ts.map +1 -1
  76. package/dist/repositories/local/deleteObjectById.js +2 -0
  77. package/dist/repositories/local/deleteObjectById.js.map +1 -1
  78. package/dist/repositories/local/getChildrenOf.d.ts +11 -0
  79. package/dist/repositories/local/getChildrenOf.d.ts.map +1 -0
  80. package/dist/repositories/local/getChildrenOf.js +73 -0
  81. package/dist/repositories/local/getChildrenOf.js.map +1 -0
  82. package/dist/repositories/local/getObjects.d.ts +1 -1
  83. package/dist/repositories/local/getObjects.d.ts.map +1 -1
  84. package/dist/repositories/local/getObjects.js +25 -6
  85. package/dist/repositories/local/getObjects.js.map +1 -1
  86. package/dist/server.js +39 -15
  87. package/dist/server.js.map +1 -1
  88. package/dist/services/TaskTrellisService.d.ts +4 -13
  89. package/dist/services/TaskTrellisService.d.ts.map +1 -1
  90. package/dist/services/local/LocalTaskTrellisService.d.ts +3 -9
  91. package/dist/services/local/LocalTaskTrellisService.d.ts.map +1 -1
  92. package/dist/services/local/LocalTaskTrellisService.js +4 -8
  93. package/dist/services/local/LocalTaskTrellisService.js.map +1 -1
  94. package/dist/services/local/__tests__/appendModifiedFiles.test.js +1 -0
  95. package/dist/services/local/__tests__/appendModifiedFiles.test.js.map +1 -1
  96. package/dist/services/local/__tests__/appendObjectLog.test.js +1 -0
  97. package/dist/services/local/__tests__/appendObjectLog.test.js.map +1 -1
  98. package/dist/services/local/__tests__/claimTask.test.js +127 -131
  99. package/dist/services/local/__tests__/claimTask.test.js.map +1 -1
  100. package/dist/services/local/__tests__/completeTask.test.js +30 -28
  101. package/dist/services/local/__tests__/completeTask.test.js.map +1 -1
  102. package/dist/services/local/__tests__/createObject.test.js +1 -0
  103. package/dist/services/local/__tests__/createObject.test.js.map +1 -1
  104. package/dist/services/local/__tests__/listObjects.test.js +135 -10
  105. package/dist/services/local/__tests__/listObjects.test.js.map +1 -1
  106. package/dist/services/local/__tests__/pruneClosed.test.js +446 -186
  107. package/dist/services/local/__tests__/pruneClosed.test.js.map +1 -1
  108. package/dist/services/local/__tests__/updateObject.test.js +234 -27
  109. package/dist/services/local/__tests__/updateObject.test.js.map +1 -1
  110. package/dist/services/local/claimTask.d.ts.map +1 -1
  111. package/dist/services/local/claimTask.js +25 -34
  112. package/dist/services/local/claimTask.js.map +1 -1
  113. package/dist/services/local/completeTask.d.ts +1 -1
  114. package/dist/services/local/completeTask.d.ts.map +1 -1
  115. package/dist/services/local/completeTask.js +4 -40
  116. package/dist/services/local/completeTask.js.map +1 -1
  117. package/dist/services/local/listObjects.d.ts +1 -1
  118. package/dist/services/local/listObjects.d.ts.map +1 -1
  119. package/dist/services/local/listObjects.js +10 -1
  120. package/dist/services/local/listObjects.js.map +1 -1
  121. package/dist/services/local/pruneClosed.d.ts.map +1 -1
  122. package/dist/services/local/pruneClosed.js +63 -6
  123. package/dist/services/local/pruneClosed.js.map +1 -1
  124. package/dist/services/local/updateObject.d.ts +2 -1
  125. package/dist/services/local/updateObject.d.ts.map +1 -1
  126. package/dist/services/local/updateObject.js +28 -1
  127. package/dist/services/local/updateObject.js.map +1 -1
  128. package/dist/tools/__tests__/appendModifiedFilesTool.test.js +1 -0
  129. package/dist/tools/__tests__/appendModifiedFilesTool.test.js.map +1 -1
  130. package/dist/tools/__tests__/appendObjectLogTool.test.js +1 -0
  131. package/dist/tools/__tests__/appendObjectLogTool.test.js.map +1 -1
  132. package/dist/tools/__tests__/claimTaskTool.test.js +1 -1
  133. package/dist/tools/__tests__/claimTaskTool.test.js.map +1 -1
  134. package/dist/tools/__tests__/completeTaskTool.test.js +23 -16
  135. package/dist/tools/__tests__/completeTaskTool.test.js.map +1 -1
  136. package/dist/tools/__tests__/createObjectTool.test.js +1 -0
  137. package/dist/tools/__tests__/createObjectTool.test.js.map +1 -1
  138. package/dist/tools/__tests__/deleteObjectTool.test.js +1 -0
  139. package/dist/tools/__tests__/deleteObjectTool.test.js.map +1 -1
  140. package/dist/tools/__tests__/getObjectTool.test.js +1 -0
  141. package/dist/tools/__tests__/getObjectTool.test.js.map +1 -1
  142. package/dist/tools/__tests__/listObjectsTool.test.js +160 -1
  143. package/dist/tools/__tests__/listObjectsTool.test.js.map +1 -1
  144. package/dist/tools/__tests__/updateObjectTool.test.js +39 -10
  145. package/dist/tools/__tests__/updateObjectTool.test.js.map +1 -1
  146. package/dist/tools/appendModifiedFilesTool.d.ts +2 -2
  147. package/dist/tools/appendModifiedFilesTool.js +4 -4
  148. package/dist/tools/appendModifiedFilesTool.js.map +1 -1
  149. package/dist/tools/appendObjectLogTool.d.ts +3 -3
  150. package/dist/tools/appendObjectLogTool.js +4 -4
  151. package/dist/tools/appendObjectLogTool.js.map +1 -1
  152. package/dist/tools/completeTaskTool.d.ts +1 -1
  153. package/dist/tools/completeTaskTool.d.ts.map +1 -1
  154. package/dist/tools/completeTaskTool.js +1 -1
  155. package/dist/tools/completeTaskTool.js.map +1 -1
  156. package/dist/tools/createObjectTool.d.ts +8 -8
  157. package/dist/tools/createObjectTool.js +13 -13
  158. package/dist/tools/createObjectTool.js.map +1 -1
  159. package/dist/tools/deleteObjectTool.d.ts +3 -3
  160. package/dist/tools/deleteObjectTool.js +12 -12
  161. package/dist/tools/deleteObjectTool.js.map +1 -1
  162. package/dist/tools/getObjectTool.d.ts +3 -3
  163. package/dist/tools/getObjectTool.d.ts.map +1 -1
  164. package/dist/tools/getObjectTool.js +12 -7
  165. package/dist/tools/getObjectTool.js.map +1 -1
  166. package/dist/tools/index.d.ts +7 -9
  167. package/dist/tools/index.d.ts.map +1 -1
  168. package/dist/tools/index.js +22 -28
  169. package/dist/tools/index.js.map +1 -1
  170. package/dist/tools/listObjectsTool.d.ts +20 -11
  171. package/dist/tools/listObjectsTool.d.ts.map +1 -1
  172. package/dist/tools/listObjectsTool.js +112 -40
  173. package/dist/tools/listObjectsTool.js.map +1 -1
  174. package/dist/tools/updateObjectTool.d.ts +12 -7
  175. package/dist/tools/updateObjectTool.d.ts.map +1 -1
  176. package/dist/tools/updateObjectTool.js +20 -14
  177. package/dist/tools/updateObjectTool.js.map +1 -1
  178. package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.d.ts +2 -0
  179. package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.d.ts.map +1 -0
  180. package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.js +206 -0
  181. package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.js.map +1 -0
  182. package/dist/utils/__tests__/checkPrerequisitesComplete.test.js +5 -0
  183. package/dist/utils/__tests__/checkPrerequisitesComplete.test.js.map +1 -1
  184. package/dist/utils/__tests__/filterUnavailableObjects.test.js +51 -25
  185. package/dist/utils/__tests__/filterUnavailableObjects.test.js.map +1 -1
  186. package/dist/utils/__tests__/isRequiredForOtherObjects.test.js +5 -0
  187. package/dist/utils/__tests__/isRequiredForOtherObjects.test.js.map +1 -1
  188. package/dist/utils/__tests__/updateParentHierarchy.test.d.ts +2 -0
  189. package/dist/utils/__tests__/updateParentHierarchy.test.d.ts.map +1 -0
  190. package/dist/utils/__tests__/updateParentHierarchy.test.js +137 -0
  191. package/dist/utils/__tests__/updateParentHierarchy.test.js.map +1 -0
  192. package/dist/utils/autoCompleteParentHierarchy.d.ts +11 -0
  193. package/dist/utils/autoCompleteParentHierarchy.d.ts.map +1 -0
  194. package/dist/utils/autoCompleteParentHierarchy.js +49 -0
  195. package/dist/utils/autoCompleteParentHierarchy.js.map +1 -0
  196. package/dist/utils/checkHierarchicalPrerequisitesComplete.d.ts +14 -0
  197. package/dist/utils/checkHierarchicalPrerequisitesComplete.d.ts.map +1 -0
  198. package/dist/utils/checkHierarchicalPrerequisitesComplete.js +47 -0
  199. package/dist/utils/checkHierarchicalPrerequisitesComplete.js.map +1 -0
  200. package/dist/utils/filterUnavailableObjects.d.ts +6 -4
  201. package/dist/utils/filterUnavailableObjects.d.ts.map +1 -1
  202. package/dist/utils/filterUnavailableObjects.js +16 -22
  203. package/dist/utils/filterUnavailableObjects.js.map +1 -1
  204. package/dist/utils/index.d.ts +3 -2
  205. package/dist/utils/index.d.ts.map +1 -1
  206. package/dist/utils/index.js +7 -3
  207. package/dist/utils/index.js.map +1 -1
  208. package/dist/utils/updateParentHierarchy.d.ts +11 -0
  209. package/dist/utils/updateParentHierarchy.d.ts.map +1 -0
  210. package/dist/utils/updateParentHierarchy.js +40 -0
  211. package/dist/utils/updateParentHierarchy.js.map +1 -0
  212. package/dist/validation/__tests__/validateObjectCreation.test.js +1 -0
  213. package/dist/validation/__tests__/validateObjectCreation.test.js.map +1 -1
  214. package/dist/validation/__tests__/validateParentExists.test.js +1 -0
  215. package/dist/validation/__tests__/validateParentExists.test.js.map +1 -1
  216. package/dist/validation/__tests__/validateStatusTransition.test.js +1 -0
  217. package/dist/validation/__tests__/validateStatusTransition.test.js.map +1 -1
  218. package/package.json +1 -1
  219. package/dist/__tests__/e2e/crud/replaceObjectBodyRegex.e2e.test.d.ts +0 -2
  220. package/dist/__tests__/e2e/crud/replaceObjectBodyRegex.e2e.test.d.ts.map +0 -1
  221. package/dist/__tests__/e2e/crud/replaceObjectBodyRegex.e2e.test.js +0 -693
  222. package/dist/__tests__/e2e/crud/replaceObjectBodyRegex.e2e.test.js.map +0 -1
  223. package/dist/__tests__/e2e/workflow/pruneClosed.e2e.test.d.ts +0 -2
  224. package/dist/__tests__/e2e/workflow/pruneClosed.e2e.test.d.ts.map +0 -1
  225. package/dist/__tests__/e2e/workflow/pruneClosed.e2e.test.js +0 -352
  226. package/dist/__tests__/e2e/workflow/pruneClosed.e2e.test.js.map +0 -1
  227. package/dist/services/local/__tests__/replaceObjectBodyRegex.test.d.ts +0 -2
  228. package/dist/services/local/__tests__/replaceObjectBodyRegex.test.d.ts.map +0 -1
  229. package/dist/services/local/__tests__/replaceObjectBodyRegex.test.js +0 -283
  230. package/dist/services/local/__tests__/replaceObjectBodyRegex.test.js.map +0 -1
  231. package/dist/services/local/replaceObjectBodyRegex.d.ts +0 -8
  232. package/dist/services/local/replaceObjectBodyRegex.d.ts.map +0 -1
  233. package/dist/services/local/replaceObjectBodyRegex.js +0 -85
  234. package/dist/services/local/replaceObjectBodyRegex.js.map +0 -1
  235. package/dist/tools/__tests__/pruneClosedTool.test.d.ts +0 -2
  236. package/dist/tools/__tests__/pruneClosedTool.test.d.ts.map +0 -1
  237. package/dist/tools/__tests__/pruneClosedTool.test.js +0 -112
  238. package/dist/tools/__tests__/pruneClosedTool.test.js.map +0 -1
  239. package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.d.ts +0 -2
  240. package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.d.ts.map +0 -1
  241. package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.js +0 -89
  242. package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.js.map +0 -1
  243. package/dist/tools/pruneClosedTool.d.ts +0 -27
  244. package/dist/tools/pruneClosedTool.d.ts.map +0 -1
  245. package/dist/tools/pruneClosedTool.js +0 -57
  246. package/dist/tools/pruneClosedTool.js.map +0 -1
  247. package/dist/tools/replaceObjectBodyRegexTool.d.ts +0 -36
  248. package/dist/tools/replaceObjectBodyRegexTool.d.ts.map +0 -1
  249. package/dist/tools/replaceObjectBodyRegexTool.js +0 -67
  250. package/dist/tools/replaceObjectBodyRegexTool.js.map +0 -1
  251. package/dist/utils/ReplaceStringOptions.d.ts +0 -12
  252. package/dist/utils/ReplaceStringOptions.d.ts.map +0 -1
  253. package/dist/utils/ReplaceStringOptions.js +0 -3
  254. package/dist/utils/ReplaceStringOptions.js.map +0 -1
  255. package/dist/utils/__tests__/replaceStringWithRegex.test.d.ts +0 -2
  256. package/dist/utils/__tests__/replaceStringWithRegex.test.d.ts.map +0 -1
  257. package/dist/utils/__tests__/replaceStringWithRegex.test.js +0 -281
  258. package/dist/utils/__tests__/replaceStringWithRegex.test.js.map +0 -1
  259. package/dist/utils/replaceStringWithRegex.d.ts +0 -45
  260. package/dist/utils/replaceStringWithRegex.d.ts.map +0 -1
  261. package/dist/utils/replaceStringWithRegex.js +0 -91
  262. package/dist/utils/replaceStringWithRegex.js.map +0 -1
@@ -1,27 +0,0 @@
1
- import { Repository } from "../repositories";
2
- import { TaskTrellisService } from "../services/TaskTrellisService";
3
- export declare const pruneClosedTool: {
4
- readonly name: "prune_closed";
5
- readonly description: "Prunes closed objects from the task trellis system\n\nUse this tool for maintenance and cleanup of completed, cancelled, or otherwise closed objects that are no longer needed. Essential for system hygiene and performance optimization.\n\nPruning criteria:\n- 'age': Minimum age in minutes since object closure (required)\n- 'scope': Limit pruning to specific project or area (optional)\n- Objects must be in closed states (completed, cancelled, archived)\n- Objects must not have active dependencies or relationships\n\nSafety mechanisms:\n- Only removes truly closed objects (completed, cancelled, etc.)\n- Validates no active objects depend on pruned items\n- Preserves objects referenced by active work\n- Maintains referential integrity of remaining system\n\nCommon usage patterns:\n- Daily cleanup: age=1440 (24 hours)\n- Weekly maintenance: age=10080 (7 days) \n- Project closure: scope='project-name', age=4320 (3 days)\n- System cleanup: age=43200 (30 days)\n\nPruning benefits:\n- Reduces database size and improves query performance\n- Removes clutter from active task views\n- Prevents accumulation of obsolete work items\n- Maintains focus on current and relevant tasks\n\nUse regularly as part of system maintenance to keep the task trellis clean and performant. Consider project lifecycles and audit requirements when setting age thresholds.\n\nThis operation is permanent - pruned objects cannot be recovered.";
6
- readonly inputSchema: {
7
- readonly type: "object";
8
- readonly properties: {
9
- readonly scope: {
10
- readonly type: "string";
11
- readonly description: "Scope to prune objects from (optional)";
12
- };
13
- readonly age: {
14
- readonly type: "number";
15
- readonly description: "Age in minutes for objects to be considered for pruning";
16
- };
17
- };
18
- readonly required: readonly ["age"];
19
- };
20
- };
21
- export declare function handlePruneClosed(service: TaskTrellisService, repository: Repository, args: unknown): Promise<{
22
- content: Array<{
23
- type: string;
24
- text: string;
25
- }>;
26
- }>;
27
- //# sourceMappingURL=pruneClosedTool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pruneClosedTool.d.ts","sourceRoot":"","sources":["../../src/tools/pruneClosedTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;CA+ClB,CAAC;AAEX,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,OAAO;;;;;GAQd"}
@@ -1,57 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pruneClosedTool = void 0;
4
- exports.handlePruneClosed = handlePruneClosed;
5
- exports.pruneClosedTool = {
6
- name: "prune_closed",
7
- description: `Prunes closed objects from the task trellis system
8
-
9
- Use this tool for maintenance and cleanup of completed, cancelled, or otherwise closed objects that are no longer needed. Essential for system hygiene and performance optimization.
10
-
11
- Pruning criteria:
12
- - 'age': Minimum age in minutes since object closure (required)
13
- - 'scope': Limit pruning to specific project or area (optional)
14
- - Objects must be in closed states (completed, cancelled, archived)
15
- - Objects must not have active dependencies or relationships
16
-
17
- Safety mechanisms:
18
- - Only removes truly closed objects (completed, cancelled, etc.)
19
- - Validates no active objects depend on pruned items
20
- - Preserves objects referenced by active work
21
- - Maintains referential integrity of remaining system
22
-
23
- Common usage patterns:
24
- - Daily cleanup: age=1440 (24 hours)
25
- - Weekly maintenance: age=10080 (7 days)
26
- - Project closure: scope='project-name', age=4320 (3 days)
27
- - System cleanup: age=43200 (30 days)
28
-
29
- Pruning benefits:
30
- - Reduces database size and improves query performance
31
- - Removes clutter from active task views
32
- - Prevents accumulation of obsolete work items
33
- - Maintains focus on current and relevant tasks
34
-
35
- Use regularly as part of system maintenance to keep the task trellis clean and performant. Consider project lifecycles and audit requirements when setting age thresholds.
36
-
37
- This operation is permanent - pruned objects cannot be recovered.`,
38
- inputSchema: {
39
- type: "object",
40
- properties: {
41
- scope: {
42
- type: "string",
43
- description: "Scope to prune objects from (optional)",
44
- },
45
- age: {
46
- type: "number",
47
- description: "Age in minutes for objects to be considered for pruning",
48
- },
49
- },
50
- required: ["age"],
51
- },
52
- };
53
- async function handlePruneClosed(service, repository, args) {
54
- const { scope, age } = args;
55
- return service.pruneClosed(repository, age, scope);
56
- }
57
- //# sourceMappingURL=pruneClosedTool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pruneClosedTool.js","sourceRoot":"","sources":["../../src/tools/pruneClosedTool.ts"],"names":[],"mappings":";;;AAoDA,8CAWC;AA5DY,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kEA8BmD;IAChE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wCAAwC;aACtD;YACD,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yDAAyD;aACvE;SACF;QACD,QAAQ,EAAE,CAAC,KAAK,CAAC;KAClB;CACO,CAAC;AAEJ,KAAK,UAAU,iBAAiB,CACrC,OAA2B,EAC3B,UAAsB,EACtB,IAAa;IAEb,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAGtB,CAAC;IAEF,OAAO,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC"}
@@ -1,36 +0,0 @@
1
- import { Repository } from "../repositories";
2
- import { TaskTrellisService } from "../services/TaskTrellisService";
3
- export declare const replaceObjectBodyRegexTool: {
4
- readonly name: "replace_object_body_regex";
5
- readonly description: "Replaces portions of an object's body using regular expressions\n\nUse this tool to make targeted edits to specific sections of an object's body content without recreating the entire text. This is safer and more efficient than wholesale body replacement for surgical text modifications.\n\nThe tool uses regex pattern matching with multiline and global capabilities, similar to Python's re.sub(). When allowMultipleOccurrences is false (default), it prevents unintended bulk replacements by throwing an error if multiple matches are found.\n\nRegex Features:\n- Multiline matching: patterns can span multiple lines\n- Dot-all mode: . matches newlines \n- Backreferences: use \\1, \\2, etc. in replacement text\n- Case-sensitive matching (use (?i) flag in pattern for case-insensitive)\n\nCommon use cases:\n- Update specific sections of documentation\n- Modify code snippets within object descriptions\n- Replace outdated information while preserving structure\n- Update specific parameters or values\n- Fix formatting or content errors in targeted areas\n\nSafety features:\n- Single-match enforcement (unless explicitly allowed)\n- Pattern validation before execution\n- Graceful error handling with detailed messages\n- Original content preservation on pattern mismatch\n\nExample patterns:\n- Simple text: \"old text\" → \"new text\"\n- With context: \"(section:\\s*)old content(\\s*end)\" → \"\\1new content\\2\" \n- Multi-line: \"BEGIN.*?END\" → \"BEGIN\\nnew content\\nEND\"\n- Backreferences: \"(\\w+) (\\w+)\" → \"\\2, \\1\"\n\nThe replacement preserves all object metadata and relationships while only modifying the body content that matches your pattern.";
6
- readonly inputSchema: {
7
- readonly type: "object";
8
- readonly properties: {
9
- readonly id: {
10
- readonly type: "string";
11
- readonly description: "ID of the object whose body should be modified";
12
- };
13
- readonly regex: {
14
- readonly type: "string";
15
- readonly description: "Regular expression pattern to match content in the body";
16
- };
17
- readonly replacement: {
18
- readonly type: "string";
19
- readonly description: "Replacement text (may contain backreferences like \\1, \\2, etc.)";
20
- };
21
- readonly allowMultipleOccurrences: {
22
- readonly type: "boolean";
23
- readonly description: "Allow replacing multiple pattern matches (defaults to false)";
24
- readonly default: false;
25
- };
26
- };
27
- readonly required: readonly ["id", "regex", "replacement"];
28
- };
29
- };
30
- export declare function handleReplaceObjectBodyRegex(service: TaskTrellisService, repository: Repository, args: unknown): Promise<{
31
- content: Array<{
32
- type: string;
33
- text: string;
34
- }>;
35
- }>;
36
- //# sourceMappingURL=replaceObjectBodyRegexTool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"replaceObjectBodyRegexTool.d.ts","sourceRoot":"","sources":["../../src/tools/replaceObjectBodyRegexTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;CA2D7B,CAAC;AAEX,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,OAAO;;;;;GAqBd"}
@@ -1,67 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.replaceObjectBodyRegexTool = void 0;
4
- exports.handleReplaceObjectBodyRegex = handleReplaceObjectBodyRegex;
5
- exports.replaceObjectBodyRegexTool = {
6
- name: "replace_object_body_regex",
7
- description: `Replaces portions of an object's body using regular expressions
8
-
9
- Use this tool to make targeted edits to specific sections of an object's body content without recreating the entire text. This is safer and more efficient than wholesale body replacement for surgical text modifications.
10
-
11
- The tool uses regex pattern matching with multiline and global capabilities, similar to Python's re.sub(). When allowMultipleOccurrences is false (default), it prevents unintended bulk replacements by throwing an error if multiple matches are found.
12
-
13
- Regex Features:
14
- - Multiline matching: patterns can span multiple lines
15
- - Dot-all mode: . matches newlines
16
- - Backreferences: use \\1, \\2, etc. in replacement text
17
- - Case-sensitive matching (use (?i) flag in pattern for case-insensitive)
18
-
19
- Common use cases:
20
- - Update specific sections of documentation
21
- - Modify code snippets within object descriptions
22
- - Replace outdated information while preserving structure
23
- - Update specific parameters or values
24
- - Fix formatting or content errors in targeted areas
25
-
26
- Safety features:
27
- - Single-match enforcement (unless explicitly allowed)
28
- - Pattern validation before execution
29
- - Graceful error handling with detailed messages
30
- - Original content preservation on pattern mismatch
31
-
32
- Example patterns:
33
- - Simple text: "old text" → "new text"
34
- - With context: "(section:\\s*)old content(\\s*end)" → "\\1new content\\2"
35
- - Multi-line: "BEGIN.*?END" → "BEGIN\\nnew content\\nEND"
36
- - Backreferences: "(\\w+) (\\w+)" → "\\2, \\1"
37
-
38
- The replacement preserves all object metadata and relationships while only modifying the body content that matches your pattern.`,
39
- inputSchema: {
40
- type: "object",
41
- properties: {
42
- id: {
43
- type: "string",
44
- description: "ID of the object whose body should be modified",
45
- },
46
- regex: {
47
- type: "string",
48
- description: "Regular expression pattern to match content in the body",
49
- },
50
- replacement: {
51
- type: "string",
52
- description: "Replacement text (may contain backreferences like \\1, \\2, etc.)",
53
- },
54
- allowMultipleOccurrences: {
55
- type: "boolean",
56
- description: "Allow replacing multiple pattern matches (defaults to false)",
57
- default: false,
58
- },
59
- },
60
- required: ["id", "regex", "replacement"],
61
- },
62
- };
63
- async function handleReplaceObjectBodyRegex(service, repository, args) {
64
- const { id, regex, replacement, allowMultipleOccurrences = false, } = args;
65
- return service.replaceObjectBodyRegex(repository, id, regex, replacement, allowMultipleOccurrences);
66
- }
67
- //# sourceMappingURL=replaceObjectBodyRegexTool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"replaceObjectBodyRegexTool.js","sourceRoot":"","sources":["../../src/tools/replaceObjectBodyRegexTool.ts"],"names":[],"mappings":";;;AAgEA,oEAwBC;AArFY,QAAA,0BAA0B,GAAG;IACxC,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iIA+BkH;IAC/H,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,EAAE,EAAE;gBACF,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;aAC9D;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yDAAyD;aACvE;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,mEAAmE;aACtE;YACD,wBAAwB,EAAE;gBACxB,IAAI,EAAE,SAAS;gBACf,WAAW,EACT,8DAA8D;gBAChE,OAAO,EAAE,KAAK;aACf;SACF;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;KACzC;CACO,CAAC;AAEJ,KAAK,UAAU,4BAA4B,CAChD,OAA2B,EAC3B,UAAsB,EACtB,IAAa;IAEb,MAAM,EACJ,EAAE,EACF,KAAK,EACL,WAAW,EACX,wBAAwB,GAAG,KAAK,GACjC,GAAG,IAKH,CAAC;IAEF,OAAO,OAAO,CAAC,sBAAsB,CACnC,UAAU,EACV,EAAE,EACF,KAAK,EACL,WAAW,EACX,wBAAwB,CACzB,CAAC;AACJ,CAAC"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Options for string replacement with regex
3
- */
4
- export interface ReplaceStringOptions {
5
- /** The regular expression pattern to match */
6
- regex: string;
7
- /** The replacement string (may contain backreferences like \1, \2, etc.) */
8
- replacement: string;
9
- /** Whether to allow multiple occurrences to be replaced. If false and multiple matches found, throws an error */
10
- allowMultipleOccurrences?: boolean;
11
- }
12
- //# sourceMappingURL=ReplaceStringOptions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReplaceStringOptions.d.ts","sourceRoot":"","sources":["../../src/utils/ReplaceStringOptions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,iHAAiH;IACjH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=ReplaceStringOptions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReplaceStringOptions.js","sourceRoot":"","sources":["../../src/utils/ReplaceStringOptions.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=replaceStringWithRegex.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"replaceStringWithRegex.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/replaceStringWithRegex.test.ts"],"names":[],"mappings":""}
@@ -1,281 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const replaceStringWithRegex_1 = require("../replaceStringWithRegex");
4
- const MultipleMatchesError_1 = require("../MultipleMatchesError");
5
- describe("replaceStringWithRegex", () => {
6
- describe("basic functionality", () => {
7
- it("should replace simple string patterns", () => {
8
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("hello world", {
9
- regex: "world",
10
- replacement: "universe",
11
- });
12
- expect(result).toBe("hello universe");
13
- });
14
- it("should return original string when no matches found", () => {
15
- const input = "hello world";
16
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(input, {
17
- regex: "foo",
18
- replacement: "bar",
19
- });
20
- expect(result).toBe(input);
21
- });
22
- it("should handle empty replacement string", () => {
23
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("hello world", {
24
- regex: "world",
25
- replacement: "",
26
- });
27
- expect(result).toBe("hello ");
28
- });
29
- it("should handle special regex characters", () => {
30
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("Price: $10.99", {
31
- regex: "\\$\\d+\\.\\d+",
32
- replacement: "$25.00",
33
- });
34
- expect(result).toBe("Price: $25.00");
35
- });
36
- });
37
- describe("backreferences", () => {
38
- it("should handle backreferences with $1, $2 notation", () => {
39
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("John Doe", {
40
- regex: "(\\w+) (\\w+)",
41
- replacement: "$2, $1",
42
- });
43
- expect(result).toBe("Doe, John");
44
- });
45
- it("should handle multiple backreferences", () => {
46
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("2023-12-25", {
47
- regex: "(\\d{4})-(\\d{2})-(\\d{2})",
48
- replacement: "$2/$3/$1",
49
- });
50
- expect(result).toBe("12/25/2023");
51
- });
52
- it("should handle backreferences with surrounding text", () => {
53
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("function getName() {", {
54
- regex: "function (\\w+)\\(\\)",
55
- replacement: "const $1 = () =>",
56
- });
57
- expect(result).toBe("const getName = () => {");
58
- });
59
- });
60
- describe("multiline and dotall matching", () => {
61
- it("should match across multiple lines with dot", () => {
62
- const input = "start\nmiddle\nend";
63
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(input, {
64
- regex: "start.*end",
65
- replacement: "replaced",
66
- });
67
- expect(result).toBe("replaced");
68
- });
69
- it("should handle multiline strings with line anchors", () => {
70
- const input = "line1\nline2\nline3";
71
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(input, {
72
- regex: "^line2$",
73
- replacement: "newline2",
74
- });
75
- expect(result).toBe("line1\nnewline2\nline3");
76
- });
77
- it("should match patterns spanning multiple lines", () => {
78
- const input = "function test() {\n console.log('hello');\n}";
79
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(input, {
80
- regex: "function test\\(\\).*?}",
81
- replacement: "const test = () => { console.log('hi'); }",
82
- });
83
- expect(result).toBe("const test = () => { console.log('hi'); }");
84
- });
85
- });
86
- describe("multiple occurrences handling", () => {
87
- it("should throw error when multiple matches found and not allowed", () => {
88
- expect(() => {
89
- (0, replaceStringWithRegex_1.replaceStringWithRegex)("foo bar foo", {
90
- regex: "foo",
91
- replacement: "baz",
92
- });
93
- }).toThrow(MultipleMatchesError_1.MultipleMatchesError);
94
- });
95
- it("should provide detailed error message for multiple matches", () => {
96
- expect(() => {
97
- (0, replaceStringWithRegex_1.replaceStringWithRegex)("test test test", {
98
- regex: "test",
99
- replacement: "replaced",
100
- });
101
- }).toThrow('Found 3 matches for pattern "test" but allowMultipleOccurrences is false. ' +
102
- "Use allowMultipleOccurrences: true to replace all matches, or provide a more specific regex.");
103
- });
104
- it("should replace all occurrences when allowMultipleOccurrences is true", () => {
105
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("foo bar foo baz foo", {
106
- regex: "foo",
107
- replacement: "qux",
108
- allowMultipleOccurrences: true,
109
- });
110
- expect(result).toBe("qux bar qux baz qux");
111
- });
112
- it("should handle single match correctly regardless of allowMultipleOccurrences", () => {
113
- const result1 = (0, replaceStringWithRegex_1.replaceStringWithRegex)("unique pattern", {
114
- regex: "unique",
115
- replacement: "special",
116
- });
117
- const result2 = (0, replaceStringWithRegex_1.replaceStringWithRegex)("unique pattern", {
118
- regex: "unique",
119
- replacement: "special",
120
- allowMultipleOccurrences: true,
121
- });
122
- expect(result1).toBe("special pattern");
123
- expect(result2).toBe("special pattern");
124
- });
125
- it("should efficiently detect multiple matches in large strings without creating full array upfront", () => {
126
- // Create a large string with many matches to test performance optimization
127
- const pattern = "match";
128
- const largeString = Array(1000).fill(`${pattern} text`).join(" ");
129
- expect(() => {
130
- (0, replaceStringWithRegex_1.replaceStringWithRegex)(largeString, {
131
- regex: pattern,
132
- replacement: "replaced",
133
- });
134
- }).toThrow(MultipleMatchesError_1.MultipleMatchesError);
135
- // Verify the error message still contains correct count despite optimization
136
- expect(() => {
137
- (0, replaceStringWithRegex_1.replaceStringWithRegex)(largeString, {
138
- regex: pattern,
139
- replacement: "replaced",
140
- });
141
- }).toThrow(/Found 1000 matches for pattern/);
142
- });
143
- });
144
- describe("error handling", () => {
145
- it("should throw error for empty regex pattern", () => {
146
- expect(() => {
147
- (0, replaceStringWithRegex_1.replaceStringWithRegex)("test", {
148
- regex: "",
149
- replacement: "replaced",
150
- });
151
- }).toThrow("Regex pattern cannot be empty");
152
- });
153
- it("should throw error for invalid regex pattern", () => {
154
- expect(() => {
155
- (0, replaceStringWithRegex_1.replaceStringWithRegex)("test", {
156
- regex: "[invalid",
157
- replacement: "replaced",
158
- });
159
- }).toThrow("Invalid regex pattern:");
160
- });
161
- it("should handle regex with unmatched parentheses", () => {
162
- expect(() => {
163
- (0, replaceStringWithRegex_1.replaceStringWithRegex)("test", {
164
- regex: "(unmatched",
165
- replacement: "replaced",
166
- });
167
- }).toThrow("Invalid regex pattern:");
168
- });
169
- it("should handle regex with invalid quantifiers", () => {
170
- expect(() => {
171
- (0, replaceStringWithRegex_1.replaceStringWithRegex)("test", {
172
- regex: "*invalid",
173
- replacement: "replaced",
174
- });
175
- }).toThrow("Invalid regex pattern:");
176
- });
177
- });
178
- describe("edge cases", () => {
179
- it("should handle empty input string", () => {
180
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("", {
181
- regex: "anything",
182
- replacement: "something",
183
- });
184
- expect(result).toBe("");
185
- });
186
- it("should handle very long strings", () => {
187
- const longString = "a".repeat(10000) + "target" + "b".repeat(10000);
188
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(longString, {
189
- regex: "target",
190
- replacement: "replaced",
191
- });
192
- expect(result).toBe("a".repeat(10000) + "replaced" + "b".repeat(10000));
193
- });
194
- it("should handle unicode characters", () => {
195
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("Hello 🌍", {
196
- regex: "🌍",
197
- replacement: "🌎",
198
- });
199
- expect(result).toBe("Hello 🌎");
200
- });
201
- it("should handle regex with word boundaries", () => {
202
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("cat concatenate", {
203
- regex: "\\bcat\\b",
204
- replacement: "dog",
205
- });
206
- expect(result).toBe("dog concatenate");
207
- });
208
- it("should handle case-sensitive matching", () => {
209
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("Hello HELLO hello", {
210
- regex: "hello",
211
- replacement: "hi",
212
- allowMultipleOccurrences: true,
213
- });
214
- expect(result).toBe("Hello HELLO hi");
215
- });
216
- });
217
- describe("real-world scenarios", () => {
218
- it("should replace function declarations", () => {
219
- const code = "function calculate(a, b) { return a + b; }";
220
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(code, {
221
- regex: "function (\\w+)\\(([^)]*)\\)",
222
- replacement: "const $1 = ($2) =>",
223
- });
224
- expect(result).toBe("const calculate = (a, b) => { return a + b; }");
225
- });
226
- it("should replace import statements", () => {
227
- const code = 'import { foo } from "./bar";';
228
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(code, {
229
- regex: 'import \\{ ([^}]+) \\} from "([^"]+)";',
230
- replacement: 'const { $1 } = require("$2");',
231
- });
232
- expect(result).toBe('const { foo } = require("./bar");');
233
- });
234
- it("should replace console.log with custom logger", () => {
235
- const code = 'console.log("debug info"); console.log("more info");';
236
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(code, {
237
- regex: "console\\.log",
238
- replacement: "logger.debug",
239
- allowMultipleOccurrences: true,
240
- });
241
- expect(result).toBe('logger.debug("debug info"); logger.debug("more info");');
242
- });
243
- it("should replace CSS class names", () => {
244
- const css = ".old-class { color: red; } .another-old-class { font-size: 16px; }";
245
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(css, {
246
- regex: "\\.old-class\\b",
247
- replacement: ".new-class",
248
- allowMultipleOccurrences: true,
249
- });
250
- expect(result).toBe(".new-class { color: red; } .another-old-class { font-size: 16px; }");
251
- });
252
- it("should handle complex markdown replacements", () => {
253
- const markdown = "# Heading\n\n## Subheading\n\nSome text";
254
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)(markdown, {
255
- regex: "^## (.+)$",
256
- replacement: "### $1",
257
- });
258
- expect(result).toBe("# Heading\n\n### Subheading\n\nSome text");
259
- });
260
- });
261
- describe("type checking", () => {
262
- it("should accept valid ReplaceStringOptions", () => {
263
- const options = {
264
- regex: "test",
265
- replacement: "replaced",
266
- allowMultipleOccurrences: false,
267
- };
268
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("test string", options);
269
- expect(result).toBe("replaced string");
270
- });
271
- it("should work with minimal options", () => {
272
- const options = {
273
- regex: "test",
274
- replacement: "replaced",
275
- };
276
- const result = (0, replaceStringWithRegex_1.replaceStringWithRegex)("test string", options);
277
- expect(result).toBe("replaced string");
278
- });
279
- });
280
- });
281
- //# sourceMappingURL=replaceStringWithRegex.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"replaceStringWithRegex.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/replaceStringWithRegex.test.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- import { ReplaceStringOptions } from "./ReplaceStringOptions";
2
- /**
3
- * Replaces portions of a string using a regular expression pattern
4
- *
5
- * This function provides regex-based string replacement similar to Python's re.sub(),
6
- * with multiline and global matching capabilities. When allowMultipleOccurrences is false,
7
- * it will throw an error if the regex matches multiple times, helping prevent unintended
8
- * bulk replacements.
9
- *
10
- * @param input - The string to modify
11
- * @param options - Configuration object containing regex, replacement, and options
12
- * @returns The modified string
13
- * @throws {MultipleMatchesError} When multiple matches found but not allowed
14
- * @throws {Error} When regex pattern is invalid
15
- *
16
- * @example
17
- * ```typescript
18
- * // Simple replacement
19
- * replaceStringWithRegex("hello world", {
20
- * regex: "world",
21
- * replacement: "universe"
22
- * }); // "hello universe"
23
- *
24
- * // With backreferences
25
- * replaceStringWithRegex("John Doe", {
26
- * regex: "(\\w+) (\\w+)",
27
- * replacement: "$2, $1"
28
- * }); // "Doe, John"
29
- *
30
- * // Multiple matches with permission
31
- * replaceStringWithRegex("foo bar foo", {
32
- * regex: "foo",
33
- * replacement: "baz",
34
- * allowMultipleOccurrences: true
35
- * }); // "baz bar baz"
36
- *
37
- * // Multiple matches without permission (throws error)
38
- * replaceStringWithRegex("foo bar foo", {
39
- * regex: "foo",
40
- * replacement: "baz"
41
- * }); // throws MultipleMatchesError
42
- * ```
43
- */
44
- export declare function replaceStringWithRegex(input: string, options: ReplaceStringOptions): string;
45
- //# sourceMappingURL=replaceStringWithRegex.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"replaceStringWithRegex.d.ts","sourceRoot":"","sources":["../../src/utils/replaceStringWithRegex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAgDR"}