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,198 @@
1
+ import assert from "assert";
2
+ import {
3
+ hasNewCommitsSince,
4
+ captureGitState,
5
+ autoCommit,
6
+ commitFile,
7
+ isClean,
8
+ getCurrentBranch,
9
+ createBenchmarkBranch,
10
+ checkoutBranch,
11
+ cleanupBenchmarkBranch,
12
+ GitState,
13
+ CommitInfo
14
+ } from "../../lib/git-utils";
15
+
16
+ describe("Git Utilities", () => {
17
+ describe("hasNewCommitsSince", () => {
18
+ it("should return true when HEAD has changed", async () => {
19
+ const mockExec = async (cmd: string) => {
20
+ if (cmd === "git rev-parse HEAD") {
21
+ return { stdout: "new-hash", stderr: "" };
22
+ }
23
+ return { stdout: "", stderr: "" };
24
+ };
25
+ const result = await hasNewCommitsSince("old-hash", mockExec);
26
+ assert.strictEqual(result, true);
27
+ });
28
+
29
+ it("should return false when HEAD is unchanged", async () => {
30
+ const mockExec = async (cmd: string) => {
31
+ if (cmd === "git rev-parse HEAD") {
32
+ return { stdout: "old-hash", stderr: "" };
33
+ }
34
+ return { stdout: "", stderr: "" };
35
+ };
36
+ const result = await hasNewCommitsSince("old-hash", mockExec);
37
+ assert.strictEqual(result, false);
38
+ });
39
+
40
+ it("should return false when command fails", async () => {
41
+ const mockExec = async () => {
42
+ throw new Error("git error");
43
+ };
44
+ const result = await hasNewCommitsSince("old-hash", mockExec);
45
+ assert.strictEqual(result, false);
46
+ });
47
+
48
+ it("should return false when beforeHead is empty", async () => {
49
+ const result = await hasNewCommitsSince("", async () => ({ stdout: "", stderr: "" }));
50
+ assert.strictEqual(result, false);
51
+ });
52
+ });
53
+
54
+ describe("captureGitState", () => {
55
+ it("should return git state with no uncommitted changes", async () => {
56
+ const mockExec = async (cmd: string) => {
57
+ if (cmd === "git rev-parse HEAD") return { stdout: "current-hash", stderr: "" };
58
+ if (cmd === "git status --porcelain") return { stdout: "", stderr: "" };
59
+ return { stdout: "", stderr: "" };
60
+ };
61
+
62
+ const state = await captureGitState(mockExec);
63
+ assert.strictEqual(state.beforeHead, "current-hash");
64
+ assert.strictEqual(state.afterHead, "current-hash");
65
+ assert.strictEqual(state.hasUncommittedChanges, false);
66
+ });
67
+
68
+ it("should return git state with uncommitted changes", async () => {
69
+ const mockExec = async (cmd: string) => {
70
+ if (cmd === "git rev-parse HEAD") return { stdout: "current-hash", stderr: "" };
71
+ if (cmd === "git status --porcelain") return { stdout: "M file.ts", stderr: "" };
72
+ return { stdout: "", stderr: "" };
73
+ };
74
+
75
+ const state = await captureGitState(mockExec);
76
+ assert.strictEqual(state.hasUncommittedChanges, true);
77
+ });
78
+
79
+ it("should return empty object on failure", async () => {
80
+ const mockExec = async () => {
81
+ throw new Error("fail");
82
+ };
83
+ const state = await captureGitState(mockExec);
84
+ assert.deepStrictEqual(state, {});
85
+ });
86
+ });
87
+
88
+ describe("autoCommit", () => {
89
+ it("should stage specific files and commit", async () => {
90
+ const commands: string[] = [];
91
+ const mockExec = async (cmd: string) => {
92
+ commands.push(cmd);
93
+ return { stdout: "", stderr: "" };
94
+ };
95
+
96
+ const commitInfo: CommitInfo = {
97
+ message: "feat: test",
98
+ files: ["file1.ts", "file2.ts"]
99
+ };
100
+
101
+ await autoCommit(commitInfo, mockExec);
102
+
103
+ assert.ok(commands.includes("git add file1.ts file2.ts"));
104
+ assert.ok(commands.includes('git commit -m "feat: test"'));
105
+ });
106
+
107
+ it("should stage all files if no specific files provided", async () => {
108
+ const commands: string[] = [];
109
+ const mockExec = async (cmd: string) => {
110
+ commands.push(cmd);
111
+ return { stdout: "", stderr: "" };
112
+ };
113
+
114
+ const commitInfo: CommitInfo = {
115
+ message: "feat: test",
116
+ files: []
117
+ };
118
+
119
+ await autoCommit(commitInfo, mockExec);
120
+
121
+ assert.ok(commands.includes("git add ."));
122
+ assert.ok(commands.includes('git commit -m "feat: test"'));
123
+ });
124
+
125
+ it("should handle errors gracefully", async () => {
126
+ const mockExec = async () => {
127
+ throw new Error("fail");
128
+ };
129
+ // Should not throw
130
+ await autoCommit({ message: "test", files: [] }, mockExec);
131
+ });
132
+ });
133
+
134
+ describe("commitFile", () => {
135
+ it("should stage and commit a single file", async () => {
136
+ const commands: string[] = [];
137
+ const mockExec = async (cmd: string) => {
138
+ commands.push(cmd);
139
+ return { stdout: "", stderr: "" };
140
+ };
141
+
142
+ await commitFile("file.ts", "update file", mockExec);
143
+
144
+ assert.ok(commands.includes("git add file.ts"));
145
+ assert.ok(commands.includes('git commit -m "update file"'));
146
+ });
147
+ });
148
+
149
+ describe("Branch Management", () => {
150
+ it("isClean should return true for empty status", async () => {
151
+ const mockExec = async () => ({ stdout: "", stderr: "" });
152
+ const result = await isClean(mockExec);
153
+ assert.strictEqual(result, true);
154
+ });
155
+
156
+ it("isClean should return false for dirty status", async () => {
157
+ const mockExec = async () => ({ stdout: "M file.ts", stderr: "" });
158
+ const result = await isClean(mockExec);
159
+ assert.strictEqual(result, false);
160
+ });
161
+
162
+ it("getCurrentBranch should return branch name", async () => {
163
+ const mockExec = async () => ({ stdout: "main", stderr: "" });
164
+ const result = await getCurrentBranch(mockExec);
165
+ assert.strictEqual(result, "main");
166
+ });
167
+
168
+ it("createBenchmarkBranch should create branch", async () => {
169
+ const commands: string[] = [];
170
+ const mockExec = async (cmd: string) => {
171
+ commands.push(cmd);
172
+ return { stdout: "", stderr: "" };
173
+ };
174
+ await createBenchmarkBranch("bench-1", "main", mockExec);
175
+ assert.ok(commands.includes("git checkout -b bench-1 main"));
176
+ });
177
+
178
+ it("checkoutBranch should checkout branch", async () => {
179
+ const commands: string[] = [];
180
+ const mockExec = async (cmd: string) => {
181
+ commands.push(cmd);
182
+ return { stdout: "", stderr: "" };
183
+ };
184
+ await checkoutBranch("main", mockExec);
185
+ assert.ok(commands.includes("git checkout main"));
186
+ });
187
+
188
+ it("cleanupBenchmarkBranch should delete branch", async () => {
189
+ const commands: string[] = [];
190
+ const mockExec = async (cmd: string) => {
191
+ commands.push(cmd);
192
+ return { stdout: "", stderr: "" };
193
+ };
194
+ await cleanupBenchmarkBranch("bench-1", mockExec);
195
+ assert.ok(commands.includes("git branch -D bench-1"));
196
+ });
197
+ });
198
+ });
@@ -0,0 +1,205 @@
1
+ import { Task, StreamingOptions, TaskAIMetadata, AIConfig } from "../../types";
2
+ import { AIOptions } from "../../utils/ai-config-builder";
3
+
4
+ export class MockAIOperations {
5
+ async enhanceTaskWithDocumentation(
6
+ taskId: string,
7
+ title: string,
8
+ description: string,
9
+ stackInfo: string,
10
+ streamingOptions?: StreamingOptions,
11
+ retryConfig?: any,
12
+ aiConfig?: AIConfig,
13
+ existingResearch?: any
14
+ ): Promise<string> {
15
+ return `${description}\n\n🤖 Enhanced with AI documentation for ${title}`;
16
+ }
17
+
18
+ async breakdownTask(
19
+ task: Task,
20
+ aiConfig: AIConfig,
21
+ promptOverride?: string,
22
+ messageOverride?: string,
23
+ streamingOptions?: StreamingOptions,
24
+ retryConfig?: any,
25
+ fullContent?: string,
26
+ stackInfo?: string,
27
+ existingSubtasks?: Task[],
28
+ enableFilesystemTools?: boolean
29
+ ): Promise<Task[]> {
30
+ return [
31
+ {
32
+ id: `${task.id}.1`,
33
+ title: `Subtask 1: ${task.title}`,
34
+ description: `First subtask for ${task.title}`,
35
+ content: `Content for subtask 1`,
36
+ status: "todo",
37
+ estimatedEffort: "small",
38
+ createdAt: Date.now(),
39
+ updatedAt: Date.now(),
40
+ },
41
+ {
42
+ id: `${task.id}.2`,
43
+ title: `Subtask 2: ${task.title}`,
44
+ description: `Second subtask for ${task.title}`,
45
+ content: `Content for subtask 2`,
46
+ status: "todo",
47
+ estimatedEffort: "medium",
48
+ createdAt: Date.now(),
49
+ updatedAt: Date.now(),
50
+ },
51
+ ];
52
+ }
53
+
54
+ async planTask(
55
+ taskContext: string,
56
+ taskDetails: string,
57
+ aiConfig: AIConfig,
58
+ promptOverride?: string,
59
+ messageOverride?: string,
60
+ streamingOptions?: StreamingOptions
61
+ ): Promise<string> {
62
+ return `# Implementation Plan for ${
63
+ taskContext.split("\n")[0]
64
+ }\n\n1. Analyze requirements\n2. Implement core functionality\n3. Write tests\n4. Review and refactor`;
65
+ }
66
+
67
+ async analyzeDocumentationNeeds(
68
+ taskId: string,
69
+ title: string,
70
+ content: string,
71
+ stackInfo: string,
72
+ streamingOptions?: StreamingOptions,
73
+ retryConfig?: any,
74
+ aiConfig?: AIConfig,
75
+ existingDocumentations?: string[]
76
+ ): Promise<any> {
77
+ return {
78
+ libraries: [
79
+ {
80
+ name: "react",
81
+ context7Id: "/facebook/react",
82
+ reason: "Task involves React development",
83
+ searchQuery: "React hooks best practices",
84
+ },
85
+ ],
86
+ confidence: 0.9,
87
+ files: ["src/components/TaskComponent.tsx"],
88
+ };
89
+ }
90
+
91
+ async generateDocumentationRecap(
92
+ libraries: any[],
93
+ toolResults: any[],
94
+ streamingOptions?: StreamingOptions
95
+ ): Promise<string> {
96
+ return `## Documentation Recap\n\n${libraries
97
+ .map((lib) => `- ${lib.name}: ${lib.reason}`)
98
+ .join("\n")}`;
99
+ }
100
+
101
+ async parsePRD(
102
+ prdContent: string,
103
+ aiConfig: AIConfig,
104
+ promptOverride?: string,
105
+ messageOverride?: string,
106
+ streamingOptions?: StreamingOptions,
107
+ retryConfig?: any,
108
+ workingDirectory?: string,
109
+ enableFilesystemTools?: boolean
110
+ ): Promise<any> {
111
+ return {
112
+ tasks: [
113
+ {
114
+ id: "1",
115
+ title: "Implement user authentication",
116
+ description: "Add login/logout functionality",
117
+ content: "Full authentication implementation",
118
+ estimatedEffort: "medium",
119
+ dependencies: [],
120
+ tags: ["auth", "backend"],
121
+ },
122
+ {
123
+ id: "2",
124
+ title: "Create task management UI",
125
+ description: "Build React components for task management",
126
+ content: "Task list, create, edit, delete components",
127
+ estimatedEffort: "large",
128
+ dependencies: ["1"],
129
+ tags: ["ui", "frontend"],
130
+ },
131
+ ],
132
+ summary: "PRD for task management application",
133
+ estimatedDuration: "2 weeks",
134
+ confidence: 0.95,
135
+ };
136
+ }
137
+
138
+ async generatePRDQuestions(
139
+ prdContent: string,
140
+ aiConfig: AIConfig,
141
+ promptOverride?: string,
142
+ messageOverride?: string,
143
+ streamingOptions?: StreamingOptions,
144
+ retryConfig?: any,
145
+ workingDirectory?: string,
146
+ enableFilesystemTools?: boolean
147
+ ): Promise<string[]> {
148
+ return [
149
+ "What authentication providers should be supported?",
150
+ "Should the task management support real-time collaboration?",
151
+ "What are the expected performance requirements?",
152
+ ];
153
+ }
154
+
155
+ async reworkPRD(
156
+ prdContent: string,
157
+ feedback: string,
158
+ aiConfig: AIConfig,
159
+ promptOverride?: string,
160
+ messageOverride?: string,
161
+ streamingOptions?: StreamingOptions,
162
+ retryConfig?: any,
163
+ workingDirectory?: string,
164
+ enableFilesystemTools?: boolean
165
+ ): Promise<string> {
166
+ return `${prdContent}\n\n## Improvements Based on Feedback\n\n${feedback}`;
167
+ }
168
+
169
+ async answerPRDQuestions(
170
+ prdContent: string,
171
+ questions: string[],
172
+ aiConfig: AIConfig,
173
+ context: any,
174
+ streamingOptions?: StreamingOptions
175
+ ): Promise<Record<string, string>> {
176
+ const answers: Record<string, string> = {};
177
+ questions.forEach((question) => {
178
+ answers[question] = `AI-generated answer for: ${question}`;
179
+ });
180
+ return answers;
181
+ }
182
+
183
+ async generatePRD(
184
+ description: string,
185
+ aiConfig: AIConfig,
186
+ promptOverride?: string,
187
+ messageOverride?: string,
188
+ streamingOptions?: StreamingOptions
189
+ ): Promise<string> {
190
+ return `# Product Requirements Document\n\n## Overview\n${description}\n\n## Features\n- User authentication\n- Task management\n- Real-time collaboration\n\n## Technical Requirements\n- React frontend\n- Node.js backend\n- PostgreSQL database`;
191
+ }
192
+
193
+ async combinePRDs(
194
+ prds: string[],
195
+ originalDescription: string,
196
+ aiConfig: AIConfig,
197
+ promptOverride?: string,
198
+ messageOverride?: string,
199
+ streamingOptions?: StreamingOptions
200
+ ): Promise<string> {
201
+ return `# Master PRD\n\n${prds
202
+ .map((prd, index) => `## PRD ${index + 1}\n\n${prd}`)
203
+ .join("\n\n")}`;
204
+ }
205
+ }
@@ -0,0 +1,84 @@
1
+ import { TaskRepository } from "../../lib/storage/types";
2
+ import { TaskContext } from "../../types";
3
+
4
+ export class MockContextBuilder {
5
+ constructor(private storage: TaskRepository) {}
6
+
7
+ async buildContextForNewTask(
8
+ title: string,
9
+ content?: string
10
+ ): Promise<TaskContext> {
11
+ return {
12
+ task: {
13
+ id: "new-task",
14
+ title,
15
+ description: content || "",
16
+ fullContent: content,
17
+ },
18
+ stack: {
19
+ projectName: "test-project",
20
+ frontend: "next",
21
+ backend: "hono",
22
+ database: "sqlite",
23
+ auth: "better-auth",
24
+ runtime: "node",
25
+ api: "none",
26
+ payments: "none",
27
+ orm: "drizzle",
28
+ dbSetup: "none",
29
+ packageManager: "npm",
30
+ git: true,
31
+ webDeploy: "none",
32
+ serverDeploy: "none",
33
+ install: true,
34
+ addons: [],
35
+ examples: [],
36
+ createdAt: new Date().toISOString(),
37
+ _source: "mock",
38
+ },
39
+ existingResearch: {},
40
+ };
41
+ }
42
+
43
+ async buildContext(taskId: string): Promise<TaskContext> {
44
+ const task = await this.storage.getTask(taskId);
45
+ if (!task) {
46
+ throw new Error(`Task ${taskId} not found`);
47
+ }
48
+
49
+ return {
50
+ task: {
51
+ id: task.id,
52
+ title: task.title,
53
+ description: task.description || "",
54
+ fullContent: task.content || task.description,
55
+ },
56
+ stack: {
57
+ projectName: "test-project",
58
+ frontend: "next",
59
+ backend: "hono",
60
+ database: "sqlite",
61
+ auth: "better-auth",
62
+ runtime: "node",
63
+ api: "none",
64
+ payments: "none",
65
+ orm: "drizzle",
66
+ dbSetup: "none",
67
+ packageManager: "npm",
68
+ git: true,
69
+ webDeploy: "none",
70
+ serverDeploy: "none",
71
+ install: true,
72
+ addons: [],
73
+ examples: [],
74
+ createdAt: new Date().toISOString(),
75
+ _source: "mock",
76
+ },
77
+ existingResearch: {},
78
+ };
79
+ }
80
+
81
+ isDocumentationFresh(documentation: any): boolean {
82
+ return true;
83
+ }
84
+ }
@@ -0,0 +1,21 @@
1
+ import { AIConfig } from "../../types";
2
+
3
+ export class MockModelProvider {
4
+ private config: AIConfig = {
5
+ provider: "openrouter",
6
+ model: "anthropic/claude-3.5-sonnet",
7
+ apiKey: "test-api-key",
8
+ baseURL: "https://openrouter.ai/api/v1",
9
+ maxTokens: 4096,
10
+ temperature: 0.7,
11
+ context7Enabled: true,
12
+ };
13
+
14
+ getAIConfig(): AIConfig {
15
+ return this.config;
16
+ }
17
+
18
+ setAIConfig(config: Partial<AIConfig>): void {
19
+ this.config = { ...this.config, ...config };
20
+ }
21
+ }
@@ -0,0 +1,64 @@
1
+ import { MockStorage } from "./mock-storage";
2
+ import { MockAIOperations } from "./mock-ai-operations";
3
+ import { MockModelProvider } from "./mock-model-provider";
4
+ import { MockContextBuilder } from "./mock-context-builder";
5
+
6
+ // Add jest types for TypeScript
7
+ declare const jest: any;
8
+
9
+ let mockStorage: MockStorage;
10
+ let mockAIOperations: MockAIOperations;
11
+ let mockModelProvider: MockModelProvider;
12
+ let mockContextBuilder: MockContextBuilder;
13
+
14
+ export function resetMockServices(): void {
15
+ mockStorage = new MockStorage();
16
+ mockAIOperations = new MockAIOperations();
17
+ mockModelProvider = new MockModelProvider();
18
+ mockContextBuilder = new MockContextBuilder(mockStorage);
19
+ }
20
+
21
+ export function getMockStorage(): MockStorage {
22
+ if (!mockStorage) {
23
+ resetMockServices();
24
+ }
25
+ return mockStorage;
26
+ }
27
+
28
+ export function getMockAIOperations(): MockAIOperations {
29
+ if (!mockAIOperations) {
30
+ resetMockServices();
31
+ }
32
+ return mockAIOperations;
33
+ }
34
+
35
+ export function getMockModelProvider(): MockModelProvider {
36
+ if (!mockModelProvider) {
37
+ resetMockServices();
38
+ }
39
+ return mockModelProvider;
40
+ }
41
+
42
+ export function getMockContextBuilder(): MockContextBuilder {
43
+ if (!mockContextBuilder) {
44
+ resetMockServices();
45
+ }
46
+ return mockContextBuilder;
47
+ }
48
+
49
+ // Mock the actual service factory functions
50
+ export function mockServiceFactory() {
51
+ // Override the real service factory functions
52
+ const originalFactory = jest.requireActual("../../utils/ai-service-factory");
53
+
54
+ return {
55
+ ...originalFactory,
56
+ getStorage: () => getMockStorage(),
57
+ getAIOperations: () => getMockAIOperations(),
58
+ getModelProvider: () => getMockModelProvider(),
59
+ getContextBuilder: () => getMockContextBuilder(),
60
+ initializeServices: async () => {
61
+ // No-op for tests
62
+ },
63
+ };
64
+ }