@langadventurellc/task-trellis-mcp 0.1.0-rc.3

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 (343) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +81 -0
  3. package/dist/configuration/ServerConfig.d.ts +8 -0
  4. package/dist/configuration/ServerConfig.d.ts.map +1 -0
  5. package/dist/configuration/ServerConfig.js +3 -0
  6. package/dist/configuration/ServerConfig.js.map +1 -0
  7. package/dist/configuration/index.d.ts +2 -0
  8. package/dist/configuration/index.d.ts.map +1 -0
  9. package/dist/configuration/index.js +18 -0
  10. package/dist/configuration/index.js.map +1 -0
  11. package/dist/models/TrellisObject.d.ts +18 -0
  12. package/dist/models/TrellisObject.d.ts.map +1 -0
  13. package/dist/models/TrellisObject.js +3 -0
  14. package/dist/models/TrellisObject.js.map +1 -0
  15. package/dist/models/TrellisObjectPriority.d.ts +6 -0
  16. package/dist/models/TrellisObjectPriority.d.ts.map +1 -0
  17. package/dist/models/TrellisObjectPriority.js +10 -0
  18. package/dist/models/TrellisObjectPriority.js.map +1 -0
  19. package/dist/models/TrellisObjectStatus.d.ts +8 -0
  20. package/dist/models/TrellisObjectStatus.d.ts.map +1 -0
  21. package/dist/models/TrellisObjectStatus.js +12 -0
  22. package/dist/models/TrellisObjectStatus.js.map +1 -0
  23. package/dist/models/TrellisObjectType.d.ts +7 -0
  24. package/dist/models/TrellisObjectType.d.ts.map +1 -0
  25. package/dist/models/TrellisObjectType.js +11 -0
  26. package/dist/models/TrellisObjectType.js.map +1 -0
  27. package/dist/models/__tests__/isClaimable.test.d.ts +2 -0
  28. package/dist/models/__tests__/isClaimable.test.d.ts.map +1 -0
  29. package/dist/models/__tests__/isClaimable.test.js +101 -0
  30. package/dist/models/__tests__/isClaimable.test.js.map +1 -0
  31. package/dist/models/__tests__/isClosed.test.d.ts +2 -0
  32. package/dist/models/__tests__/isClosed.test.d.ts.map +1 -0
  33. package/dist/models/__tests__/isClosed.test.js +84 -0
  34. package/dist/models/__tests__/isClosed.test.js.map +1 -0
  35. package/dist/models/__tests__/isOpen.test.d.ts +2 -0
  36. package/dist/models/__tests__/isOpen.test.d.ts.map +1 -0
  37. package/dist/models/__tests__/isOpen.test.js +84 -0
  38. package/dist/models/__tests__/isOpen.test.js.map +1 -0
  39. package/dist/models/index.d.ts +8 -0
  40. package/dist/models/index.d.ts.map +1 -0
  41. package/dist/models/index.js +16 -0
  42. package/dist/models/index.js.map +1 -0
  43. package/dist/models/isClaimable.d.ts +10 -0
  44. package/dist/models/isClaimable.d.ts.map +1 -0
  45. package/dist/models/isClaimable.js +16 -0
  46. package/dist/models/isClaimable.js.map +1 -0
  47. package/dist/models/isClosed.d.ts +10 -0
  48. package/dist/models/isClosed.d.ts.map +1 -0
  49. package/dist/models/isClosed.js +16 -0
  50. package/dist/models/isClosed.js.map +1 -0
  51. package/dist/models/isOpen.d.ts +10 -0
  52. package/dist/models/isOpen.d.ts.map +1 -0
  53. package/dist/models/isOpen.js +16 -0
  54. package/dist/models/isOpen.js.map +1 -0
  55. package/dist/repositories/Repository.d.ts +8 -0
  56. package/dist/repositories/Repository.d.ts.map +1 -0
  57. package/dist/repositories/Repository.js +3 -0
  58. package/dist/repositories/Repository.js.map +1 -0
  59. package/dist/repositories/index.d.ts +3 -0
  60. package/dist/repositories/index.d.ts.map +1 -0
  61. package/dist/repositories/index.js +19 -0
  62. package/dist/repositories/index.js.map +1 -0
  63. package/dist/repositories/local/LocalRepository.d.ts +21 -0
  64. package/dist/repositories/local/LocalRepository.d.ts.map +1 -0
  65. package/dist/repositories/local/LocalRepository.js +75 -0
  66. package/dist/repositories/local/LocalRepository.js.map +1 -0
  67. package/dist/repositories/local/__tests__/deleteObjectById.test.d.ts +2 -0
  68. package/dist/repositories/local/__tests__/deleteObjectById.test.d.ts.map +1 -0
  69. package/dist/repositories/local/__tests__/deleteObjectById.test.js +228 -0
  70. package/dist/repositories/local/__tests__/deleteObjectById.test.js.map +1 -0
  71. package/dist/repositories/local/__tests__/extractMarkdownIds.test.d.ts +2 -0
  72. package/dist/repositories/local/__tests__/extractMarkdownIds.test.d.ts.map +1 -0
  73. package/dist/repositories/local/__tests__/extractMarkdownIds.test.js +135 -0
  74. package/dist/repositories/local/__tests__/extractMarkdownIds.test.js.map +1 -0
  75. package/dist/repositories/local/__tests__/findMarkdownFiles.test.d.ts +2 -0
  76. package/dist/repositories/local/__tests__/findMarkdownFiles.test.d.ts.map +1 -0
  77. package/dist/repositories/local/__tests__/findMarkdownFiles.test.js +236 -0
  78. package/dist/repositories/local/__tests__/findMarkdownFiles.test.js.map +1 -0
  79. package/dist/repositories/local/__tests__/getObjectByFilePath.test.d.ts +2 -0
  80. package/dist/repositories/local/__tests__/getObjectByFilePath.test.d.ts.map +1 -0
  81. package/dist/repositories/local/__tests__/getObjectByFilePath.test.js +96 -0
  82. package/dist/repositories/local/__tests__/getObjectByFilePath.test.js.map +1 -0
  83. package/dist/repositories/local/__tests__/getObjectById.test.d.ts +2 -0
  84. package/dist/repositories/local/__tests__/getObjectById.test.d.ts.map +1 -0
  85. package/dist/repositories/local/__tests__/getObjectById.test.js +46 -0
  86. package/dist/repositories/local/__tests__/getObjectById.test.js.map +1 -0
  87. package/dist/repositories/local/__tests__/getObjectFilePath.test.d.ts +2 -0
  88. package/dist/repositories/local/__tests__/getObjectFilePath.test.d.ts.map +1 -0
  89. package/dist/repositories/local/__tests__/getObjectFilePath.test.js +172 -0
  90. package/dist/repositories/local/__tests__/getObjectFilePath.test.js.map +1 -0
  91. package/dist/repositories/local/__tests__/getObjects.test.d.ts +2 -0
  92. package/dist/repositories/local/__tests__/getObjects.test.d.ts.map +1 -0
  93. package/dist/repositories/local/__tests__/getObjects.test.js +351 -0
  94. package/dist/repositories/local/__tests__/getObjects.test.js.map +1 -0
  95. package/dist/repositories/local/__tests__/scopeFilter.test.d.ts +2 -0
  96. package/dist/repositories/local/__tests__/scopeFilter.test.d.ts.map +1 -0
  97. package/dist/repositories/local/__tests__/scopeFilter.test.js +109 -0
  98. package/dist/repositories/local/__tests__/scopeFilter.test.js.map +1 -0
  99. package/dist/repositories/local/deleteObjectById.d.ts +16 -0
  100. package/dist/repositories/local/deleteObjectById.d.ts.map +1 -0
  101. package/dist/repositories/local/deleteObjectById.js +108 -0
  102. package/dist/repositories/local/deleteObjectById.js.map +1 -0
  103. package/dist/repositories/local/extractMarkdownIds.d.ts +17 -0
  104. package/dist/repositories/local/extractMarkdownIds.d.ts.map +1 -0
  105. package/dist/repositories/local/extractMarkdownIds.js +34 -0
  106. package/dist/repositories/local/extractMarkdownIds.js.map +1 -0
  107. package/dist/repositories/local/filterByScope.d.ts +8 -0
  108. package/dist/repositories/local/filterByScope.d.ts.map +1 -0
  109. package/dist/repositories/local/filterByScope.js +17 -0
  110. package/dist/repositories/local/filterByScope.js.map +1 -0
  111. package/dist/repositories/local/findMarkdownFiles.d.ts +9 -0
  112. package/dist/repositories/local/findMarkdownFiles.d.ts.map +1 -0
  113. package/dist/repositories/local/findMarkdownFiles.js +47 -0
  114. package/dist/repositories/local/findMarkdownFiles.js.map +1 -0
  115. package/dist/repositories/local/getObjectByFilePath.d.ts +9 -0
  116. package/dist/repositories/local/getObjectByFilePath.d.ts.map +1 -0
  117. package/dist/repositories/local/getObjectByFilePath.js +16 -0
  118. package/dist/repositories/local/getObjectByFilePath.js.map +1 -0
  119. package/dist/repositories/local/getObjectById.d.ts +10 -0
  120. package/dist/repositories/local/getObjectById.d.ts.map +1 -0
  121. package/dist/repositories/local/getObjectById.js +36 -0
  122. package/dist/repositories/local/getObjectById.js.map +1 -0
  123. package/dist/repositories/local/getObjectFilePath.d.ts +7 -0
  124. package/dist/repositories/local/getObjectFilePath.d.ts.map +1 -0
  125. package/dist/repositories/local/getObjectFilePath.js +90 -0
  126. package/dist/repositories/local/getObjectFilePath.js.map +1 -0
  127. package/dist/repositories/local/getObjects.d.ts +3 -0
  128. package/dist/repositories/local/getObjects.d.ts.map +1 -0
  129. package/dist/repositories/local/getObjects.js +64 -0
  130. package/dist/repositories/local/getObjects.js.map +1 -0
  131. package/dist/repositories/local/index.d.ts +8 -0
  132. package/dist/repositories/local/index.d.ts.map +1 -0
  133. package/dist/repositories/local/index.js +24 -0
  134. package/dist/repositories/local/index.js.map +1 -0
  135. package/dist/repositories/local/saveObject.d.ts +12 -0
  136. package/dist/repositories/local/saveObject.d.ts.map +1 -0
  137. package/dist/repositories/local/saveObject.js +27 -0
  138. package/dist/repositories/local/saveObject.js.map +1 -0
  139. package/dist/repositories/local/scopeFilter.d.ts +12 -0
  140. package/dist/repositories/local/scopeFilter.d.ts.map +1 -0
  141. package/dist/repositories/local/scopeFilter.js +21 -0
  142. package/dist/repositories/local/scopeFilter.js.map +1 -0
  143. package/dist/server.d.ts +3 -0
  144. package/dist/server.d.ts.map +1 -0
  145. package/dist/server.js +138 -0
  146. package/dist/server.js.map +1 -0
  147. package/dist/tools/__tests__/appendObjectLogTool.test.d.ts +2 -0
  148. package/dist/tools/__tests__/appendObjectLogTool.test.d.ts.map +1 -0
  149. package/dist/tools/__tests__/appendObjectLogTool.test.js +125 -0
  150. package/dist/tools/__tests__/appendObjectLogTool.test.js.map +1 -0
  151. package/dist/tools/__tests__/claimTaskTool.test.d.ts +2 -0
  152. package/dist/tools/__tests__/claimTaskTool.test.d.ts.map +1 -0
  153. package/dist/tools/__tests__/claimTaskTool.test.js +348 -0
  154. package/dist/tools/__tests__/claimTaskTool.test.js.map +1 -0
  155. package/dist/tools/__tests__/completeTaskTool.test.d.ts +2 -0
  156. package/dist/tools/__tests__/completeTaskTool.test.d.ts.map +1 -0
  157. package/dist/tools/__tests__/completeTaskTool.test.js +221 -0
  158. package/dist/tools/__tests__/completeTaskTool.test.js.map +1 -0
  159. package/dist/tools/__tests__/createObjectTool.test.d.ts +2 -0
  160. package/dist/tools/__tests__/createObjectTool.test.d.ts.map +1 -0
  161. package/dist/tools/__tests__/createObjectTool.test.js +387 -0
  162. package/dist/tools/__tests__/createObjectTool.test.js.map +1 -0
  163. package/dist/tools/__tests__/deleteObjectTool.test.d.ts +2 -0
  164. package/dist/tools/__tests__/deleteObjectTool.test.d.ts.map +1 -0
  165. package/dist/tools/__tests__/deleteObjectTool.test.js +169 -0
  166. package/dist/tools/__tests__/deleteObjectTool.test.js.map +1 -0
  167. package/dist/tools/__tests__/getObjectTool.test.d.ts +2 -0
  168. package/dist/tools/__tests__/getObjectTool.test.d.ts.map +1 -0
  169. package/dist/tools/__tests__/getObjectTool.test.js +124 -0
  170. package/dist/tools/__tests__/getObjectTool.test.js.map +1 -0
  171. package/dist/tools/__tests__/listObjectsTool.test.d.ts +2 -0
  172. package/dist/tools/__tests__/listObjectsTool.test.d.ts.map +1 -0
  173. package/dist/tools/__tests__/listObjectsTool.test.js +266 -0
  174. package/dist/tools/__tests__/listObjectsTool.test.js.map +1 -0
  175. package/dist/tools/__tests__/updateObjectTool.test.d.ts +2 -0
  176. package/dist/tools/__tests__/updateObjectTool.test.d.ts.map +1 -0
  177. package/dist/tools/__tests__/updateObjectTool.test.js +208 -0
  178. package/dist/tools/__tests__/updateObjectTool.test.js.map +1 -0
  179. package/dist/tools/activateTool.d.ts +38 -0
  180. package/dist/tools/activateTool.d.ts.map +1 -0
  181. package/dist/tools/activateTool.js +48 -0
  182. package/dist/tools/activateTool.js.map +1 -0
  183. package/dist/tools/appendObjectLogTool.d.ts +26 -0
  184. package/dist/tools/appendObjectLogTool.d.ts.map +1 -0
  185. package/dist/tools/appendObjectLogTool.js +65 -0
  186. package/dist/tools/appendObjectLogTool.js.map +1 -0
  187. package/dist/tools/claimTaskTool.d.ts +30 -0
  188. package/dist/tools/claimTaskTool.d.ts.map +1 -0
  189. package/dist/tools/claimTaskTool.js +109 -0
  190. package/dist/tools/claimTaskTool.js.map +1 -0
  191. package/dist/tools/completeTaskTool.d.ts +33 -0
  192. package/dist/tools/completeTaskTool.d.ts.map +1 -0
  193. package/dist/tools/completeTaskTool.js +61 -0
  194. package/dist/tools/completeTaskTool.js.map +1 -0
  195. package/dist/tools/createObjectTool.d.ts +52 -0
  196. package/dist/tools/createObjectTool.d.ts.map +1 -0
  197. package/dist/tools/createObjectTool.js +87 -0
  198. package/dist/tools/createObjectTool.js.map +1 -0
  199. package/dist/tools/deleteObjectTool.d.ts +27 -0
  200. package/dist/tools/deleteObjectTool.d.ts.map +1 -0
  201. package/dist/tools/deleteObjectTool.js +48 -0
  202. package/dist/tools/deleteObjectTool.js.map +1 -0
  203. package/dist/tools/getObjectTool.d.ts +22 -0
  204. package/dist/tools/getObjectTool.d.ts.map +1 -0
  205. package/dist/tools/getObjectTool.js +53 -0
  206. package/dist/tools/getObjectTool.js.map +1 -0
  207. package/dist/tools/index.d.ts +11 -0
  208. package/dist/tools/index.d.ts.map +1 -0
  209. package/dist/tools/index.js +34 -0
  210. package/dist/tools/index.js.map +1 -0
  211. package/dist/tools/listObjectsTool.d.ts +39 -0
  212. package/dist/tools/listObjectsTool.d.ts.map +1 -0
  213. package/dist/tools/listObjectsTool.js +87 -0
  214. package/dist/tools/listObjectsTool.js.map +1 -0
  215. package/dist/tools/pruneClosedTool.d.ts +26 -0
  216. package/dist/tools/pruneClosedTool.d.ts.map +1 -0
  217. package/dist/tools/pruneClosedTool.js +35 -0
  218. package/dist/tools/pruneClosedTool.js.map +1 -0
  219. package/dist/tools/updateObjectTool.d.ts +46 -0
  220. package/dist/tools/updateObjectTool.d.ts.map +1 -0
  221. package/dist/tools/updateObjectTool.js +93 -0
  222. package/dist/tools/updateObjectTool.js.map +1 -0
  223. package/dist/utils/__tests__/checkPrerequisitesComplete.test.d.ts +2 -0
  224. package/dist/utils/__tests__/checkPrerequisitesComplete.test.d.ts.map +1 -0
  225. package/dist/utils/__tests__/checkPrerequisitesComplete.test.js +200 -0
  226. package/dist/utils/__tests__/checkPrerequisitesComplete.test.js.map +1 -0
  227. package/dist/utils/__tests__/deserializeTrellisObject.test.d.ts +2 -0
  228. package/dist/utils/__tests__/deserializeTrellisObject.test.d.ts.map +1 -0
  229. package/dist/utils/__tests__/deserializeTrellisObject.test.js +329 -0
  230. package/dist/utils/__tests__/deserializeTrellisObject.test.js.map +1 -0
  231. package/dist/utils/__tests__/filterUnavailableObjects.test.d.ts +2 -0
  232. package/dist/utils/__tests__/filterUnavailableObjects.test.d.ts.map +1 -0
  233. package/dist/utils/__tests__/filterUnavailableObjects.test.js +172 -0
  234. package/dist/utils/__tests__/filterUnavailableObjects.test.js.map +1 -0
  235. package/dist/utils/__tests__/generateUniqueId.test.d.ts +2 -0
  236. package/dist/utils/__tests__/generateUniqueId.test.d.ts.map +1 -0
  237. package/dist/utils/__tests__/generateUniqueId.test.js +186 -0
  238. package/dist/utils/__tests__/generateUniqueId.test.js.map +1 -0
  239. package/dist/utils/__tests__/inferObjectType.test.d.ts +2 -0
  240. package/dist/utils/__tests__/inferObjectType.test.d.ts.map +1 -0
  241. package/dist/utils/__tests__/inferObjectType.test.js +43 -0
  242. package/dist/utils/__tests__/inferObjectType.test.js.map +1 -0
  243. package/dist/utils/__tests__/isRequiredForOtherObjects.test.d.ts +2 -0
  244. package/dist/utils/__tests__/isRequiredForOtherObjects.test.d.ts.map +1 -0
  245. package/dist/utils/__tests__/isRequiredForOtherObjects.test.js +229 -0
  246. package/dist/utils/__tests__/isRequiredForOtherObjects.test.js.map +1 -0
  247. package/dist/utils/__tests__/serializationRoundTrip.test.d.ts +2 -0
  248. package/dist/utils/__tests__/serializationRoundTrip.test.d.ts.map +1 -0
  249. package/dist/utils/__tests__/serializationRoundTrip.test.js +389 -0
  250. package/dist/utils/__tests__/serializationRoundTrip.test.js.map +1 -0
  251. package/dist/utils/__tests__/serializeTrellisObject.test.d.ts +2 -0
  252. package/dist/utils/__tests__/serializeTrellisObject.test.d.ts.map +1 -0
  253. package/dist/utils/__tests__/serializeTrellisObject.test.js +192 -0
  254. package/dist/utils/__tests__/serializeTrellisObject.test.js.map +1 -0
  255. package/dist/utils/__tests__/sortTrellisObjects.test.d.ts +2 -0
  256. package/dist/utils/__tests__/sortTrellisObjects.test.d.ts.map +1 -0
  257. package/dist/utils/__tests__/sortTrellisObjects.test.js +114 -0
  258. package/dist/utils/__tests__/sortTrellisObjects.test.js.map +1 -0
  259. package/dist/utils/checkPrerequisitesComplete.d.ts +12 -0
  260. package/dist/utils/checkPrerequisitesComplete.d.ts.map +1 -0
  261. package/dist/utils/checkPrerequisitesComplete.js +38 -0
  262. package/dist/utils/checkPrerequisitesComplete.js.map +1 -0
  263. package/dist/utils/deserializeTrellisObject.d.ts +9 -0
  264. package/dist/utils/deserializeTrellisObject.d.ts.map +1 -0
  265. package/dist/utils/deserializeTrellisObject.js +134 -0
  266. package/dist/utils/deserializeTrellisObject.js.map +1 -0
  267. package/dist/utils/filterUnavailableObjects.d.ts +13 -0
  268. package/dist/utils/filterUnavailableObjects.d.ts.map +1 -0
  269. package/dist/utils/filterUnavailableObjects.js +40 -0
  270. package/dist/utils/filterUnavailableObjects.js.map +1 -0
  271. package/dist/utils/generateUniqueId.d.ts +10 -0
  272. package/dist/utils/generateUniqueId.d.ts.map +1 -0
  273. package/dist/utils/generateUniqueId.js +67 -0
  274. package/dist/utils/generateUniqueId.js.map +1 -0
  275. package/dist/utils/index.d.ts +9 -0
  276. package/dist/utils/index.d.ts.map +1 -0
  277. package/dist/utils/index.js +20 -0
  278. package/dist/utils/index.js.map +1 -0
  279. package/dist/utils/inferObjectType.d.ts +3 -0
  280. package/dist/utils/inferObjectType.d.ts.map +1 -0
  281. package/dist/utils/inferObjectType.js +26 -0
  282. package/dist/utils/inferObjectType.js.map +1 -0
  283. package/dist/utils/isRequiredForOtherObjects.d.ts +12 -0
  284. package/dist/utils/isRequiredForOtherObjects.d.ts.map +1 -0
  285. package/dist/utils/isRequiredForOtherObjects.js +33 -0
  286. package/dist/utils/isRequiredForOtherObjects.js.map +1 -0
  287. package/dist/utils/serializeTrellisObject.d.ts +8 -0
  288. package/dist/utils/serializeTrellisObject.d.ts.map +1 -0
  289. package/dist/utils/serializeTrellisObject.js +35 -0
  290. package/dist/utils/serializeTrellisObject.js.map +1 -0
  291. package/dist/utils/sortTrellisObjects.d.ts +8 -0
  292. package/dist/utils/sortTrellisObjects.d.ts.map +1 -0
  293. package/dist/utils/sortTrellisObjects.js +20 -0
  294. package/dist/utils/sortTrellisObjects.js.map +1 -0
  295. package/dist/validation/ValidationError.d.ts +9 -0
  296. package/dist/validation/ValidationError.d.ts.map +1 -0
  297. package/dist/validation/ValidationError.js +18 -0
  298. package/dist/validation/ValidationError.js.map +1 -0
  299. package/dist/validation/ValidationErrorCode.d.ts +3 -0
  300. package/dist/validation/ValidationErrorCode.d.ts.map +1 -0
  301. package/dist/validation/ValidationErrorCode.js +3 -0
  302. package/dist/validation/ValidationErrorCode.js.map +1 -0
  303. package/dist/validation/ValidationErrorCodes.d.ts +8 -0
  304. package/dist/validation/ValidationErrorCodes.d.ts.map +1 -0
  305. package/dist/validation/ValidationErrorCodes.js +11 -0
  306. package/dist/validation/ValidationErrorCodes.js.map +1 -0
  307. package/dist/validation/__tests__/ValidationError.test.d.ts +2 -0
  308. package/dist/validation/__tests__/ValidationError.test.d.ts.map +1 -0
  309. package/dist/validation/__tests__/ValidationError.test.js +32 -0
  310. package/dist/validation/__tests__/ValidationError.test.js.map +1 -0
  311. package/dist/validation/__tests__/validateObjectCreation.test.d.ts +2 -0
  312. package/dist/validation/__tests__/validateObjectCreation.test.d.ts.map +1 -0
  313. package/dist/validation/__tests__/validateObjectCreation.test.js +93 -0
  314. package/dist/validation/__tests__/validateObjectCreation.test.js.map +1 -0
  315. package/dist/validation/__tests__/validateParentExists.test.d.ts +2 -0
  316. package/dist/validation/__tests__/validateParentExists.test.d.ts.map +1 -0
  317. package/dist/validation/__tests__/validateParentExists.test.js +62 -0
  318. package/dist/validation/__tests__/validateParentExists.test.js.map +1 -0
  319. package/dist/validation/__tests__/validateParentType.test.d.ts +2 -0
  320. package/dist/validation/__tests__/validateParentType.test.d.ts.map +1 -0
  321. package/dist/validation/__tests__/validateParentType.test.js +125 -0
  322. package/dist/validation/__tests__/validateParentType.test.js.map +1 -0
  323. package/dist/validation/__tests__/validateStatusTransition.test.d.ts +2 -0
  324. package/dist/validation/__tests__/validateStatusTransition.test.d.ts.map +1 -0
  325. package/dist/validation/__tests__/validateStatusTransition.test.js +103 -0
  326. package/dist/validation/__tests__/validateStatusTransition.test.js.map +1 -0
  327. package/dist/validation/validateObjectCreation.d.ts +12 -0
  328. package/dist/validation/validateObjectCreation.d.ts.map +1 -0
  329. package/dist/validation/validateObjectCreation.js +24 -0
  330. package/dist/validation/validateObjectCreation.js.map +1 -0
  331. package/dist/validation/validateParentExists.d.ts +10 -0
  332. package/dist/validation/validateParentExists.d.ts.map +1 -0
  333. package/dist/validation/validateParentExists.js +23 -0
  334. package/dist/validation/validateParentExists.js.map +1 -0
  335. package/dist/validation/validateParentType.d.ts +16 -0
  336. package/dist/validation/validateParentType.d.ts.map +1 -0
  337. package/dist/validation/validateParentType.js +48 -0
  338. package/dist/validation/validateParentType.js.map +1 -0
  339. package/dist/validation/validateStatusTransition.d.ts +12 -0
  340. package/dist/validation/validateStatusTransition.d.ts.map +1 -0
  341. package/dist/validation/validateStatusTransition.js +29 -0
  342. package/dist/validation/validateStatusTransition.js.map +1 -0
  343. package/package.json +78 -0
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const filterByScope_1 = require("../filterByScope");
4
+ const scopeFilter_1 = require("../scopeFilter");
5
+ describe("scopeFilter", () => {
6
+ describe("matchesScope", () => {
7
+ it("should return true when no scope is provided", () => {
8
+ const filePath = "/path/to/project/P-test-project/file.md";
9
+ const result = (0, scopeFilter_1.matchesScope)(filePath, "");
10
+ expect(result).toBe(true);
11
+ });
12
+ it("should match files within project scope", () => {
13
+ const filePath = "/path/to/project/P-ecommerce-platform/epic/file.md";
14
+ const scope = "P-ecommerce-platform";
15
+ const result = (0, scopeFilter_1.matchesScope)(filePath, scope);
16
+ expect(result).toBe(true);
17
+ });
18
+ it("should match files within epic scope", () => {
19
+ const filePath = "/path/to/project/E-user-management/feature/file.md";
20
+ const scope = "E-user-management";
21
+ const result = (0, scopeFilter_1.matchesScope)(filePath, scope);
22
+ expect(result).toBe(true);
23
+ });
24
+ it("should match files within feature scope", () => {
25
+ const filePath = "/path/to/project/F-user-registration/task/file.md";
26
+ const scope = "F-user-registration";
27
+ const result = (0, scopeFilter_1.matchesScope)(filePath, scope);
28
+ expect(result).toBe(true);
29
+ });
30
+ it("should not match files outside of scope", () => {
31
+ const filePath = "/path/to/project/P-different-project/file.md";
32
+ const scope = "P-ecommerce-platform";
33
+ const result = (0, scopeFilter_1.matchesScope)(filePath, scope);
34
+ expect(result).toBe(false);
35
+ });
36
+ it("should handle paths with multiple directory separators correctly", () => {
37
+ const filePath = "/root/p/P-project/e/E-epic/f/F-feature/t/open/T-task.md";
38
+ const scope = "P-project";
39
+ const result = (0, scopeFilter_1.matchesScope)(filePath, scope);
40
+ expect(result).toBe(true);
41
+ });
42
+ it("should not match partial scope names", () => {
43
+ const filePath = "/path/to/project/P-ecommerce-platform-extended/file.md";
44
+ const scope = "P-ecommerce-platform";
45
+ const result = (0, scopeFilter_1.matchesScope)(filePath, scope);
46
+ expect(result).toBe(false);
47
+ });
48
+ it("should match scope at the end of path", () => {
49
+ const filePath = "/path/to/F-user-auth/F-user-auth.md";
50
+ const scope = "F-user-auth";
51
+ const result = (0, scopeFilter_1.matchesScope)(filePath, scope);
52
+ expect(result).toBe(true);
53
+ });
54
+ });
55
+ describe("filterByScope", () => {
56
+ const testPaths = [
57
+ "/root/p/P-ecommerce/e/E-users/E-users.md",
58
+ "/root/p/P-ecommerce/e/E-products/E-products.md",
59
+ "/root/p/P-mobile/e/E-sync/E-sync.md",
60
+ "/root/f/F-standalone/F-standalone.md",
61
+ "/root/t/open/T-standalone-task.md",
62
+ ];
63
+ it("should return all paths when no scope is provided", () => {
64
+ const result = (0, filterByScope_1.filterByScope)(testPaths);
65
+ expect(result).toEqual(testPaths);
66
+ expect(result).toHaveLength(5);
67
+ });
68
+ it("should return all paths when scope is undefined", () => {
69
+ const result = (0, filterByScope_1.filterByScope)(testPaths, undefined);
70
+ expect(result).toEqual(testPaths);
71
+ expect(result).toHaveLength(5);
72
+ });
73
+ it("should filter by project scope", () => {
74
+ const result = (0, filterByScope_1.filterByScope)(testPaths, "P-ecommerce");
75
+ expect(result).toHaveLength(2);
76
+ expect(result).toContain("/root/p/P-ecommerce/e/E-users/E-users.md");
77
+ expect(result).toContain("/root/p/P-ecommerce/e/E-products/E-products.md");
78
+ expect(result).not.toContain("/root/p/P-mobile/e/E-sync/E-sync.md");
79
+ });
80
+ it("should filter by epic scope", () => {
81
+ const result = (0, filterByScope_1.filterByScope)(testPaths, "E-users");
82
+ expect(result).toHaveLength(1);
83
+ expect(result).toContain("/root/p/P-ecommerce/e/E-users/E-users.md");
84
+ });
85
+ it("should filter by feature scope", () => {
86
+ const result = (0, filterByScope_1.filterByScope)(testPaths, "F-standalone");
87
+ expect(result).toHaveLength(1);
88
+ expect(result).toContain("/root/f/F-standalone/F-standalone.md");
89
+ });
90
+ it("should return empty array for non-existent scope", () => {
91
+ const result = (0, filterByScope_1.filterByScope)(testPaths, "P-non-existent");
92
+ expect(result).toEqual([]);
93
+ });
94
+ it("should handle empty file paths array", () => {
95
+ const result = (0, filterByScope_1.filterByScope)([], "P-test");
96
+ expect(result).toEqual([]);
97
+ });
98
+ it("should preserve order of matching files", () => {
99
+ const orderedPaths = [
100
+ "/root/p/P-test/a.md",
101
+ "/root/p/P-test/b.md",
102
+ "/root/p/P-test/c.md",
103
+ ];
104
+ const result = (0, filterByScope_1.filterByScope)(orderedPaths, "P-test");
105
+ expect(result).toEqual(orderedPaths);
106
+ });
107
+ });
108
+ });
109
+ //# sourceMappingURL=scopeFilter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopeFilter.test.js","sourceRoot":"","sources":["../../../../src/repositories/local/__tests__/scopeFilter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Deletes a TrellisObject by its ID, including both the markdown file and associated folder
3
+ *
4
+ * By default, the function checks if the object is required by other objects (as a prerequisite)
5
+ * and throws an error if it is. This safety check can be bypassed using the force parameter.
6
+ *
7
+ * @param id The ID of the object to delete
8
+ * @param planningRoot The root directory to search for markdown files
9
+ * @param force Optional. If true, bypasses dependency checks and deletes the object even if required by others. Defaults to false.
10
+ * @returns Promise resolving when the object is successfully deleted
11
+ * @throws Error if no object with the given ID is found
12
+ * @throws Error if object is required by other objects and force is false
13
+ * @throws Error if deletion fails due to file system issues
14
+ */
15
+ export declare function deleteObjectById(id: string, planningRoot: string, force?: boolean): Promise<void>;
16
+ //# sourceMappingURL=deleteObjectById.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteObjectById.d.ts","sourceRoot":"","sources":["../../../src/repositories/local/deleteObjectById.ts"],"names":[],"mappings":"AAkFA;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.deleteObjectById = deleteObjectById;
37
+ const promises_1 = require("fs/promises");
38
+ const path_1 = require("path");
39
+ const utils_1 = require("../../utils");
40
+ const findMarkdownFiles_1 = require("./findMarkdownFiles");
41
+ async function findObjectById(id, planningRoot) {
42
+ const markdownFiles = await (0, findMarkdownFiles_1.findMarkdownFiles)(planningRoot);
43
+ for (const filePath of markdownFiles) {
44
+ try {
45
+ const fileContent = await (0, promises_1.readFile)(filePath, "utf-8");
46
+ const trellisObject = (0, utils_1.deserializeTrellisObject)(fileContent);
47
+ if (trellisObject.id === id) {
48
+ return { filePath, object: trellisObject };
49
+ }
50
+ }
51
+ catch (error) {
52
+ console.warn(`Warning: Could not deserialize file ${filePath}:`, error);
53
+ continue;
54
+ }
55
+ }
56
+ throw new Error(`No object found with ID: ${id}`);
57
+ }
58
+ async function checkObjectDependencies(targetObject, planningRoot) {
59
+ const { LocalRepository } = await Promise.resolve().then(() => __importStar(require("./LocalRepository")));
60
+ const config = {
61
+ mode: "local",
62
+ planningRootFolder: planningRoot,
63
+ };
64
+ const repository = new LocalRepository(config);
65
+ const isRequired = await (0, utils_1.isRequiredForOtherObjects)(targetObject, repository);
66
+ if (isRequired) {
67
+ throw new Error(`Cannot delete object ${targetObject.id} because it is required by other objects. Use force=true to override.`);
68
+ }
69
+ }
70
+ async function deleteObjectFile(filePath) {
71
+ await (0, promises_1.unlink)(filePath);
72
+ }
73
+ async function deleteAssociatedFolder(id, filePath) {
74
+ if (!id.startsWith("P-") && !id.startsWith("E-") && !id.startsWith("F-")) {
75
+ return;
76
+ }
77
+ const associatedFolderPath = (0, path_1.dirname)(filePath);
78
+ try {
79
+ await (0, promises_1.rm)(associatedFolderPath, { recursive: true, force: true });
80
+ }
81
+ catch (error) {
82
+ console.warn(`Warning: Could not delete associated folder ${associatedFolderPath}:`, error);
83
+ }
84
+ }
85
+ /**
86
+ * Deletes a TrellisObject by its ID, including both the markdown file and associated folder
87
+ *
88
+ * By default, the function checks if the object is required by other objects (as a prerequisite)
89
+ * and throws an error if it is. This safety check can be bypassed using the force parameter.
90
+ *
91
+ * @param id The ID of the object to delete
92
+ * @param planningRoot The root directory to search for markdown files
93
+ * @param force Optional. If true, bypasses dependency checks and deletes the object even if required by others. Defaults to false.
94
+ * @returns Promise resolving when the object is successfully deleted
95
+ * @throws Error if no object with the given ID is found
96
+ * @throws Error if object is required by other objects and force is false
97
+ * @throws Error if deletion fails due to file system issues
98
+ */
99
+ async function deleteObjectById(id, planningRoot, force) {
100
+ const foundObject = await findObjectById(id, planningRoot);
101
+ const { filePath, object } = foundObject;
102
+ if (!force) {
103
+ await checkObjectDependencies(object, planningRoot);
104
+ }
105
+ await deleteObjectFile(filePath);
106
+ await deleteAssociatedFolder(id, filePath);
107
+ }
108
+ //# sourceMappingURL=deleteObjectById.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteObjectById.js","sourceRoot":"","sources":["../../../src/repositories/local/deleteObjectById.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Extracts IDs from markdown file paths based on the Trellis naming convention
3
+ *
4
+ * In Trellis, all markdown files represent objects with IDs that match their filename (without .md).
5
+ * This works for all object types:
6
+ * - Projects: .trellis/p/P-project-name/P-project-name.md -> P-project-name
7
+ * - Epics: .trellis/p/P-project/e/E-epic-name/E-epic-name.md -> E-epic-name
8
+ * - Features: .trellis/p/P-project/e/E-epic/f/F-feature-name/F-feature-name.md -> F-feature-name
9
+ * - Hierarchical tasks: .trellis/p/P-project/e/E-epic/f/F-feature/t/open/T-task-name.md -> T-task-name
10
+ * - Standalone tasks: .trellis/t/open/T-task-name.md -> T-task-name
11
+ * - Feature tasks: .trellis/f/F-feature/t/open/T-task-name.md -> T-task-name
12
+ *
13
+ * @param filePaths Array of file paths from findMarkdownFiles
14
+ * @returns Array of extracted IDs (sorted alphabetically)
15
+ */
16
+ export declare function extractMarkdownIds(filePaths: string[]): string[];
17
+ //# sourceMappingURL=extractMarkdownIds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractMarkdownIds.d.ts","sourceRoot":"","sources":["../../../src/repositories/local/extractMarkdownIds.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAiBhE"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractMarkdownIds = extractMarkdownIds;
4
+ const path_1 = require("path");
5
+ /**
6
+ * Extracts IDs from markdown file paths based on the Trellis naming convention
7
+ *
8
+ * In Trellis, all markdown files represent objects with IDs that match their filename (without .md).
9
+ * This works for all object types:
10
+ * - Projects: .trellis/p/P-project-name/P-project-name.md -> P-project-name
11
+ * - Epics: .trellis/p/P-project/e/E-epic-name/E-epic-name.md -> E-epic-name
12
+ * - Features: .trellis/p/P-project/e/E-epic/f/F-feature-name/F-feature-name.md -> F-feature-name
13
+ * - Hierarchical tasks: .trellis/p/P-project/e/E-epic/f/F-feature/t/open/T-task-name.md -> T-task-name
14
+ * - Standalone tasks: .trellis/t/open/T-task-name.md -> T-task-name
15
+ * - Feature tasks: .trellis/f/F-feature/t/open/T-task-name.md -> T-task-name
16
+ *
17
+ * @param filePaths Array of file paths from findMarkdownFiles
18
+ * @returns Array of extracted IDs (sorted alphabetically)
19
+ */
20
+ function extractMarkdownIds(filePaths) {
21
+ const ids = [];
22
+ for (const filePath of filePaths) {
23
+ // Normalize path separators to forward slashes for consistent handling
24
+ const normalizedPath = filePath.replace(/\\/g, "/");
25
+ // Extract the filename without .md extension as the ID
26
+ const fileName = (0, path_1.basename)(normalizedPath, ".md");
27
+ // Only include files that follow the Trellis naming convention (P-, E-, F-, T- prefixes)
28
+ if (/^[PEFT]-/.test(fileName)) {
29
+ ids.push(fileName);
30
+ }
31
+ }
32
+ return ids.sort();
33
+ }
34
+ //# sourceMappingURL=extractMarkdownIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractMarkdownIds.js","sourceRoot":"","sources":["../../../src/repositories/local/extractMarkdownIds.ts"],"names":[],"mappings":";;AAiBA,gDAiBC;AAlCD,+BAAgC;AAEhC;;;;;;;;;;;;;;GAcG;AACH,SAAgB,kBAAkB,CAAC,SAAmB;IACpD,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,uEAAuE;QACvE,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEpD,uDAAuD;QACvD,MAAM,QAAQ,GAAG,IAAA,eAAQ,EAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAEjD,yFAAyF;QACzF,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Filters an array of file paths to only include those within the specified scope
3
+ * @param filePaths Array of file paths to filter
4
+ * @param scope Optional scope ID to filter by (e.g., "P-project-id", "E-epic-id", "F-feature-id")
5
+ * @returns Filtered array of file paths that match the scope
6
+ */
7
+ export declare function filterByScope(filePaths: string[], scope?: string): string[];
8
+ //# sourceMappingURL=filterByScope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterByScope.d.ts","sourceRoot":"","sources":["../../../src/repositories/local/filterByScope.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAM3E"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filterByScope = filterByScope;
4
+ const scopeFilter_1 = require("./scopeFilter");
5
+ /**
6
+ * Filters an array of file paths to only include those within the specified scope
7
+ * @param filePaths Array of file paths to filter
8
+ * @param scope Optional scope ID to filter by (e.g., "P-project-id", "E-epic-id", "F-feature-id")
9
+ * @returns Filtered array of file paths that match the scope
10
+ */
11
+ function filterByScope(filePaths, scope) {
12
+ if (!scope) {
13
+ return filePaths;
14
+ }
15
+ return filePaths.filter((filePath) => (0, scopeFilter_1.matchesScope)(filePath, scope));
16
+ }
17
+ //# sourceMappingURL=filterByScope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterByScope.js","sourceRoot":"","sources":["../../../src/repositories/local/filterByScope.ts"],"names":[],"mappings":";;AASA,sCAMC;AAfD,+CAA6C;AAE7C;;;;;GAKG;AAEH,SAAgB,aAAa,CAAC,SAAmB,EAAE,KAAc;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAA,0BAAY,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Recursively finds all markdown files in a directory and its subdirectories
3
+ * @param folderPath The root folder path to search
4
+ * @param includeClosed Optional flag to include files in closed task folders (paths containing "/t/closed"), defaults to true
5
+ * @param scope Optional scope ID to filter results to children of that scope object (e.g., "P-project-id", "E-epic-id", "F-feature-id")
6
+ * @returns Promise resolving to an array of full paths to markdown files
7
+ */
8
+ export declare function findMarkdownFiles(folderPath: string, includeClosed?: boolean, scope?: string): Promise<string[]>;
9
+ //# sourceMappingURL=findMarkdownFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findMarkdownFiles.d.ts","sourceRoot":"","sources":["../../../src/repositories/local/findMarkdownFiles.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,OAAO,EACvB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findMarkdownFiles = findMarkdownFiles;
4
+ const promises_1 = require("fs/promises");
5
+ const path_1 = require("path");
6
+ const scopeFilter_1 = require("./scopeFilter");
7
+ /**
8
+ * Recursively finds all markdown files in a directory and its subdirectories
9
+ * @param folderPath The root folder path to search
10
+ * @param includeClosed Optional flag to include files in closed task folders (paths containing "/t/closed"), defaults to true
11
+ * @param scope Optional scope ID to filter results to children of that scope object (e.g., "P-project-id", "E-epic-id", "F-feature-id")
12
+ * @returns Promise resolving to an array of full paths to markdown files
13
+ */
14
+ async function findMarkdownFiles(folderPath, includeClosed, scope) {
15
+ const markdownFiles = [];
16
+ async function scanDirectory(currentPath) {
17
+ try {
18
+ const entries = await (0, promises_1.readdir)(currentPath);
19
+ for (const entry of entries) {
20
+ const fullPath = (0, path_1.join)(currentPath, entry);
21
+ const stats = await (0, promises_1.stat)(fullPath);
22
+ if (stats.isDirectory()) {
23
+ await scanDirectory(fullPath);
24
+ }
25
+ else if (stats.isFile() && entry.toLowerCase().endsWith(".md")) {
26
+ // If includeClosed is false, skip files in closed task folders
27
+ if (includeClosed === false && fullPath.includes("/t/closed")) {
28
+ return;
29
+ }
30
+ // If scope is provided, filter files to only include those within the scope
31
+ if (scope && !(0, scopeFilter_1.matchesScope)(fullPath, scope)) {
32
+ // console.log(`Skipping file ${fullPath} not in scope ${scope}`);
33
+ continue;
34
+ }
35
+ markdownFiles.push(fullPath);
36
+ }
37
+ }
38
+ }
39
+ catch (error) {
40
+ // Skip directories that can't be read (permissions, etc.)
41
+ console.warn(`Warning: Could not read directory ${currentPath}:`, error);
42
+ }
43
+ }
44
+ await scanDirectory(folderPath);
45
+ return markdownFiles.sort();
46
+ }
47
+ //# sourceMappingURL=findMarkdownFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findMarkdownFiles.js","sourceRoot":"","sources":["../../../src/repositories/local/findMarkdownFiles.ts"],"names":[],"mappings":";;AAWA,8CAwCC;AAnDD,0CAA4C;AAC5C,+BAA4B;AAC5B,+CAA6C;AAE7C;;;;;;GAMG;AACI,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,aAAuB,EACvB,KAAc;IAEd,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,UAAU,aAAa,CAAC,WAAmB;QAC9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,WAAW,CAAC,CAAC;YAE3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,MAAM,IAAA,eAAI,EAAC,QAAQ,CAAC,CAAC;gBAEnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAChC,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjE,+DAA+D;oBAC/D,IAAI,aAAa,KAAK,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC9D,OAAO;oBACT,CAAC;oBAED,4EAA4E;oBAC5E,IAAI,KAAK,IAAI,CAAC,IAAA,0BAAY,EAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;wBAC5C,kEAAkE;wBAClE,SAAS;oBACX,CAAC;oBAED,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0DAA0D;YAC1D,OAAO,CAAC,IAAI,CAAC,qCAAqC,WAAW,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IAChC,OAAO,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { TrellisObject } from "../../models";
2
+ /**
3
+ * Gets a TrellisObject by reading and deserializing a specific markdown file
4
+ * @param filePath The full path to the markdown file to read
5
+ * @returns Promise resolving to the TrellisObject from the file
6
+ * @throws Error if file reading fails or deserialization fails
7
+ */
8
+ export declare function getObjectByFilePath(filePath: string): Promise<TrellisObject>;
9
+ //# sourceMappingURL=getObjectByFilePath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getObjectByFilePath.d.ts","sourceRoot":"","sources":["../../../src/repositories/local/getObjectByFilePath.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAGxB"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getObjectByFilePath = getObjectByFilePath;
4
+ const promises_1 = require("fs/promises");
5
+ const deserializeTrellisObject_1 = require("../../utils/deserializeTrellisObject");
6
+ /**
7
+ * Gets a TrellisObject by reading and deserializing a specific markdown file
8
+ * @param filePath The full path to the markdown file to read
9
+ * @returns Promise resolving to the TrellisObject from the file
10
+ * @throws Error if file reading fails or deserialization fails
11
+ */
12
+ async function getObjectByFilePath(filePath) {
13
+ const fileContent = await (0, promises_1.readFile)(filePath, "utf-8");
14
+ return (0, deserializeTrellisObject_1.deserializeTrellisObject)(fileContent);
15
+ }
16
+ //# sourceMappingURL=getObjectByFilePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getObjectByFilePath.js","sourceRoot":"","sources":["../../../src/repositories/local/getObjectByFilePath.ts"],"names":[],"mappings":";;AAUA,kDAKC;AAfD,0CAAuC;AAEvC,mFAAgF;AAEhF;;;;;GAKG;AACI,KAAK,UAAU,mBAAmB,CACvC,QAAgB;IAEhB,MAAM,WAAW,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,IAAA,mDAAwB,EAAC,WAAW,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { TrellisObject } from "../../models";
2
+ /**
3
+ * Gets a TrellisObject by its ID by searching through markdown files
4
+ * @param id The ID of the object to find
5
+ * @param planningRoot The root directory to search for markdown files
6
+ * @returns Promise resolving to the TrellisObject with the matching ID, or null if not found
7
+ * @throws Error if file reading fails
8
+ */
9
+ export declare function getObjectById(id: string, planningRoot: string): Promise<TrellisObject | null>;
10
+ //# sourceMappingURL=getObjectById.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getObjectById.d.ts","sourceRoot":"","sources":["../../../src/repositories/local/getObjectById.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAuB/B"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getObjectById = getObjectById;
4
+ const promises_1 = require("fs/promises");
5
+ const deserializeTrellisObject_1 = require("../../utils/deserializeTrellisObject");
6
+ const findMarkdownFiles_1 = require("./findMarkdownFiles");
7
+ /**
8
+ * Gets a TrellisObject by its ID by searching through markdown files
9
+ * @param id The ID of the object to find
10
+ * @param planningRoot The root directory to search for markdown files
11
+ * @returns Promise resolving to the TrellisObject with the matching ID, or null if not found
12
+ * @throws Error if file reading fails
13
+ */
14
+ async function getObjectById(id, planningRoot) {
15
+ // Find all markdown files in the planning root
16
+ const markdownFiles = await (0, findMarkdownFiles_1.findMarkdownFiles)(planningRoot);
17
+ // Search through each markdown file to find the one with the matching ID
18
+ for (const filePath of markdownFiles) {
19
+ try {
20
+ const fileContent = await (0, promises_1.readFile)(filePath, "utf-8");
21
+ const trellisObject = (0, deserializeTrellisObject_1.deserializeTrellisObject)(fileContent);
22
+ // Check if this object has the ID we're looking for
23
+ if (trellisObject.id === id) {
24
+ return trellisObject;
25
+ }
26
+ }
27
+ catch (error) {
28
+ // Skip files that can't be deserialized (might not be valid Trellis objects)
29
+ console.warn(`Warning: Could not deserialize file ${filePath}:`, error);
30
+ continue;
31
+ }
32
+ }
33
+ // If we get here, no object with the given ID was found
34
+ return null;
35
+ }
36
+ //# sourceMappingURL=getObjectById.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getObjectById.js","sourceRoot":"","sources":["../../../src/repositories/local/getObjectById.ts"],"names":[],"mappings":";;AAYA,sCA0BC;AAtCD,0CAAuC;AAEvC,mFAAgF;AAChF,2DAAwD;AAExD;;;;;;GAMG;AACI,KAAK,UAAU,aAAa,CACjC,EAAU,EACV,YAAoB;IAEpB,+CAA+C;IAC/C,MAAM,aAAa,GAAG,MAAM,IAAA,qCAAiB,EAAC,YAAY,CAAC,CAAC;IAE5D,yEAAyE;IACzE,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,aAAa,GAAG,IAAA,mDAAwB,EAAC,WAAW,CAAC,CAAC;YAE5D,oDAAoD;YACpD,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5B,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6EAA6E;YAC7E,OAAO,CAAC,IAAI,CAAC,uCAAuC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { TrellisObject } from "../../models/TrellisObject";
2
+ /**
3
+ * Generates the file path for a Trellis object based on its type, hierarchy, and status.
4
+ * This function assumes the object is new and doesn't have an existing file.
5
+ */
6
+ export declare function getObjectFilePath(trellisObject: TrellisObject, planningRoot: string): Promise<string>;
7
+ //# sourceMappingURL=getObjectFilePath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getObjectFilePath.d.ts","sourceRoot":"","sources":["../../../src/repositories/local/getObjectFilePath.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAK3D;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAoDjB"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getObjectFilePath = getObjectFilePath;
4
+ const path_1 = require("path");
5
+ const TrellisObjectType_1 = require("../../models/TrellisObjectType");
6
+ const TrellisObjectStatus_1 = require("../../models/TrellisObjectStatus");
7
+ const getObjectById_1 = require("./getObjectById");
8
+ /**
9
+ * Generates the file path for a Trellis object based on its type, hierarchy, and status.
10
+ * This function assumes the object is new and doesn't have an existing file.
11
+ */
12
+ async function getObjectFilePath(trellisObject, planningRoot) {
13
+ const { id, type, parent } = trellisObject;
14
+ switch (type) {
15
+ case TrellisObjectType_1.TrellisObjectType.PROJECT:
16
+ return (0, path_1.join)(planningRoot, "p", id, `${id}.md`);
17
+ case TrellisObjectType_1.TrellisObjectType.EPIC:
18
+ if (!parent) {
19
+ throw new Error(`Epic ${id} must have a parent project`);
20
+ }
21
+ return (0, path_1.join)(planningRoot, "p", parent, "e", id, `${id}.md`);
22
+ case TrellisObjectType_1.TrellisObjectType.FEATURE: {
23
+ if (!parent) {
24
+ // Feature without parent - standalone feature
25
+ return (0, path_1.join)(planningRoot, "f", id, `${id}.md`);
26
+ }
27
+ // Feature with parent - need to determine if parent is epic or project
28
+ const parentObject = await (0, getObjectById_1.getObjectById)(parent, planningRoot);
29
+ if (!parentObject) {
30
+ throw new Error(`Parent object with ID '${parent}' not found`);
31
+ }
32
+ if (parentObject.type === TrellisObjectType_1.TrellisObjectType.EPIC) {
33
+ // Feature under epic - need to get the project ID from the epic
34
+ if (!parentObject.parent) {
35
+ throw new Error(`Epic ${parent} must have a parent project`);
36
+ }
37
+ return (0, path_1.join)(planningRoot, "p", parentObject.parent, "e", parent, "f", id, `${id}.md`);
38
+ }
39
+ else {
40
+ throw new Error(`Feature ${id} parent must be an epic`);
41
+ }
42
+ }
43
+ case TrellisObjectType_1.TrellisObjectType.TASK:
44
+ return await getTaskFilePath(trellisObject, planningRoot);
45
+ default:
46
+ throw new Error(`Unknown object type: ${String(type)}`);
47
+ }
48
+ }
49
+ /**
50
+ * Helper function to determine the file path for a task based on its parent hierarchy and status.
51
+ */
52
+ async function getTaskFilePath(trellisObject, planningRoot) {
53
+ const { id, parent, status } = trellisObject;
54
+ // Determine if status is closed (done or wont-do)
55
+ const isClosed = status === TrellisObjectStatus_1.TrellisObjectStatus.DONE ||
56
+ status === TrellisObjectStatus_1.TrellisObjectStatus.WONT_DO;
57
+ const statusFolder = isClosed ? "closed" : "open";
58
+ if (!parent) {
59
+ // Task without parent - standalone task
60
+ return (0, path_1.join)(planningRoot, "t", statusFolder, `${id}.md`);
61
+ }
62
+ // Task with parent - need to determine parent type and hierarchy
63
+ const parentObject = await (0, getObjectById_1.getObjectById)(parent, planningRoot);
64
+ if (!parentObject) {
65
+ throw new Error(`Parent object with ID '${parent}' not found`);
66
+ }
67
+ if (parentObject.type === TrellisObjectType_1.TrellisObjectType.FEATURE) {
68
+ if (!parentObject.parent) {
69
+ // Feature doesn't have parent - task goes under standalone feature
70
+ return (0, path_1.join)(planningRoot, "f", parent, "t", statusFolder, `${id}.md`);
71
+ }
72
+ // Feature has parent (epic) - need to get full hierarchy
73
+ const epicObject = await (0, getObjectById_1.getObjectById)(parentObject.parent, planningRoot);
74
+ if (!epicObject) {
75
+ throw new Error(`Epic object with ID '${parentObject.parent}' not found`);
76
+ }
77
+ if (epicObject.type !== TrellisObjectType_1.TrellisObjectType.EPIC) {
78
+ throw new Error(`Feature parent ${parentObject.parent} must be an epic`);
79
+ }
80
+ if (!epicObject.parent) {
81
+ throw new Error(`Epic ${epicObject.id} must have a parent project`);
82
+ }
83
+ // Task under feature under epic under project
84
+ return (0, path_1.join)(planningRoot, "p", epicObject.parent, "e", epicObject.id, "f", parent, "t", statusFolder, `${id}.md`);
85
+ }
86
+ else {
87
+ throw new Error(`Task ${id} parent must be a feature`);
88
+ }
89
+ }
90
+ //# sourceMappingURL=getObjectFilePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getObjectFilePath.js","sourceRoot":"","sources":["../../../src/repositories/local/getObjectFilePath.ts"],"names":[],"mappings":"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"}