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,107 @@
1
+ import { AIOptions } from "../utils/ai-config-builder";
2
+ import { StreamingOptions } from "../types";
3
+ import { ProgressCallback } from "../types/callbacks";
4
+ import { InitializeResult, DefinePRDResult, RefinePRDResult, GenerateTasksResult, SplitTasksResult } from "../types/workflow-results";
5
+ import { ExecuteLoopOptions, ExecuteLoopResult } from "../types";
6
+ /**
7
+ * WorkflowService - Business logic for workflow operations
8
+ * Extracts all workflow logic from the command layer for reusability
9
+ */
10
+ export declare class WorkflowService {
11
+ /**
12
+ * Step 1: Initialize Project
13
+ * Handles project initialization, AI configuration, and optional bootstrapping
14
+ */
15
+ initializeProject(input: {
16
+ projectName: string;
17
+ projectDir?: string;
18
+ initMethod?: "quick" | "custom" | "ai";
19
+ projectDescription?: string;
20
+ aiOptions?: AIOptions;
21
+ stackConfig?: {
22
+ frontend?: string;
23
+ backend?: string;
24
+ database?: string;
25
+ auth?: boolean;
26
+ };
27
+ bootstrap?: boolean;
28
+ includeDocs?: boolean;
29
+ streamingOptions?: StreamingOptions;
30
+ callbacks?: ProgressCallback;
31
+ }): Promise<InitializeResult>;
32
+ /**
33
+ * Step 2: Define PRD
34
+ * Handles PRD creation through various methods
35
+ */
36
+ definePRD(input: {
37
+ method: "upload" | "manual" | "ai" | "skip";
38
+ prdFile?: string;
39
+ prdDescription?: string;
40
+ prdContent?: string;
41
+ projectDir: string;
42
+ aiOptions?: AIOptions;
43
+ streamingOptions?: StreamingOptions;
44
+ callbacks?: ProgressCallback;
45
+ multiGeneration?: boolean;
46
+ multiGenerationModels?: Array<{
47
+ provider: string;
48
+ model: string;
49
+ }>;
50
+ combineAI?: {
51
+ provider: string;
52
+ model: string;
53
+ };
54
+ }): Promise<DefinePRDResult>;
55
+ /**
56
+ * Step 3: Refine PRD
57
+ * Handles PRD refinement through manual or AI methods
58
+ */
59
+ refinePRD(input: {
60
+ method: "manual" | "ai" | "skip";
61
+ prdFile: string;
62
+ prdContent?: string;
63
+ feedback?: string;
64
+ projectDir: string;
65
+ aiOptions?: AIOptions;
66
+ streamingOptions?: StreamingOptions;
67
+ callbacks?: ProgressCallback;
68
+ }): Promise<RefinePRDResult>;
69
+ /**
70
+ * Step 4: Generate Tasks
71
+ * Generates tasks from PRD using the prdService
72
+ */
73
+ generateTasks(input: {
74
+ prdFile: string;
75
+ method: "standard" | "ai";
76
+ customInstructions?: string;
77
+ projectDir: string;
78
+ aiOptions?: AIOptions;
79
+ streamingOptions?: StreamingOptions;
80
+ callbacks?: ProgressCallback;
81
+ }): Promise<GenerateTasksResult>;
82
+ /**
83
+ * Step 5: Split Tasks
84
+ * Splits complex tasks into subtasks
85
+ */
86
+ splitTasks(input: {
87
+ taskIds: string[];
88
+ splitMethod: "interactive" | "standard" | "custom";
89
+ customInstructions?: string;
90
+ aiOptions?: AIOptions;
91
+ streamingOptions?: StreamingOptions;
92
+ callbacks?: ProgressCallback;
93
+ }): Promise<SplitTasksResult>;
94
+ /**
95
+ * Step 6: Execute Tasks
96
+ * Executes the generated tasks using the task loop executor
97
+ */
98
+ executeTasks(input: {
99
+ options: ExecuteLoopOptions;
100
+ callbacks?: ProgressCallback;
101
+ }): Promise<{
102
+ success: boolean;
103
+ result: ExecuteLoopResult;
104
+ }>;
105
+ }
106
+ export declare const workflowService: WorkflowService;
107
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/services/workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,580 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.workflowService = exports.WorkflowService = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const config_1 = require("../lib/config");
7
+ const better_t_stack_cli_1 = require("../lib/better-t-stack-cli");
8
+ const prd_1 = require("./prd");
9
+ const tasks_1 = require("./tasks");
10
+ const workflow_ai_assistant_1 = require("./workflow-ai-assistant");
11
+ const task_o_matic_error_1 = require("../utils/task-o-matic-error");
12
+ const task_loop_execution_1 = require("../lib/task-loop-execution");
13
+ /**
14
+ * WorkflowService - Business logic for workflow operations
15
+ * Extracts all workflow logic from the command layer for reusability
16
+ */
17
+ class WorkflowService {
18
+ /**
19
+ * Step 1: Initialize Project
20
+ * Handles project initialization, AI configuration, and optional bootstrapping
21
+ */
22
+ async initializeProject(input) {
23
+ input.callbacks?.onProgress?.({
24
+ type: "started",
25
+ message: "Initializing project...",
26
+ });
27
+ // Determine project directory
28
+ const projectDir = input.projectDir || (0, path_1.resolve)(process.cwd(), input.projectName);
29
+ // Create project directory
30
+ if (!(0, fs_1.existsSync)(projectDir)) {
31
+ (0, fs_1.mkdirSync)(projectDir, { recursive: true });
32
+ input.callbacks?.onProgress?.({
33
+ type: "progress",
34
+ message: `Created directory: ${input.projectName}`,
35
+ });
36
+ }
37
+ // Switch to project directory
38
+ process.chdir(projectDir);
39
+ config_1.configManager.setWorkingDirectory(projectDir);
40
+ await config_1.configManager.load();
41
+ // Initialize task-o-matic directory structure
42
+ const taskOMaticDir = (0, path_1.join)(projectDir, ".task-o-matic");
43
+ if (!(0, fs_1.existsSync)(taskOMaticDir)) {
44
+ (0, fs_1.mkdirSync)(taskOMaticDir, { recursive: true });
45
+ ["tasks", "prd", "logs"].forEach((dir) => {
46
+ (0, fs_1.mkdirSync)((0, path_1.join)(taskOMaticDir, dir), { recursive: true });
47
+ });
48
+ }
49
+ input.callbacks?.onProgress?.({
50
+ type: "progress",
51
+ message: "Configuring AI settings...",
52
+ });
53
+ // Get AI configuration
54
+ const aiProvider = input.aiOptions?.aiProvider || "openrouter";
55
+ const aiModel = input.aiOptions?.aiModel ||
56
+ (aiProvider === "openrouter"
57
+ ? "anthropic/claude-3.5-sonnet"
58
+ : aiProvider === "anthropic"
59
+ ? "claude-sonnet-4.5"
60
+ : "gpt-4o");
61
+ const apiKey = input.aiOptions?.aiKey || process.env.AI_API_KEY || "";
62
+ // Save AI config to .env
63
+ const envPath = (0, path_1.join)(projectDir, ".env");
64
+ let envContent = (0, fs_1.existsSync)(envPath) ? (0, fs_1.readFileSync)(envPath, "utf-8") : "";
65
+ if (!envContent.includes("AI_PROVIDER=")) {
66
+ envContent += `AI_PROVIDER=${aiProvider}\n`;
67
+ }
68
+ if (!envContent.includes("AI_MODEL=")) {
69
+ envContent += `AI_MODEL=${aiModel}\n`;
70
+ }
71
+ if (input.aiOptions?.aiProviderUrl &&
72
+ !envContent.includes("AI_PROVIDER_URL=")) {
73
+ envContent += `AI_PROVIDER_URL=${input.aiOptions.aiProviderUrl}\n`;
74
+ }
75
+ const providerKeyName = aiProvider === "openai"
76
+ ? "OPENAI_API_KEY"
77
+ : aiProvider === "anthropic"
78
+ ? "ANTHROPIC_API_KEY"
79
+ : aiProvider === "openrouter"
80
+ ? "OPENROUTER_API_KEY"
81
+ : "AI_API_KEY";
82
+ if (!envContent.includes(`${providerKeyName}=`)) {
83
+ envContent += `${providerKeyName}=${apiKey}\n`;
84
+ }
85
+ (0, fs_1.writeFileSync)(envPath, envContent);
86
+ // Update process.env and ConfigManager
87
+ process.env.AI_PROVIDER = aiProvider;
88
+ process.env.AI_MODEL = aiModel;
89
+ process.env[providerKeyName] = apiKey;
90
+ if (input.aiOptions?.aiProviderUrl) {
91
+ process.env.AI_PROVIDER_URL = input.aiOptions.aiProviderUrl;
92
+ }
93
+ config_1.configManager.setAIConfig({
94
+ provider: aiProvider,
95
+ model: aiModel,
96
+ apiKey: apiKey,
97
+ baseURL: input.aiOptions?.aiProviderUrl,
98
+ });
99
+ // Determine stack configuration
100
+ let stackConfig = {
101
+ projectName: input.projectName,
102
+ aiProvider,
103
+ aiModel,
104
+ };
105
+ if (input.initMethod === "ai" && input.projectDescription) {
106
+ input.callbacks?.onProgress?.({
107
+ type: "progress",
108
+ message: "Getting AI recommendations for stack...",
109
+ });
110
+ stackConfig = await workflow_ai_assistant_1.workflowAIAssistant.assistInitConfig({
111
+ userDescription: input.projectDescription,
112
+ aiOptions: input.aiOptions,
113
+ streamingOptions: input.streamingOptions,
114
+ });
115
+ // Override with user's choices
116
+ stackConfig.projectName = input.projectName;
117
+ stackConfig.aiProvider = aiProvider;
118
+ stackConfig.aiModel = aiModel;
119
+ }
120
+ else if (input.initMethod === "quick") {
121
+ stackConfig = {
122
+ ...stackConfig,
123
+ frontend: "next",
124
+ backend: "hono",
125
+ database: "sqlite",
126
+ auth: true,
127
+ reasoning: "Modern, well-supported stack",
128
+ };
129
+ }
130
+ else if (input.stackConfig) {
131
+ stackConfig = { ...stackConfig, ...input.stackConfig };
132
+ }
133
+ // Bootstrap if requested
134
+ let bootstrapped = false;
135
+ if (input.bootstrap && (stackConfig.frontend || stackConfig.backend)) {
136
+ input.callbacks?.onProgress?.({
137
+ type: "progress",
138
+ message: "Bootstrapping with Better-T-Stack...",
139
+ });
140
+ try {
141
+ const result = await (0, better_t_stack_cli_1.runBetterTStackCLI)({
142
+ projectName: ".",
143
+ frontend: stackConfig.frontend || "next",
144
+ backend: stackConfig.backend || "hono",
145
+ database: stackConfig.database || "sqlite",
146
+ noAuth: !stackConfig.auth,
147
+ orm: "drizzle",
148
+ packageManager: "npm",
149
+ runtime: "node",
150
+ noInstall: false,
151
+ noGit: false,
152
+ includeDocs: input.includeDocs,
153
+ }, projectDir);
154
+ if (result.success) {
155
+ bootstrapped = true;
156
+ // Fix config file naming
157
+ const dotConfigPath = (0, path_1.join)(taskOMaticDir, ".-bts-config.json");
158
+ const realConfigPath = (0, path_1.join)(taskOMaticDir, `${input.projectName}-bts-config.json`);
159
+ const stackConfigPath = (0, path_1.join)(taskOMaticDir, "stack.json");
160
+ if ((0, fs_1.existsSync)(dotConfigPath)) {
161
+ const configContent = JSON.parse((0, fs_1.readFileSync)(dotConfigPath, "utf-8"));
162
+ configContent.projectName = input.projectName;
163
+ const newContent = JSON.stringify(configContent, null, 2);
164
+ (0, fs_1.writeFileSync)(realConfigPath, newContent);
165
+ (0, fs_1.writeFileSync)(stackConfigPath, newContent);
166
+ const { unlinkSync } = require("fs");
167
+ unlinkSync(dotConfigPath);
168
+ }
169
+ }
170
+ }
171
+ catch (error) {
172
+ input.callbacks?.onError?.(error instanceof Error ? error : new Error(String(error)));
173
+ }
174
+ }
175
+ // Save configuration
176
+ config_1.configManager.save();
177
+ input.callbacks?.onProgress?.({
178
+ type: "completed",
179
+ message: "Project initialized successfully",
180
+ });
181
+ return {
182
+ success: true,
183
+ projectDir,
184
+ projectName: input.projectName,
185
+ aiConfig: {
186
+ provider: aiProvider,
187
+ model: aiModel,
188
+ key: apiKey,
189
+ },
190
+ stackConfig,
191
+ bootstrapped,
192
+ };
193
+ }
194
+ /**
195
+ * Step 2: Define PRD
196
+ * Handles PRD creation through various methods
197
+ */
198
+ async definePRD(input) {
199
+ const startTime = Date.now();
200
+ let tokenUsage;
201
+ let timeToFirstToken;
202
+ let cost;
203
+ input.callbacks?.onProgress?.({
204
+ type: "started",
205
+ message: "Defining PRD...",
206
+ });
207
+ const taskOMaticDir = (0, path_1.join)(input.projectDir, ".task-o-matic");
208
+ const prdDir = (0, path_1.join)(taskOMaticDir, "prd");
209
+ if (!(0, fs_1.existsSync)(prdDir)) {
210
+ (0, fs_1.mkdirSync)(prdDir, { recursive: true });
211
+ }
212
+ if (input.method === "skip") {
213
+ return {
214
+ success: true,
215
+ prdFile: "",
216
+ prdContent: "",
217
+ method: "skip",
218
+ stats: {
219
+ duration: Date.now() - startTime,
220
+ },
221
+ };
222
+ }
223
+ let prdContent = "";
224
+ let prdFilename = "prd.md";
225
+ if (input.method === "upload" && input.prdFile) {
226
+ if (!(0, fs_1.existsSync)(input.prdFile)) {
227
+ throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.INVALID_INPUT, `PRD file not found: ${input.prdFile}`, {
228
+ suggestions: [
229
+ "Verify the file path is correct",
230
+ "Check if file was moved or deleted",
231
+ ],
232
+ });
233
+ }
234
+ prdContent = (0, fs_1.readFileSync)(input.prdFile, "utf-8");
235
+ prdFilename = input.prdFile.split("/").pop() || "prd.md";
236
+ }
237
+ else if (input.method === "manual" && input.prdContent) {
238
+ prdContent = input.prdContent;
239
+ }
240
+ else if (input.method === "ai" && input.prdDescription) {
241
+ // Check if multi-generation is requested
242
+ if (input.multiGeneration &&
243
+ input.multiGenerationModels &&
244
+ input.multiGenerationModels.length > 1) {
245
+ // Multi-generation mode
246
+ const results = [];
247
+ input.callbacks?.onProgress?.({
248
+ type: "progress",
249
+ message: `Generating ${input.multiGenerationModels.length} PRDs concurrently...`,
250
+ });
251
+ // Generate PRDs concurrently
252
+ const promises = input.multiGenerationModels.map(async (modelConfig, index) => {
253
+ const modelId = `${modelConfig.provider}:${modelConfig.model}`;
254
+ const result = await prd_1.prdService.generatePRD({
255
+ description: input.prdDescription,
256
+ outputDir: prdDir,
257
+ filename: `prd-${modelConfig.provider}-${modelConfig.model.replace(/\//g, "-")}.md`,
258
+ aiOptions: {
259
+ aiProvider: modelConfig.provider,
260
+ aiModel: modelConfig.model,
261
+ },
262
+ callbacks: {
263
+ onProgress: (event) => {
264
+ // Only modify events that have a message property
265
+ if (event.type !== "stream-chunk" &&
266
+ event.type !== "reasoning-chunk") {
267
+ input.callbacks?.onProgress?.({
268
+ ...event,
269
+ message: `[${modelId}] ${event.message}`,
270
+ });
271
+ }
272
+ else {
273
+ input.callbacks?.onProgress?.(event);
274
+ }
275
+ },
276
+ },
277
+ });
278
+ results.push({
279
+ path: result.path,
280
+ content: result.content,
281
+ stats: result.stats,
282
+ modelId,
283
+ });
284
+ return result;
285
+ });
286
+ await Promise.all(promises);
287
+ // Aggregate metrics
288
+ tokenUsage = {
289
+ prompt: results.reduce((sum, r) => sum + (r.stats.tokenUsage?.prompt || 0), 0),
290
+ completion: results.reduce((sum, r) => sum + (r.stats.tokenUsage?.completion || 0), 0),
291
+ total: results.reduce((sum, r) => sum + (r.stats.tokenUsage?.total || 0), 0),
292
+ };
293
+ timeToFirstToken = Math.min(...results
294
+ .map((r) => r.stats.timeToFirstToken || Infinity)
295
+ .filter((t) => t !== Infinity));
296
+ cost = results.reduce((sum, r) => sum + (r.stats.cost || 0), 0);
297
+ // Combine if requested
298
+ if (input.combineAI) {
299
+ input.callbacks?.onProgress?.({
300
+ type: "progress",
301
+ message: "Combining PRDs into master PRD...",
302
+ });
303
+ const prdContents = results.map((r) => r.content);
304
+ const masterResult = await prd_1.prdService.combinePRDs({
305
+ prds: prdContents,
306
+ originalDescription: input.prdDescription,
307
+ outputDir: prdDir,
308
+ filename: "prd-master.md",
309
+ aiOptions: {
310
+ aiProvider: input.combineAI.provider,
311
+ aiModel: input.combineAI.model,
312
+ },
313
+ callbacks: input.callbacks,
314
+ });
315
+ prdContent = masterResult.content;
316
+ prdFilename = "prd-master.md";
317
+ // Add combination metrics
318
+ if (masterResult.stats.tokenUsage) {
319
+ tokenUsage.prompt += masterResult.stats.tokenUsage.prompt;
320
+ tokenUsage.completion += masterResult.stats.tokenUsage.completion;
321
+ tokenUsage.total += masterResult.stats.tokenUsage.total;
322
+ }
323
+ if (masterResult.stats.cost) {
324
+ cost = (cost || 0) + masterResult.stats.cost;
325
+ }
326
+ }
327
+ else {
328
+ // Use the first generated PRD as the main one
329
+ prdContent = results[0].content;
330
+ prdFilename = `prd-${results[0].modelId
331
+ .replace(/:/g, "-")
332
+ .replace(/\//g, "-")}.md`;
333
+ }
334
+ }
335
+ else {
336
+ // Single generation mode
337
+ const result = await prd_1.prdService.generatePRD({
338
+ description: input.prdDescription,
339
+ outputDir: prdDir,
340
+ filename: prdFilename,
341
+ aiOptions: input.aiOptions,
342
+ streamingOptions: input.streamingOptions,
343
+ callbacks: input.callbacks,
344
+ });
345
+ prdContent = result.content;
346
+ tokenUsage = result.stats.tokenUsage;
347
+ timeToFirstToken = result.stats.timeToFirstToken;
348
+ cost = result.stats.cost;
349
+ }
350
+ }
351
+ // Save PRD if not already saved by AI service
352
+ const prdPath = (0, path_1.join)(prdDir, prdFilename);
353
+ if (input.method !== "ai") {
354
+ (0, fs_1.writeFileSync)(prdPath, prdContent);
355
+ input.callbacks?.onProgress?.({
356
+ type: "completed",
357
+ message: `PRD saved to ${prdPath}`,
358
+ });
359
+ }
360
+ const stats = {
361
+ duration: Date.now() - startTime,
362
+ ...(tokenUsage && { tokenUsage }),
363
+ ...(timeToFirstToken && { timeToFirstToken }),
364
+ ...(cost && { cost }),
365
+ };
366
+ return {
367
+ success: true,
368
+ prdFile: prdPath,
369
+ prdContent,
370
+ method: input.method,
371
+ stats,
372
+ };
373
+ }
374
+ /**
375
+ * Step 3: Refine PRD
376
+ * Handles PRD refinement through manual or AI methods
377
+ */
378
+ async refinePRD(input) {
379
+ const startTime = Date.now();
380
+ let tokenUsage;
381
+ let timeToFirstToken;
382
+ let cost;
383
+ input.callbacks?.onProgress?.({
384
+ type: "started",
385
+ message: "Refining PRD...",
386
+ });
387
+ if (input.method === "skip") {
388
+ return {
389
+ success: true,
390
+ prdFile: input.prdFile,
391
+ prdContent: input.prdContent || (0, fs_1.readFileSync)(input.prdFile, "utf-8"),
392
+ stats: {
393
+ duration: Date.now() - startTime,
394
+ },
395
+ };
396
+ }
397
+ let refinedContent = input.prdContent || (0, fs_1.readFileSync)(input.prdFile, "utf-8");
398
+ if (input.method === "manual" && input.prdContent) {
399
+ refinedContent = input.prdContent;
400
+ }
401
+ else if (input.method === "ai" && input.feedback) {
402
+ input.callbacks?.onProgress?.({
403
+ type: "progress",
404
+ message: "Refining PRD with AI...",
405
+ });
406
+ // Capture metrics for AI operations
407
+ const streamingOptions = {
408
+ ...input.streamingOptions,
409
+ onFinish: async (result) => {
410
+ if (result.usage) {
411
+ tokenUsage = {
412
+ prompt: result.usage.inputTokens || result.usage.promptTokens || 0,
413
+ completion: result.usage.outputTokens || result.usage.completionTokens || 0,
414
+ total: result.usage.totalTokens || 0,
415
+ };
416
+ // Calculate cost (simplified - would need proper pricing lookup)
417
+ if (tokenUsage.total > 0) {
418
+ cost = tokenUsage.total * 0.000001; // Placeholder cost calculation
419
+ }
420
+ }
421
+ // Call original onFinish if provided
422
+ input.streamingOptions?.onFinish?.(result);
423
+ },
424
+ onChunk: (chunk) => {
425
+ if (chunk && !timeToFirstToken) {
426
+ timeToFirstToken = Date.now() - startTime;
427
+ }
428
+ // Call original onChunk if provided
429
+ input.streamingOptions?.onChunk?.(chunk);
430
+ },
431
+ };
432
+ refinedContent = await workflow_ai_assistant_1.workflowAIAssistant.assistPRDRefinement({
433
+ currentPRD: refinedContent,
434
+ userFeedback: input.feedback,
435
+ aiOptions: input.aiOptions,
436
+ streamingOptions,
437
+ });
438
+ }
439
+ // Save refined PRD
440
+ (0, fs_1.writeFileSync)(input.prdFile, refinedContent);
441
+ input.callbacks?.onProgress?.({
442
+ type: "completed",
443
+ message: "PRD refined successfully",
444
+ });
445
+ const stats = {
446
+ duration: Date.now() - startTime,
447
+ ...(tokenUsage && { tokenUsage }),
448
+ ...(timeToFirstToken && { timeToFirstToken }),
449
+ ...(cost && { cost }),
450
+ };
451
+ return {
452
+ success: true,
453
+ prdFile: input.prdFile,
454
+ prdContent: refinedContent,
455
+ stats,
456
+ };
457
+ }
458
+ /**
459
+ * Step 4: Generate Tasks
460
+ * Generates tasks from PRD using the prdService
461
+ */
462
+ async generateTasks(input) {
463
+ const startTime = Date.now();
464
+ let tokenUsage;
465
+ let timeToFirstToken;
466
+ let cost;
467
+ input.callbacks?.onProgress?.({
468
+ type: "started",
469
+ message: "Generating tasks from PRD...",
470
+ });
471
+ // Capture metrics for AI operations
472
+ const streamingOptions = {
473
+ ...input.streamingOptions,
474
+ onFinish: async (result) => {
475
+ if (result.usage) {
476
+ tokenUsage = {
477
+ prompt: result.usage.inputTokens || result.usage.promptTokens || 0,
478
+ completion: result.usage.outputTokens || result.usage.completionTokens || 0,
479
+ total: result.usage.totalTokens || 0,
480
+ };
481
+ // Calculate cost (simplified - would need proper pricing lookup)
482
+ if (tokenUsage.total > 0) {
483
+ cost = tokenUsage.total * 0.000001; // Placeholder cost calculation
484
+ }
485
+ }
486
+ // Call original onFinish if provided
487
+ input.streamingOptions?.onFinish?.(result);
488
+ },
489
+ onChunk: (chunk) => {
490
+ if (chunk && !timeToFirstToken) {
491
+ timeToFirstToken = Date.now() - startTime;
492
+ }
493
+ // Call original onChunk if provided
494
+ input.streamingOptions?.onChunk?.(chunk);
495
+ },
496
+ };
497
+ const result = await prd_1.prdService.parsePRD({
498
+ file: input.prdFile,
499
+ workingDirectory: input.projectDir,
500
+ aiOptions: input.aiOptions,
501
+ messageOverride: input.customInstructions,
502
+ streamingOptions,
503
+ callbacks: input.callbacks,
504
+ });
505
+ const stats = {
506
+ tasksCreated: result.tasks.length,
507
+ duration: Date.now() - startTime,
508
+ ...(tokenUsage && { tokenUsage }),
509
+ ...(timeToFirstToken && { timeToFirstToken }),
510
+ ...(cost && { cost }),
511
+ };
512
+ return {
513
+ success: true,
514
+ tasks: result.tasks,
515
+ stats,
516
+ };
517
+ }
518
+ /**
519
+ * Step 5: Split Tasks
520
+ * Splits complex tasks into subtasks
521
+ */
522
+ async splitTasks(input) {
523
+ input.callbacks?.onProgress?.({
524
+ type: "started",
525
+ message: `Splitting ${input.taskIds.length} tasks...`,
526
+ });
527
+ const results = [];
528
+ for (const taskId of input.taskIds) {
529
+ try {
530
+ input.callbacks?.onProgress?.({
531
+ type: "progress",
532
+ message: `Splitting task ${taskId}...`,
533
+ });
534
+ const result = await tasks_1.taskService.splitTask(taskId, input.aiOptions, undefined, // promptOverride
535
+ input.customInstructions, input.streamingOptions);
536
+ results.push({
537
+ taskId,
538
+ subtasks: result.subtasks,
539
+ });
540
+ }
541
+ catch (error) {
542
+ results.push({
543
+ taskId,
544
+ subtasks: [],
545
+ error: error instanceof Error ? error.message : String(error),
546
+ });
547
+ }
548
+ }
549
+ input.callbacks?.onProgress?.({
550
+ type: "completed",
551
+ message: "Task splitting completed",
552
+ });
553
+ return {
554
+ success: true,
555
+ results,
556
+ };
557
+ }
558
+ /**
559
+ * Step 6: Execute Tasks
560
+ * Executes the generated tasks using the task loop executor
561
+ */
562
+ async executeTasks(input) {
563
+ input.callbacks?.onProgress?.({
564
+ type: "started",
565
+ message: "Executing tasks...",
566
+ });
567
+ const result = await (0, task_loop_execution_1.executeTaskLoop)(input.options);
568
+ input.callbacks?.onProgress?.({
569
+ type: "completed",
570
+ message: `Execution complete: ${result.completedTasks} completed, ${result.failedTasks} failed`,
571
+ });
572
+ return {
573
+ success: result.failedTasks === 0,
574
+ result,
575
+ };
576
+ }
577
+ }
578
+ exports.WorkflowService = WorkflowService;
579
+ // Export singleton instance
580
+ exports.workflowService = new WorkflowService();