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,74 @@
1
+ import { StreamingOptions } from "../types";
2
+ import { AIOptions } from "../utils/ai-config-builder";
3
+ /**
4
+ * WorkflowAIAssistant - AI-powered decision making for workflow steps
5
+ * Helps users make configuration choices using natural language
6
+ */
7
+ export declare class WorkflowAIAssistant {
8
+ /**
9
+ * Assist with initialization and bootstrap configuration
10
+ */
11
+ assistInitConfig(input: {
12
+ userDescription: string;
13
+ aiOptions?: AIOptions;
14
+ streamingOptions?: StreamingOptions;
15
+ }): Promise<{
16
+ projectName: string;
17
+ aiProvider: string;
18
+ aiModel: string;
19
+ frontend?: string;
20
+ backend?: string;
21
+ database?: string;
22
+ auth?: boolean;
23
+ reasoning: string;
24
+ }>;
25
+ /**
26
+ * Generate a PRD from user's product description
27
+ */
28
+ assistPRDCreation(input: {
29
+ userDescription: string;
30
+ aiOptions?: AIOptions;
31
+ streamingOptions?: StreamingOptions;
32
+ }): Promise<string>;
33
+ /**
34
+ * Suggest improvements to an existing PRD
35
+ */
36
+ assistPRDRefinement(input: {
37
+ currentPRD: string;
38
+ userFeedback: string;
39
+ aiOptions?: AIOptions;
40
+ streamingOptions?: StreamingOptions;
41
+ }): Promise<string>;
42
+ /**
43
+ * Help prioritize and organize tasks
44
+ */
45
+ assistTaskPrioritization(input: {
46
+ tasks: Array<{
47
+ id: string;
48
+ title: string;
49
+ description?: string;
50
+ }>;
51
+ userGuidance: string;
52
+ aiOptions?: AIOptions;
53
+ streamingOptions?: StreamingOptions;
54
+ }): Promise<{
55
+ prioritizedTasks: Array<{
56
+ id: string;
57
+ priority: number;
58
+ reasoning: string;
59
+ }>;
60
+ recommendations: string;
61
+ }>;
62
+ /**
63
+ * Generate custom instructions for task splitting
64
+ */
65
+ assistTaskSplitting(input: {
66
+ taskTitle: string;
67
+ taskContent?: string;
68
+ userGuidance: string;
69
+ aiOptions?: AIOptions;
70
+ streamingOptions?: StreamingOptions;
71
+ }): Promise<string>;
72
+ }
73
+ export declare const workflowAIAssistant: WorkflowAIAssistant;
74
+ //# sourceMappingURL=workflow-ai-assistant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-ai-assistant.d.ts","sourceRoot":"","sources":["../../src/services/workflow-ai-assistant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAQtE;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE;QAC5B,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC,GAAG,OAAO,CAAC;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAgEF;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE;QAC7B,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC,GAAG,OAAO,CAAC,MAAM,CAAC;IAYnB;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE;QAC/B,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCnB;;OAEG;IACG,wBAAwB,CAAC,KAAK,EAAE;QACpC,KAAK,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClE,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC,GAAG,OAAO,CAAC;QACV,gBAAgB,EAAE,KAAK,CAAC;YACtB,EAAE,EAAE,MAAM,CAAC;YACX,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC,CAAC;QACH,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IAwEF;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE;QAC/B,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC,GAAG,OAAO,CAAC,MAAM,CAAC;CAwCpB;AAGD,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.workflowAIAssistant = exports.WorkflowAIAssistant = void 0;
4
+ const ai_service_factory_1 = require("../utils/ai-service-factory");
5
+ const ai_config_builder_1 = require("../utils/ai-config-builder");
6
+ const prompt_builder_1 = require("../lib/prompt-builder");
7
+ const task_o_matic_error_1 = require("../utils/task-o-matic-error");
8
+ /**
9
+ * WorkflowAIAssistant - AI-powered decision making for workflow steps
10
+ * Helps users make configuration choices using natural language
11
+ */
12
+ class WorkflowAIAssistant {
13
+ /**
14
+ * Assist with initialization and bootstrap configuration
15
+ */
16
+ async assistInitConfig(input) {
17
+ const aiConfig = (0, ai_config_builder_1.buildAIConfig)(input.aiOptions);
18
+ const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
19
+ name: "project-init-suggestion",
20
+ type: "user",
21
+ variables: {
22
+ USER_DESCRIPTION: input.userDescription,
23
+ },
24
+ });
25
+ if (!promptResult.success) {
26
+ throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.CONFIGURATION_ERROR, `Failed to build project init prompt: ${promptResult.error}`);
27
+ }
28
+ const systemPromptResult = prompt_builder_1.PromptBuilder.buildPrompt({
29
+ name: "project-init-suggestion",
30
+ type: "system",
31
+ variables: {},
32
+ });
33
+ const result = await (0, ai_service_factory_1.getAIOperations)().streamText(promptResult.prompt, aiConfig, systemPromptResult.prompt, undefined, input.streamingOptions);
34
+ // Parse AI response
35
+ try {
36
+ const jsonMatch = result.match(/\{[\s\S]*\}/);
37
+ if (!jsonMatch) {
38
+ throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.AI_OPERATION_FAILED, "No JSON found in AI response for init config", {
39
+ context: "The AI did not return a valid JSON object.",
40
+ suggestions: [
41
+ "Try a different model or provider.",
42
+ "Check the prompt for clarity.",
43
+ ],
44
+ });
45
+ }
46
+ return JSON.parse(jsonMatch[0]);
47
+ }
48
+ catch (error) {
49
+ // Fallback to sensible defaults
50
+ return {
51
+ projectName: "my-project",
52
+ aiProvider: "openrouter",
53
+ aiModel: "anthropic/claude-3.5-sonnet",
54
+ frontend: "next",
55
+ backend: "hono",
56
+ database: "sqlite",
57
+ auth: true,
58
+ reasoning: "Using modern, well-supported defaults",
59
+ };
60
+ }
61
+ }
62
+ /**
63
+ * Generate a PRD from user's product description
64
+ */
65
+ async assistPRDCreation(input) {
66
+ const aiConfig = (0, ai_config_builder_1.buildAIConfig)(input.aiOptions);
67
+ return (0, ai_service_factory_1.getAIOperations)().generatePRD(input.userDescription, aiConfig, undefined, undefined, input.streamingOptions);
68
+ }
69
+ /**
70
+ * Suggest improvements to an existing PRD
71
+ */
72
+ async assistPRDRefinement(input) {
73
+ const aiConfig = (0, ai_config_builder_1.buildAIConfig)(input.aiOptions);
74
+ const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
75
+ name: "prd-improvement",
76
+ type: "user",
77
+ variables: {
78
+ CURRENT_PRD: input.currentPRD,
79
+ USER_FEEDBACK: input.userFeedback,
80
+ },
81
+ });
82
+ if (!promptResult.success) {
83
+ throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.CONFIGURATION_ERROR, `Failed to build PRD improvement prompt: ${promptResult.error}`);
84
+ }
85
+ const systemPromptResult = prompt_builder_1.PromptBuilder.buildPrompt({
86
+ name: "prd-improvement",
87
+ type: "system",
88
+ variables: {},
89
+ });
90
+ const result = await (0, ai_service_factory_1.getAIOperations)().streamText(promptResult.prompt, aiConfig, systemPromptResult.prompt, undefined, input.streamingOptions);
91
+ return result;
92
+ }
93
+ /**
94
+ * Help prioritize and organize tasks
95
+ */
96
+ async assistTaskPrioritization(input) {
97
+ const aiConfig = (0, ai_config_builder_1.buildAIConfig)(input.aiOptions);
98
+ const tasksDescription = input.tasks
99
+ .map((t, i) => `${i + 1}. [${t.id}] ${t.title}${t.description ? `: ${t.description}` : ""}`)
100
+ .join("\n");
101
+ const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
102
+ name: "task-prioritization",
103
+ type: "user",
104
+ variables: {
105
+ TASKS_DESCRIPTION: tasksDescription,
106
+ USER_GUIDANCE: input.userGuidance,
107
+ },
108
+ });
109
+ if (!promptResult.success) {
110
+ throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.CONFIGURATION_ERROR, `Failed to build task prioritization prompt: ${promptResult.error}`);
111
+ }
112
+ const systemPromptResult = prompt_builder_1.PromptBuilder.buildPrompt({
113
+ name: "task-prioritization",
114
+ type: "system",
115
+ variables: {},
116
+ });
117
+ const result = await (0, ai_service_factory_1.getAIOperations)().streamText(promptResult.prompt, aiConfig, systemPromptResult.prompt, undefined, input.streamingOptions);
118
+ // Parse AI response
119
+ try {
120
+ const jsonMatch = result.match(/\{[\s\S]*\}/);
121
+ if (!jsonMatch) {
122
+ throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.AI_OPERATION_FAILED, "No JSON found in AI response for task prioritization", {
123
+ context: "The AI did not return a valid JSON object.",
124
+ suggestions: [
125
+ "Try a different model or provider.",
126
+ "Check the prompt for clarity.",
127
+ ],
128
+ });
129
+ }
130
+ return JSON.parse(jsonMatch[0]);
131
+ }
132
+ catch (error) {
133
+ // Fallback: return tasks in original order
134
+ return {
135
+ prioritizedTasks: input.tasks.map((t, i) => ({
136
+ id: t.id,
137
+ priority: i + 1,
138
+ reasoning: "Default ordering",
139
+ })),
140
+ recommendations: "Review and adjust priorities as needed",
141
+ };
142
+ }
143
+ }
144
+ /**
145
+ * Generate custom instructions for task splitting
146
+ */
147
+ async assistTaskSplitting(input) {
148
+ const aiConfig = (0, ai_config_builder_1.buildAIConfig)(input.aiOptions);
149
+ const taskContentText = input.taskContent
150
+ ? `Description: ${input.taskContent}`
151
+ : "";
152
+ const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
153
+ name: "task-splitting-assistance",
154
+ type: "user",
155
+ variables: {
156
+ TASK_TITLE: input.taskTitle,
157
+ TASK_CONTENT: taskContentText,
158
+ USER_GUIDANCE: input.userGuidance,
159
+ },
160
+ });
161
+ if (!promptResult.success) {
162
+ throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.CONFIGURATION_ERROR, `Failed to build task splitting prompt: ${promptResult.error}`);
163
+ }
164
+ const systemPromptResult = prompt_builder_1.PromptBuilder.buildPrompt({
165
+ name: "task-splitting-assistance",
166
+ type: "system",
167
+ variables: {},
168
+ });
169
+ const result = await (0, ai_service_factory_1.getAIOperations)().streamText(promptResult.prompt, aiConfig, systemPromptResult.prompt, undefined, input.streamingOptions);
170
+ return result;
171
+ }
172
+ }
173
+ exports.WorkflowAIAssistant = WorkflowAIAssistant;
174
+ // Export singleton instance
175
+ exports.workflowAIAssistant = new WorkflowAIAssistant();
@@ -0,0 +1,34 @@
1
+ import { AIOptions } from "../utils/ai-config-builder";
2
+ import { StreamingOptions } from "../types";
3
+ import { WorkflowBenchmarkInput, WorkflowBenchmarkResult } from "../lib/benchmark/types";
4
+ /**
5
+ * WorkflowBenchmarkService - Executes complete workflows for benchmarking
6
+ * Creates isolated environments for each model to ensure fair comparison
7
+ */
8
+ export declare class WorkflowBenchmarkService {
9
+ /**
10
+ * Execute a complete workflow for benchmarking purposes
11
+ */
12
+ executeWorkflow(input: WorkflowBenchmarkInput, aiOptions: AIOptions, streamingOptions?: StreamingOptions): Promise<WorkflowBenchmarkResult["output"]>;
13
+ /**
14
+ * Create a temporary project directory for benchmarking
15
+ */
16
+ private createTempProjectDir;
17
+ /**
18
+ * Clean up temporary project directory
19
+ */
20
+ private cleanupTempProjectDir;
21
+ /**
22
+ * Apply the results from a selected benchmark to the actual project
23
+ */
24
+ applyBenchmarkResult(selectedResult: WorkflowBenchmarkResult, targetProjectDir: string, originalResponses: WorkflowBenchmarkInput["collectedResponses"]): Promise<{
25
+ success: boolean;
26
+ message: string;
27
+ }>;
28
+ /**
29
+ * Validate workflow benchmark input
30
+ */
31
+ validateInput(input: any): input is WorkflowBenchmarkInput;
32
+ }
33
+ export declare const workflowBenchmarkService: WorkflowBenchmarkService;
34
+ //# sourceMappingURL=workflow-benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-benchmark.d.ts","sourceRoot":"","sources":["../../src/services/workflow-benchmark.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAQ,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAIzF;;;GAGG;AACH,qBAAa,wBAAwB;IACnC;;OAEG;IACG,eAAe,CACnB,KAAK,EAAE,sBAAsB,EAC7B,SAAS,EAAE,SAAS,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAiL7C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;OAEG;IACG,oBAAoB,CACxB,cAAc,EAAE,uBAAuB,EACvC,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,sBAAsB,CAAC,oBAAoB,CAAC,GAC9D,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAyFjD;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,sBAAsB;CAU3D;AAED,eAAO,MAAM,wBAAwB,0BAAiC,CAAC"}
@@ -0,0 +1,318 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.workflowBenchmarkService = exports.WorkflowBenchmarkService = void 0;
37
+ const path_1 = require("path");
38
+ const fs_1 = require("fs");
39
+ const workflow_1 = require("./workflow");
40
+ const logger_1 = require("../lib/logger");
41
+ /**
42
+ * WorkflowBenchmarkService - Executes complete workflows for benchmarking
43
+ * Creates isolated environments for each model to ensure fair comparison
44
+ */
45
+ class WorkflowBenchmarkService {
46
+ /**
47
+ * Execute a complete workflow for benchmarking purposes
48
+ */
49
+ async executeWorkflow(input, aiOptions, streamingOptions) {
50
+ const startTime = Date.now();
51
+ // Create temporary project directory for this benchmark run
52
+ const tempProjectDir = this.createTempProjectDir(input.tempDirBase || "/tmp", input.collectedResponses.projectName, aiOptions.aiProvider || "unknown", aiOptions.aiModel || "unknown");
53
+ const stats = {
54
+ initDuration: 0,
55
+ prdGenerationDuration: 0,
56
+ prdRefinementDuration: 0,
57
+ taskGenerationDuration: 0,
58
+ taskSplittingDuration: 0,
59
+ totalTasks: 0,
60
+ tasksWithSubtasks: 0,
61
+ avgTaskComplexity: 0,
62
+ prdSize: 0,
63
+ totalSteps: 0,
64
+ successfulSteps: 0,
65
+ };
66
+ let projectDir = tempProjectDir;
67
+ let prdFile = "";
68
+ let prdContent = "";
69
+ let tasks = [];
70
+ try {
71
+ // Step 1: Initialize Project
72
+ const stepStart = Date.now();
73
+ stats.totalSteps++;
74
+ const initResult = await workflow_1.workflowService.initializeProject({
75
+ projectName: input.collectedResponses.projectName,
76
+ projectDir: tempProjectDir,
77
+ initMethod: input.collectedResponses.initMethod,
78
+ projectDescription: input.collectedResponses.projectDescription,
79
+ aiOptions,
80
+ stackConfig: input.collectedResponses.stackConfig,
81
+ bootstrap: true, // Always bootstrap for benchmark unless explicitly disabled
82
+ streamingOptions,
83
+ callbacks: {
84
+ onProgress: () => { }, // Silent for benchmarking
85
+ onError: () => { },
86
+ },
87
+ });
88
+ stats.initDuration = Date.now() - stepStart;
89
+ stats.successfulSteps++;
90
+ projectDir = initResult.projectDir;
91
+ // Step 2: Define PRD
92
+ if (input.collectedResponses.prdMethod !== "skip") {
93
+ const prdStart = Date.now();
94
+ stats.totalSteps++;
95
+ const prdResult = await workflow_1.workflowService.definePRD({
96
+ method: input.collectedResponses.prdMethod,
97
+ prdFile: input.collectedResponses.prdFile,
98
+ prdDescription: input.collectedResponses.prdDescription,
99
+ prdContent: input.collectedResponses.prdContent,
100
+ projectDir,
101
+ aiOptions,
102
+ streamingOptions,
103
+ callbacks: {
104
+ onProgress: () => { },
105
+ onError: () => { },
106
+ },
107
+ });
108
+ stats.prdGenerationDuration = Date.now() - prdStart;
109
+ stats.successfulSteps++;
110
+ prdFile = prdResult.prdFile;
111
+ prdContent = prdResult.prdContent;
112
+ stats.prdSize = prdContent.length;
113
+ // Step 3: Refine PRD (if requested)
114
+ if (input.collectedResponses.refinePrd && input.collectedResponses.refineFeedback) {
115
+ const refineStart = Date.now();
116
+ stats.totalSteps++;
117
+ const refineResult = await workflow_1.workflowService.refinePRD({
118
+ method: "ai",
119
+ prdFile,
120
+ feedback: input.collectedResponses.refineFeedback,
121
+ projectDir,
122
+ aiOptions,
123
+ streamingOptions,
124
+ callbacks: {
125
+ onProgress: () => { },
126
+ onError: () => { },
127
+ },
128
+ });
129
+ stats.prdRefinementDuration = Date.now() - refineStart;
130
+ stats.successfulSteps++;
131
+ prdContent = refineResult.prdContent;
132
+ stats.prdSize = prdContent.length;
133
+ }
134
+ // Step 4: Generate Tasks
135
+ if (input.collectedResponses.generateTasks !== false && prdFile) {
136
+ const tasksStart = Date.now();
137
+ stats.totalSteps++;
138
+ const tasksResult = await workflow_1.workflowService.generateTasks({
139
+ prdFile,
140
+ method: input.collectedResponses.customInstructions ? "ai" : "standard",
141
+ customInstructions: input.collectedResponses.customInstructions,
142
+ projectDir,
143
+ aiOptions,
144
+ streamingOptions,
145
+ callbacks: {
146
+ onProgress: () => { },
147
+ onError: () => { },
148
+ },
149
+ });
150
+ stats.taskGenerationDuration = Date.now() - tasksStart;
151
+ stats.successfulSteps++;
152
+ tasks = tasksResult.tasks;
153
+ stats.totalTasks = tasks.length;
154
+ // Step 5: Split Tasks (if requested)
155
+ if (input.collectedResponses.splitTasks && tasks.length > 0) {
156
+ const splitStart = Date.now();
157
+ stats.totalSteps++;
158
+ const tasksToSplit = input.collectedResponses.tasksToSplit?.length
159
+ ? input.collectedResponses.tasksToSplit
160
+ : tasks.slice(0, Math.min(3, tasks.length)).map(t => t.id); // Split first 3 tasks by default
161
+ const splitResult = await workflow_1.workflowService.splitTasks({
162
+ taskIds: tasksToSplit,
163
+ splitMethod: input.collectedResponses.splitInstructions ? "custom" : "standard",
164
+ customInstructions: input.collectedResponses.splitInstructions,
165
+ aiOptions,
166
+ streamingOptions,
167
+ callbacks: {
168
+ onProgress: () => { },
169
+ onError: () => { },
170
+ },
171
+ });
172
+ stats.taskSplittingDuration = Date.now() - splitStart;
173
+ stats.successfulSteps++;
174
+ stats.tasksWithSubtasks = splitResult.results.filter(r => !r.error && r.subtasks.length > 0).length;
175
+ }
176
+ }
177
+ }
178
+ // Calculate complexity metrics
179
+ if (tasks.length > 0) {
180
+ const totalComplexity = tasks.reduce((sum, task) => {
181
+ const contentLength = (task.description || "").length;
182
+ return sum + (contentLength > 200 ? 3 : contentLength > 100 ? 2 : 1);
183
+ }, 0);
184
+ stats.avgTaskComplexity = totalComplexity / tasks.length;
185
+ }
186
+ return {
187
+ projectDir,
188
+ prdFile,
189
+ prdContent,
190
+ tasks,
191
+ stats,
192
+ };
193
+ }
194
+ finally {
195
+ // Clean up temporary directory
196
+ this.cleanupTempProjectDir(tempProjectDir);
197
+ }
198
+ }
199
+ /**
200
+ * Create a temporary project directory for benchmarking
201
+ */
202
+ createTempProjectDir(tempBase, projectName, provider, model) {
203
+ const sanitizedModel = model.replace(/[^a-zA-Z0-9-]/g, "-");
204
+ const dirName = `benchmark-${projectName}-${provider}-${sanitizedModel}-${Date.now()}`;
205
+ const tempDir = (0, path_1.join)(tempBase, "task-o-matic-benchmark", dirName);
206
+ if (!(0, fs_1.existsSync)(tempDir)) {
207
+ (0, fs_1.mkdirSync)(tempDir, { recursive: true });
208
+ }
209
+ return tempDir;
210
+ }
211
+ /**
212
+ * Clean up temporary project directory
213
+ */
214
+ cleanupTempProjectDir(projectDir) {
215
+ try {
216
+ if ((0, fs_1.existsSync)(projectDir) && projectDir.includes("task-o-matic-benchmark")) {
217
+ (0, fs_1.rmSync)(projectDir, { recursive: true, force: true });
218
+ }
219
+ }
220
+ catch (error) {
221
+ // Ignore cleanup errors
222
+ logger_1.logger.warn(`Warning: Could not clean up temp directory ${projectDir}`);
223
+ }
224
+ }
225
+ /**
226
+ * Apply the results from a selected benchmark to the actual project
227
+ */
228
+ async applyBenchmarkResult(selectedResult, targetProjectDir, originalResponses) {
229
+ try {
230
+ const { workflowService } = await Promise.resolve().then(() => __importStar(require("./workflow")));
231
+ const { writeFileSync, existsSync, mkdirSync } = await Promise.resolve().then(() => __importStar(require("fs")));
232
+ const { join } = await Promise.resolve().then(() => __importStar(require("path")));
233
+ // Ensure target directory exists
234
+ if (!existsSync(targetProjectDir)) {
235
+ mkdirSync(targetProjectDir, { recursive: true });
236
+ }
237
+ // Extract model configuration from modelId (e.g., "openai:gpt-4o")
238
+ const [provider, model] = selectedResult.modelId.split(":").slice(0, 2);
239
+ // Step 1: Initialize actual project with selected model
240
+ const actualResult = await workflowService.initializeProject({
241
+ projectName: originalResponses.projectName,
242
+ projectDir: targetProjectDir,
243
+ initMethod: originalResponses.initMethod,
244
+ projectDescription: originalResponses.projectDescription,
245
+ aiOptions: {
246
+ aiProvider: provider,
247
+ aiModel: model,
248
+ },
249
+ stackConfig: originalResponses.stackConfig,
250
+ bootstrap: true,
251
+ streamingOptions: {},
252
+ callbacks: {
253
+ onProgress: (msg) => {
254
+ const message = typeof msg === 'string' ? msg :
255
+ 'message' in msg ? msg.message :
256
+ 'text' in msg ? msg.text : 'Progress update';
257
+ logger_1.logger.progress(` ${message}`);
258
+ },
259
+ onError: (err) => logger_1.logger.error(` Error: ${err.message || err}`),
260
+ },
261
+ });
262
+ // Step 2: Copy PRD content if available
263
+ if (selectedResult.output.prdContent && selectedResult.output.prdFile) {
264
+ const taskOMaticDir = join(targetProjectDir, ".task-o-matic", "prd");
265
+ if (!existsSync(taskOMaticDir)) {
266
+ mkdirSync(taskOMaticDir, { recursive: true });
267
+ }
268
+ const targetPrdFile = join(taskOMaticDir, "prd.md");
269
+ writeFileSync(targetPrdFile, selectedResult.output.prdContent);
270
+ logger_1.logger.success(` ✓ PRD copied to ${targetPrdFile}`);
271
+ }
272
+ // Step 3: Import tasks if available
273
+ if (selectedResult.output.tasks && selectedResult.output.tasks.length > 0) {
274
+ const { getStorage } = await Promise.resolve().then(() => __importStar(require("../utils/ai-service-factory")));
275
+ // Switch to target directory context
276
+ process.chdir(targetProjectDir);
277
+ for (const task of selectedResult.output.tasks) {
278
+ try {
279
+ await getStorage().createTask({
280
+ title: task.title,
281
+ description: task.description || "",
282
+ content: task.description || "",
283
+ parentId: task.parentId,
284
+ estimatedEffort: task.estimatedEffort,
285
+ });
286
+ }
287
+ catch (error) {
288
+ logger_1.logger.warn(` Warning: Could not import task "${task.title}"`);
289
+ }
290
+ }
291
+ logger_1.logger.success(` ✓ Imported ${selectedResult.output.tasks.length} tasks`);
292
+ }
293
+ return {
294
+ success: true,
295
+ message: `Successfully applied results from ${selectedResult.modelId} to ${targetProjectDir}`,
296
+ };
297
+ }
298
+ catch (error) {
299
+ return {
300
+ success: false,
301
+ message: `Failed to apply benchmark results: ${error instanceof Error ? error.message : String(error)}`,
302
+ };
303
+ }
304
+ }
305
+ /**
306
+ * Validate workflow benchmark input
307
+ */
308
+ validateInput(input) {
309
+ return (input &&
310
+ input.collectedResponses &&
311
+ typeof input.collectedResponses.projectName === "string" &&
312
+ input.collectedResponses.projectName.length > 0 &&
313
+ typeof input.collectedResponses.initMethod === "string" &&
314
+ ["quick", "custom", "ai"].includes(input.collectedResponses.initMethod));
315
+ }
316
+ }
317
+ exports.WorkflowBenchmarkService = WorkflowBenchmarkService;
318
+ exports.workflowBenchmarkService = new WorkflowBenchmarkService();