task-o-matic-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/README.md +646 -0
  2. package/dist/index.d.ts +27 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +46 -0
  5. package/dist/lib/ai-service/ai-operations.d.ts +45 -0
  6. package/dist/lib/ai-service/ai-operations.d.ts.map +1 -0
  7. package/dist/lib/ai-service/ai-operations.js +60 -0
  8. package/dist/lib/ai-service/base-operations.d.ts +43 -0
  9. package/dist/lib/ai-service/base-operations.d.ts.map +1 -0
  10. package/dist/lib/ai-service/base-operations.js +119 -0
  11. package/dist/lib/ai-service/documentation-operations.d.ts +18 -0
  12. package/dist/lib/ai-service/documentation-operations.d.ts.map +1 -0
  13. package/dist/lib/ai-service/documentation-operations.js +308 -0
  14. package/dist/lib/ai-service/filesystem-tools.d.ts +69 -0
  15. package/dist/lib/ai-service/filesystem-tools.d.ts.map +1 -0
  16. package/dist/lib/ai-service/filesystem-tools.js +70 -0
  17. package/dist/lib/ai-service/json-parser.d.ts +34 -0
  18. package/dist/lib/ai-service/json-parser.d.ts.map +1 -0
  19. package/dist/lib/ai-service/json-parser.js +177 -0
  20. package/dist/lib/ai-service/mcp-client.d.ts +9 -0
  21. package/dist/lib/ai-service/mcp-client.d.ts.map +1 -0
  22. package/dist/lib/ai-service/mcp-client.js +48 -0
  23. package/dist/lib/ai-service/model-provider.d.ts +12 -0
  24. package/dist/lib/ai-service/model-provider.d.ts.map +1 -0
  25. package/dist/lib/ai-service/model-provider.js +146 -0
  26. package/dist/lib/ai-service/prd-operations.d.ts +25 -0
  27. package/dist/lib/ai-service/prd-operations.d.ts.map +1 -0
  28. package/dist/lib/ai-service/prd-operations.js +592 -0
  29. package/dist/lib/ai-service/research-tools.d.ts +4 -0
  30. package/dist/lib/ai-service/research-tools.d.ts.map +1 -0
  31. package/dist/lib/ai-service/research-tools.js +8 -0
  32. package/dist/lib/ai-service/retry-handler.d.ts +8 -0
  33. package/dist/lib/ai-service/retry-handler.d.ts.map +1 -0
  34. package/dist/lib/ai-service/retry-handler.js +63 -0
  35. package/dist/lib/ai-service/task-operations.d.ts +13 -0
  36. package/dist/lib/ai-service/task-operations.d.ts.map +1 -0
  37. package/dist/lib/ai-service/task-operations.js +220 -0
  38. package/dist/lib/benchmark/registry.d.ts +11 -0
  39. package/dist/lib/benchmark/registry.d.ts.map +1 -0
  40. package/dist/lib/benchmark/registry.js +212 -0
  41. package/dist/lib/benchmark/runner.d.ts +6 -0
  42. package/dist/lib/benchmark/runner.d.ts.map +1 -0
  43. package/dist/lib/benchmark/runner.js +150 -0
  44. package/dist/lib/benchmark/storage.d.ts +13 -0
  45. package/dist/lib/benchmark/storage.d.ts.map +1 -0
  46. package/dist/lib/benchmark/storage.js +100 -0
  47. package/dist/lib/benchmark/types.d.ts +104 -0
  48. package/dist/lib/benchmark/types.d.ts.map +1 -0
  49. package/dist/lib/benchmark/types.js +2 -0
  50. package/dist/lib/better-t-stack-cli.d.ts +50 -0
  51. package/dist/lib/better-t-stack-cli.d.ts.map +1 -0
  52. package/dist/lib/better-t-stack-cli.js +428 -0
  53. package/dist/lib/bootstrap/cli-bootstrap.d.ts +14 -0
  54. package/dist/lib/bootstrap/cli-bootstrap.d.ts.map +1 -0
  55. package/dist/lib/bootstrap/cli-bootstrap.js +322 -0
  56. package/dist/lib/bootstrap/index.d.ts +3 -0
  57. package/dist/lib/bootstrap/index.d.ts.map +1 -0
  58. package/dist/lib/bootstrap/index.js +18 -0
  59. package/dist/lib/bootstrap/medusa-bootstrap.d.ts +14 -0
  60. package/dist/lib/bootstrap/medusa-bootstrap.d.ts.map +1 -0
  61. package/dist/lib/bootstrap/medusa-bootstrap.js +215 -0
  62. package/dist/lib/config-validation.d.ts +215 -0
  63. package/dist/lib/config-validation.d.ts.map +1 -0
  64. package/dist/lib/config-validation.js +254 -0
  65. package/dist/lib/config.d.ts +55 -0
  66. package/dist/lib/config.d.ts.map +1 -0
  67. package/dist/lib/config.js +351 -0
  68. package/dist/lib/context-builder.d.ts +66 -0
  69. package/dist/lib/context-builder.d.ts.map +1 -0
  70. package/dist/lib/context-builder.js +322 -0
  71. package/dist/lib/executors/claude-code-executor.d.ts +9 -0
  72. package/dist/lib/executors/claude-code-executor.d.ts.map +1 -0
  73. package/dist/lib/executors/claude-code-executor.js +69 -0
  74. package/dist/lib/executors/codex-executor.d.ts +9 -0
  75. package/dist/lib/executors/codex-executor.d.ts.map +1 -0
  76. package/dist/lib/executors/codex-executor.js +73 -0
  77. package/dist/lib/executors/executor-factory.d.ts +5 -0
  78. package/dist/lib/executors/executor-factory.d.ts.map +1 -0
  79. package/dist/lib/executors/executor-factory.js +27 -0
  80. package/dist/lib/executors/gemini-executor.d.ts +9 -0
  81. package/dist/lib/executors/gemini-executor.d.ts.map +1 -0
  82. package/dist/lib/executors/gemini-executor.js +67 -0
  83. package/dist/lib/executors/kilo-executor.d.ts +9 -0
  84. package/dist/lib/executors/kilo-executor.d.ts.map +1 -0
  85. package/dist/lib/executors/kilo-executor.js +69 -0
  86. package/dist/lib/executors/opencode-executor.d.ts +9 -0
  87. package/dist/lib/executors/opencode-executor.d.ts.map +1 -0
  88. package/dist/lib/executors/opencode-executor.js +67 -0
  89. package/dist/lib/git-utils.d.ts +88 -0
  90. package/dist/lib/git-utils.d.ts.map +1 -0
  91. package/dist/lib/git-utils.js +242 -0
  92. package/dist/lib/hooks.d.ts +73 -0
  93. package/dist/lib/hooks.d.ts.map +1 -0
  94. package/dist/lib/hooks.js +62 -0
  95. package/dist/lib/index.d.ts +100 -0
  96. package/dist/lib/index.d.ts.map +1 -0
  97. package/dist/lib/index.js +143 -0
  98. package/dist/lib/logger.d.ts +20 -0
  99. package/dist/lib/logger.d.ts.map +1 -0
  100. package/dist/lib/logger.js +32 -0
  101. package/dist/lib/notifications.d.ts +7 -0
  102. package/dist/lib/notifications.d.ts.map +1 -0
  103. package/dist/lib/notifications.js +81 -0
  104. package/dist/lib/prompt-builder.d.ts +70 -0
  105. package/dist/lib/prompt-builder.d.ts.map +1 -0
  106. package/dist/lib/prompt-builder.js +344 -0
  107. package/dist/lib/prompt-registry.d.ts +22 -0
  108. package/dist/lib/prompt-registry.d.ts.map +1 -0
  109. package/dist/lib/prompt-registry.js +409 -0
  110. package/dist/lib/provider-defaults.json +32 -0
  111. package/dist/lib/storage/file-system.d.ts +57 -0
  112. package/dist/lib/storage/file-system.d.ts.map +1 -0
  113. package/dist/lib/storage/file-system.js +638 -0
  114. package/dist/lib/storage/storage-callbacks.d.ts +17 -0
  115. package/dist/lib/storage/storage-callbacks.d.ts.map +1 -0
  116. package/dist/lib/storage/storage-callbacks.js +94 -0
  117. package/dist/lib/storage/types.d.ts +43 -0
  118. package/dist/lib/storage/types.d.ts.map +1 -0
  119. package/dist/lib/storage/types.js +2 -0
  120. package/dist/lib/task-execution-core.d.ts +7 -0
  121. package/dist/lib/task-execution-core.d.ts.map +1 -0
  122. package/dist/lib/task-execution-core.js +381 -0
  123. package/dist/lib/task-execution.d.ts +7 -0
  124. package/dist/lib/task-execution.d.ts.map +1 -0
  125. package/dist/lib/task-execution.js +40 -0
  126. package/dist/lib/task-loop-execution.d.ts +7 -0
  127. package/dist/lib/task-loop-execution.d.ts.map +1 -0
  128. package/dist/lib/task-loop-execution.js +156 -0
  129. package/dist/lib/task-planning.d.ts +29 -0
  130. package/dist/lib/task-planning.d.ts.map +1 -0
  131. package/dist/lib/task-planning.js +103 -0
  132. package/dist/lib/task-review.d.ts +27 -0
  133. package/dist/lib/task-review.d.ts.map +1 -0
  134. package/dist/lib/task-review.js +103 -0
  135. package/dist/lib/validation.d.ts +26 -0
  136. package/dist/lib/validation.d.ts.map +1 -0
  137. package/dist/lib/validation.js +98 -0
  138. package/dist/prompts/documentation-detection.d.ts +2 -0
  139. package/dist/prompts/documentation-detection.d.ts.map +1 -0
  140. package/dist/prompts/documentation-detection.js +24 -0
  141. package/dist/prompts/documentation-recap.d.ts +3 -0
  142. package/dist/prompts/documentation-recap.d.ts.map +1 -0
  143. package/dist/prompts/documentation-recap.js +13 -0
  144. package/dist/prompts/index.d.ts +15 -0
  145. package/dist/prompts/index.d.ts.map +1 -0
  146. package/dist/prompts/index.js +30 -0
  147. package/dist/prompts/prd-combination.d.ts +2 -0
  148. package/dist/prompts/prd-combination.d.ts.map +1 -0
  149. package/dist/prompts/prd-combination.js +35 -0
  150. package/dist/prompts/prd-generation.d.ts +2 -0
  151. package/dist/prompts/prd-generation.d.ts.map +1 -0
  152. package/dist/prompts/prd-generation.js +49 -0
  153. package/dist/prompts/prd-parsing.d.ts +3 -0
  154. package/dist/prompts/prd-parsing.d.ts.map +1 -0
  155. package/dist/prompts/prd-parsing.js +172 -0
  156. package/dist/prompts/prd-question-answer.d.ts +3 -0
  157. package/dist/prompts/prd-question-answer.d.ts.map +1 -0
  158. package/dist/prompts/prd-question-answer.js +27 -0
  159. package/dist/prompts/prd-question.d.ts +3 -0
  160. package/dist/prompts/prd-question.d.ts.map +1 -0
  161. package/dist/prompts/prd-question.js +40 -0
  162. package/dist/prompts/prd-rework.d.ts +3 -0
  163. package/dist/prompts/prd-rework.d.ts.map +1 -0
  164. package/dist/prompts/prd-rework.js +81 -0
  165. package/dist/prompts/prd-suggest-stack.d.ts +3 -0
  166. package/dist/prompts/prd-suggest-stack.d.ts.map +1 -0
  167. package/dist/prompts/prd-suggest-stack.js +99 -0
  168. package/dist/prompts/task-breakdown.d.ts +3 -0
  169. package/dist/prompts/task-breakdown.d.ts.map +1 -0
  170. package/dist/prompts/task-breakdown.js +151 -0
  171. package/dist/prompts/task-enhancement.d.ts +3 -0
  172. package/dist/prompts/task-enhancement.d.ts.map +1 -0
  173. package/dist/prompts/task-enhancement.js +140 -0
  174. package/dist/prompts/task-execution.d.ts +3 -0
  175. package/dist/prompts/task-execution.d.ts.map +1 -0
  176. package/dist/prompts/task-execution.js +24 -0
  177. package/dist/prompts/task-planning.d.ts +3 -0
  178. package/dist/prompts/task-planning.d.ts.map +1 -0
  179. package/dist/prompts/task-planning.js +66 -0
  180. package/dist/prompts/workflow-assistance.d.ts +32 -0
  181. package/dist/prompts/workflow-assistance.d.ts.map +1 -0
  182. package/dist/prompts/workflow-assistance.js +130 -0
  183. package/dist/prompts/workflow-prompts.d.ts +9 -0
  184. package/dist/prompts/workflow-prompts.d.ts.map +1 -0
  185. package/dist/prompts/workflow-prompts.js +93 -0
  186. package/dist/services/benchmark.d.ts +26 -0
  187. package/dist/services/benchmark.d.ts.map +1 -0
  188. package/dist/services/benchmark.js +343 -0
  189. package/dist/services/prd.d.ts +136 -0
  190. package/dist/services/prd.d.ts.map +1 -0
  191. package/dist/services/prd.js +550 -0
  192. package/dist/services/tasks.d.ts +388 -0
  193. package/dist/services/tasks.d.ts.map +1 -0
  194. package/dist/services/tasks.js +1150 -0
  195. package/dist/services/workflow-ai-assistant.d.ts +74 -0
  196. package/dist/services/workflow-ai-assistant.d.ts.map +1 -0
  197. package/dist/services/workflow-ai-assistant.js +175 -0
  198. package/dist/services/workflow-benchmark.d.ts +34 -0
  199. package/dist/services/workflow-benchmark.d.ts.map +1 -0
  200. package/dist/services/workflow-benchmark.js +318 -0
  201. package/dist/services/workflow.d.ts +107 -0
  202. package/dist/services/workflow.d.ts.map +1 -0
  203. package/dist/services/workflow.js +580 -0
  204. package/dist/test/hooks.test.d.ts +2 -0
  205. package/dist/test/hooks.test.d.ts.map +1 -0
  206. package/dist/test/hooks.test.js +67 -0
  207. package/dist/test/integration/callbacks.test.d.ts +2 -0
  208. package/dist/test/integration/callbacks.test.d.ts.map +1 -0
  209. package/dist/test/integration/callbacks.test.js +64 -0
  210. package/dist/test/lib/ai-service/task-operations.test.d.ts +2 -0
  211. package/dist/test/lib/ai-service/task-operations.test.d.ts.map +1 -0
  212. package/dist/test/lib/ai-service/task-operations.test.js +362 -0
  213. package/dist/test/lib/config.test.d.ts +2 -0
  214. package/dist/test/lib/config.test.d.ts.map +1 -0
  215. package/dist/test/lib/config.test.js +128 -0
  216. package/dist/test/lib/git-utils.test.d.ts +2 -0
  217. package/dist/test/lib/git-utils.test.d.ts.map +1 -0
  218. package/dist/test/lib/git-utils.test.js +168 -0
  219. package/dist/test/mocks/mock-ai-operations.d.ts +15 -0
  220. package/dist/test/mocks/mock-ai-operations.d.ts.map +1 -0
  221. package/dist/test/mocks/mock-ai-operations.js +107 -0
  222. package/dist/test/mocks/mock-context-builder.d.ts +10 -0
  223. package/dist/test/mocks/mock-context-builder.d.ts.map +1 -0
  224. package/dist/test/mocks/mock-context-builder.js +81 -0
  225. package/dist/test/mocks/mock-model-provider.d.ts +7 -0
  226. package/dist/test/mocks/mock-model-provider.d.ts.map +1 -0
  227. package/dist/test/mocks/mock-model-provider.js +21 -0
  228. package/dist/test/mocks/mock-service-factory.d.ts +11 -0
  229. package/dist/test/mocks/mock-service-factory.d.ts.map +1 -0
  230. package/dist/test/mocks/mock-service-factory.js +61 -0
  231. package/dist/test/mocks/mock-storage.d.ts +50 -0
  232. package/dist/test/mocks/mock-storage.d.ts.map +1 -0
  233. package/dist/test/mocks/mock-storage.js +145 -0
  234. package/dist/test/model-parsing.test.d.ts +2 -0
  235. package/dist/test/model-parsing.test.d.ts.map +1 -0
  236. package/dist/test/model-parsing.test.js +73 -0
  237. package/dist/test/services/task-service.test.d.ts +2 -0
  238. package/dist/test/services/task-service.test.d.ts.map +1 -0
  239. package/dist/test/services/task-service.test.js +459 -0
  240. package/dist/test/storage.test.d.ts +2 -0
  241. package/dist/test/storage.test.d.ts.map +1 -0
  242. package/dist/test/storage.test.js +207 -0
  243. package/dist/test/task-loop-git.test.d.ts +2 -0
  244. package/dist/test/task-loop-git.test.d.ts.map +1 -0
  245. package/dist/test/task-loop-git.test.js +95 -0
  246. package/dist/test/test-mock-setup.d.ts +26 -0
  247. package/dist/test/test-mock-setup.d.ts.map +1 -0
  248. package/dist/test/test-mock-setup.js +41 -0
  249. package/dist/test/test-setup.d.ts +9 -0
  250. package/dist/test/test-setup.d.ts.map +1 -0
  251. package/dist/test/test-setup.js +44 -0
  252. package/dist/test/test-utils.d.ts +22 -0
  253. package/dist/test/test-utils.d.ts.map +1 -0
  254. package/dist/test/test-utils.js +37 -0
  255. package/dist/test/utils/ai-operation-utility.test.d.ts +2 -0
  256. package/dist/test/utils/ai-operation-utility.test.d.ts.map +1 -0
  257. package/dist/test/utils/ai-operation-utility.test.js +290 -0
  258. package/dist/test/utils/error-handling.test.d.ts +2 -0
  259. package/dist/test/utils/error-handling.test.d.ts.map +1 -0
  260. package/dist/test/utils/error-handling.test.js +231 -0
  261. package/dist/test/utils/file-utils.test.d.ts +2 -0
  262. package/dist/test/utils/file-utils.test.d.ts.map +1 -0
  263. package/dist/test/utils/file-utils.test.js +76 -0
  264. package/dist/test/utils/id-generator.test.d.ts +2 -0
  265. package/dist/test/utils/id-generator.test.d.ts.map +1 -0
  266. package/dist/test/utils/id-generator.test.js +41 -0
  267. package/dist/test/utils/model-parser.test.d.ts +2 -0
  268. package/dist/test/utils/model-parser.test.d.ts.map +1 -0
  269. package/dist/test/utils/model-parser.test.js +65 -0
  270. package/dist/test/validation.test.d.ts +2 -0
  271. package/dist/test/validation.test.d.ts.map +1 -0
  272. package/dist/test/validation.test.js +22 -0
  273. package/dist/types/callbacks.d.ts +30 -0
  274. package/dist/types/callbacks.d.ts.map +1 -0
  275. package/dist/types/callbacks.js +2 -0
  276. package/dist/types/index.d.ts +435 -0
  277. package/dist/types/index.d.ts.map +1 -0
  278. package/dist/types/index.js +30 -0
  279. package/dist/types/mcp.d.ts +3 -0
  280. package/dist/types/mcp.d.ts.map +1 -0
  281. package/dist/types/mcp.js +3 -0
  282. package/dist/types/options.d.ts +112 -0
  283. package/dist/types/options.d.ts.map +1 -0
  284. package/dist/types/options.js +2 -0
  285. package/dist/types/results.d.ts +200 -0
  286. package/dist/types/results.d.ts.map +1 -0
  287. package/dist/types/results.js +2 -0
  288. package/dist/types/workflow-options.d.ts +82 -0
  289. package/dist/types/workflow-options.d.ts.map +1 -0
  290. package/dist/types/workflow-options.js +2 -0
  291. package/dist/types/workflow-results.d.ts +82 -0
  292. package/dist/types/workflow-results.d.ts.map +1 -0
  293. package/dist/types/workflow-results.js +2 -0
  294. package/dist/utils/ai-config-builder.d.ts +14 -0
  295. package/dist/utils/ai-config-builder.d.ts.map +1 -0
  296. package/dist/utils/ai-config-builder.js +22 -0
  297. package/dist/utils/ai-operation-utility.d.ts +142 -0
  298. package/dist/utils/ai-operation-utility.d.ts.map +1 -0
  299. package/dist/utils/ai-operation-utility.js +303 -0
  300. package/dist/utils/ai-service-factory.d.ts +34 -0
  301. package/dist/utils/ai-service-factory.d.ts.map +1 -0
  302. package/dist/utils/ai-service-factory.js +99 -0
  303. package/dist/utils/error-utils.d.ts +70 -0
  304. package/dist/utils/error-utils.d.ts.map +1 -0
  305. package/dist/utils/error-utils.js +104 -0
  306. package/dist/utils/file-utils.d.ts +107 -0
  307. package/dist/utils/file-utils.d.ts.map +1 -0
  308. package/dist/utils/file-utils.js +171 -0
  309. package/dist/utils/id-generator.d.ts +92 -0
  310. package/dist/utils/id-generator.d.ts.map +1 -0
  311. package/dist/utils/id-generator.js +146 -0
  312. package/dist/utils/metadata-utils.d.ts +40 -0
  313. package/dist/utils/metadata-utils.d.ts.map +1 -0
  314. package/dist/utils/metadata-utils.js +43 -0
  315. package/dist/utils/model-executor-parser.d.ts +38 -0
  316. package/dist/utils/model-executor-parser.d.ts.map +1 -0
  317. package/dist/utils/model-executor-parser.js +69 -0
  318. package/dist/utils/model-parser.d.ts +6 -0
  319. package/dist/utils/model-parser.d.ts.map +1 -0
  320. package/dist/utils/model-parser.js +49 -0
  321. package/dist/utils/stack-formatter.d.ts +12 -0
  322. package/dist/utils/stack-formatter.d.ts.map +1 -0
  323. package/dist/utils/stack-formatter.js +36 -0
  324. package/dist/utils/storage-utils.d.ts +49 -0
  325. package/dist/utils/storage-utils.d.ts.map +1 -0
  326. package/dist/utils/storage-utils.js +80 -0
  327. package/dist/utils/streaming-utils.d.ts +38 -0
  328. package/dist/utils/streaming-utils.d.ts.map +1 -0
  329. package/dist/utils/streaming-utils.js +64 -0
  330. package/dist/utils/task-o-matic-error.d.ts +206 -0
  331. package/dist/utils/task-o-matic-error.d.ts.map +1 -0
  332. package/dist/utils/task-o-matic-error.js +304 -0
  333. package/package.json +40 -0
  334. package/src/index.ts +36 -0
  335. package/src/lib/ai-service/ai-operations.ts +310 -0
  336. package/src/lib/ai-service/base-operations.ts +139 -0
  337. package/src/lib/ai-service/documentation-operations.ts +438 -0
  338. package/src/lib/ai-service/filesystem-tools.ts +73 -0
  339. package/src/lib/ai-service/gemini-proxy.ts.bak +52 -0
  340. package/src/lib/ai-service/json-parser.ts +203 -0
  341. package/src/lib/ai-service/mcp-client.ts +54 -0
  342. package/src/lib/ai-service/model-provider.ts +192 -0
  343. package/src/lib/ai-service/prd-operations.ts +854 -0
  344. package/src/lib/ai-service/research-tools.ts +207 -0
  345. package/src/lib/ai-service/retry-handler.ts +89 -0
  346. package/src/lib/ai-service/task-operations.ts +342 -0
  347. package/src/lib/benchmark/registry.ts +307 -0
  348. package/src/lib/benchmark/runner.ts +190 -0
  349. package/src/lib/benchmark/storage.ts +140 -0
  350. package/src/lib/benchmark/types.ts +121 -0
  351. package/src/lib/better-t-stack-cli.ts +524 -0
  352. package/src/lib/bootstrap/cli-bootstrap.ts +397 -0
  353. package/src/lib/bootstrap/index.ts +2 -0
  354. package/src/lib/bootstrap/medusa-bootstrap.ts +261 -0
  355. package/src/lib/config-validation.ts +278 -0
  356. package/src/lib/config.ts +435 -0
  357. package/src/lib/context-builder.ts +383 -0
  358. package/src/lib/executors/claude-code-executor.ts +83 -0
  359. package/src/lib/executors/codex-executor.ts +85 -0
  360. package/src/lib/executors/executor-factory.ts +28 -0
  361. package/src/lib/executors/gemini-executor.ts +80 -0
  362. package/src/lib/executors/kilo-executor.ts +83 -0
  363. package/src/lib/executors/opencode-executor.ts +81 -0
  364. package/src/lib/git-utils.ts +334 -0
  365. package/src/lib/hooks.ts +121 -0
  366. package/src/lib/index.ts +166 -0
  367. package/src/lib/logger.ts +43 -0
  368. package/src/lib/notifications.ts +103 -0
  369. package/src/lib/prompt-builder.ts +471 -0
  370. package/src/lib/prompt-registry.ts +491 -0
  371. package/src/lib/provider-defaults.json +32 -0
  372. package/src/lib/storage/file-system.ts +864 -0
  373. package/src/lib/storage/storage-callbacks.ts +120 -0
  374. package/src/lib/storage/types.ts +58 -0
  375. package/src/lib/task-execution-core.ts +591 -0
  376. package/src/lib/task-execution.ts +59 -0
  377. package/src/lib/task-loop-execution.ts +214 -0
  378. package/src/lib/task-planning.ts +157 -0
  379. package/src/lib/task-review.ts +138 -0
  380. package/src/lib/validation.ts +140 -0
  381. package/src/prompts/documentation-detection.ts +21 -0
  382. package/src/prompts/documentation-recap.ts +11 -0
  383. package/src/prompts/index.ts +14 -0
  384. package/src/prompts/prd-combination.ts +32 -0
  385. package/src/prompts/prd-generation.ts +46 -0
  386. package/src/prompts/prd-parsing.ts +170 -0
  387. package/src/prompts/prd-question-answer.ts +25 -0
  388. package/src/prompts/prd-question.ts +38 -0
  389. package/src/prompts/prd-rework.ts +79 -0
  390. package/src/prompts/prd-suggest-stack.ts +97 -0
  391. package/src/prompts/task-breakdown.ts +149 -0
  392. package/src/prompts/task-enhancement.ts +138 -0
  393. package/src/prompts/task-execution.ts +22 -0
  394. package/src/prompts/task-planning.ts +64 -0
  395. package/src/prompts/workflow-assistance.ts +151 -0
  396. package/src/prompts/workflow-prompts.ts +97 -0
  397. package/src/services/benchmark.ts +433 -0
  398. package/src/services/prd.ts +845 -0
  399. package/src/services/tasks.ts +1515 -0
  400. package/src/services/workflow-ai-assistant.ts +298 -0
  401. package/src/services/workflow-benchmark.ts +339 -0
  402. package/src/services/workflow.ts +779 -0
  403. package/src/test/hooks.test.ts +77 -0
  404. package/src/test/integration/callbacks.test.ts +39 -0
  405. package/src/test/lib/ai-service/task-operations.test.ts +430 -0
  406. package/src/test/lib/config.test.ts +150 -0
  407. package/src/test/lib/git-utils.test.ts +198 -0
  408. package/src/test/mocks/mock-ai-operations.ts +205 -0
  409. package/src/test/mocks/mock-context-builder.ts +84 -0
  410. package/src/test/mocks/mock-model-provider.ts +21 -0
  411. package/src/test/mocks/mock-service-factory.ts +64 -0
  412. package/src/test/mocks/mock-storage.ts +204 -0
  413. package/src/test/model-parsing.test.ts +78 -0
  414. package/src/test/services/task-service.test.ts +551 -0
  415. package/src/test/storage.test.ts +206 -0
  416. package/src/test/task-loop-git.test.ts +142 -0
  417. package/src/test/test-mock-setup.ts +46 -0
  418. package/src/test/test-setup.ts +48 -0
  419. package/src/test/test-utils.ts +45 -0
  420. package/src/test/utils/ai-operation-utility.test.ts +306 -0
  421. package/src/test/utils/error-handling.test.ts +241 -0
  422. package/src/test/utils/file-utils.test.ts +80 -0
  423. package/src/test/utils/id-generator.test.ts +44 -0
  424. package/src/test/utils/model-parser.test.ts +67 -0
  425. package/src/test/validation.test.ts +19 -0
  426. package/src/types/callbacks.ts +14 -0
  427. package/src/types/index.ts +628 -0
  428. package/src/types/mcp.ts +5 -0
  429. package/src/types/options.ts +165 -0
  430. package/src/types/results.ts +216 -0
  431. package/src/types/workflow-options.ts +113 -0
  432. package/src/types/workflow-results.ts +87 -0
  433. package/src/utils/ai-config-builder.ts +33 -0
  434. package/src/utils/ai-operation-utility.ts +380 -0
  435. package/src/utils/ai-service-factory.ts +125 -0
  436. package/src/utils/error-utils.ts +124 -0
  437. package/src/utils/file-utils.ts +197 -0
  438. package/src/utils/id-generator.ts +168 -0
  439. package/src/utils/metadata-utils.ts +48 -0
  440. package/src/utils/model-executor-parser.ts +80 -0
  441. package/src/utils/model-parser.ts +58 -0
  442. package/src/utils/stack-formatter.ts +53 -0
  443. package/src/utils/storage-utils.ts +94 -0
  444. package/src/utils/streaming-utils.ts +91 -0
  445. package/src/utils/task-o-matic-error.ts +393 -0
  446. package/tsconfig.json +20 -0
  447. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,459 @@
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
+ const assert = __importStar(require("assert"));
37
+ const tasks_1 = require("../../services/tasks");
38
+ const test_utils_1 = require("../test-utils");
39
+ const test_mock_setup_1 = require("../test-mock-setup");
40
+ describe("TaskService", () => {
41
+ let taskService;
42
+ beforeEach(() => {
43
+ // Reset mocks to ensure clean state for each test
44
+ (0, test_mock_setup_1.resetMocks)();
45
+ // Create a new TaskService instance
46
+ taskService = new tasks_1.TaskService();
47
+ });
48
+ describe("createTask", () => {
49
+ it("should create a basic task without AI enhancement", async () => {
50
+ const taskData = (0, test_utils_1.createTestTaskData)();
51
+ const result = await taskService.createTask({
52
+ title: taskData.title,
53
+ content: taskData.description,
54
+ effort: taskData.effort,
55
+ });
56
+ assert.strictEqual(result.success, true);
57
+ assert.ok(result.task);
58
+ assert.strictEqual(result.task.title, taskData.title);
59
+ assert.strictEqual(result.task.description, taskData.description);
60
+ assert.strictEqual(result.task.status, "todo");
61
+ assert.strictEqual(result.task.estimatedEffort, taskData.effort);
62
+ });
63
+ it("should create a task with AI enhancement", async () => {
64
+ const taskData = (0, test_utils_1.createTestTaskData)();
65
+ const result = await taskService.createTask({
66
+ title: taskData.title,
67
+ content: taskData.description,
68
+ effort: taskData.effort,
69
+ aiEnhance: true,
70
+ });
71
+ assert.strictEqual(result.success, true);
72
+ assert.ok(result.task);
73
+ assert.strictEqual(result.task.title, taskData.title);
74
+ // Check that the content field (not description) has the AI enhancement
75
+ assert.ok((result.task.content || "").includes("🤖 Enhanced with AI documentation"));
76
+ assert.ok(result.aiMetadata);
77
+ assert.strictEqual(result.aiMetadata?.aiGenerated, true);
78
+ });
79
+ it("should handle context building failures gracefully", async () => {
80
+ const taskData = (0, test_utils_1.createTestTaskData)();
81
+ // The mock context builder will work normally, but we test that
82
+ // the task creation is resilient to potential context building issues
83
+ const result = await taskService.createTask({
84
+ title: taskData.title,
85
+ content: taskData.description,
86
+ effort: taskData.effort,
87
+ aiEnhance: true,
88
+ });
89
+ assert.strictEqual(result.success, true);
90
+ assert.ok(result.task);
91
+ assert.strictEqual(result.task.title, taskData.title);
92
+ });
93
+ });
94
+ describe("updateTask", () => {
95
+ it("should update task properties", async () => {
96
+ // Create a task first
97
+ const taskData = (0, test_utils_1.createTestTaskData)();
98
+ const createResult = await taskService.createTask({
99
+ title: taskData.title,
100
+ content: taskData.description,
101
+ });
102
+ const taskId = createResult.task.id;
103
+ // Update the task
104
+ const updatedTask = await taskService.updateTask(taskId, {
105
+ title: "Updated Title",
106
+ status: "in-progress",
107
+ tags: ["urgent", "important"],
108
+ });
109
+ assert.strictEqual(updatedTask.title, "Updated Title");
110
+ assert.strictEqual(updatedTask.status, "in-progress");
111
+ assert.deepStrictEqual(updatedTask.tags, ["urgent", "important"]);
112
+ });
113
+ it("should validate status transitions", async () => {
114
+ // Create a task
115
+ const taskData = (0, test_utils_1.createTestTaskData)();
116
+ const createResult = await taskService.createTask({
117
+ title: taskData.title,
118
+ });
119
+ const taskId = createResult.task.id;
120
+ // Valid transition: todo -> completed is allowed
121
+ const updatedTask = await taskService.updateTask(taskId, {
122
+ status: "completed",
123
+ });
124
+ assert.strictEqual(updatedTask.status, "completed");
125
+ // Now test an invalid transition: completed -> completed (same status should not error, but let's test a truly invalid one)
126
+ // Actually, looking at the valid transitions, all transitions are allowed from any status
127
+ // So let's test that valid transitions work
128
+ await taskService.updateTask(taskId, {
129
+ status: "in-progress",
130
+ });
131
+ const task = await taskService.getTask(taskId);
132
+ assert.strictEqual(task?.status, "in-progress");
133
+ });
134
+ it("should handle string tags and convert to array", async () => {
135
+ // Create a task
136
+ const taskData = (0, test_utils_1.createTestTaskData)();
137
+ const createResult = await taskService.createTask({
138
+ title: taskData.title,
139
+ });
140
+ const taskId = createResult.task.id;
141
+ // Update with string tags
142
+ const updatedTask = await taskService.updateTask(taskId, {
143
+ tags: "urgent, important, bugfix",
144
+ });
145
+ assert.deepStrictEqual(updatedTask.tags, [
146
+ "urgent",
147
+ "important",
148
+ "bugfix",
149
+ ]);
150
+ });
151
+ });
152
+ describe("deleteTask", () => {
153
+ it("should delete a task successfully", async () => {
154
+ // Create a task
155
+ const taskData = (0, test_utils_1.createTestTaskData)();
156
+ const createResult = await taskService.createTask({
157
+ title: taskData.title,
158
+ });
159
+ const taskId = createResult.task.id;
160
+ // Delete the task
161
+ const deleteResult = await taskService.deleteTask(taskId);
162
+ assert.strictEqual(deleteResult.success, true);
163
+ assert.strictEqual(deleteResult.deleted.length, 1);
164
+ assert.strictEqual(deleteResult.deleted[0].id, taskId);
165
+ // Verify task is gone
166
+ const deletedTask = await taskService.getTask(taskId);
167
+ assert.strictEqual(deletedTask, null);
168
+ });
169
+ it("should handle cascade deletion of subtasks", async () => {
170
+ // Create parent task
171
+ const parentResult = await taskService.createTask({
172
+ title: "Parent Task",
173
+ });
174
+ const parentId = parentResult.task.id;
175
+ // Create subtasks
176
+ const subtask1 = await taskService.createTask({
177
+ title: "Subtask 1",
178
+ parentId: parentId,
179
+ });
180
+ const subtask2 = await taskService.createTask({
181
+ title: "Subtask 2",
182
+ parentId: parentId,
183
+ });
184
+ // Delete parent with cascade
185
+ const deleteResult = await taskService.deleteTask(parentId, {
186
+ cascade: true,
187
+ });
188
+ assert.strictEqual(deleteResult.success, true);
189
+ assert.strictEqual(deleteResult.deleted.length, 3); // parent + 2 subtasks
190
+ });
191
+ it("should throw error when task has subtasks and no cascade/force", async () => {
192
+ // Create parent task
193
+ const parentResult = await taskService.createTask({
194
+ title: "Parent Task",
195
+ });
196
+ const parentId = parentResult.task.id;
197
+ // Create subtask
198
+ await taskService.createTask({
199
+ title: "Subtask 1",
200
+ parentId: parentId,
201
+ });
202
+ // Try to delete without cascade or force
203
+ await assert.rejects(async () => {
204
+ await taskService.deleteTask(parentId);
205
+ }, (err) => {
206
+ assert.ok(err.message.includes("subtasks"));
207
+ return true;
208
+ });
209
+ });
210
+ });
211
+ describe("listTasks", () => {
212
+ it("should list all top-level tasks", async () => {
213
+ // Create some tasks
214
+ await taskService.createTask({ title: "Task 1" });
215
+ await taskService.createTask({ title: "Task 2" });
216
+ await taskService.createTask({ title: "Task 3" });
217
+ const tasks = await taskService.listTasks({});
218
+ assert.strictEqual(tasks.length, 3);
219
+ assert.ok(tasks.every((task) => !task.parentId));
220
+ });
221
+ it("should filter tasks by status", async () => {
222
+ // Create tasks with different statuses
223
+ const task1 = await taskService.createTask({ title: "Task 1" });
224
+ await taskService.updateTask(task1.task.id, { status: "in-progress" });
225
+ const task2 = await taskService.createTask({ title: "Task 2" });
226
+ await taskService.updateTask(task2.task.id, { status: "completed" });
227
+ const task3 = await taskService.createTask({ title: "Task 3" });
228
+ const inProgressTasks = await taskService.listTasks({
229
+ status: "in-progress",
230
+ });
231
+ const completedTasks = await taskService.listTasks({
232
+ status: "completed",
233
+ });
234
+ assert.strictEqual(inProgressTasks.length, 1);
235
+ assert.strictEqual(completedTasks.length, 1);
236
+ });
237
+ it("should filter tasks by tag", async () => {
238
+ // Create tasks with different tags
239
+ const task1 = await taskService.createTask({ title: "Task 1" });
240
+ await taskService.updateTask(task1.task.id, {
241
+ tags: ["frontend", "urgent"],
242
+ });
243
+ const task2 = await taskService.createTask({ title: "Task 2" });
244
+ await taskService.updateTask(task2.task.id, { tags: ["backend"] });
245
+ const task3 = await taskService.createTask({ title: "Task 3" });
246
+ const frontendTasks = await taskService.listTasks({ tag: "frontend" });
247
+ const backendTasks = await taskService.listTasks({ tag: "backend" });
248
+ assert.strictEqual(frontendTasks.length, 1);
249
+ assert.strictEqual(backendTasks.length, 1);
250
+ });
251
+ });
252
+ describe("getTaskTree", () => {
253
+ it("should return task tree for specific task", async () => {
254
+ // Create parent task
255
+ const parentResult = await taskService.createTask({
256
+ title: "Parent Task",
257
+ });
258
+ const parentId = parentResult.task.id;
259
+ // Create subtasks
260
+ const subtask1 = await taskService.createTask({
261
+ title: "Subtask 1",
262
+ parentId: parentId,
263
+ });
264
+ const subtask2 = await taskService.createTask({
265
+ title: "Subtask 2",
266
+ parentId: parentId,
267
+ });
268
+ // Create sub-subtask
269
+ const subSubtask = await taskService.createTask({
270
+ title: "Sub-Subtask 1",
271
+ parentId: subtask1.task.id,
272
+ });
273
+ const tree = await taskService.getTaskTree(parentId);
274
+ assert.strictEqual(tree.length, 4); // parent + 2 subtasks + 1 sub-subtask
275
+ assert.strictEqual(tree[0].id, parentId);
276
+ });
277
+ it("should return all tasks when no rootId provided", async () => {
278
+ // Create some tasks
279
+ await taskService.createTask({ title: "Task 1" });
280
+ await taskService.createTask({ title: "Task 2" });
281
+ await taskService.createTask({ title: "Task 3" });
282
+ const allTasks = await taskService.getTaskTree();
283
+ assert.strictEqual(allTasks.length, 3);
284
+ });
285
+ });
286
+ describe("enhanceTask", () => {
287
+ it("should enhance task with AI documentation", async () => {
288
+ // Create a task
289
+ const taskData = (0, test_utils_1.createTestTaskData)();
290
+ const createResult = await taskService.createTask({
291
+ title: taskData.title,
292
+ content: taskData.description,
293
+ });
294
+ const taskId = createResult.task.id;
295
+ // Enhance the task
296
+ const enhanceResult = await taskService.enhanceTask(taskId);
297
+ assert.strictEqual(enhanceResult.success, true);
298
+ assert.ok(enhanceResult.enhancedContent);
299
+ assert.ok(enhanceResult.enhancedContent.includes("🤖 Enhanced with AI documentation"));
300
+ assert.ok(enhanceResult.stats);
301
+ assert.ok(enhanceResult.metadata);
302
+ });
303
+ it("should throw error for non-existent task", async () => {
304
+ await assert.rejects(async () => {
305
+ await taskService.enhanceTask("non-existent-id");
306
+ }, (err) => {
307
+ assert.ok(err.message.includes("not found"));
308
+ return true;
309
+ });
310
+ });
311
+ });
312
+ describe("splitTask", () => {
313
+ it("should split task into subtasks", async () => {
314
+ // Create a task
315
+ const taskData = (0, test_utils_1.createTestTaskData)();
316
+ const createResult = await taskService.createTask({
317
+ title: taskData.title,
318
+ content: taskData.description,
319
+ });
320
+ const taskId = createResult.task.id;
321
+ // Split the task
322
+ const splitResult = await taskService.splitTask(taskId);
323
+ assert.strictEqual(splitResult.success, true);
324
+ assert.strictEqual(splitResult.subtasks.length, 2);
325
+ assert.ok(splitResult.stats);
326
+ assert.ok(splitResult.metadata);
327
+ // Verify subtasks were created
328
+ const subtasks = await taskService.getSubtasks(taskId);
329
+ assert.strictEqual(subtasks.length, 2);
330
+ });
331
+ it("should throw error if task already has subtasks", async () => {
332
+ // Create a task
333
+ const taskData = (0, test_utils_1.createTestTaskData)();
334
+ const createResult = await taskService.createTask({
335
+ title: taskData.title,
336
+ });
337
+ const taskId = createResult.task.id;
338
+ // Create a subtask
339
+ await taskService.createTask({
340
+ title: "Existing Subtask",
341
+ parentId: taskId,
342
+ });
343
+ // Try to split task that already has subtasks
344
+ await assert.rejects(async () => {
345
+ await taskService.splitTask(taskId);
346
+ }, (err) => {
347
+ assert.ok(err.message.includes("already has"));
348
+ return true;
349
+ });
350
+ });
351
+ });
352
+ describe("getTask", () => {
353
+ it("should retrieve a task by ID", async () => {
354
+ const taskData = (0, test_utils_1.createTestTaskData)();
355
+ const createResult = await taskService.createTask({ title: taskData.title });
356
+ const task = await taskService.getTask(createResult.task.id);
357
+ assert.ok(task !== null);
358
+ if (task) {
359
+ assert.strictEqual(task.id, createResult.task.id);
360
+ assert.strictEqual(task.title, taskData.title);
361
+ }
362
+ });
363
+ it("should return null for non-existent task", async () => {
364
+ const task = await taskService.getTask("non-existent-id");
365
+ assert.strictEqual(task, null);
366
+ });
367
+ });
368
+ describe("getSubtasks", () => {
369
+ it("should return empty array for task without subtasks", async () => {
370
+ const createResult = await taskService.createTask({ title: "Parent Task" });
371
+ const subtasks = await taskService.getSubtasks(createResult.task.id);
372
+ assert.strictEqual(subtasks.length, 0);
373
+ });
374
+ it("should return all subtasks for a parent task", async () => {
375
+ const parentResult = await taskService.createTask({ title: "Parent" });
376
+ await taskService.createTask({ title: "Subtask 1", parentId: parentResult.task.id });
377
+ await taskService.createTask({ title: "Subtask 2", parentId: parentResult.task.id });
378
+ const subtasks = await taskService.getSubtasks(parentResult.task.id);
379
+ assert.strictEqual(subtasks.length, 2);
380
+ assert.ok(subtasks.every(t => t.parentId === parentResult.task.id));
381
+ });
382
+ });
383
+ describe("Tag Management", () => {
384
+ it("should add tags to a task", async () => {
385
+ const createResult = await taskService.createTask({ title: "Test Task" });
386
+ await taskService.addTags(createResult.task.id, ["urgent", "bug"]);
387
+ const task = await taskService.getTask(createResult.task.id);
388
+ assert.ok(task !== null);
389
+ if (task && task.tags) {
390
+ assert.ok(task.tags.includes("urgent"));
391
+ assert.ok(task.tags.includes("bug"));
392
+ }
393
+ });
394
+ it("should remove tags from a task", async () => {
395
+ const createResult = await taskService.createTask({
396
+ title: "Test Task"
397
+ });
398
+ // Add tags first
399
+ await taskService.addTags(createResult.task.id, ["urgent", "bug"]);
400
+ // Then remove one
401
+ const updatedTask = await taskService.removeTags(createResult.task.id, ["bug"]);
402
+ if (updatedTask.tags) {
403
+ assert.strictEqual(updatedTask.tags.includes("bug"), false);
404
+ }
405
+ });
406
+ it("should not duplicate tags when adding existing tags", async () => {
407
+ const createResult = await taskService.createTask({
408
+ title: "Test Task"
409
+ });
410
+ await taskService.addTags(createResult.task.id, ["urgent"]);
411
+ await taskService.addTags(createResult.task.id, ["urgent", "bug"]);
412
+ const task = await taskService.getTask(createResult.task.id);
413
+ if (task && task.tags) {
414
+ const urgentCount = task.tags.filter(t => t === "urgent").length;
415
+ assert.strictEqual(urgentCount, 1);
416
+ }
417
+ });
418
+ });
419
+ describe("setTaskStatus", () => {
420
+ it("should update task status", async () => {
421
+ const createResult = await taskService.createTask({ title: "Test Task" });
422
+ await taskService.setTaskStatus(createResult.task.id, "in-progress");
423
+ const task = await taskService.getTask(createResult.task.id);
424
+ assert.ok(task !== null);
425
+ if (task) {
426
+ assert.strictEqual(task.status, "in-progress");
427
+ }
428
+ });
429
+ it("should allow valid status transitions", async () => {
430
+ const createResult = await taskService.createTask({ title: "Test Task" });
431
+ await taskService.setTaskStatus(createResult.task.id, "in-progress");
432
+ await taskService.setTaskStatus(createResult.task.id, "completed");
433
+ const task = await taskService.getTask(createResult.task.id);
434
+ assert.ok(task !== null);
435
+ if (task) {
436
+ assert.strictEqual(task.status, "completed");
437
+ }
438
+ });
439
+ });
440
+ describe("getNextTask", () => {
441
+ it("should return next pending task", async () => {
442
+ await taskService.createTask({ title: "Task 1" });
443
+ const nextTask = await taskService.getNextTask({});
444
+ assert.ok(nextTask !== null);
445
+ });
446
+ it("should filter by tag", async () => {
447
+ const task1 = await taskService.createTask({ title: "Task 1" });
448
+ const task2 = await taskService.createTask({ title: "Task 2" });
449
+ // Add tags after creation
450
+ await taskService.addTags(task1.task.id, ["backend"]);
451
+ await taskService.addTags(task2.task.id, ["frontend"]);
452
+ const nextTask = await taskService.getNextTask({ tag: "frontend" });
453
+ // Either returns frontend task or null if implementation differs
454
+ if (nextTask && nextTask.tags) {
455
+ assert.ok(nextTask.tags.includes("frontend"));
456
+ }
457
+ });
458
+ });
459
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=storage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.d.ts","sourceRoot":"","sources":["../../src/test/storage.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,207 @@
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
+ const file_system_1 = require("../lib/storage/file-system");
37
+ const assert = __importStar(require("assert"));
38
+ describe("FileSystemStorage", () => {
39
+ let storage;
40
+ beforeEach(async () => {
41
+ storage = new file_system_1.FileSystemStorage();
42
+ // Clean up any existing data for fresh test
43
+ try {
44
+ const tasks = await storage.getTopLevelTasks();
45
+ for (const task of tasks) {
46
+ await storage.deleteTask(task.id);
47
+ }
48
+ }
49
+ catch (error) {
50
+ // Ignore cleanup errors
51
+ }
52
+ });
53
+ describe("Task Management", () => {
54
+ it("should create a task successfully", async () => {
55
+ const taskRequest = {
56
+ title: "Test Task",
57
+ description: "A test task description",
58
+ estimatedEffort: "small",
59
+ };
60
+ const task = await storage.createTask(taskRequest);
61
+ assert.strictEqual(task.title, "Test Task");
62
+ assert.strictEqual(task.description, "A test task description");
63
+ assert.strictEqual(task.estimatedEffort, "small");
64
+ assert.strictEqual(task.status, "todo");
65
+ assert.ok(task.id);
66
+ assert.ok(task.createdAt);
67
+ assert.ok(task.updatedAt);
68
+ });
69
+ it("should retrieve a task by ID", async () => {
70
+ const taskRequest = {
71
+ title: "Test Task for Retrieval",
72
+ };
73
+ const createdTask = await storage.createTask(taskRequest);
74
+ const retrievedTask = await storage.getTask(createdTask.id);
75
+ assert.ok(retrievedTask);
76
+ assert.strictEqual(retrievedTask.id, createdTask.id);
77
+ assert.strictEqual(retrievedTask.title, createdTask.title);
78
+ });
79
+ it("should return null for non-existent task", async () => {
80
+ const task = await storage.getTask("non-existent-id");
81
+ assert.strictEqual(task, null);
82
+ });
83
+ it("should update a task", async () => {
84
+ const taskRequest = {
85
+ title: "Original Title",
86
+ };
87
+ const createdTask = await storage.createTask(taskRequest);
88
+ // Add a small delay to ensure different timestamps
89
+ await new Promise((resolve) => setTimeout(resolve, 1));
90
+ const updatedTask = await storage.updateTask(createdTask.id, {
91
+ title: "Updated Title",
92
+ status: "in-progress",
93
+ });
94
+ assert.ok(updatedTask);
95
+ assert.strictEqual(updatedTask.title, "Updated Title");
96
+ assert.strictEqual(updatedTask.status, "in-progress");
97
+ assert.ok(updatedTask.updatedAt >= createdTask.updatedAt);
98
+ });
99
+ it("should delete a task", async () => {
100
+ const taskRequest = {
101
+ title: "Task to Delete",
102
+ };
103
+ const createdTask = await storage.createTask(taskRequest);
104
+ const deleteResult = await storage.deleteTask(createdTask.id);
105
+ assert.strictEqual(deleteResult, true);
106
+ const deletedTask = await storage.getTask(createdTask.id);
107
+ assert.strictEqual(deletedTask, null);
108
+ });
109
+ it("should handle task dependencies", async () => {
110
+ const task1Request = {
111
+ title: "First Task",
112
+ };
113
+ const task2Request = {
114
+ title: "Second Task",
115
+ dependencies: [],
116
+ };
117
+ const task1 = await storage.createTask(task1Request);
118
+ const task2 = await storage.createTask({
119
+ ...task2Request,
120
+ dependencies: [task1.id],
121
+ });
122
+ assert.strictEqual(task2.dependencies?.length, 1);
123
+ assert.strictEqual(task2.dependencies[0], task1.id);
124
+ });
125
+ });
126
+ describe("Input Validation", () => {
127
+ it("should reject empty task title", async () => {
128
+ try {
129
+ await storage.createTask({ title: "" });
130
+ assert.fail("Should have thrown an error");
131
+ }
132
+ catch (error) {
133
+ assert.ok(error instanceof Error);
134
+ assert.ok(error.message.includes("title"));
135
+ }
136
+ });
137
+ it("should reject invalid task ID", async () => {
138
+ try {
139
+ await storage.getTask("");
140
+ assert.fail("Should have thrown an error");
141
+ }
142
+ catch (error) {
143
+ assert.ok(error instanceof Error);
144
+ assert.ok(error.message.includes("Task ID"));
145
+ }
146
+ });
147
+ it("should reject invalid estimated effort", async () => {
148
+ try {
149
+ await storage.createTask({
150
+ title: "Test Task",
151
+ estimatedEffort: "invalid",
152
+ });
153
+ assert.fail("Should have thrown an error");
154
+ }
155
+ catch (error) {
156
+ assert.ok(error instanceof Error);
157
+ assert.ok(error.message.includes("effort"));
158
+ }
159
+ });
160
+ });
161
+ describe("Storage Validation", () => {
162
+ it("should validate storage integrity", async () => {
163
+ const validation = await storage.validateStorageIntegrity();
164
+ assert.ok(validation.isValid);
165
+ assert.strictEqual(validation.issues.length, 0);
166
+ });
167
+ it("should detect duplicate task IDs", async () => {
168
+ // This would require manual manipulation to test
169
+ // For now, just ensure the method exists
170
+ const validation = await storage.validateStorageIntegrity();
171
+ assert.ok(typeof validation.isValid === "boolean");
172
+ assert.ok(Array.isArray(validation.issues));
173
+ });
174
+ });
175
+ describe("Content Management", () => {
176
+ it("should save and retrieve task content", async () => {
177
+ const taskRequest = {
178
+ title: "Task with Content",
179
+ };
180
+ const task = await storage.createTask(taskRequest);
181
+ const content = "# Task Content\nThis is the task content.";
182
+ const contentFile = await storage.saveTaskContent(task.id, content);
183
+ const retrievedContent = await storage.getTaskContent(task.id);
184
+ assert.strictEqual(retrievedContent, content);
185
+ assert.ok(contentFile.includes(task.id));
186
+ });
187
+ it("should return null for non-existent content", async () => {
188
+ // First create a task to ensure storage is initialized
189
+ const taskRequest = {
190
+ title: "Dummy Task for Initialization",
191
+ };
192
+ await storage.createTask(taskRequest);
193
+ const content = await storage.getTaskContent("non-existent-task");
194
+ assert.strictEqual(content, null);
195
+ });
196
+ it("should delete task content", async () => {
197
+ const taskRequest = {
198
+ title: "Task with Content to Delete",
199
+ };
200
+ const task = await storage.createTask(taskRequest);
201
+ await storage.saveTaskContent(task.id, "Some content");
202
+ await storage.deleteTaskContent(task.id);
203
+ const content = await storage.getTaskContent(task.id);
204
+ assert.strictEqual(content, null);
205
+ });
206
+ });
207
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=task-loop-git.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-loop-git.test.d.ts","sourceRoot":"","sources":["../../src/test/task-loop-git.test.ts"],"names":[],"mappings":""}