mcoda 0.1.2 → 0.1.4

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 (461) hide show
  1. package/CHANGELOG.md +2 -2
  2. package/README.md +9 -300
  3. package/dist/bin/McodaEntrypoint.d.ts +5 -0
  4. package/dist/bin/McodaEntrypoint.d.ts.map +1 -0
  5. package/dist/bin/McodaEntrypoint.js +175 -0
  6. package/dist/commands/agents/AgentsCommands.d.ts +4 -0
  7. package/dist/commands/agents/AgentsCommands.d.ts.map +1 -0
  8. package/dist/commands/agents/AgentsCommands.js +376 -0
  9. package/dist/commands/agents/GatewayAgentCommand.d.ts +4 -0
  10. package/dist/commands/agents/GatewayAgentCommand.d.ts.map +1 -0
  11. package/dist/commands/agents/GatewayAgentCommand.js +583 -0
  12. package/dist/commands/agents/TestAgentCommand.d.ts +4 -0
  13. package/dist/commands/agents/TestAgentCommand.d.ts.map +1 -0
  14. package/dist/commands/agents/TestAgentCommand.js +57 -0
  15. package/dist/commands/backlog/BacklogCommands.d.ts +17 -0
  16. package/dist/commands/backlog/BacklogCommands.d.ts.map +1 -0
  17. package/dist/commands/backlog/BacklogCommands.js +260 -0
  18. package/dist/commands/backlog/OrderTasksCommand.d.ts +16 -0
  19. package/dist/commands/backlog/OrderTasksCommand.d.ts.map +1 -0
  20. package/dist/commands/backlog/OrderTasksCommand.js +211 -0
  21. package/dist/commands/backlog/TaskShowCommands.d.ts +16 -0
  22. package/dist/commands/backlog/TaskShowCommands.d.ts.map +1 -0
  23. package/dist/commands/backlog/TaskShowCommands.js +275 -0
  24. package/dist/commands/docs/DocsCommands.d.ts +37 -0
  25. package/dist/commands/docs/DocsCommands.d.ts.map +1 -0
  26. package/dist/commands/docs/DocsCommands.js +381 -0
  27. package/dist/commands/estimate/EstimateCommands.d.ts +24 -0
  28. package/dist/commands/estimate/EstimateCommands.d.ts.map +1 -0
  29. package/dist/commands/estimate/EstimateCommands.js +259 -0
  30. package/dist/commands/jobs/JobsCommands.d.ts +24 -0
  31. package/dist/commands/jobs/JobsCommands.d.ts.map +1 -0
  32. package/dist/commands/jobs/JobsCommands.js +535 -0
  33. package/dist/commands/openapi/OpenapiCommands.d.ts +14 -0
  34. package/dist/commands/openapi/OpenapiCommands.d.ts.map +1 -0
  35. package/dist/commands/openapi/OpenapiCommands.js +157 -0
  36. package/dist/commands/planning/CreateTasksCommand.d.ts +17 -0
  37. package/dist/commands/planning/CreateTasksCommand.d.ts.map +1 -0
  38. package/dist/commands/planning/CreateTasksCommand.js +134 -0
  39. package/dist/commands/planning/MigrateTasksCommand.d.ts +15 -0
  40. package/dist/commands/planning/MigrateTasksCommand.d.ts.map +1 -0
  41. package/dist/commands/planning/MigrateTasksCommand.js +95 -0
  42. package/dist/commands/planning/PlanningCommands.d.ts +3 -0
  43. package/dist/commands/planning/PlanningCommands.d.ts.map +1 -0
  44. package/dist/commands/planning/PlanningCommands.js +2 -0
  45. package/dist/commands/planning/QaTasksCommand.d.ts +30 -0
  46. package/dist/commands/planning/QaTasksCommand.d.ts.map +1 -0
  47. package/dist/commands/planning/QaTasksCommand.js +293 -0
  48. package/dist/commands/planning/RefineTasksCommand.d.ts +30 -0
  49. package/dist/commands/planning/RefineTasksCommand.d.ts.map +1 -0
  50. package/dist/commands/planning/RefineTasksCommand.js +365 -0
  51. package/dist/commands/review/CodeReviewCommand.d.ts +21 -0
  52. package/dist/commands/review/CodeReviewCommand.d.ts.map +1 -0
  53. package/dist/commands/review/CodeReviewCommand.js +236 -0
  54. package/dist/commands/routing/RoutingCommands.d.ts +7 -0
  55. package/dist/commands/routing/RoutingCommands.d.ts.map +1 -0
  56. package/dist/commands/routing/RoutingCommands.js +484 -0
  57. package/dist/commands/telemetry/TelemetryCommands.d.ts +26 -0
  58. package/dist/commands/telemetry/TelemetryCommands.d.ts.map +1 -0
  59. package/dist/commands/telemetry/TelemetryCommands.js +313 -0
  60. package/dist/commands/update/UpdateCommands.d.ts +4 -0
  61. package/dist/commands/update/UpdateCommands.d.ts.map +1 -0
  62. package/dist/commands/update/UpdateCommands.js +280 -0
  63. package/dist/commands/work/WorkOnTasksCommand.d.ts +21 -0
  64. package/dist/commands/work/WorkOnTasksCommand.d.ts.map +1 -0
  65. package/dist/commands/work/WorkOnTasksCommand.js +238 -0
  66. package/dist/commands/workspace/SetWorkspaceCommand.d.ts +9 -0
  67. package/dist/commands/workspace/SetWorkspaceCommand.d.ts.map +1 -0
  68. package/dist/commands/workspace/SetWorkspaceCommand.js +128 -0
  69. package/dist/index.d.ts +19 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/package.json +31 -16
  72. package/.editorconfig +0 -9
  73. package/.eslintrc.cjs +0 -12
  74. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -29
  75. package/.github/ISSUE_TEMPLATE/config.yml +0 -5
  76. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -19
  77. package/.github/workflows/ci.yml +0 -37
  78. package/.github/workflows/nightly.yml +0 -38
  79. package/.github/workflows/release-dry-run.yml +0 -40
  80. package/.github/workflows/release-please.yml +0 -22
  81. package/.github/workflows/release.yml +0 -139
  82. package/.prettierrc +0 -5
  83. package/.release-please-manifest.json +0 -8
  84. package/CLA.md +0 -42
  85. package/CONTRIBUTING.md +0 -38
  86. package/docs/oss_publishing_plan.md +0 -41
  87. package/docs/pdr/.gitkeep +0 -0
  88. package/docs/quality_gates.md +0 -32
  89. package/docs/rfp/.gitkeep +0 -0
  90. package/docs/sds/sds.md +0 -11963
  91. package/docs/usage.md +0 -72
  92. package/openapi/gen-openapi.ts +0 -1
  93. package/openapi/generated/clients/.gitkeep +0 -0
  94. package/openapi/generated/types/.gitkeep +0 -0
  95. package/openapi/generated/types/index.ts +0 -118
  96. package/openapi/mcoda.yaml +0 -2063
  97. package/pack-mcoda.sh +0 -88
  98. package/packages/agents/CHANGELOG.md +0 -7
  99. package/packages/agents/LICENSE +0 -21
  100. package/packages/agents/README.md +0 -9
  101. package/packages/agents/package.json +0 -41
  102. package/packages/agents/src/AgentService/.gitkeep +0 -0
  103. package/packages/agents/src/AgentService/AgentService.d.ts +0 -21
  104. package/packages/agents/src/AgentService/AgentService.d.ts.map +0 -1
  105. package/packages/agents/src/AgentService/AgentService.js +0 -141
  106. package/packages/agents/src/AgentService/AgentService.ts +0 -308
  107. package/packages/agents/src/__tests__/AgentService.test.ts +0 -284
  108. package/packages/agents/src/adapters/AdapterTypes.d.ts +0 -29
  109. package/packages/agents/src/adapters/AdapterTypes.d.ts.map +0 -1
  110. package/packages/agents/src/adapters/AdapterTypes.js +0 -1
  111. package/packages/agents/src/adapters/AdapterTypes.ts +0 -32
  112. package/packages/agents/src/adapters/codex/.gitkeep +0 -0
  113. package/packages/agents/src/adapters/codex/CodexAdapter.d.ts +0 -11
  114. package/packages/agents/src/adapters/codex/CodexAdapter.d.ts.map +0 -1
  115. package/packages/agents/src/adapters/codex/CodexAdapter.js +0 -43
  116. package/packages/agents/src/adapters/codex/CodexAdapter.ts +0 -63
  117. package/packages/agents/src/adapters/codex/CodexCliRunner.ts +0 -154
  118. package/packages/agents/src/adapters/gemini/.gitkeep +0 -0
  119. package/packages/agents/src/adapters/gemini/GeminiAdapter.d.ts +0 -11
  120. package/packages/agents/src/adapters/gemini/GeminiAdapter.d.ts.map +0 -1
  121. package/packages/agents/src/adapters/gemini/GeminiAdapter.js +0 -42
  122. package/packages/agents/src/adapters/gemini/GeminiAdapter.ts +0 -58
  123. package/packages/agents/src/adapters/gemini/GeminiCliRunner.ts +0 -75
  124. package/packages/agents/src/adapters/local/.gitkeep +0 -0
  125. package/packages/agents/src/adapters/local/LocalAdapter.d.ts +0 -11
  126. package/packages/agents/src/adapters/local/LocalAdapter.d.ts.map +0 -1
  127. package/packages/agents/src/adapters/local/LocalAdapter.js +0 -38
  128. package/packages/agents/src/adapters/local/LocalAdapter.ts +0 -43
  129. package/packages/agents/src/adapters/ollama/OllamaCliAdapter.ts +0 -58
  130. package/packages/agents/src/adapters/ollama/OllamaCliRunner.ts +0 -70
  131. package/packages/agents/src/adapters/ollama/OllamaRemoteAdapter.ts +0 -205
  132. package/packages/agents/src/adapters/openai/.gitkeep +0 -0
  133. package/packages/agents/src/adapters/openai/OpenAiAdapter.d.ts +0 -11
  134. package/packages/agents/src/adapters/openai/OpenAiAdapter.d.ts.map +0 -1
  135. package/packages/agents/src/adapters/openai/OpenAiAdapter.js +0 -51
  136. package/packages/agents/src/adapters/openai/OpenAiAdapter.ts +0 -56
  137. package/packages/agents/src/adapters/openai/OpenAiCliAdapter.ts +0 -62
  138. package/packages/agents/src/adapters/qa/.gitkeep +0 -0
  139. package/packages/agents/src/adapters/qa/QaAdapter.d.ts +0 -11
  140. package/packages/agents/src/adapters/qa/QaAdapter.d.ts.map +0 -1
  141. package/packages/agents/src/adapters/qa/QaAdapter.js +0 -37
  142. package/packages/agents/src/adapters/qa/QaAdapter.ts +0 -42
  143. package/packages/agents/src/adapters/zhipu/ZhipuApiAdapter.ts +0 -273
  144. package/packages/agents/src/index.d.ts +0 -8
  145. package/packages/agents/src/index.d.ts.map +0 -1
  146. package/packages/agents/src/index.js +0 -7
  147. package/packages/agents/src/index.ts +0 -11
  148. package/packages/agents/tsconfig.json +0 -14
  149. package/packages/cli/CHANGELOG.md +0 -7
  150. package/packages/cli/LICENSE +0 -21
  151. package/packages/cli/README.md +0 -23
  152. package/packages/cli/package.json +0 -61
  153. package/packages/cli/src/__tests__/AgentsCommands.test.ts +0 -137
  154. package/packages/cli/src/__tests__/BacklogCommands.test.ts +0 -40
  155. package/packages/cli/src/__tests__/CodeReviewCommand.test.ts +0 -594
  156. package/packages/cli/src/__tests__/CreateTasksCommand.test.ts +0 -40
  157. package/packages/cli/src/__tests__/DocsCommands.test.ts +0 -41
  158. package/packages/cli/src/__tests__/EstimateCommands.test.ts +0 -54
  159. package/packages/cli/src/__tests__/JobsCommands.behavior.test.ts +0 -311
  160. package/packages/cli/src/__tests__/JobsCommands.test.ts +0 -49
  161. package/packages/cli/src/__tests__/MigrateTasksCommand.test.ts +0 -36
  162. package/packages/cli/src/__tests__/OpenapiCommands.test.ts +0 -34
  163. package/packages/cli/src/__tests__/OrderTasksCommand.test.ts +0 -150
  164. package/packages/cli/src/__tests__/PlanningCommands.test.ts +0 -9
  165. package/packages/cli/src/__tests__/QaTasksCommand.test.ts +0 -58
  166. package/packages/cli/src/__tests__/RefineTasksCommand.test.ts +0 -63
  167. package/packages/cli/src/__tests__/RoutingCommands.test.ts +0 -302
  168. package/packages/cli/src/__tests__/SetWorkspaceCommand.test.ts +0 -18
  169. package/packages/cli/src/__tests__/TaskShowCommands.test.ts +0 -130
  170. package/packages/cli/src/__tests__/TelemetryCommands.test.ts +0 -35
  171. package/packages/cli/src/__tests__/TestAgentCommand.test.ts +0 -41
  172. package/packages/cli/src/__tests__/UpdateCommands.test.ts +0 -292
  173. package/packages/cli/src/__tests__/WorkOnTasksCommand.test.ts +0 -42
  174. package/packages/cli/src/bin/.gitkeep +0 -0
  175. package/packages/cli/src/bin/McodaEntrypoint.ts +0 -180
  176. package/packages/cli/src/commands/agents/.gitkeep +0 -0
  177. package/packages/cli/src/commands/agents/AgentsCommands.ts +0 -374
  178. package/packages/cli/src/commands/agents/GatewayAgentCommand.ts +0 -621
  179. package/packages/cli/src/commands/agents/TestAgentCommand.ts +0 -63
  180. package/packages/cli/src/commands/backlog/.gitkeep +0 -0
  181. package/packages/cli/src/commands/backlog/BacklogCommands.ts +0 -286
  182. package/packages/cli/src/commands/backlog/OrderTasksCommand.ts +0 -237
  183. package/packages/cli/src/commands/backlog/TaskShowCommands.ts +0 -289
  184. package/packages/cli/src/commands/docs/.gitkeep +0 -0
  185. package/packages/cli/src/commands/docs/DocsCommands.ts +0 -413
  186. package/packages/cli/src/commands/estimate/EstimateCommands.ts +0 -290
  187. package/packages/cli/src/commands/jobs/.gitkeep +0 -0
  188. package/packages/cli/src/commands/jobs/JobsCommands.ts +0 -595
  189. package/packages/cli/src/commands/openapi/OpenapiCommands.ts +0 -167
  190. package/packages/cli/src/commands/planning/.gitkeep +0 -0
  191. package/packages/cli/src/commands/planning/CreateTasksCommand.ts +0 -149
  192. package/packages/cli/src/commands/planning/MigrateTasksCommand.ts +0 -105
  193. package/packages/cli/src/commands/planning/PlanningCommands.ts +0 -1
  194. package/packages/cli/src/commands/planning/QaTasksCommand.ts +0 -320
  195. package/packages/cli/src/commands/planning/RefineTasksCommand.ts +0 -408
  196. package/packages/cli/src/commands/review/CodeReviewCommand.ts +0 -262
  197. package/packages/cli/src/commands/routing/.gitkeep +0 -0
  198. package/packages/cli/src/commands/routing/RoutingCommands.ts +0 -554
  199. package/packages/cli/src/commands/telemetry/.gitkeep +0 -0
  200. package/packages/cli/src/commands/telemetry/TelemetryCommands.ts +0 -348
  201. package/packages/cli/src/commands/update/.gitkeep +0 -0
  202. package/packages/cli/src/commands/update/UpdateCommands.ts +0 -301
  203. package/packages/cli/src/commands/work/WorkOnTasksCommand.ts +0 -264
  204. package/packages/cli/src/commands/workspace/SetWorkspaceCommand.ts +0 -132
  205. package/packages/cli/test/packaging_guardrails.test.js +0 -75
  206. package/packages/cli/tsconfig.json +0 -20
  207. package/packages/core/CHANGELOG.md +0 -7
  208. package/packages/core/LICENSE +0 -21
  209. package/packages/core/README.md +0 -9
  210. package/packages/core/package.json +0 -45
  211. package/packages/core/src/__tests__/SmokeClasses.test.ts +0 -32
  212. package/packages/core/src/api/AgentsApi.ts +0 -219
  213. package/packages/core/src/api/QaTasksApi.ts +0 -38
  214. package/packages/core/src/api/TasksApi.ts +0 -35
  215. package/packages/core/src/api/__tests__/AgentsApi.test.ts +0 -203
  216. package/packages/core/src/api/__tests__/QaTasksApi.test.ts +0 -51
  217. package/packages/core/src/api/__tests__/TasksApi.test.ts +0 -56
  218. package/packages/core/src/config/.gitkeep +0 -0
  219. package/packages/core/src/config/ConfigService.ts +0 -1
  220. package/packages/core/src/domain/dependencies/.gitkeep +0 -0
  221. package/packages/core/src/domain/dependencies/Dependency.ts +0 -1
  222. package/packages/core/src/domain/epics/.gitkeep +0 -0
  223. package/packages/core/src/domain/epics/Epic.ts +0 -1
  224. package/packages/core/src/domain/projects/.gitkeep +0 -0
  225. package/packages/core/src/domain/projects/Project.ts +0 -1
  226. package/packages/core/src/domain/tasks/.gitkeep +0 -0
  227. package/packages/core/src/domain/tasks/Task.ts +0 -1
  228. package/packages/core/src/domain/userStories/.gitkeep +0 -0
  229. package/packages/core/src/domain/userStories/UserStory.ts +0 -1
  230. package/packages/core/src/index.ts +0 -27
  231. package/packages/core/src/prompts/.gitkeep +0 -0
  232. package/packages/core/src/prompts/PdrPrompts.ts +0 -23
  233. package/packages/core/src/prompts/PromptLoader.ts +0 -1
  234. package/packages/core/src/prompts/SdsPrompts.ts +0 -47
  235. package/packages/core/src/services/agents/.gitkeep +0 -0
  236. package/packages/core/src/services/agents/AgentManagementService.ts +0 -1
  237. package/packages/core/src/services/agents/GatewayAgentService.ts +0 -956
  238. package/packages/core/src/services/agents/RoutingService.ts +0 -461
  239. package/packages/core/src/services/agents/__tests__/GatewayAgentService.test.ts +0 -72
  240. package/packages/core/src/services/agents/__tests__/RoutingService.test.ts +0 -267
  241. package/packages/core/src/services/agents/generated/RoutingApiClient.ts +0 -89
  242. package/packages/core/src/services/backlog/.gitkeep +0 -0
  243. package/packages/core/src/services/backlog/BacklogService.ts +0 -580
  244. package/packages/core/src/services/backlog/TaskOrderingService.ts +0 -868
  245. package/packages/core/src/services/backlog/__tests__/BacklogService.test.ts +0 -219
  246. package/packages/core/src/services/backlog/__tests__/TaskOrderingService.test.ts +0 -268
  247. package/packages/core/src/services/docs/.gitkeep +0 -0
  248. package/packages/core/src/services/docs/DocsService.ts +0 -1913
  249. package/packages/core/src/services/docs/__tests__/DocsService.test.ts +0 -350
  250. package/packages/core/src/services/estimate/EstimateService.ts +0 -111
  251. package/packages/core/src/services/estimate/VelocityService.ts +0 -272
  252. package/packages/core/src/services/estimate/__tests__/VelocityAndEstimate.test.ts +0 -209
  253. package/packages/core/src/services/estimate/types.ts +0 -41
  254. package/packages/core/src/services/execution/.gitkeep +0 -0
  255. package/packages/core/src/services/execution/ExecutionService.ts +0 -1
  256. package/packages/core/src/services/execution/QaFollowupService.ts +0 -289
  257. package/packages/core/src/services/execution/QaProfileService.ts +0 -160
  258. package/packages/core/src/services/execution/QaTasksService.ts +0 -1303
  259. package/packages/core/src/services/execution/TaskSelectionService.ts +0 -362
  260. package/packages/core/src/services/execution/TaskStateService.ts +0 -64
  261. package/packages/core/src/services/execution/WorkOnTasksService.ts +0 -2023
  262. package/packages/core/src/services/execution/__tests__/QaFollowupService.test.ts +0 -58
  263. package/packages/core/src/services/execution/__tests__/QaProfileService.test.ts +0 -49
  264. package/packages/core/src/services/execution/__tests__/QaTasksService.test.ts +0 -157
  265. package/packages/core/src/services/execution/__tests__/TaskSelectionService.test.ts +0 -179
  266. package/packages/core/src/services/execution/__tests__/TaskStateService.test.ts +0 -51
  267. package/packages/core/src/services/execution/__tests__/WorkOnTasksService.test.ts +0 -285
  268. package/packages/core/src/services/jobs/.gitkeep +0 -0
  269. package/packages/core/src/services/jobs/JobInsightsService.ts +0 -355
  270. package/packages/core/src/services/jobs/JobResumeService.ts +0 -119
  271. package/packages/core/src/services/jobs/JobService.ts +0 -648
  272. package/packages/core/src/services/jobs/JobsApiClient.ts +0 -113
  273. package/packages/core/src/services/jobs/__tests__/JobInsightsService.test.ts +0 -17
  274. package/packages/core/src/services/jobs/__tests__/JobResumeService.test.ts +0 -45
  275. package/packages/core/src/services/jobs/__tests__/JobService.test.ts +0 -44
  276. package/packages/core/src/services/openapi/OpenApiService.ts +0 -558
  277. package/packages/core/src/services/openapi/__tests__/OpenApiService.test.ts +0 -57
  278. package/packages/core/src/services/planning/.gitkeep +0 -0
  279. package/packages/core/src/services/planning/CreateTasksService.ts +0 -1280
  280. package/packages/core/src/services/planning/KeyHelpers.ts +0 -80
  281. package/packages/core/src/services/planning/PlanningService.ts +0 -1
  282. package/packages/core/src/services/planning/RefineTasksService.ts +0 -1552
  283. package/packages/core/src/services/planning/__tests__/CreateTasksService.test.ts +0 -288
  284. package/packages/core/src/services/planning/__tests__/KeyHelpers.test.ts +0 -16
  285. package/packages/core/src/services/planning/__tests__/RefineTasksService.test.ts +0 -172
  286. package/packages/core/src/services/review/CodeReviewService.ts +0 -1386
  287. package/packages/core/src/services/review/__tests__/CodeReviewService.test.ts +0 -89
  288. package/packages/core/src/services/system/SystemUpdateService.ts +0 -177
  289. package/packages/core/src/services/system/__tests__/SystemUpdateService.test.ts +0 -40
  290. package/packages/core/src/services/tasks/TaskApiResolver.ts +0 -37
  291. package/packages/core/src/services/tasks/TaskDetailService.ts +0 -494
  292. package/packages/core/src/services/tasks/__tests__/TaskApiResolver.test.ts +0 -41
  293. package/packages/core/src/services/tasks/__tests__/TaskDetailService.test.ts +0 -178
  294. package/packages/core/src/services/telemetry/.gitkeep +0 -0
  295. package/packages/core/src/services/telemetry/TelemetryService.ts +0 -515
  296. package/packages/core/src/services/telemetry/__tests__/TelemetryService.test.ts +0 -160
  297. package/packages/core/src/workspace/.gitkeep +0 -0
  298. package/packages/core/src/workspace/WorkspaceManager.ts +0 -234
  299. package/packages/core/tsconfig.json +0 -20
  300. package/packages/db/CHANGELOG.md +0 -7
  301. package/packages/db/LICENSE +0 -21
  302. package/packages/db/README.md +0 -9
  303. package/packages/db/package.json +0 -42
  304. package/packages/db/src/__tests__/GlobalRepository.test.ts +0 -109
  305. package/packages/db/src/__tests__/SchemaAlignment.test.ts +0 -80
  306. package/packages/db/src/__tests__/WorkspaceRepository.test.ts +0 -19
  307. package/packages/db/src/index.d.ts +0 -6
  308. package/packages/db/src/index.d.ts.map +0 -1
  309. package/packages/db/src/index.js +0 -5
  310. package/packages/db/src/index.ts +0 -6
  311. package/packages/db/src/migrations/global/.gitkeep +0 -0
  312. package/packages/db/src/migrations/global/GlobalMigrations.d.ts +0 -9
  313. package/packages/db/src/migrations/global/GlobalMigrations.d.ts.map +0 -1
  314. package/packages/db/src/migrations/global/GlobalMigrations.js +0 -68
  315. package/packages/db/src/migrations/global/GlobalMigrations.ts +0 -336
  316. package/packages/db/src/migrations/workspace/.gitkeep +0 -0
  317. package/packages/db/src/migrations/workspace/WorkspaceMigrations.d.ts +0 -9
  318. package/packages/db/src/migrations/workspace/WorkspaceMigrations.d.ts.map +0 -1
  319. package/packages/db/src/migrations/workspace/WorkspaceMigrations.js +0 -251
  320. package/packages/db/src/migrations/workspace/WorkspaceMigrations.ts +0 -248
  321. package/packages/db/src/repositories/global/.gitkeep +0 -0
  322. package/packages/db/src/repositories/global/GlobalRepository.d.ts +0 -30
  323. package/packages/db/src/repositories/global/GlobalRepository.d.ts.map +0 -1
  324. package/packages/db/src/repositories/global/GlobalRepository.js +0 -209
  325. package/packages/db/src/repositories/global/GlobalRepository.ts +0 -492
  326. package/packages/db/src/repositories/workspace/.gitkeep +0 -0
  327. package/packages/db/src/repositories/workspace/WorkspaceRepository.d.ts +0 -282
  328. package/packages/db/src/repositories/workspace/WorkspaceRepository.d.ts.map +0 -1
  329. package/packages/db/src/repositories/workspace/WorkspaceRepository.js +0 -773
  330. package/packages/db/src/repositories/workspace/WorkspaceRepository.ts +0 -1511
  331. package/packages/db/src/sqlite/connection.d.ts +0 -11
  332. package/packages/db/src/sqlite/connection.d.ts.map +0 -1
  333. package/packages/db/src/sqlite/connection.js +0 -31
  334. package/packages/db/src/sqlite/connection.ts +0 -35
  335. package/packages/db/src/sqlite/pragmas.d.ts +0 -5
  336. package/packages/db/src/sqlite/pragmas.d.ts.map +0 -1
  337. package/packages/db/src/sqlite/pragmas.js +0 -6
  338. package/packages/db/src/sqlite/pragmas.ts +0 -10
  339. package/packages/db/tsconfig.json +0 -13
  340. package/packages/generators/package.json +0 -21
  341. package/packages/generators/src/__tests__/Generators.test.ts +0 -19
  342. package/packages/generators/src/index.ts +0 -1
  343. package/packages/generators/src/openapi/generateTypes.ts +0 -1
  344. package/packages/generators/src/openapi/validateSchema.ts +0 -1
  345. package/packages/generators/src/scaffolding/docs/.gitkeep +0 -0
  346. package/packages/generators/src/scaffolding/docs/DocsScaffolder.ts +0 -1
  347. package/packages/generators/src/scaffolding/global/.gitkeep +0 -0
  348. package/packages/generators/src/scaffolding/global/GlobalScaffolder.ts +0 -1
  349. package/packages/generators/src/scaffolding/workspace/.gitkeep +0 -0
  350. package/packages/generators/src/scaffolding/workspace/WorkspaceScaffolder.ts +0 -1
  351. package/packages/generators/tsconfig.json +0 -10
  352. package/packages/integrations/CHANGELOG.md +0 -7
  353. package/packages/integrations/LICENSE +0 -21
  354. package/packages/integrations/README.md +0 -9
  355. package/packages/integrations/package.json +0 -47
  356. package/packages/integrations/src/docdex/.gitkeep +0 -0
  357. package/packages/integrations/src/docdex/DocdexClient.d.ts +0 -50
  358. package/packages/integrations/src/docdex/DocdexClient.d.ts.map +0 -1
  359. package/packages/integrations/src/docdex/DocdexClient.js +0 -216
  360. package/packages/integrations/src/docdex/DocdexClient.ts +0 -261
  361. package/packages/integrations/src/docdex/__tests__/DocdexClient.test.ts +0 -29
  362. package/packages/integrations/src/index.d.ts +0 -2
  363. package/packages/integrations/src/index.d.ts.map +0 -1
  364. package/packages/integrations/src/index.js +0 -4
  365. package/packages/integrations/src/index.ts +0 -5
  366. package/packages/integrations/src/issues/.gitkeep +0 -0
  367. package/packages/integrations/src/issues/IssuesClient.ts +0 -1
  368. package/packages/integrations/src/issues/__tests__/IssuesClient.test.ts +0 -10
  369. package/packages/integrations/src/qa/.gitkeep +0 -0
  370. package/packages/integrations/src/qa/ChromiumQaAdapter.ts +0 -89
  371. package/packages/integrations/src/qa/CliQaAdapter.ts +0 -95
  372. package/packages/integrations/src/qa/MaestroQaAdapter.ts +0 -91
  373. package/packages/integrations/src/qa/QaAdapter.ts +0 -7
  374. package/packages/integrations/src/qa/QaClient.ts +0 -1
  375. package/packages/integrations/src/qa/QaTypes.ts +0 -26
  376. package/packages/integrations/src/qa/__tests__/ChromiumQaAdapter.test.ts +0 -30
  377. package/packages/integrations/src/qa/__tests__/CliQaAdapter.test.ts +0 -33
  378. package/packages/integrations/src/qa/__tests__/MaestroQaAdapter.test.ts +0 -30
  379. package/packages/integrations/src/qa/index.ts +0 -5
  380. package/packages/integrations/src/system/SystemClient.ts +0 -50
  381. package/packages/integrations/src/system/__tests__/SystemClient.test.ts +0 -40
  382. package/packages/integrations/src/telemetry/TelemetryClient.ts +0 -139
  383. package/packages/integrations/src/telemetry/__tests__/TelemetryClient.test.ts +0 -41
  384. package/packages/integrations/src/vcs/.gitkeep +0 -0
  385. package/packages/integrations/src/vcs/VcsClient.ts +0 -211
  386. package/packages/integrations/src/vcs/__tests__/VcsClient.test.ts +0 -26
  387. package/packages/integrations/tsconfig.json +0 -14
  388. package/packages/shared/CHANGELOG.md +0 -7
  389. package/packages/shared/LICENSE +0 -21
  390. package/packages/shared/README.md +0 -9
  391. package/packages/shared/package.json +0 -40
  392. package/packages/shared/src/__tests__/CommandMetadata.test.ts +0 -15
  393. package/packages/shared/src/__tests__/ServiceShells.test.ts +0 -16
  394. package/packages/shared/src/crypto/.gitkeep +0 -0
  395. package/packages/shared/src/crypto/CryptoHelper.d.ts +0 -15
  396. package/packages/shared/src/crypto/CryptoHelper.d.ts.map +0 -1
  397. package/packages/shared/src/crypto/CryptoHelper.js +0 -54
  398. package/packages/shared/src/crypto/CryptoHelper.ts +0 -57
  399. package/packages/shared/src/errors/.gitkeep +0 -0
  400. package/packages/shared/src/errors/ErrorFactory.ts +0 -1
  401. package/packages/shared/src/index.d.ts +0 -6
  402. package/packages/shared/src/index.d.ts.map +0 -1
  403. package/packages/shared/src/index.js +0 -4
  404. package/packages/shared/src/index.ts +0 -35
  405. package/packages/shared/src/logging/.gitkeep +0 -0
  406. package/packages/shared/src/logging/Logger.ts +0 -1
  407. package/packages/shared/src/metadata/CommandMetadata.ts +0 -165
  408. package/packages/shared/src/openapi/.gitkeep +0 -0
  409. package/packages/shared/src/openapi/OpenApiTypes.d.ts +0 -216
  410. package/packages/shared/src/openapi/OpenApiTypes.d.ts.map +0 -1
  411. package/packages/shared/src/openapi/OpenApiTypes.js +0 -1
  412. package/packages/shared/src/openapi/OpenApiTypes.ts +0 -312
  413. package/packages/shared/src/paths/.gitkeep +0 -0
  414. package/packages/shared/src/paths/PathHelper.d.ts +0 -12
  415. package/packages/shared/src/paths/PathHelper.d.ts.map +0 -1
  416. package/packages/shared/src/paths/PathHelper.js +0 -24
  417. package/packages/shared/src/paths/PathHelper.ts +0 -29
  418. package/packages/shared/src/qa/QaProfile.ts +0 -14
  419. package/packages/shared/src/utils/.gitkeep +0 -0
  420. package/packages/shared/src/utils/UtilityService.ts +0 -1
  421. package/packages/shared/tsconfig.json +0 -10
  422. package/packages/testing/package.json +0 -26
  423. package/packages/testing/src/__tests__/TestingFakes.test.ts +0 -15
  424. package/packages/testing/src/cli/e2e/.gitkeep +0 -0
  425. package/packages/testing/src/cli/e2e/E2eSuite.ts +0 -1
  426. package/packages/testing/src/fakes/agents/.gitkeep +0 -0
  427. package/packages/testing/src/fakes/agents/FakeAgents.ts +0 -1
  428. package/packages/testing/src/fakes/docdex/.gitkeep +0 -0
  429. package/packages/testing/src/fakes/docdex/FakeDocdexClient.ts +0 -1
  430. package/packages/testing/src/fakes/qa/.gitkeep +0 -0
  431. package/packages/testing/src/fakes/qa/FakeQaClient.ts +0 -1
  432. package/packages/testing/src/fakes/vcs/.gitkeep +0 -0
  433. package/packages/testing/src/fakes/vcs/FakeVcsClient.ts +0 -1
  434. package/packages/testing/src/fixtures/db/.gitkeep +0 -0
  435. package/packages/testing/src/fixtures/db/DbFixtures.ts +0 -1
  436. package/packages/testing/src/fixtures/workspaces/.gitkeep +0 -0
  437. package/packages/testing/src/fixtures/workspaces/WorkspaceFixtures.ts +0 -1
  438. package/packages/testing/src/index.ts +0 -1
  439. package/packages/testing/tsconfig.json +0 -10
  440. package/pnpm-workspace.yaml +0 -2
  441. package/prompts/README.md +0 -5
  442. package/prompts/code-reviewer.md +0 -23
  443. package/prompts/code-writer.md +0 -35
  444. package/prompts/gateway-agent.md +0 -27
  445. package/prompts/qa-agent.md +0 -21
  446. package/release-please-config.json +0 -39
  447. package/scripts/build-all.ts +0 -1
  448. package/scripts/dev.ts +0 -1
  449. package/scripts/install-local-cli.sh +0 -28
  450. package/scripts/pack-npm-tarballs.js +0 -63
  451. package/scripts/release.ts +0 -1
  452. package/scripts/run-node-tests.js +0 -37
  453. package/tests/all.js +0 -127
  454. package/tests/api/openapi_spec.test.js +0 -21
  455. package/tests/artifacts.md +0 -31
  456. package/tests/component/cli_version.test.js +0 -38
  457. package/tests/integration/workspace_resolver.test.js +0 -44
  458. package/tests/unit/crypto_helper.test.js +0 -36
  459. package/tests/unit/path_helper.test.js +0 -20
  460. package/tsconfig.base.json +0 -32
  461. /package/{packages/cli/src/index.ts → dist/index.js} +0 -0
@@ -1,285 +0,0 @@
1
- import test from "node:test";
2
- import assert from "node:assert";
3
- import fs from "node:fs/promises";
4
- import os from "node:os";
5
- import path from "node:path";
6
- import { WorkspaceRepository } from "@mcoda/db";
7
- import { WorkspaceResolver } from "../../../workspace/WorkspaceManager.js";
8
- import { TaskSelectionService } from "../TaskSelectionService.js";
9
- import { TaskStateService } from "../TaskStateService.js";
10
- import { WorkOnTasksService } from "../WorkOnTasksService.js";
11
- import { JobService } from "../../jobs/JobService.js";
12
-
13
- class StubAgentService {
14
- async resolveAgent() {
15
- return { id: "agent-1", slug: "agent-1", adapter: "local-model", defaultModel: "stub" } as any;
16
- }
17
- async invoke(_id: string, _req: any) {
18
- const patch = "```patch\n--- a/tmp.txt\n+++ b/tmp.txt\n@@\n-foo\n+bar\n```";
19
- return { output: patch, adapter: "local-model" };
20
- }
21
- async getPrompts() {
22
- return {
23
- jobPrompt: "You are a worker.",
24
- characterPrompt: "Be concise.",
25
- commandPrompts: { "work-on-tasks": "Apply patches carefully." },
26
- };
27
- }
28
- }
29
-
30
- class StubAgentServiceNoPlus {
31
- async resolveAgent() {
32
- return { id: "agent-1", slug: "agent-1", adapter: "local-model", defaultModel: "stub" } as any;
33
- }
34
- async invoke(_id: string, _req: any) {
35
- const patch = [
36
- "```patch",
37
- "*** Begin Patch",
38
- "*** Add File: hello.txt",
39
- "hello world",
40
- "*** End Patch",
41
- "```",
42
- ].join("\n");
43
- return { output: patch, adapter: "local-model" };
44
- }
45
- async getPrompts() {
46
- return {
47
- jobPrompt: "You are a worker.",
48
- characterPrompt: "Be concise.",
49
- commandPrompts: { "work-on-tasks": "Apply patches carefully." },
50
- };
51
- }
52
- }
53
-
54
- class StubDocdex {
55
- async search() {
56
- return [];
57
- }
58
- async close() {}
59
- }
60
-
61
- class StubRepo {
62
- async getWorkspaceDefaults() {
63
- return [];
64
- }
65
- async close() {}
66
- }
67
-
68
- class StubRoutingService {
69
- async resolveAgentForCommand() {
70
- return {
71
- agent: { id: "agent-1", slug: "agent-1", adapter: "local-model", defaultModel: "stub" } as any,
72
- agentId: "agent-1",
73
- agentSlug: "agent-1",
74
- model: "stub",
75
- capabilities: [],
76
- healthStatus: "healthy",
77
- source: "override",
78
- routingPreview: { workspaceId: "ws", commandName: "work-on-tasks" } as any,
79
- };
80
- }
81
- }
82
-
83
- class StubVcs {
84
- async ensureRepo(_cwd: string) {}
85
- async ensureBaseBranch(_cwd: string, _base: string) {}
86
- async branchExists(_cwd: string, _branch: string) {
87
- return false;
88
- }
89
- async checkoutBranch(_cwd: string, _branch: string) {}
90
- async createOrCheckoutBranch(_cwd: string, _branch: string, _base: string) {}
91
- async applyPatch(_cwd: string, _patch: string) {}
92
- async pull(_cwd: string, _remote: string, _branch: string, _ffOnly = true) {}
93
- async conflictPaths(_cwd?: string) {
94
- return [];
95
- }
96
- async currentBranch(_cwd?: string) {
97
- return "mcoda-dev";
98
- }
99
- async ensureClean(_cwd: string, _ignoreDotMcoda = true) {}
100
- async dirtyPaths(_cwd?: string) {
101
- return [];
102
- }
103
- async stage(_cwd: string, _paths: string[]) {}
104
- async status(_cwd?: string) {
105
- return " M tmp.txt";
106
- }
107
- async commit(_cwd: string, _message: string) {}
108
- async lastCommitSha(_cwd?: string) {
109
- return "abc123";
110
- }
111
- async hasRemote(_cwd?: string) {
112
- return false;
113
- }
114
- async push(_cwd: string, _remote: string, _branch: string) {}
115
- async merge(_cwd: string, _source: string, _target: string) {}
116
- }
117
-
118
- class RecordingVcs extends StubVcs {
119
- patches: string[] = [];
120
- override async applyPatch(_cwd: string, patch: string) {
121
- this.patches.push(patch);
122
- if (!patch.includes("+hello world")) {
123
- throw new Error("patch missing content");
124
- }
125
- }
126
- override async status() {
127
- return "";
128
- }
129
- }
130
-
131
- const setupWorkspace = async () => {
132
- const dir = await fs.mkdtemp(path.join(os.tmpdir(), "mcoda-work-"));
133
- const workspace = await WorkspaceResolver.resolveWorkspace({ cwd: dir, explicitWorkspace: dir });
134
- const repo = await WorkspaceRepository.create(workspace.workspaceRoot);
135
- const project = await repo.createProjectIfMissing({ key: "proj", name: "proj" });
136
- const [epic] = await repo.insertEpics(
137
- [
138
- {
139
- projectId: project.id,
140
- key: "proj-epic",
141
- title: "Epic",
142
- description: "",
143
- priority: 1,
144
- },
145
- ],
146
- false,
147
- );
148
- const [story] = await repo.insertStories(
149
- [
150
- {
151
- projectId: project.id,
152
- epicId: epic.id,
153
- key: "proj-epic-us-01",
154
- title: "Story",
155
- description: "",
156
- },
157
- ],
158
- false,
159
- );
160
- const tasks = await repo.insertTasks(
161
- [
162
- {
163
- projectId: project.id,
164
- epicId: epic.id,
165
- userStoryId: story.id,
166
- key: "proj-epic-us-01-t01",
167
- title: "Task A",
168
- description: "",
169
- status: "not_started",
170
- storyPoints: 1,
171
- },
172
- {
173
- projectId: project.id,
174
- epicId: epic.id,
175
- userStoryId: story.id,
176
- key: "proj-epic-us-01-t02",
177
- title: "Task B",
178
- description: "",
179
- status: "not_started",
180
- storyPoints: 2,
181
- },
182
- ],
183
- false,
184
- );
185
- return { dir, workspace, repo, tasks };
186
- };
187
-
188
- const cleanupWorkspace = async (dir: string, repo: WorkspaceRepository) => {
189
- try {
190
- await repo.close();
191
- } catch {
192
- /* ignore */
193
- }
194
- await fs.rm(dir, { recursive: true, force: true });
195
- };
196
-
197
- test("workOnTasks marks tasks ready_to_review and records task runs", async () => {
198
- const { dir, workspace, repo, tasks } = await setupWorkspace();
199
- const jobService = new JobService(workspace.workspaceRoot, repo);
200
- const selectionService = new TaskSelectionService(workspace, repo);
201
- const stateService = new TaskStateService(repo);
202
- const service = new WorkOnTasksService(workspace, {
203
- agentService: new StubAgentService() as any,
204
- docdex: new StubDocdex() as any,
205
- jobService,
206
- workspaceRepo: repo,
207
- selectionService,
208
- stateService,
209
- repo: new StubRepo() as any,
210
- routingService: new StubRoutingService() as any,
211
- vcsClient: new StubVcs() as any,
212
- });
213
-
214
- try {
215
- const result = await service.workOnTasks({
216
- workspace,
217
- projectKey: "proj",
218
- agentStream: false,
219
- dryRun: false,
220
- });
221
- assert.equal(result.results.length, 2);
222
- const updatedA = await repo.getTaskByKey(tasks[0].key);
223
- const updatedB = await repo.getTaskByKey(tasks[1].key);
224
- assert.equal(updatedA?.status, "ready_to_review");
225
- assert.equal(updatedB?.status, "ready_to_review");
226
- const db = repo.getDb();
227
- const taskRuns = await db.all<{ status: string }[]>("SELECT status FROM task_runs WHERE command = 'work-on-tasks'");
228
- assert.equal(taskRuns.length, 2);
229
- assert.ok(taskRuns.every((r) => r.status === "succeeded"));
230
- const jobs = await db.all<{ state: string }[]>("SELECT state FROM jobs");
231
- assert.ok(jobs.some((j) => j.state === "completed"));
232
- const tokens = await db.all<{ tokens_prompt: number }[]>("SELECT tokens_prompt FROM token_usage");
233
- assert.equal(tokens.length, 2);
234
- const logs = await db.all<{ source: string }[]>("SELECT source FROM task_logs");
235
- assert.ok(logs.some((l) => l.source === "agent"));
236
- assert.ok(logs.some((l) => l.source === "finalize"));
237
- const commandRunRow = await db.get<{ sp_processed: number | null }>(
238
- "SELECT sp_processed FROM command_runs WHERE id = ?",
239
- result.commandRunId,
240
- );
241
- assert.equal(commandRunRow?.sp_processed, 3);
242
- const checkpointPath = path.join(workspace.workspaceRoot, ".mcoda", "jobs", result.jobId, "work", "state.json");
243
- const exists = await fs.stat(checkpointPath).then(() => true, () => false);
244
- assert.equal(exists, true);
245
- } finally {
246
- await service.close();
247
- await cleanupWorkspace(dir, repo);
248
- }
249
- });
250
-
251
- test("workOnTasks handles apply_patch add-file output without leading '+' lines", async () => {
252
- const { dir, workspace, repo } = await setupWorkspace();
253
- const jobService = new JobService(workspace.workspaceRoot, repo);
254
- const selectionService = new TaskSelectionService(workspace, repo);
255
- const stateService = new TaskStateService(repo);
256
- const vcs = new RecordingVcs();
257
- const service = new WorkOnTasksService(workspace, {
258
- agentService: new StubAgentServiceNoPlus() as any,
259
- docdex: new StubDocdex() as any,
260
- jobService,
261
- workspaceRepo: repo,
262
- selectionService,
263
- stateService,
264
- repo: new StubRepo() as any,
265
- routingService: new StubRoutingService() as any,
266
- vcsClient: vcs as any,
267
- });
268
-
269
- try {
270
- const result = await service.workOnTasks({
271
- workspace,
272
- projectKey: "proj",
273
- agentStream: false,
274
- dryRun: false,
275
- noCommit: true,
276
- limit: 1,
277
- });
278
- assert.equal(result.results.length, 1);
279
- assert.equal(result.results[0]?.status, "succeeded");
280
- assert.ok(vcs.patches.some((p) => p.includes("+hello world")));
281
- } finally {
282
- await service.close();
283
- await cleanupWorkspace(dir, repo);
284
- }
285
- });
File without changes
@@ -1,355 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import path from "node:path";
3
- import { PathHelper } from "@mcoda/shared";
4
- import { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
5
- import { JobRecord, JobService, JobState } from "./JobService.js";
6
- import { JobsApiClient } from "./JobsApiClient.js";
7
- import { TelemetryService, TokenUsageRow } from "../telemetry/TelemetryService.js";
8
-
9
- export interface JobListFilters {
10
- status?: string;
11
- type?: string;
12
- projectKey?: string;
13
- since?: string;
14
- limit?: number;
15
- }
16
-
17
- export interface JobSummary extends JobRecord {
18
- progressPct?: number | null;
19
- lastCheckpointStage?: string;
20
- lastCheckpointAt?: string;
21
- stateDetail?: string;
22
- jobState?: JobState;
23
- jobStateDetail?: string;
24
- totalUnits?: number;
25
- completedUnits?: number;
26
- }
27
-
28
- export interface CheckpointSummary {
29
- stage?: string;
30
- timestamp?: string;
31
- details?: Record<string, unknown>;
32
- path?: string;
33
- }
34
-
35
- export interface JobLogEntry {
36
- timestamp: string;
37
- sequence?: number | null;
38
- level?: string | null;
39
- source?: string | null;
40
- message?: string | null;
41
- taskId?: string | null;
42
- taskKey?: string | null;
43
- phase?: string | null;
44
- details?: Record<string, unknown> | null;
45
- }
46
-
47
- export interface JobLogsResult {
48
- entries: JobLogEntry[];
49
- cursor?: { timestamp: string; sequence?: number | null };
50
- }
51
-
52
- export interface TaskRunSnapshot {
53
- taskId?: string | null;
54
- taskKey?: string | null;
55
- status?: string | null;
56
- startedAt?: string | null;
57
- finishedAt?: string | null;
58
- command?: string | null;
59
- }
60
-
61
- export interface TaskRunSummary {
62
- totals: Record<string, number>;
63
- tasks: TaskRunSnapshot[];
64
- }
65
-
66
- export interface TokenUsageSummary {
67
- agentId?: string | null;
68
- modelName?: string | null;
69
- commandName?: string | null;
70
- commandRunId?: string | null;
71
- taskId?: string | null;
72
- tokensPrompt?: number | null;
73
- tokensCompletion?: number | null;
74
- tokensTotal?: number | null;
75
- cost?: number | null;
76
- }
77
-
78
- const parseSinceInput = (input?: string): string | undefined => {
79
- if (!input) return undefined;
80
- const trimmed = input.trim();
81
- const durationMatch = trimmed.match(/^(\d+)([smhdw])$/i);
82
- if (durationMatch) {
83
- const amount = Number(durationMatch[1]);
84
- const unit = durationMatch[2].toLowerCase();
85
- const multipliers: Record<string, number> = {
86
- s: 1000,
87
- m: 60 * 1000,
88
- h: 60 * 60 * 1000,
89
- d: 24 * 60 * 60 * 1000,
90
- w: 7 * 24 * 60 * 60 * 1000,
91
- };
92
- if (multipliers[unit]) {
93
- return new Date(Date.now() - amount * multipliers[unit]).toISOString();
94
- }
95
- }
96
- const parsed = Date.parse(trimmed);
97
- if (!Number.isNaN(parsed)) {
98
- return new Date(parsed).toISOString();
99
- }
100
- return undefined;
101
- };
102
-
103
- const computeProgress = (job: { totalItems?: number | null; processedItems?: number | null }): number | null => {
104
- const total = (job as any).totalUnits ?? job.totalItems ?? null;
105
- const completed = (job as any).completedUnits ?? job.processedItems ?? 0;
106
- if (!total || total <= 0) return null;
107
- return Math.round((completed / total) * 100);
108
- };
109
-
110
- const mapJobRow = (row: any): JobSummary => {
111
- const payload = row.payload_json ? JSON.parse(row.payload_json) : undefined;
112
- const totalUnits = row.total_units ?? row.totalUnits ?? row.total_items ?? row.totalItems ?? undefined;
113
- const completedUnits = row.completed_units ?? row.completedUnits ?? row.processed_items ?? row.processedItems ?? undefined;
114
- const progressPct = computeProgress({ totalItems: totalUnits, processedItems: completedUnits });
115
- return {
116
- id: row.id,
117
- type: row.type,
118
- state: row.state ?? row.job_state,
119
- jobState: row.job_state ?? row.state,
120
- jobStateDetail: row.job_state_detail ?? row.state_detail ?? row.errorSummary,
121
- stateDetail: row.job_state_detail ?? row.state_detail ?? row.errorSummary,
122
- commandName: row.command_name ?? row.commandName,
123
- commandRunId: row.command_run_id ?? row.commandRunId,
124
- workspaceId: row.workspace_id ?? row.workspaceId,
125
- projectKey: row.projectKey,
126
- payload,
127
- totalItems: totalUnits,
128
- processedItems: completedUnits,
129
- totalUnits,
130
- completedUnits,
131
- lastCheckpoint: row.last_checkpoint ?? row.lastCheckpoint,
132
- createdAt: row.created_at ?? row.createdAt,
133
- updatedAt: row.updated_at ?? row.updatedAt,
134
- completedAt: row.completed_at ?? row.completedAt,
135
- errorSummary: row.error_summary ?? row.errorSummary,
136
- progressPct,
137
- };
138
- };
139
-
140
- const matchesProject = (payload: Record<string, unknown> | undefined, projectKey?: string): boolean => {
141
- if (!projectKey) return true;
142
- if (!payload) return false;
143
- const candidates = [
144
- (payload as any).projectKey,
145
- (payload as any).project_id,
146
- (payload as any).project,
147
- (payload as any).projectId,
148
- ].filter(Boolean);
149
- return candidates.includes(projectKey);
150
- };
151
-
152
- export class JobInsightsService {
153
- private apiClient?: JobsApiClient;
154
-
155
- constructor(private workspace: WorkspaceResolution, private jobService: JobService, apiBaseUrl?: string) {
156
- if (apiBaseUrl) {
157
- this.apiClient = new JobsApiClient(workspace, apiBaseUrl);
158
- }
159
- }
160
-
161
- static async create(workspace: WorkspaceResolution): Promise<JobInsightsService> {
162
- const jobService = new JobService(workspace, undefined, { requireRepo: true });
163
- const apiBaseUrl =
164
- (workspace as any).config?.api?.baseUrl ??
165
- process.env.MCODA_API_BASE_URL ??
166
- process.env.MCODA_JOBS_API_URL ??
167
- undefined;
168
- return new JobInsightsService(workspace, jobService, apiBaseUrl);
169
- }
170
-
171
- async close(): Promise<void> {
172
- await this.jobService.close();
173
- }
174
-
175
- async listJobs(filters: JobListFilters = {}): Promise<JobSummary[]> {
176
- if (!this.apiClient) {
177
- throw new Error(
178
- "Jobs API is not configured; set MCODA_API_BASE_URL/MCODA_JOBS_API_URL or workspace api.baseUrl to query jobs.",
179
- );
180
- }
181
- const remote = (await this.apiClient.listJobs({
182
- status: filters.status,
183
- type: filters.type,
184
- project: filters.projectKey,
185
- since: filters.since,
186
- limit: filters.limit,
187
- })) ?? [];
188
- const rows = remote.map(mapJobRow);
189
- const sinceIso = parseSinceInput(filters.since);
190
- return rows
191
- .filter((job) => {
192
- const state = (job as any).jobState ?? job.state;
193
- return !filters.status || state === filters.status;
194
- })
195
- .filter((job) => (!filters.type || job.type === filters.type))
196
- .filter((job) => matchesProject(job.payload, filters.projectKey))
197
- .filter((job) => {
198
- if (!sinceIso) return true;
199
- const updated = job.updatedAt ?? job.createdAt;
200
- if (!updated) return true;
201
- return Date.parse(updated) >= Date.parse(sinceIso);
202
- })
203
- .slice(0, Number.isFinite(filters.limit) ? (filters.limit as number) : rows.length)
204
- .map((job) => ({ ...job, progressPct: computeProgress(job) }));
205
- }
206
-
207
- async getJob(jobId: string): Promise<JobSummary | undefined> {
208
- if (!this.apiClient) {
209
- throw new Error(
210
- "Jobs API is not configured; set MCODA_API_BASE_URL/MCODA_JOBS_API_URL or workspace api.baseUrl to read job status.",
211
- );
212
- }
213
- const remote = await this.apiClient.getJob(jobId);
214
- const job = remote ? mapJobRow(remote) : undefined;
215
- if (!job) return undefined;
216
- const detail = (job as any).job_state_detail ?? (job as any).jobStateDetail ?? job.errorSummary;
217
- const totalUnits = (job as any).totalUnits ?? job.totalItems ?? (job as any).total_units ?? undefined;
218
- const completedUnits = (job as any).completedUnits ?? job.processedItems ?? (job as any).completed_units ?? undefined;
219
- return {
220
- ...job,
221
- jobState: (job as any).job_state ?? job.state,
222
- jobStateDetail: detail,
223
- stateDetail: detail,
224
- totalUnits,
225
- completedUnits,
226
- progressPct: computeProgress({ totalItems: totalUnits, processedItems: completedUnits }),
227
- };
228
- }
229
-
230
- async latestCheckpoint(jobId: string): Promise<CheckpointSummary | undefined> {
231
- if (!this.apiClient) {
232
- throw new Error(
233
- "Jobs API is not configured; set MCODA_API_BASE_URL/MCODA_JOBS_API_URL or workspace api.baseUrl to read checkpoints.",
234
- );
235
- }
236
- const remote = await this.apiClient.getCheckpoint(jobId);
237
- if (remote && ((remote as any).stage || (remote as any).status || (remote as any).timestamp)) {
238
- const data = remote as any;
239
- return {
240
- stage: data.stage ?? data.status,
241
- timestamp: data.timestamp ?? data.created_at,
242
- details: data.details ?? data.progress,
243
- };
244
- }
245
- const checkpoints = await this.jobService.readCheckpoints(jobId);
246
- if (!checkpoints.length) return undefined;
247
- const last = checkpoints[checkpoints.length - 1] as any;
248
- return {
249
- stage: last.stage ?? last.status,
250
- timestamp: last.timestamp ?? last.created_at,
251
- details: last.details,
252
- };
253
- }
254
-
255
- async getJobLogs(
256
- jobId: string,
257
- options: { since?: string; after?: { timestamp: string; sequence?: number | null } } = {},
258
- ): Promise<JobLogsResult> {
259
- if (!this.apiClient) {
260
- throw new Error(
261
- "Jobs API is not configured; set MCODA_API_BASE_URL/MCODA_JOBS_API_URL or workspace api.baseUrl to stream job logs.",
262
- );
263
- }
264
- const remote = await this.apiClient.getLogs(jobId, options);
265
- if (!remote) return { entries: [], cursor: undefined };
266
- return remote;
267
- }
268
-
269
- async summarizeTasks(jobId: string): Promise<TaskRunSummary> {
270
- if (!this.apiClient) {
271
- throw new Error(
272
- "Jobs API is not configured; set MCODA_API_BASE_URL/MCODA_JOBS_API_URL or workspace api.baseUrl to read task summaries.",
273
- );
274
- }
275
- const remote = (await this.apiClient.getTasksSummary(jobId)) ?? { totals: {}, tasks: [] };
276
- const runs = (remote.tasks ?? []).map((t) => {
277
- const taskId = (t as any).taskId ?? t.task_id ?? null;
278
- const taskKey = (t as any).taskKey ?? t.task_key ?? null;
279
- const startedAt = (t as any).startedAt ?? t.started_at ?? null;
280
- const finishedAt = (t as any).finishedAt ?? t.finished_at ?? null;
281
- const command = (t as any).command ?? null;
282
- return { taskId, taskKey, status: t.status ?? null, startedAt, finishedAt, command };
283
- });
284
- const totalsRemote = remote.totals ?? {};
285
- const totals: Record<string, number> = {};
286
- for (const run of runs) {
287
- const status = run.status ?? "unknown";
288
- totals[status] = (totals[status] ?? 0) + 1;
289
- }
290
- Object.entries(totalsRemote ?? {}).forEach(([k, v]) => {
291
- totals[k] = v as number;
292
- });
293
- const tasks: TaskRunSnapshot[] = runs.map((run) => ({
294
- taskId: run.taskId ?? undefined,
295
- taskKey: run.taskKey ?? undefined,
296
- status: run.status ?? undefined,
297
- startedAt: run.startedAt ?? undefined,
298
- finishedAt: run.finishedAt ?? undefined,
299
- command: run.command ?? undefined,
300
- }));
301
- return { totals, tasks };
302
- }
303
-
304
- async summarizeTokenUsage(jobId: string): Promise<TokenUsageSummary[]> {
305
- const telemetry = await TelemetryService.create(this.workspace, { allowMissingTelemetry: false, requireApi: true });
306
- try {
307
- const summary = await telemetry.getSummary({
308
- jobId,
309
- groupBy: ["command", "agent", "model"],
310
- since: undefined,
311
- until: undefined,
312
- });
313
- return summary.map((row) => ({
314
- commandName: row.command_name ?? null,
315
- agentId: row.agent_id ?? null,
316
- modelName: row.model_name ?? null,
317
- tokensPrompt: row.tokens_prompt ?? null,
318
- tokensCompletion: row.tokens_completion ?? null,
319
- tokensTotal: row.tokens_total ?? null,
320
- cost: row.cost_estimate ?? null,
321
- }));
322
- } finally {
323
- await telemetry.close();
324
- }
325
- }
326
-
327
- async readJobLog(jobId: string): Promise<string> {
328
- return this.jobService.readLog(jobId);
329
- }
330
-
331
- async readJobLogTail(jobId: string, offset: number): Promise<{ content: string; nextOffset: number }> {
332
- const logPath = path.join(PathHelper.getWorkspaceDir(this.workspace.workspaceRoot), "jobs", jobId, "logs", "stream.log");
333
- try {
334
- const content = await fs.readFile(logPath, "utf8");
335
- const slice = offset > 0 ? content.slice(offset) : content;
336
- return { content: slice, nextOffset: content.length };
337
- } catch {
338
- return { content: "", nextOffset: offset };
339
- }
340
- }
341
-
342
- async updateJobState(jobId: string, state: JobState, meta?: Record<string, unknown>): Promise<void> {
343
- await this.jobService.updateJobStatus(jobId, state, meta);
344
- }
345
-
346
- async cancelJob(jobId: string, options: { force?: boolean; reason?: string } = {}): Promise<void> {
347
- if (this.apiClient) {
348
- await this.apiClient.cancelJob(jobId, options);
349
- return;
350
- }
351
- throw new Error(
352
- "Cancel requires the jobs API; set MCODA_API_BASE_URL or workspace baseUrl so the cancel endpoint can enforce state transitions.",
353
- );
354
- }
355
- }