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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.test.d.ts","sourceRoot":"","sources":["../../src/test/hooks.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_assert_1 = __importDefault(require("node:assert"));
7
+ const hooks_1 = require("../lib/hooks");
8
+ describe("HookRegistry", () => {
9
+ beforeEach(() => {
10
+ hooks_1.hooks.clear();
11
+ });
12
+ it("should register and call a listener", async () => {
13
+ let called = false;
14
+ const task = { id: "1", title: "Test Task" };
15
+ hooks_1.hooks.on("task:created", (payload) => {
16
+ node_assert_1.default.strictEqual(payload.task, task);
17
+ called = true;
18
+ });
19
+ await hooks_1.hooks.emit("task:created", { task });
20
+ node_assert_1.default.strictEqual(called, true);
21
+ });
22
+ it("should handle multiple listeners", async () => {
23
+ let count = 0;
24
+ const task = { id: "1", title: "Test Task" };
25
+ hooks_1.hooks.on("task:created", () => {
26
+ count++;
27
+ });
28
+ hooks_1.hooks.on("task:created", () => {
29
+ count++;
30
+ });
31
+ await hooks_1.hooks.emit("task:created", { task });
32
+ node_assert_1.default.strictEqual(count, 2);
33
+ });
34
+ it("should remove a listener", async () => {
35
+ let count = 0;
36
+ const handler = () => {
37
+ count++;
38
+ };
39
+ const task = { id: "1", title: "Test Task" };
40
+ hooks_1.hooks.on("task:created", handler);
41
+ hooks_1.hooks.off("task:created", handler);
42
+ await hooks_1.hooks.emit("task:created", { task });
43
+ node_assert_1.default.strictEqual(count, 0);
44
+ });
45
+ it("should not fail if a listener throws", async () => {
46
+ const task = { id: "1", title: "Test Task" };
47
+ // Suppress console.error for this test
48
+ const originalConsoleError = console.error;
49
+ console.error = () => { };
50
+ try {
51
+ hooks_1.hooks.on("task:created", () => {
52
+ throw new Error("Oops");
53
+ });
54
+ let secondCalled = false;
55
+ hooks_1.hooks.on("task:created", () => {
56
+ secondCalled = true;
57
+ });
58
+ // Should not throw
59
+ await hooks_1.hooks.emit("task:created", { task });
60
+ node_assert_1.default.strictEqual(secondCalled, true);
61
+ }
62
+ finally {
63
+ // Restore console.error
64
+ console.error = originalConsoleError;
65
+ }
66
+ });
67
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=callbacks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callbacks.test.d.ts","sourceRoot":"","sources":["../../../src/test/integration/callbacks.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
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("Callback Integration", () => {
39
+ it("should use custom storage callbacks", async () => {
40
+ const memoryStore = new Map();
41
+ const callbacks = {
42
+ read: async (key) => memoryStore.get(key) || null,
43
+ write: async (key, value) => {
44
+ memoryStore.set(key, value);
45
+ },
46
+ delete: async (key) => {
47
+ memoryStore.delete(key);
48
+ },
49
+ list: async (prefix) => Array.from(memoryStore.keys()).filter((k) => k.startsWith(prefix || "")),
50
+ exists: async (key) => memoryStore.has(key),
51
+ };
52
+ const storage = new file_system_1.FileSystemStorage(callbacks);
53
+ // Create task
54
+ const task = await storage.createTask({ title: "Test Task" });
55
+ // Verify it was written to memory store
56
+ assert.strictEqual(memoryStore.has("tasks.json"), true);
57
+ const data = JSON.parse(memoryStore.get("tasks.json"));
58
+ assert.strictEqual(data.tasks.length, 1);
59
+ assert.strictEqual(data.tasks[0].title, "Test Task");
60
+ // Verify retrieval
61
+ const retrieved = await storage.getTask(task.id);
62
+ assert.strictEqual(retrieved?.id, task.id);
63
+ });
64
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=task-operations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-operations.test.d.ts","sourceRoot":"","sources":["../../../../src/test/lib/ai-service/task-operations.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,362 @@
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 task_operations_1 = require("../../../lib/ai-service/task-operations");
38
+ const task_o_matic_error_1 = require("../../../utils/task-o-matic-error");
39
+ /**
40
+ * ⚠️ CRITICAL: These integration tests use 100% MOCKS - ZERO real AI calls
41
+ * No API calls are made, no costs incurred, tests run fast
42
+ *
43
+ * These tests verify that TaskOperations properly integrates with AIOperationUtility
44
+ * and that errors propagate correctly through the stack.
45
+ */
46
+ describe("TaskOperations Integration Tests", () => {
47
+ let taskOps;
48
+ let mockAIOperationUtility;
49
+ beforeEach(() => {
50
+ taskOps = new task_operations_1.TaskOperations();
51
+ // Create mock AIOperationUtility - NO REAL AI CALLS
52
+ mockAIOperationUtility = {
53
+ executeAIOperation: async (operationName, operation, options) => {
54
+ // Execute the operation and return mock metrics
55
+ const result = await operation();
56
+ return {
57
+ result,
58
+ metrics: {
59
+ duration: 100,
60
+ tokenUsage: {
61
+ prompt: 50,
62
+ completion: 25,
63
+ total: 75,
64
+ },
65
+ },
66
+ };
67
+ },
68
+ streamTextWithTools: async (systemPrompt, userMessage, config, streamingOptions, tools) => {
69
+ // Return mock JSON response
70
+ return JSON.stringify({
71
+ subtasks: [
72
+ {
73
+ title: "Mock subtask 1",
74
+ description: "Mock description 1",
75
+ effort: "small",
76
+ },
77
+ {
78
+ title: "Mock subtask 2",
79
+ description: "Mock description 2",
80
+ effort: "medium",
81
+ },
82
+ ],
83
+ });
84
+ },
85
+ streamText: async (_prompt, _config, _systemPrompt, _userMessage, _streamingOptions) => {
86
+ return "Mock enhanced content";
87
+ },
88
+ };
89
+ // Inject mock into TaskOperations
90
+ taskOps.aiOperationUtility = mockAIOperationUtility;
91
+ });
92
+ describe("breakdownTask Integration", () => {
93
+ it("should successfully break down a task using AIOperationUtility", async () => {
94
+ const mockTask = {
95
+ id: "test-task-1",
96
+ title: "Test Task",
97
+ description: "A task to break down",
98
+ status: "todo",
99
+ createdAt: Date.now(),
100
+ updatedAt: Date.now(),
101
+ };
102
+ const result = await taskOps.breakdownTask(mockTask);
103
+ // Verify result structure
104
+ assert.ok(Array.isArray(result));
105
+ assert.strictEqual(result.length, 2);
106
+ assert.strictEqual(result[0].title, "Mock subtask 1");
107
+ assert.strictEqual(result[0].content, "Mock description 1");
108
+ assert.strictEqual(result[0].estimatedEffort, "small");
109
+ });
110
+ it("should handle filesystem tools when enabled", async () => {
111
+ let toolsPassed = false;
112
+ // Override streamTextWithTools to capture tools parameter
113
+ mockAIOperationUtility.streamTextWithTools = async (_systemPrompt, _userMessage, _config, _streamingOptions, tools) => {
114
+ if (tools && Object.keys(tools).length > 0) {
115
+ toolsPassed = true;
116
+ }
117
+ return JSON.stringify({
118
+ subtasks: [
119
+ {
120
+ title: "Subtask with tools",
121
+ description: "Used filesystem tools",
122
+ effort: "small",
123
+ },
124
+ ],
125
+ });
126
+ };
127
+ const mockTask = {
128
+ id: "test-task-2",
129
+ title: "Task with tools",
130
+ status: "todo",
131
+ createdAt: Date.now(),
132
+ updatedAt: Date.now(),
133
+ };
134
+ const result = await taskOps.breakdownTask(mockTask, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true // enableFilesystemTools
135
+ );
136
+ assert.ok(toolsPassed, "Filesystem tools should be passed when enabled");
137
+ assert.strictEqual(result.length, 1);
138
+ });
139
+ it("should propagate TaskOMaticError from AIOperationUtility", async () => {
140
+ // Mock AIOperationUtility to throw error
141
+ taskOps.aiOperationUtility.executeAIOperation = async () => {
142
+ throw new task_o_matic_error_1.TaskOMaticError("AI operation failed: Task breakdown", {
143
+ code: "AI_OPERATION_FAILED",
144
+ context: "Mock error context",
145
+ suggestions: ["Check AI configuration"],
146
+ });
147
+ };
148
+ const mockTask = {
149
+ id: "test-task-error",
150
+ title: "Task that will fail",
151
+ status: "todo",
152
+ createdAt: Date.now(),
153
+ updatedAt: Date.now(),
154
+ };
155
+ try {
156
+ await taskOps.breakdownTask(mockTask);
157
+ assert.fail("Should have thrown TaskOMaticError");
158
+ }
159
+ catch (error) {
160
+ assert.ok(error instanceof task_o_matic_error_1.TaskOMaticError);
161
+ assert.strictEqual(error.code, "AI_OPERATION_FAILED");
162
+ assert.ok(error.message.includes("Task breakdown"));
163
+ }
164
+ });
165
+ });
166
+ describe("enhanceTask Integration", () => {
167
+ it("should successfully enhance a task using AIOperationUtility", async () => {
168
+ const result = await taskOps.enhanceTask("Test Task", "Basic description");
169
+ // Verify result
170
+ assert.strictEqual(typeof result, "string");
171
+ assert.strictEqual(result, "Mock enhanced content");
172
+ });
173
+ it("should propagate errors from AIOperationUtility", async () => {
174
+ // Mock AIOperationUtility to throw error
175
+ taskOps.aiOperationUtility.executeAIOperation = async () => {
176
+ throw new task_o_matic_error_1.TaskOMaticError("AI operation failed: Task enhancement", {
177
+ code: "AI_OPERATION_FAILED",
178
+ context: "Enhancement failed",
179
+ suggestions: ["Retry with different parameters"],
180
+ });
181
+ };
182
+ try {
183
+ await taskOps.enhanceTask("Test", "Description");
184
+ assert.fail("Should have thrown TaskOMaticError");
185
+ }
186
+ catch (error) {
187
+ assert.ok(error instanceof task_o_matic_error_1.TaskOMaticError);
188
+ assert.ok(error.message.includes("Task enhancement"));
189
+ }
190
+ });
191
+ });
192
+ describe("planTask Integration", () => {
193
+ it("should successfully plan a task using AIOperationUtility", async () => {
194
+ // Mock streamTextWithTools to return plan
195
+ mockAIOperationUtility.streamTextWithTools = async () => {
196
+ return "Mock implementation plan:\n1. Step 1\n2. Step 2\n3. Step 3";
197
+ };
198
+ const result = await taskOps.planTask("Project context", "Task details");
199
+ // Verify result
200
+ assert.strictEqual(typeof result, "string");
201
+ assert.ok(result.includes("Mock implementation plan"));
202
+ assert.ok(result.includes("Step 1"));
203
+ });
204
+ it("should handle MCP tools and filesystem tools", async () => {
205
+ let toolsReceived = false;
206
+ mockAIOperationUtility.streamTextWithTools = async (_systemPrompt, _userMessage, _config, _streamingOptions, tools) => {
207
+ if (tools && Object.keys(tools).length > 0) {
208
+ toolsReceived = true;
209
+ }
210
+ return "Plan with tools";
211
+ };
212
+ // Mock Context7Client to return MCP tools
213
+ const mockContext7Client = {
214
+ getMCPTools: async () => ({
215
+ mockTool: {
216
+ description: "Mock MCP tool",
217
+ parameters: {},
218
+ execute: async () => ({}),
219
+ },
220
+ }),
221
+ saveContext7Documentation: () => { },
222
+ };
223
+ taskOps.context7Client = mockContext7Client;
224
+ const result = await taskOps.planTask("Context", "Details");
225
+ assert.ok(toolsReceived, "Tools should be passed to streamTextWithTools");
226
+ assert.strictEqual(result, "Plan with tools");
227
+ });
228
+ it("should propagate errors from AIOperationUtility", async () => {
229
+ // Mock AIOperationUtility to throw error
230
+ taskOps.aiOperationUtility.executeAIOperation = async () => {
231
+ throw new task_o_matic_error_1.TaskOMaticError("AI operation failed: Task planning", {
232
+ code: "AI_OPERATION_FAILED",
233
+ context: "Planning failed",
234
+ suggestions: ["Check task context"],
235
+ });
236
+ };
237
+ try {
238
+ await taskOps.planTask("Context", "Details");
239
+ assert.fail("Should have thrown TaskOMaticError");
240
+ }
241
+ catch (error) {
242
+ assert.ok(error instanceof task_o_matic_error_1.TaskOMaticError);
243
+ assert.ok(error.message.includes("Task planning"));
244
+ }
245
+ });
246
+ });
247
+ describe("Metrics Flow", () => {
248
+ it("should return results from AIOperationUtility without exposing metrics", async () => {
249
+ // breakdownTask returns result.result directly, not the full AIOperationResult
250
+ const mockTask = {
251
+ id: "metrics-test",
252
+ title: "Metrics test task",
253
+ status: "todo",
254
+ createdAt: Date.now(),
255
+ updatedAt: Date.now(),
256
+ };
257
+ const result = await taskOps.breakdownTask(mockTask);
258
+ // Verify we got the result, not the AIOperationResult wrapper
259
+ assert.ok(Array.isArray(result));
260
+ assert.ok(!("metrics" in result), "Should not expose metrics in result");
261
+ assert.ok(!("result" in result), "Should not expose AIOperationResult structure");
262
+ });
263
+ });
264
+ describe("Error Handling Integration", () => {
265
+ it("should wrap string errors in TaskOMaticError", async () => {
266
+ // Mock operation that throws string error
267
+ taskOps.aiOperationUtility.executeAIOperation = async () => {
268
+ const error = new Error("String error was converted");
269
+ throw new task_o_matic_error_1.TaskOMaticError("AI operation failed: Task breakdown", {
270
+ code: "AI_OPERATION_FAILED",
271
+ cause: error,
272
+ context: JSON.stringify({
273
+ operation: "Task breakdown",
274
+ error: "String error was converted",
275
+ }),
276
+ suggestions: ["Check AI configuration"],
277
+ });
278
+ };
279
+ const mockTask = {
280
+ id: "string-error-test",
281
+ title: "Test",
282
+ status: "todo",
283
+ createdAt: Date.now(),
284
+ updatedAt: Date.now(),
285
+ };
286
+ try {
287
+ await taskOps.breakdownTask(mockTask);
288
+ assert.fail("Should have thrown");
289
+ }
290
+ catch (error) {
291
+ assert.ok(error instanceof task_o_matic_error_1.TaskOMaticError);
292
+ const taskError = error;
293
+ assert.ok(taskError.cause instanceof Error);
294
+ }
295
+ });
296
+ it("should preserve error context and suggestions", async () => {
297
+ const mockError = new task_o_matic_error_1.TaskOMaticError("Original error", {
298
+ code: "TEST_ERROR",
299
+ context: "Original context",
300
+ suggestions: ["Original suggestion 1", "Original suggestion 2"],
301
+ metadata: { testData: "test value" },
302
+ });
303
+ taskOps.aiOperationUtility.executeAIOperation = async () => {
304
+ throw mockError;
305
+ };
306
+ const mockTask = {
307
+ id: "context-test",
308
+ title: "Test",
309
+ status: "todo",
310
+ createdAt: Date.now(),
311
+ updatedAt: Date.now(),
312
+ };
313
+ try {
314
+ await taskOps.breakdownTask(mockTask);
315
+ assert.fail("Should have thrown");
316
+ }
317
+ catch (error) {
318
+ assert.ok(error instanceof task_o_matic_error_1.TaskOMaticError);
319
+ const taskError = error;
320
+ assert.strictEqual(taskError.code, "TEST_ERROR");
321
+ assert.ok(taskError.context?.includes("Original context"));
322
+ assert.ok(Array.isArray(taskError.suggestions));
323
+ assert.ok(taskError.metadata?.testData === "test value");
324
+ }
325
+ });
326
+ });
327
+ describe("Streaming Options Integration", () => {
328
+ it("should pass streaming options through to AIOperationUtility", async () => {
329
+ let onChunkCalled = false;
330
+ let onFinishCalled = false;
331
+ const streamingOptions = {
332
+ onChunk: (chunk) => {
333
+ onChunkCalled = true;
334
+ },
335
+ onFinish: (result) => {
336
+ onFinishCalled = true;
337
+ },
338
+ };
339
+ // Mock to verify streaming options are passed
340
+ let receivedOptions;
341
+ taskOps.aiOperationUtility.executeAIOperation = async (_operationName, operation, options) => {
342
+ receivedOptions = options;
343
+ const result = await operation();
344
+ return {
345
+ result,
346
+ metrics: { duration: 100 },
347
+ };
348
+ };
349
+ const mockTask = {
350
+ id: "streaming-test",
351
+ title: "Test",
352
+ status: "todo",
353
+ createdAt: Date.now(),
354
+ updatedAt: Date.now(),
355
+ };
356
+ await taskOps.breakdownTask(mockTask, undefined, undefined, undefined, streamingOptions);
357
+ // Verify streaming options were passed
358
+ assert.ok(receivedOptions);
359
+ assert.ok(receivedOptions.streamingOptions);
360
+ });
361
+ });
362
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../src/test/lib/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const config_1 = require("../../lib/config");
8
+ const task_o_matic_error_1 = require("../../utils/task-o-matic-error");
9
+ describe("ConfigManager", () => {
10
+ let mockCallbacks;
11
+ let mockStorage;
12
+ let mockEnv;
13
+ beforeEach(() => {
14
+ mockStorage = {};
15
+ mockEnv = {};
16
+ mockCallbacks = {
17
+ read: async (key) => mockStorage[key] || null,
18
+ write: async (key, value) => {
19
+ mockStorage[key] = value;
20
+ },
21
+ getEnv: (key) => mockEnv[key],
22
+ };
23
+ });
24
+ it("should load default configuration when no config file exists", async () => {
25
+ const configManager = new config_1.ConfigManager(mockCallbacks);
26
+ const config = await configManager.load();
27
+ assert_1.default.strictEqual(config.ai.provider, "openrouter"); // Default
28
+ assert_1.default.strictEqual(config.ai.model, "z-ai/glm-4.6"); // Default
29
+ });
30
+ it("should load configuration from file", async () => {
31
+ const storedConfig = {
32
+ ai: {
33
+ provider: "openai",
34
+ model: "gpt-4",
35
+ apiKey: "sk-test",
36
+ maxTokens: 1000,
37
+ temperature: 0.1,
38
+ },
39
+ };
40
+ mockStorage["config.json"] = JSON.stringify(storedConfig);
41
+ const configManager = new config_1.ConfigManager(mockCallbacks);
42
+ const config = await configManager.load();
43
+ assert_1.default.strictEqual(config.ai.provider, "openai");
44
+ assert_1.default.strictEqual(config.ai.model, "gpt-4");
45
+ assert_1.default.strictEqual(config.ai.apiKey, "sk-test");
46
+ });
47
+ it("should override config with environment variables", async () => {
48
+ const storedConfig = {
49
+ ai: {
50
+ provider: "openai",
51
+ model: "gpt-4",
52
+ apiKey: "sk-test",
53
+ },
54
+ };
55
+ mockStorage["config.json"] = JSON.stringify(storedConfig);
56
+ mockEnv["AI_PROVIDER"] = "anthropic";
57
+ mockEnv["ANTHROPIC_API_KEY"] = "sk-ant-test";
58
+ // Note: ConfigManager loads defaults based on provider, but file config overrides defaults,
59
+ // and env config overrides file config?
60
+ // Let's check implementation:
61
+ // ... fileConfig ... envConfig
62
+ // ai: { ...defaultConfig.ai, ...fileConfig.ai, ...envConfig }
63
+ // So envConfig wins.
64
+ const configManager = new config_1.ConfigManager(mockCallbacks);
65
+ const config = await configManager.load();
66
+ assert_1.default.strictEqual(config.ai.provider, "anthropic");
67
+ assert_1.default.strictEqual(config.ai.apiKey, "sk-ant-test");
68
+ });
69
+ it("should validate configuration", async () => {
70
+ const configManager = new config_1.ConfigManager(mockCallbacks);
71
+ // Invalid provider
72
+ const result1 = configManager.validate({
73
+ ai: { provider: "invalid", model: "test-model" },
74
+ });
75
+ assert_1.default.strictEqual(result1.valid, false);
76
+ assert_1.default.ok(result1.errors[0].includes("Invalid provider"));
77
+ // Valid provider
78
+ const result2 = configManager.validate({
79
+ ai: { provider: "openai", model: "gpt-5.2-mini" },
80
+ });
81
+ assert_1.default.strictEqual(result2.valid, true);
82
+ });
83
+ it("should save configuration", async () => {
84
+ const configManager = new config_1.ConfigManager(mockCallbacks);
85
+ await configManager.load(); // Load defaults
86
+ const newConfig = {
87
+ ai: {
88
+ provider: "custom",
89
+ model: "my-model",
90
+ apiKey: "secret",
91
+ },
92
+ };
93
+ configManager.setConfig(newConfig);
94
+ await configManager.save();
95
+ const saved = JSON.parse(mockStorage["config.json"]);
96
+ assert_1.default.strictEqual(saved.ai.provider, "custom");
97
+ assert_1.default.strictEqual(saved.ai.model, "my-model");
98
+ });
99
+ it("should throw error when accessing config before load", () => {
100
+ const configManager = new config_1.ConfigManager(mockCallbacks);
101
+ assert_1.default.throws(() => {
102
+ configManager.getConfig();
103
+ }, (err) => {
104
+ return err.code === task_o_matic_error_1.TaskOMaticErrorCodes.CONFIGURATION_ERROR;
105
+ });
106
+ });
107
+ it("should set AI config partially and save", async () => {
108
+ const configManager = new config_1.ConfigManager(mockCallbacks);
109
+ await configManager.load();
110
+ await configManager.setAIConfig({
111
+ temperature: 0.9,
112
+ maxTokens: 500,
113
+ });
114
+ const saved = JSON.parse(mockStorage["config.json"]);
115
+ assert_1.default.strictEqual(saved.ai.temperature, 0.9);
116
+ assert_1.default.strictEqual(saved.ai.maxTokens, 500);
117
+ // Should preserve other defaults
118
+ assert_1.default.strictEqual(saved.ai.provider, "openrouter");
119
+ });
120
+ it("should update callbacks when changing working directory", () => {
121
+ const configManager = new config_1.ConfigManager();
122
+ const initialDir = configManager.getWorkingDirectory();
123
+ configManager.setWorkingDirectory("/new/path");
124
+ assert_1.default.notStrictEqual(configManager.getWorkingDirectory(), initialDir);
125
+ // Should reset config
126
+ assert_1.default.throws(() => configManager.getConfig());
127
+ });
128
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=git-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-utils.test.d.ts","sourceRoot":"","sources":["../../../src/test/lib/git-utils.test.ts"],"names":[],"mappings":""}