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,494 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import { Connection, WorkspaceRepository, GlobalRepository, type TaskCommentRow, type Database } from "@mcoda/db";
3
- import { PathHelper } from "@mcoda/shared";
4
- import type { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
5
- import { TaskApiResolver } from "./TaskApiResolver.js";
6
-
7
- const hasTables = async (db: Database, required: string[]): Promise<boolean> => {
8
- const placeholders = required.map(() => "?").join(", ");
9
- const rows = await db.all<{ name: string }[]>(
10
- `SELECT name FROM sqlite_master WHERE type = 'table' AND name IN (${placeholders})`,
11
- required,
12
- );
13
- return rows.length === required.length;
14
- };
15
-
16
- export interface DependencySummary {
17
- taskId: string;
18
- key: string;
19
- status: string;
20
- relationType: string;
21
- }
22
-
23
- export interface TaskLogSummary {
24
- taskRunId: string;
25
- timestamp: string;
26
- level?: string | null;
27
- source?: string | null;
28
- message?: string | null;
29
- command?: string;
30
- status?: string;
31
- details?: Record<string, unknown> | null;
32
- }
33
-
34
- export interface TaskRevisionSummary {
35
- id: string;
36
- jobId?: string | null;
37
- commandRunId?: string | null;
38
- changedAt: string;
39
- statusBefore?: string;
40
- statusAfter?: string;
41
- storyPointsBefore?: number | null;
42
- storyPointsAfter?: number | null;
43
- changedFields?: string[];
44
- snapshotBefore?: Record<string, unknown> | null;
45
- snapshotAfter?: Record<string, unknown> | null;
46
- }
47
-
48
- export interface TaskDetailRecord {
49
- id: string;
50
- key: string;
51
- title: string;
52
- description?: string | null;
53
- type?: string | null;
54
- status: string;
55
- storyPoints?: number | null;
56
- priority?: number | null;
57
- assignedAgentId?: string | null;
58
- assignedAgentSlug?: string | null;
59
- assigneeHuman?: string | null;
60
- vcsBranch?: string | null;
61
- vcsBaseBranch?: string | null;
62
- vcsLastCommitSha?: string | null;
63
- metadata?: Record<string, unknown> | null;
64
- project: { id: string; key: string; name?: string | null };
65
- epic: { id: string; key: string; title: string };
66
- story: { id: string; key: string; title: string };
67
- createdAt: string;
68
- updatedAt: string;
69
- }
70
-
71
- export interface TaskDetailResult {
72
- task: TaskDetailRecord;
73
- dependencies: { upstream: DependencySummary[]; downstream: DependencySummary[] };
74
- comments: TaskCommentRow[];
75
- logs?: TaskLogSummary[];
76
- history?: TaskRevisionSummary[];
77
- }
78
-
79
- export interface TaskDetailOptions {
80
- taskKey: string;
81
- projectKey?: string;
82
- includeLogs?: boolean;
83
- includeHistory?: boolean;
84
- commentsLimit?: number;
85
- logsLimit?: number;
86
- historyLimit?: number;
87
- }
88
-
89
- interface TaskRowWithRelations {
90
- task_id: string;
91
- task_key: string;
92
- task_title: string;
93
- task_description: string | null;
94
- task_type: string | null;
95
- task_status: string;
96
- task_story_points: number | null;
97
- task_priority: number | null;
98
- assigned_agent_id: string | null;
99
- assignee_human: string | null;
100
- vcs_branch: string | null;
101
- vcs_base_branch: string | null;
102
- vcs_last_commit_sha: string | null;
103
- metadata_json: string | null;
104
- created_at: string;
105
- updated_at: string;
106
- project_id: string;
107
- project_key: string;
108
- project_name: string | null;
109
- epic_id: string;
110
- epic_key: string;
111
- epic_title: string;
112
- story_id: string;
113
- story_key: string;
114
- story_title: string;
115
- }
116
-
117
- export class TaskDetailService {
118
- private constructor(
119
- private workspace: WorkspaceResolution,
120
- private db: Database,
121
- private repo: WorkspaceRepository,
122
- private globalRepo?: GlobalRepository,
123
- private apiResolver: TaskApiResolver = new TaskApiResolver(),
124
- ) {}
125
-
126
- static async create(workspace: WorkspaceResolution): Promise<TaskDetailService> {
127
- const dbPath = PathHelper.getWorkspaceDbPath(workspace.workspaceRoot);
128
- try {
129
- await fs.access(dbPath);
130
- } catch {
131
- throw new Error(`No workspace DB found at ${dbPath}. Run mcoda create-tasks first or ensure it exists.`);
132
- }
133
- const connection = await Connection.open(dbPath);
134
- const ok = await hasTables(connection.db, ["projects", "epics", "user_stories", "tasks"]);
135
- if (!ok) {
136
- await connection.close();
137
- throw new Error(`Workspace DB at ${dbPath} is missing required tables. Re-run create-tasks to seed it.`);
138
- }
139
- const repo = new WorkspaceRepository(connection.db, connection);
140
- return new TaskDetailService(workspace, connection.db, repo, undefined, new TaskApiResolver());
141
- }
142
-
143
- async close(): Promise<void> {
144
- await this.repo.close();
145
- if (this.globalRepo) {
146
- await this.globalRepo.close();
147
- }
148
- }
149
-
150
- getRepository(): WorkspaceRepository {
151
- return this.repo;
152
- }
153
-
154
- async getTaskDetail(options: TaskDetailOptions): Promise<TaskDetailResult> {
155
- if (!options.taskKey) {
156
- throw new Error("taskKey is required");
157
- }
158
- const task = await this.resolveTask(options.taskKey, options.projectKey);
159
- const dependencies = await this.getDependencies(task.id);
160
- const comments = await this.repo.listTaskComments(task.id, { limit: options.commentsLimit ?? 20 });
161
- const logs = options.includeLogs ? await this.getLogs(task.id, options.logsLimit ?? 20) : undefined;
162
- const history = options.includeHistory ? await this.getHistory(task.id, options.historyLimit ?? 20) : undefined;
163
-
164
- return {
165
- task,
166
- dependencies,
167
- comments,
168
- logs,
169
- history,
170
- };
171
- }
172
-
173
- private async resolveTask(taskKey: string, projectKey?: string): Promise<TaskDetailRecord> {
174
- const openApiTaskId = await this.apiResolver.resolveTaskId(taskKey, projectKey);
175
- if (openApiTaskId) {
176
- return this.resolveTaskById(openApiTaskId);
177
- }
178
-
179
- const clauses = ["t.key = ?"];
180
- const params: any[] = [taskKey];
181
- if (projectKey) {
182
- clauses.push("p.key = ?");
183
- params.push(projectKey);
184
- }
185
- const where = `WHERE ${clauses.join(" AND ")}`;
186
- const rows = await this.db.all<TaskRowWithRelations[]>(
187
- `
188
- SELECT
189
- t.id AS task_id,
190
- t.key AS task_key,
191
- t.title AS task_title,
192
- t.description AS task_description,
193
- t.type AS task_type,
194
- t.status AS task_status,
195
- t.story_points AS task_story_points,
196
- t.priority AS task_priority,
197
- t.assigned_agent_id AS assigned_agent_id,
198
- t.assignee_human AS assignee_human,
199
- t.vcs_branch AS vcs_branch,
200
- t.vcs_base_branch AS vcs_base_branch,
201
- t.vcs_last_commit_sha AS vcs_last_commit_sha,
202
- t.metadata_json AS metadata_json,
203
- t.created_at AS created_at,
204
- t.updated_at AS updated_at,
205
- p.id AS project_id,
206
- p.key AS project_key,
207
- p.name AS project_name,
208
- e.id AS epic_id,
209
- e.key AS epic_key,
210
- e.title AS epic_title,
211
- us.id AS story_id,
212
- us.key AS story_key,
213
- us.title AS story_title
214
- FROM tasks t
215
- INNER JOIN projects p ON p.id = t.project_id
216
- INNER JOIN epics e ON e.id = t.epic_id
217
- INNER JOIN user_stories us ON us.id = t.user_story_id
218
- ${where}
219
- `,
220
- params,
221
- );
222
-
223
- if (!rows || rows.length === 0) {
224
- const suffix = projectKey ? ` in project "${projectKey}"` : "";
225
- throw new Error(`No task with key "${taskKey}"${suffix}.`);
226
- }
227
- if (rows.length > 1 && !projectKey) {
228
- throw new Error(`Multiple tasks found with key "${taskKey}"; please specify --project.`);
229
- }
230
- const row = rows[0];
231
- const assignedAgentSlug = await this.resolveAgentSlug(row.assigned_agent_id);
232
- return {
233
- id: row.task_id,
234
- key: row.task_key,
235
- title: row.task_title,
236
- description: row.task_description,
237
- type: row.task_type,
238
- status: row.task_status,
239
- storyPoints: row.task_story_points,
240
- priority: row.task_priority,
241
- assignedAgentId: row.assigned_agent_id,
242
- assignedAgentSlug: assignedAgentSlug ?? null,
243
- assigneeHuman: row.assignee_human,
244
- vcsBranch: row.vcs_branch,
245
- vcsBaseBranch: row.vcs_base_branch,
246
- vcsLastCommitSha: row.vcs_last_commit_sha,
247
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : null,
248
- project: {
249
- id: row.project_id,
250
- key: row.project_key,
251
- name: row.project_name,
252
- },
253
- epic: {
254
- id: row.epic_id,
255
- key: row.epic_key,
256
- title: row.epic_title,
257
- },
258
- story: {
259
- id: row.story_id,
260
- key: row.story_key,
261
- title: row.story_title,
262
- },
263
- createdAt: row.created_at,
264
- updatedAt: row.updated_at,
265
- };
266
- }
267
-
268
- private async getDependencies(taskId: string): Promise<{ upstream: DependencySummary[]; downstream: DependencySummary[] }> {
269
- const upstream = await this.db.all<DependencySummary[]>(
270
- `
271
- SELECT td.depends_on_task_id AS taskId, dep.key AS key, dep.status AS status, td.relation_type AS relationType
272
- FROM task_dependencies td
273
- INNER JOIN tasks dep ON dep.id = td.depends_on_task_id
274
- WHERE td.task_id = ?
275
- ORDER BY dep.key
276
- `,
277
- taskId,
278
- );
279
- const downstream = await this.db.all<DependencySummary[]>(
280
- `
281
- SELECT td.task_id AS taskId, t.key AS key, t.status AS status, td.relation_type AS relationType
282
- FROM task_dependencies td
283
- INNER JOIN tasks t ON t.id = td.task_id
284
- WHERE td.depends_on_task_id = ?
285
- ORDER BY t.key
286
- `,
287
- taskId,
288
- );
289
- return { upstream: upstream ?? [], downstream: downstream ?? [] };
290
- }
291
-
292
- private async resolveTaskById(taskId: string): Promise<TaskDetailRecord> {
293
- const rows = await this.db.all<TaskRowWithRelations[]>(
294
- `
295
- SELECT
296
- t.id AS task_id,
297
- t.key AS task_key,
298
- t.title AS task_title,
299
- t.description AS task_description,
300
- t.type AS task_type,
301
- t.status AS task_status,
302
- t.story_points AS task_story_points,
303
- t.priority AS task_priority,
304
- t.assigned_agent_id AS assigned_agent_id,
305
- t.assignee_human AS assignee_human,
306
- t.vcs_branch AS vcs_branch,
307
- t.vcs_base_branch AS vcs_base_branch,
308
- t.vcs_last_commit_sha AS vcs_last_commit_sha,
309
- t.metadata_json AS metadata_json,
310
- t.created_at AS created_at,
311
- t.updated_at AS updated_at,
312
- p.id AS project_id,
313
- p.key AS project_key,
314
- p.name AS project_name,
315
- e.id AS epic_id,
316
- e.key AS epic_key,
317
- e.title AS epic_title,
318
- us.id AS story_id,
319
- us.key AS story_key,
320
- us.title AS story_title
321
- FROM tasks t
322
- INNER JOIN projects p ON p.id = t.project_id
323
- INNER JOIN epics e ON e.id = t.epic_id
324
- INNER JOIN user_stories us ON us.id = t.user_story_id
325
- WHERE t.id = ?
326
- `,
327
- [taskId],
328
- );
329
- if (!rows || rows.length === 0) {
330
- throw new Error(`Task with id "${taskId}" not found in local DB.`);
331
- }
332
- const row = rows[0];
333
- const assignedAgentSlug = await this.resolveAgentSlug(row.assigned_agent_id);
334
- return {
335
- id: row.task_id,
336
- key: row.task_key,
337
- title: row.task_title,
338
- description: row.task_description,
339
- type: row.task_type,
340
- status: row.task_status,
341
- storyPoints: row.task_story_points,
342
- priority: row.task_priority,
343
- assignedAgentId: row.assigned_agent_id,
344
- assignedAgentSlug: assignedAgentSlug ?? null,
345
- assigneeHuman: row.assignee_human,
346
- vcsBranch: row.vcs_branch,
347
- vcsBaseBranch: row.vcs_base_branch,
348
- vcsLastCommitSha: row.vcs_last_commit_sha,
349
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : null,
350
- project: {
351
- id: row.project_id,
352
- key: row.project_key,
353
- name: row.project_name,
354
- },
355
- epic: {
356
- id: row.epic_id,
357
- key: row.epic_key,
358
- title: row.epic_title,
359
- },
360
- story: {
361
- id: row.story_id,
362
- key: row.story_key,
363
- title: row.story_title,
364
- },
365
- createdAt: row.created_at,
366
- updatedAt: row.updated_at,
367
- };
368
- }
369
-
370
- private async getLogs(taskId: string, limit: number): Promise<TaskLogSummary[]> {
371
- const rows = await this.db.all<
372
- {
373
- task_run_id: string;
374
- timestamp: string;
375
- level: string | null;
376
- source: string | null;
377
- message: string | null;
378
- details_json: string | null;
379
- command: string;
380
- status: string;
381
- }[]
382
- >(
383
- `
384
- SELECT l.task_run_id, l.timestamp, l.level, l.source, l.message, l.details_json, r.command, r.status
385
- FROM task_logs l
386
- INNER JOIN task_runs r ON r.id = l.task_run_id
387
- WHERE r.task_id = ?
388
- ORDER BY datetime(l.timestamp) DESC
389
- LIMIT ?
390
- `,
391
- taskId,
392
- limit,
393
- );
394
- return (rows ?? []).map((row) => ({
395
- taskRunId: row.task_run_id,
396
- timestamp: row.timestamp,
397
- level: row.level,
398
- source: row.source,
399
- message: row.message,
400
- command: row.command,
401
- status: row.status,
402
- details: row.details_json ? (JSON.parse(row.details_json) as Record<string, unknown>) : null,
403
- }));
404
- }
405
-
406
- private async resolveAgentSlug(agentId: string | null): Promise<string | undefined> {
407
- if (!agentId) return undefined;
408
- if (!this.globalRepo) {
409
- this.globalRepo = await GlobalRepository.create();
410
- }
411
- const agent = await this.globalRepo.getAgentById(agentId);
412
- return agent?.slug ?? undefined;
413
- }
414
-
415
- private async getHistory(taskId: string, limit: number): Promise<TaskRevisionSummary[]> {
416
- const rows = await this.db.all<
417
- {
418
- id: string;
419
- job_id: string | null;
420
- command_run_id: string | null;
421
- snapshot_before_json: string | null;
422
- snapshot_after_json: string | null;
423
- created_at: string;
424
- }[]
425
- >(
426
- `
427
- SELECT id, job_id, command_run_id, snapshot_before_json, snapshot_after_json, created_at
428
- FROM task_revisions
429
- WHERE task_id = ?
430
- ORDER BY datetime(created_at) DESC
431
- LIMIT ?
432
- `,
433
- taskId,
434
- limit,
435
- );
436
-
437
- return (rows ?? []).map((row) => {
438
- const before = row.snapshot_before_json ? this.safeParse(row.snapshot_before_json) : null;
439
- const after = row.snapshot_after_json ? this.safeParse(row.snapshot_after_json) : null;
440
- const statusBefore = this.pickField<string>(before, ["status", "task_status"]);
441
- const statusAfter = this.pickField<string>(after, ["status", "task_status"]);
442
- const spBefore = this.pickField<number | null>(before, ["story_points", "storyPoints", "task_story_points"]);
443
- const spAfter = this.pickField<number | null>(after, ["story_points", "storyPoints", "task_story_points"]);
444
- const changedFields = this.diffFields(before, after);
445
-
446
- return {
447
- id: row.id,
448
- jobId: row.job_id,
449
- commandRunId: row.command_run_id,
450
- changedAt: row.created_at,
451
- statusBefore: statusBefore ?? undefined,
452
- statusAfter: statusAfter ?? undefined,
453
- storyPointsBefore: spBefore ?? null,
454
- storyPointsAfter: spAfter ?? null,
455
- changedFields,
456
- snapshotBefore: before,
457
- snapshotAfter: after,
458
- };
459
- });
460
- }
461
-
462
- private safeParse(raw: string): Record<string, unknown> | null {
463
- try {
464
- return JSON.parse(raw) as Record<string, unknown>;
465
- } catch {
466
- return null;
467
- }
468
- }
469
-
470
- private pickField<T>(obj: Record<string, unknown> | null, keys: string[]): T | null | undefined {
471
- if (!obj) return undefined;
472
- for (const key of keys) {
473
- if (obj[key] !== undefined) return obj[key] as T;
474
- }
475
- return undefined;
476
- }
477
-
478
- private diffFields(
479
- before: Record<string, unknown> | null,
480
- after: Record<string, unknown> | null,
481
- ): string[] | undefined {
482
- if (!before || !after) return undefined;
483
- const keys = new Set([...Object.keys(before), ...Object.keys(after)]);
484
- const changed: string[] = [];
485
- for (const key of keys) {
486
- const lhs = before[key];
487
- const rhs = after[key];
488
- const same = JSON.stringify(lhs) === JSON.stringify(rhs);
489
- if (!same) changed.push(key);
490
- }
491
- return changed.length ? changed : undefined;
492
- }
493
-
494
- }
@@ -1,41 +0,0 @@
1
- import { describe, it, beforeEach, afterEach } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { TaskApiResolver } from "../TaskApiResolver.js";
4
-
5
- describe("TaskApiResolver", () => {
6
- const originalFetch = globalThis.fetch;
7
-
8
- beforeEach(() => {
9
- globalThis.fetch = (async (input: RequestInfo | URL) => {
10
- const url = typeof input === "string" ? new URL(input) : input instanceof URL ? input : new URL(input.url);
11
- if (url.searchParams.get("key") === "task-1") {
12
- return {
13
- ok: true,
14
- status: 200,
15
- json: async () => [{ id: "task-id-1" }],
16
- } as Response;
17
- }
18
- return {
19
- ok: true,
20
- status: 200,
21
- json: async () => [],
22
- } as Response;
23
- }) as typeof fetch;
24
- });
25
-
26
- afterEach(() => {
27
- globalThis.fetch = originalFetch;
28
- });
29
-
30
- it("returns undefined when no base url is configured", async () => {
31
- const resolver = new TaskApiResolver();
32
- const result = await resolver.resolveTaskId("task-1");
33
- assert.equal(result, undefined);
34
- });
35
-
36
- it("resolves task id from API response", async () => {
37
- const resolver = new TaskApiResolver("https://api.test");
38
- const result = await resolver.resolveTaskId("task-1");
39
- assert.equal(result, "task-id-1");
40
- });
41
- });
@@ -1,178 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { describe, it, beforeEach, afterEach } from "node:test";
3
- import fs from "node:fs/promises";
4
- import os from "node:os";
5
- import path from "node:path";
6
- import { Connection, WorkspaceMigrations, WorkspaceRepository } from "@mcoda/db";
7
- import { PathHelper } from "@mcoda/shared";
8
- import { TaskDetailService } from "../TaskDetailService.js";
9
- import type { WorkspaceResolution } from "../../../workspace/WorkspaceManager.js";
10
-
11
- const workspaceFromRoot = (workspaceRoot: string): WorkspaceResolution => ({
12
- workspaceRoot,
13
- workspaceId: workspaceRoot,
14
- mcodaDir: path.join(workspaceRoot, ".mcoda"),
15
- id: workspaceRoot,
16
- legacyWorkspaceIds: [],
17
- workspaceDbPath: PathHelper.getWorkspaceDbPath(workspaceRoot),
18
- globalDbPath: PathHelper.getGlobalDbPath(),
19
- });
20
-
21
- describe("TaskDetailService", () => {
22
- let workspaceRoot: string;
23
-
24
- beforeEach(async () => {
25
- workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "mcoda-task-detail-"));
26
- await fs.mkdir(path.join(workspaceRoot, ".mcoda"), { recursive: true });
27
- const dbPath = PathHelper.getWorkspaceDbPath(workspaceRoot);
28
- const connection = await Connection.open(dbPath);
29
- await WorkspaceMigrations.run(connection.db);
30
- const repo = new WorkspaceRepository(connection.db, connection);
31
-
32
- const project = await repo.createProjectIfMissing({ key: "WEB", name: "Web" });
33
- const [epic] = await repo.insertEpics(
34
- [
35
- {
36
- projectId: project.id,
37
- key: "web-01",
38
- title: "Auth",
39
- description: "Authentication work",
40
- priority: 1,
41
- },
42
- ],
43
- true,
44
- );
45
- const [story] = await repo.insertStories(
46
- [
47
- {
48
- projectId: project.id,
49
- epicId: epic.id,
50
- key: "web-01-us-01",
51
- title: "Login",
52
- description: "Login feature",
53
- priority: 1,
54
- },
55
- ],
56
- true,
57
- );
58
- const [upstream, target, downstream] = await repo.insertTasks(
59
- [
60
- {
61
- projectId: project.id,
62
- epicId: epic.id,
63
- userStoryId: story.id,
64
- key: "web-01-us-01-t00",
65
- title: "Design flow",
66
- description: "Design login flow",
67
- status: "not_started",
68
- storyPoints: 2,
69
- priority: 2,
70
- },
71
- {
72
- projectId: project.id,
73
- epicId: epic.id,
74
- userStoryId: story.id,
75
- key: "web-01-us-01-t01",
76
- title: "Implement login",
77
- description: "Implement UI and API wiring",
78
- status: "in_progress",
79
- storyPoints: 5,
80
- priority: 1,
81
- assigneeHuman: "alice",
82
- vcsBranch: "mcoda/task/web-01-us-01-t01",
83
- vcsBaseBranch: "mcoda-dev",
84
- vcsLastCommitSha: "abcdef123456",
85
- },
86
- {
87
- projectId: project.id,
88
- epicId: epic.id,
89
- userStoryId: story.id,
90
- key: "web-01-us-01-t02",
91
- title: "Wire analytics",
92
- description: "Add tracking",
93
- status: "blocked",
94
- storyPoints: 3,
95
- priority: 3,
96
- },
97
- ],
98
- true,
99
- );
100
-
101
- await repo.insertTaskDependencies(
102
- [
103
- { taskId: target.id, dependsOnTaskId: upstream.id, relationType: "blocks" },
104
- { taskId: downstream.id, dependsOnTaskId: target.id, relationType: "blocks" },
105
- ],
106
- true,
107
- );
108
-
109
- const now = new Date().toISOString();
110
- const run = await repo.createTaskRun({
111
- taskId: target.id,
112
- command: "work-on-tasks",
113
- status: "succeeded",
114
- startedAt: now,
115
- finishedAt: now,
116
- gitBranch: "mcoda/task/web-01-us-01-t01",
117
- gitBaseBranch: "mcoda-dev",
118
- gitCommitSha: "abcdef123456",
119
- });
120
- await repo.insertTaskLog({
121
- taskRunId: run.id,
122
- sequence: 0,
123
- timestamp: now,
124
- level: "info",
125
- source: "work-on-tasks",
126
- message: "Completed login implementation",
127
- details: { summary: "done" },
128
- });
129
-
130
- await repo.createTaskComment({
131
- taskId: target.id,
132
- sourceCommand: "work-on-tasks",
133
- authorType: "agent",
134
- authorAgentId: "agent-1",
135
- category: "note",
136
- body: "Remember to add forgot password later.",
137
- createdAt: now,
138
- });
139
-
140
- await repo.insertTaskRevision({
141
- taskId: target.id,
142
- jobId: "job-1",
143
- commandRunId: "cmd-1",
144
- snapshotBefore: { status: "not_started", story_points: 3 },
145
- snapshotAfter: { status: "in_progress", story_points: 5 },
146
- createdAt: now,
147
- });
148
-
149
- await repo.close();
150
- });
151
-
152
- afterEach(async () => {
153
- await fs.rm(workspaceRoot, { recursive: true, force: true });
154
- });
155
-
156
- it("aggregates task detail with dependencies, comments, logs, and history", async () => {
157
- const workspace = workspaceFromRoot(workspaceRoot);
158
- const service = await TaskDetailService.create(workspace);
159
- const detail = await service.getTaskDetail({
160
- taskKey: "web-01-us-01-t01",
161
- includeLogs: true,
162
- includeHistory: true,
163
- });
164
- await service.close();
165
-
166
- assert.equal(detail.task.project.key, "WEB");
167
- assert.equal(detail.task.epic.key, "web-01");
168
- assert.equal(detail.task.story.key, "web-01-us-01");
169
- assert.equal(detail.task.vcsBranch, "mcoda/task/web-01-us-01-t01");
170
- assert.equal(detail.dependencies.upstream[0]?.key, "web-01-us-01-t00");
171
- assert.equal(detail.dependencies.downstream[0]?.key, "web-01-us-01-t02");
172
- assert.equal(detail.comments.length, 1);
173
- assert.ok(detail.logs && detail.logs.length === 1);
174
- assert.equal(detail.logs?.[0]?.command, "work-on-tasks");
175
- assert.equal(detail.history?.[0]?.statusBefore, "not_started");
176
- assert.equal(detail.history?.[0]?.statusAfter, "in_progress");
177
- });
178
- });
File without changes