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,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KiloExecutor = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const logger_1 = require("../logger");
6
+ class KiloExecutor {
7
+ name = "kilo";
8
+ config;
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ supportsSessionResumption() {
13
+ return true;
14
+ }
15
+ async execute(message, dry = false, config) {
16
+ // Merge constructor config with execution config (execution takes precedence)
17
+ const finalConfig = { ...this.config, ...config };
18
+ // Build arguments array
19
+ const args = [];
20
+ // Add model if specified
21
+ if (finalConfig.model) {
22
+ args.push("-mo", finalConfig.model);
23
+ logger_1.logger.progress(`🤖 Using model: ${finalConfig.model}`);
24
+ }
25
+ // Add session resumption if specified
26
+ if (finalConfig.continueLastSession) {
27
+ args.push("-c");
28
+ logger_1.logger.progress("🔄 Continuing last session");
29
+ }
30
+ else if (finalConfig.sessionId) {
31
+ args.push("-s", finalConfig.sessionId);
32
+ logger_1.logger.progress(`🔄 Resuming session: ${finalConfig.sessionId}`);
33
+ }
34
+ // Run in autonomous mode (non-interactive) for automation
35
+ args.push("--auto");
36
+ // Enable auto-approval of all tool permissions
37
+ args.push("--yolo");
38
+ // Add prompt as positional argument
39
+ args.push(message);
40
+ if (dry) {
41
+ logger_1.logger.progress(`🔧 Using executor: ${this.name}`);
42
+ logger_1.logger.progress(`kilocode ${args.join(" ")}`);
43
+ return;
44
+ }
45
+ // Launch kilocode and wait for it to complete
46
+ const child = (0, node_child_process_1.spawn)("kilocode", args, {
47
+ stdio: "inherit", // Give tool full terminal control
48
+ });
49
+ // Wait for completion (blocking)
50
+ await new Promise((resolve, reject) => {
51
+ child.on("close", (code) => {
52
+ if (code === 0) {
53
+ logger_1.logger.success("✅ Kilo Code execution completed successfully");
54
+ resolve();
55
+ }
56
+ else {
57
+ const error = new Error(`Kilo Code exited with code ${code}`);
58
+ logger_1.logger.error(`❌ ${error.message}`);
59
+ reject(error);
60
+ }
61
+ });
62
+ child.on("error", (error) => {
63
+ logger_1.logger.error(`❌ Failed to launch Kilo Code: ${error.message}`);
64
+ reject(error);
65
+ });
66
+ });
67
+ }
68
+ }
69
+ exports.KiloExecutor = KiloExecutor;
@@ -0,0 +1,9 @@
1
+ import type { ExecutorConfig, ExternalExecutor } from "../../types";
2
+ export declare class OpencodeExecutor implements ExternalExecutor {
3
+ name: string;
4
+ private config?;
5
+ constructor(config?: ExecutorConfig);
6
+ supportsSessionResumption(): boolean;
7
+ execute(message: string, dry?: boolean, config?: ExecutorConfig): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=opencode-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-executor.d.ts","sourceRoot":"","sources":["../../../src/lib/executors/opencode-executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpE,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAc;IAClB,OAAO,CAAC,MAAM,CAAC,CAAiB;gBAEpB,MAAM,CAAC,EAAE,cAAc;IAInC,yBAAyB,IAAI,OAAO;IAI9B,OAAO,CACX,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,OAAe,EACpB,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;CA2DjB"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpencodeExecutor = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const logger_1 = require("../logger");
6
+ class OpencodeExecutor {
7
+ name = "opencode";
8
+ config;
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ supportsSessionResumption() {
13
+ return true;
14
+ }
15
+ async execute(message, dry = false, config) {
16
+ // Merge constructor config with execution config (execution takes precedence)
17
+ const finalConfig = { ...this.config, ...config };
18
+ // Build arguments array
19
+ const args = [];
20
+ // Add model if specified
21
+ if (finalConfig.model) {
22
+ args.push("-m", finalConfig.model);
23
+ logger_1.logger.progress(`🤖 Using model: ${finalConfig.model}`);
24
+ }
25
+ // Add session resumption if specified
26
+ if (finalConfig.continueLastSession) {
27
+ args.push("-c");
28
+ logger_1.logger.progress("🔄 Continuing last session");
29
+ }
30
+ else if (finalConfig.sessionId) {
31
+ args.push("-s", finalConfig.sessionId);
32
+ logger_1.logger.progress(`🔄 Resuming session: ${finalConfig.sessionId}`);
33
+ }
34
+ // Use 'run' subcommand with message as positional argument
35
+ args.push("run", message);
36
+ if (dry) {
37
+ logger_1.logger.progress(`🔧 Using executor: ${this.name}`);
38
+ // Quote arguments that contain spaces for display
39
+ const quotedArgs = args.map((arg) => arg.includes(" ") ? `"${arg.replace(/"/g, '\\"')}"` : arg);
40
+ logger_1.logger.progress(`opencode ${quotedArgs.join(" ")}`);
41
+ return;
42
+ }
43
+ // Launch opencode and wait for it to complete
44
+ const child = (0, node_child_process_1.spawn)("opencode", args, {
45
+ stdio: "inherit", // Give tool full terminal control
46
+ });
47
+ // Wait for completion (blocking)
48
+ await new Promise((resolve, reject) => {
49
+ child.on("close", (code) => {
50
+ if (code === 0) {
51
+ logger_1.logger.success("✅ Opencode execution completed successfully");
52
+ resolve();
53
+ }
54
+ else {
55
+ const error = new Error(`Opencode exited with code ${code}`);
56
+ logger_1.logger.error(`❌ ${error.message}`);
57
+ reject(error);
58
+ }
59
+ });
60
+ child.on("error", (error) => {
61
+ logger_1.logger.error(`❌ Failed to launch opencode: ${error.message}`);
62
+ reject(error);
63
+ });
64
+ });
65
+ }
66
+ }
67
+ exports.OpencodeExecutor = OpencodeExecutor;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Git state captured before and after execution
3
+ */
4
+ export interface GitState {
5
+ beforeHead: string;
6
+ afterHead: string;
7
+ hasUncommittedChanges: boolean;
8
+ }
9
+ /**
10
+ * Commit information extracted from git state
11
+ */
12
+ export interface CommitInfo {
13
+ message: string;
14
+ files: string[];
15
+ }
16
+ /**
17
+ * Check if new commits were made since a given HEAD
18
+ * Used to detect if the AI agent already committed during execution
19
+ */
20
+ export declare function hasNewCommitsSince(beforeHead: string, execFn?: (command: string) => Promise<{
21
+ stdout: string;
22
+ stderr: string;
23
+ }>): Promise<boolean>;
24
+ /**
25
+ * Capture git state (HEAD commit and uncommitted changes)
26
+ */
27
+ export declare function captureGitState(execFn?: (command: string) => Promise<{
28
+ stdout: string;
29
+ stderr: string;
30
+ }>): Promise<Partial<GitState>>;
31
+ /**
32
+ * Extract commit message and file list from git state
33
+ * This function analyzes the actual git state to generate appropriate commit info
34
+ */
35
+ export declare function extractCommitInfo(taskId: string, taskTitle: string, executionMessage: string, gitState: GitState, execFn?: (command: string) => Promise<{
36
+ stdout: string;
37
+ stderr: string;
38
+ }>, aiOps?: any): Promise<CommitInfo>;
39
+ /**
40
+ * Auto-commit changes using the provided commit info
41
+ */
42
+ export declare function autoCommit(commitInfo: CommitInfo, execFn?: (command: string) => Promise<{
43
+ stdout: string;
44
+ stderr: string;
45
+ }>): Promise<void>;
46
+ /**
47
+ * Commit a specific file with a custom message
48
+ */
49
+ export declare function commitFile(filePath: string, message: string, execFn?: (command: string) => Promise<{
50
+ stdout: string;
51
+ stderr: string;
52
+ }>): Promise<void>;
53
+ /**
54
+ * Check if the working directory is clean
55
+ */
56
+ export declare function isClean(execFn?: (command: string) => Promise<{
57
+ stdout: string;
58
+ stderr: string;
59
+ }>): Promise<boolean>;
60
+ /**
61
+ * Get the current branch name
62
+ */
63
+ export declare function getCurrentBranch(execFn?: (command: string) => Promise<{
64
+ stdout: string;
65
+ stderr: string;
66
+ }>): Promise<string>;
67
+ /**
68
+ * Create a new branch for benchmarking
69
+ */
70
+ export declare function createBenchmarkBranch(name: string, baseBranch?: string, execFn?: (command: string) => Promise<{
71
+ stdout: string;
72
+ stderr: string;
73
+ }>): Promise<void>;
74
+ /**
75
+ * Checkout an existing branch
76
+ */
77
+ export declare function checkoutBranch(name: string, execFn?: (command: string) => Promise<{
78
+ stdout: string;
79
+ stderr: string;
80
+ }>): Promise<void>;
81
+ /**
82
+ * Delete a benchmark branch (force delete)
83
+ */
84
+ export declare function cleanupBenchmarkBranch(name: string, execFn?: (command: string) => Promise<{
85
+ stdout: string;
86
+ stderr: string;
87
+ }>): Promise<void>;
88
+ //# sourceMappingURL=git-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/lib/git-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasNewCommitsSince = hasNewCommitsSince;
4
+ exports.captureGitState = captureGitState;
5
+ exports.extractCommitInfo = extractCommitInfo;
6
+ exports.autoCommit = autoCommit;
7
+ exports.commitFile = commitFile;
8
+ exports.isClean = isClean;
9
+ exports.getCurrentBranch = getCurrentBranch;
10
+ exports.createBenchmarkBranch = createBenchmarkBranch;
11
+ exports.checkoutBranch = checkoutBranch;
12
+ exports.cleanupBenchmarkBranch = cleanupBenchmarkBranch;
13
+ const child_process_1 = require("child_process");
14
+ const util_1 = require("util");
15
+ const logger_1 = require("./logger");
16
+ const ai_service_factory_1 = require("../utils/ai-service-factory");
17
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
18
+ /**
19
+ * Check if new commits were made since a given HEAD
20
+ * Used to detect if the AI agent already committed during execution
21
+ */
22
+ async function hasNewCommitsSince(beforeHead, execFn = execAsync) {
23
+ if (!beforeHead)
24
+ return false;
25
+ try {
26
+ const { stdout } = await execFn("git rev-parse HEAD");
27
+ return stdout.trim() !== beforeHead;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ /**
34
+ * Capture git state (HEAD commit and uncommitted changes)
35
+ */
36
+ async function captureGitState(execFn = execAsync) {
37
+ try {
38
+ const { stdout: headStdout } = await execFn("git rev-parse HEAD");
39
+ const { stdout: statusStdout } = await execFn("git status --porcelain");
40
+ return {
41
+ beforeHead: headStdout.trim(),
42
+ afterHead: headStdout.trim(),
43
+ hasUncommittedChanges: statusStdout.trim().length > 0,
44
+ };
45
+ }
46
+ catch (e) {
47
+ // Git might not be initialized or no commits yet
48
+ return {};
49
+ }
50
+ }
51
+ /**
52
+ * Extract commit message and file list from git state
53
+ * This function analyzes the actual git state to generate appropriate commit info
54
+ */
55
+ async function extractCommitInfo(taskId, taskTitle, executionMessage, gitState, execFn = execAsync, aiOps = (0, ai_service_factory_1.getAIOperations)()) {
56
+ try {
57
+ // Case 1: Executor created a commit
58
+ if (gitState.beforeHead !== gitState.afterHead) {
59
+ logger_1.logger.info("📝 Executor created a commit, extracting info...");
60
+ const { stdout } = await execFn(`git show --stat --format="%s%n%b" ${gitState.afterHead}`);
61
+ const lines = stdout.trim().split("\n");
62
+ const message = lines[0].trim();
63
+ // Parse files from stat output (e.g. " src/file.ts | 10 +")
64
+ const files = lines
65
+ .slice(1)
66
+ .filter((line) => line.includes("|"))
67
+ .map((line) => line.split("|")[0].trim());
68
+ return {
69
+ message,
70
+ files,
71
+ };
72
+ }
73
+ // Case 2: Executor left uncommitted changes
74
+ if (gitState.hasUncommittedChanges) {
75
+ logger_1.logger.info("📝 Uncommitted changes detected, generating commit message...");
76
+ // Get the diff to send to AI
77
+ const { stdout: diff } = await execFn("git diff HEAD");
78
+ // Get list of changed files
79
+ const { stdout: status } = await execFn("git status --porcelain");
80
+ const files = status
81
+ .split("\n")
82
+ .filter((line) => line.length > 0)
83
+ .map((line) => line.substring(3).trim())
84
+ .filter((file) => file.length > 0);
85
+ // Use AI to generate commit message based on the diff
86
+ const prompt = `Based on the following git diff, generate a concise git commit message.
87
+
88
+ Task: ${taskTitle}
89
+
90
+ Git Diff:
91
+ ${diff.substring(0, 10000)} // Limit diff size
92
+
93
+ Please respond in JSON format:
94
+ {
95
+ "message": "concise commit message following conventional commits format"
96
+ }
97
+
98
+ The commit message should:
99
+ - Follow conventional commits format (feat:, fix:, refactor:, etc.)
100
+ - Be concise and descriptive
101
+ - Focus on what changed
102
+ `;
103
+ const response = await aiOps.streamText(prompt, undefined, "You are a helpful assistant that generates git commit messages.");
104
+ // Try to parse JSON from response
105
+ const jsonMatch = response.match(/\{[\s\S]*\}/);
106
+ let message = `feat: complete task ${taskTitle}`;
107
+ if (jsonMatch) {
108
+ try {
109
+ const parsed = JSON.parse(jsonMatch[0]);
110
+ if (parsed.message) {
111
+ message = parsed.message;
112
+ }
113
+ }
114
+ catch (e) {
115
+ // Ignore parse error
116
+ }
117
+ }
118
+ return {
119
+ message,
120
+ files,
121
+ };
122
+ }
123
+ // Case 3: No changes detected
124
+ return {
125
+ message: `feat: complete task ${taskTitle}`,
126
+ files: [],
127
+ };
128
+ }
129
+ catch (error) {
130
+ logger_1.logger.warn(`⚠️ Failed to extract commit info: ${error instanceof Error ? error.message : "Unknown error"}`);
131
+ // Fallback commit info
132
+ return {
133
+ message: `feat: complete task ${taskTitle}`,
134
+ files: [],
135
+ };
136
+ }
137
+ }
138
+ /**
139
+ * Auto-commit changes using the provided commit info
140
+ */
141
+ async function autoCommit(commitInfo, execFn = execAsync) {
142
+ try {
143
+ const { message, files } = commitInfo;
144
+ if (files.length > 0) {
145
+ // Stage specific files
146
+ const gitAdd = `git add ${files.join(" ")}`;
147
+ logger_1.logger.info(`📦 Staging files: ${gitAdd}`);
148
+ await execFn(gitAdd);
149
+ }
150
+ else {
151
+ // Stage all changes
152
+ logger_1.logger.info("📦 Staging all changes");
153
+ await execFn("git add .");
154
+ }
155
+ // Commit
156
+ const gitCommit = `git commit -m "${message}"`;
157
+ logger_1.logger.info(`💾 Committing: ${message}`);
158
+ await execFn(gitCommit);
159
+ logger_1.logger.success("✅ Changes committed successfully\n");
160
+ }
161
+ catch (error) {
162
+ logger_1.logger.warn(`⚠️ Auto-commit failed: ${error instanceof Error ? error.message : "Unknown error"}\n`);
163
+ }
164
+ }
165
+ /**
166
+ * Commit a specific file with a custom message
167
+ */
168
+ async function commitFile(filePath, message, execFn = execAsync) {
169
+ try {
170
+ logger_1.logger.info(`📦 Staging file: ${filePath}`);
171
+ await execFn(`git add ${filePath}`);
172
+ await execFn(`git commit -m "${message}"`);
173
+ logger_1.logger.success("✅ File committed successfully");
174
+ }
175
+ catch (e) {
176
+ logger_1.logger.warn(`⚠️ Failed to commit file: ${e instanceof Error ? e.message : "Unknown error"}`);
177
+ }
178
+ }
179
+ // ============================================================================
180
+ // Benchmarking Git Utilities
181
+ // ============================================================================
182
+ /**
183
+ * Check if the working directory is clean
184
+ */
185
+ async function isClean(execFn = execAsync) {
186
+ try {
187
+ const { stdout } = await execFn("git status --porcelain");
188
+ return stdout.trim().length === 0;
189
+ }
190
+ catch (error) {
191
+ logger_1.logger.warn("Could not check git status");
192
+ return false;
193
+ }
194
+ }
195
+ /**
196
+ * Get the current branch name
197
+ */
198
+ async function getCurrentBranch(execFn = execAsync) {
199
+ try {
200
+ const { stdout } = await execFn("git rev-parse --abbrev-ref HEAD");
201
+ return stdout.trim();
202
+ }
203
+ catch (error) {
204
+ throw new Error("Failed to get current branch");
205
+ }
206
+ }
207
+ /**
208
+ * Create a new branch for benchmarking
209
+ */
210
+ async function createBenchmarkBranch(name, baseBranch = "HEAD", execFn = execAsync) {
211
+ try {
212
+ logger_1.logger.info(`🌿 Creating benchmark branch: ${name} from ${baseBranch}`);
213
+ await execFn(`git checkout -b ${name} ${baseBranch}`);
214
+ }
215
+ catch (error) {
216
+ throw new Error(`Failed to create benchmark branch ${name}: ${error}`);
217
+ }
218
+ }
219
+ /**
220
+ * Checkout an existing branch
221
+ */
222
+ async function checkoutBranch(name, execFn = execAsync) {
223
+ try {
224
+ logger_1.logger.info(`🌿 Checking out branch: ${name}`);
225
+ await execFn(`git checkout ${name}`);
226
+ }
227
+ catch (error) {
228
+ throw new Error(`Failed to checkout branch ${name}: ${error}`);
229
+ }
230
+ }
231
+ /**
232
+ * Delete a benchmark branch (force delete)
233
+ */
234
+ async function cleanupBenchmarkBranch(name, execFn = execAsync) {
235
+ try {
236
+ logger_1.logger.info(`🗑️ Deleting benchmark branch: ${name}`);
237
+ await execFn(`git branch -D ${name}`);
238
+ }
239
+ catch (error) {
240
+ logger_1.logger.warn(`Failed to delete branch ${name}: ${error}`);
241
+ }
242
+ }
@@ -0,0 +1,73 @@
1
+ import { Task } from "../types";
2
+ export type TaskEventType = "task:created" | "task:updated" | "task:deleted" | "task:status-changed" | "task:progress" | "execution:start" | "execution:end" | "execution:error" | "log:info" | "log:warn" | "log:error" | "log:success" | "log:progress";
3
+ export interface LogEventPayload {
4
+ message: string;
5
+ context?: Record<string, unknown>;
6
+ }
7
+ export interface TaskEventPayloads {
8
+ "task:created": {
9
+ task: Task;
10
+ };
11
+ "task:updated": {
12
+ task: Task;
13
+ changes: Partial<Task>;
14
+ };
15
+ "task:deleted": {
16
+ taskId: string;
17
+ };
18
+ "task:status-changed": {
19
+ task: Task;
20
+ oldStatus: string;
21
+ newStatus: string;
22
+ };
23
+ "task:progress": {
24
+ taskId?: string;
25
+ message: string;
26
+ type?: string;
27
+ };
28
+ "execution:start": {
29
+ taskId: string;
30
+ tool: string;
31
+ };
32
+ "execution:end": {
33
+ taskId: string;
34
+ success: boolean;
35
+ };
36
+ "execution:error": {
37
+ taskId: string;
38
+ error: Error;
39
+ };
40
+ "log:info": LogEventPayload;
41
+ "log:warn": LogEventPayload;
42
+ "log:error": LogEventPayload;
43
+ "log:success": LogEventPayload;
44
+ "log:progress": LogEventPayload;
45
+ }
46
+ export type TaskEventHandler<T extends TaskEventType> = (payload: TaskEventPayloads[T]) => Promise<void> | void;
47
+ declare class HookRegistry {
48
+ private static instance;
49
+ private listeners;
50
+ private constructor();
51
+ static getInstance(): HookRegistry;
52
+ /**
53
+ * Register a handler for a specific event type
54
+ */
55
+ on<T extends TaskEventType>(type: T, handler: TaskEventHandler<T>): void;
56
+ /**
57
+ * Remove a handler
58
+ */
59
+ off<T extends TaskEventType>(type: T, handler: TaskEventHandler<T>): void;
60
+ /**
61
+ * Emit an event to all registered handlers
62
+ * We don't await handlers to prevent blocking the main flow,
63
+ * but we catch errors to prevent crashes.
64
+ */
65
+ emit<T extends TaskEventType>(type: T, payload: TaskEventPayloads[T]): Promise<void>;
66
+ /**
67
+ * Clear all listeners (useful for testing)
68
+ */
69
+ clear(): void;
70
+ }
71
+ export declare const hooks: HookRegistry;
72
+ export {};
73
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGhC,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,cAAc,GACd,cAAc,GACd,qBAAqB,GACrB,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,UAAU,GACV,UAAU,GACV,WAAW,GACX,aAAa,GACb,cAAc,CAAC;AAGnB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAGD,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;IAC/B,cAAc,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACvD,cAAc,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,qBAAqB,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,eAAe,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,iBAAiB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,eAAe,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,iBAAiB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IACpD,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW,EAAE,eAAe,CAAC;IAC7B,aAAa,EAAE,eAAe,CAAC;IAC/B,cAAc,EAAE,eAAe,CAAC;CACjC;AAGD,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,aAAa,IAAI,CACtD,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,cAAM,YAAY;IAChB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,SAAS,CAAiD;IAElE,OAAO;WAIO,WAAW,IAAI,YAAY;IAOzC;;OAEG;IACI,EAAE,CAAC,CAAC,SAAS,aAAa,EAC/B,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,IAAI;IAOP;;OAEG;IACI,GAAG,CAAC,CAAC,SAAS,aAAa,EAChC,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,IAAI;IAOP;;;;OAIG;IACU,IAAI,CAAC,CAAC,SAAS,aAAa,EACvC,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;IACI,KAAK,IAAI,IAAI;CAGrB;AAED,eAAO,MAAM,KAAK,cAA6B,CAAC"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hooks = void 0;
4
+ class HookRegistry {
5
+ static instance;
6
+ listeners;
7
+ constructor() {
8
+ this.listeners = new Map();
9
+ }
10
+ static getInstance() {
11
+ if (!HookRegistry.instance) {
12
+ HookRegistry.instance = new HookRegistry();
13
+ }
14
+ return HookRegistry.instance;
15
+ }
16
+ /**
17
+ * Register a handler for a specific event type
18
+ */
19
+ on(type, handler) {
20
+ if (!this.listeners.has(type)) {
21
+ this.listeners.set(type, new Set());
22
+ }
23
+ this.listeners.get(type).add(handler);
24
+ }
25
+ /**
26
+ * Remove a handler
27
+ */
28
+ off(type, handler) {
29
+ const handlers = this.listeners.get(type);
30
+ if (handlers) {
31
+ handlers.delete(handler);
32
+ }
33
+ }
34
+ /**
35
+ * Emit an event to all registered handlers
36
+ * We don't await handlers to prevent blocking the main flow,
37
+ * but we catch errors to prevent crashes.
38
+ */
39
+ async emit(type, payload) {
40
+ const handlers = this.listeners.get(type);
41
+ if (!handlers || handlers.size === 0)
42
+ return;
43
+ const promises = Array.from(handlers).map(async (handler) => {
44
+ try {
45
+ await handler(payload);
46
+ }
47
+ catch (error) {
48
+ // NOTE: Using console.error here intentionally - this is the hooks system
49
+ // that the logger depends on, so we can't use logger here (circular dependency)
50
+ console.error(`Error in hook handler for event ${type}:`, error);
51
+ }
52
+ });
53
+ await Promise.all(promises);
54
+ }
55
+ /**
56
+ * Clear all listeners (useful for testing)
57
+ */
58
+ clear() {
59
+ this.listeners.clear();
60
+ }
61
+ }
62
+ exports.hooks = HookRegistry.getInstance();