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,580 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import { Connection, type Database } from "@mcoda/db";
3
- import { PathHelper } from "@mcoda/shared";
4
- import { TaskOrderingService } from "./TaskOrderingService.js";
5
- import { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
6
-
7
- type BacklogLane = "implementation" | "review" | "qa" | "done";
8
-
9
- const IMPLEMENTATION_STATUSES = new Set(["not_started", "in_progress", "blocked"]);
10
- const REVIEW_STATUSES = new Set(["ready_to_review"]);
11
- const QA_STATUSES = new Set(["ready_to_qa"]);
12
- const DONE_STATUSES = new Set(["completed", "cancelled"]);
13
-
14
- export interface BacklogTotals {
15
- implementation: { tasks: number; story_points: number };
16
- review: { tasks: number; story_points: number };
17
- qa: { tasks: number; story_points: number };
18
- done: { tasks: number; story_points: number };
19
- }
20
-
21
- export interface EpicBacklogSummary {
22
- epic_id: string;
23
- epic_key: string;
24
- title: string;
25
- priority: number | null;
26
- description?: string;
27
- totals: BacklogTotals;
28
- stories: StoryBacklogSummary[];
29
- }
30
-
31
- export interface StoryBacklogSummary {
32
- user_story_id: string;
33
- user_story_key: string;
34
- epic_key: string;
35
- title: string;
36
- description?: string;
37
- priority: number | null;
38
- status?: string;
39
- totals: BacklogTotals;
40
- }
41
-
42
- export interface TaskBacklogRow {
43
- task_id: string;
44
- task_key: string;
45
- epic_key: string;
46
- user_story_key: string;
47
- title: string;
48
- description: string;
49
- status: string;
50
- story_points: number | null;
51
- priority: number | null;
52
- assignee: string | null;
53
- dependency_keys: string[];
54
- }
55
-
56
- export interface BacklogSummary {
57
- scope: {
58
- project_id: string | null;
59
- project_key: string | null;
60
- epic_key?: string;
61
- user_story_key?: string;
62
- assignee?: string;
63
- };
64
- totals: BacklogTotals;
65
- epics: EpicBacklogSummary[];
66
- tasks: TaskBacklogRow[];
67
- }
68
-
69
- export interface BacklogQueryOptions {
70
- projectKey?: string;
71
- epicKey?: string;
72
- storyKey?: string;
73
- assignee?: string;
74
- statuses?: string[];
75
- orderByDependencies?: boolean;
76
- verbose?: boolean;
77
- }
78
-
79
- export interface BacklogResult {
80
- summary: BacklogSummary;
81
- warnings: string[];
82
- }
83
-
84
- interface RawTaskRow {
85
- task_id: string;
86
- task_key: string;
87
- task_title: string;
88
- task_description: string | null;
89
- task_status: string;
90
- task_story_points: number | null;
91
- task_priority: number | null;
92
- assignee_human: string | null;
93
- epic_id: string;
94
- epic_key: string;
95
- epic_title: string;
96
- epic_priority: number | null;
97
- epic_description: string | null;
98
- story_id: string;
99
- story_key: string;
100
- story_title: string;
101
- story_priority: number | null;
102
- story_description: string | null;
103
- }
104
-
105
- const emptyTotals = (): BacklogTotals => ({
106
- implementation: { tasks: 0, story_points: 0 },
107
- review: { tasks: 0, story_points: 0 },
108
- qa: { tasks: 0, story_points: 0 },
109
- done: { tasks: 0, story_points: 0 },
110
- });
111
-
112
- const bucketForStatus = (status: string): BacklogLane => {
113
- const normalized = status?.toLowerCase() ?? "";
114
- if (IMPLEMENTATION_STATUSES.has(normalized)) return "implementation";
115
- if (REVIEW_STATUSES.has(normalized)) return "review";
116
- if (QA_STATUSES.has(normalized)) return "qa";
117
- if (DONE_STATUSES.has(normalized)) return "done";
118
- return "implementation";
119
- };
120
-
121
- const addToTotals = (totals: BacklogTotals, lane: BacklogLane, storyPoints: number | null): void => {
122
- totals[lane].tasks += 1;
123
- if (typeof storyPoints === "number" && Number.isFinite(storyPoints)) {
124
- totals[lane].story_points += storyPoints;
125
- }
126
- };
127
-
128
- const truncate = (value: string | null | undefined, max = 100): string => {
129
- if (!value) return "";
130
- if (value.length <= max) return value;
131
- return `${value.slice(0, max - 3)}...`;
132
- };
133
-
134
- const hasTables = async (db: Database, required: string[]): Promise<boolean> => {
135
- const placeholders = required.map(() => "?").join(", ");
136
- const rows = await db.all<{ name: string }[]>(
137
- `SELECT name FROM sqlite_master WHERE type = 'table' AND name IN (${placeholders})`,
138
- required,
139
- );
140
- return rows.length === required.length;
141
- };
142
-
143
- const deriveStoryStatus = (statuses: Set<string>): string | undefined => {
144
- const order = ["completed", "cancelled", "ready_to_qa", "ready_to_review", "in_progress", "blocked", "not_started"];
145
- for (const status of order) {
146
- if (statuses.has(status)) return status;
147
- }
148
- return undefined;
149
- };
150
-
151
- export class BacklogService {
152
- private warnings: string[] = [];
153
- private epicPriority = new Map<string, number | null>();
154
- private storyPriority = new Map<string, number | null>();
155
-
156
- private constructor(
157
- private workspace: WorkspaceResolution,
158
- private db: Database,
159
- private connection: Connection,
160
- ) {}
161
-
162
- static async create(workspace: WorkspaceResolution): Promise<BacklogService> {
163
- const dbPath = PathHelper.getWorkspaceDbPath(workspace.workspaceRoot);
164
- try {
165
- await fs.access(dbPath);
166
- } catch {
167
- throw new Error(`No workspace DB found at ${dbPath}. Run mcoda init or create-tasks first.`);
168
- }
169
- const connection = await Connection.open(dbPath);
170
- const ok = await hasTables(connection.db, ["projects", "epics", "user_stories", "tasks"]);
171
- if (!ok) {
172
- await connection.close();
173
- throw new Error(`Workspace DB at ${dbPath} is missing required tables. Re-run create-tasks to seed it.`);
174
- }
175
- return new BacklogService(workspace, connection.db, connection);
176
- }
177
-
178
- async close(): Promise<void> {
179
- await this.connection.close();
180
- }
181
-
182
- async getBacklog(options: BacklogQueryOptions = {}): Promise<BacklogResult> {
183
- this.warnings = [];
184
- this.epicPriority.clear();
185
- this.storyPriority.clear();
186
- const project = options.projectKey ? await this.getProject(options.projectKey) : undefined;
187
- if (options.projectKey && !project) {
188
- throw new Error(`Unknown project key: ${options.projectKey}`);
189
- }
190
- const epic = options.epicKey ? await this.getEpic(options.epicKey, project?.id) : undefined;
191
- if (options.epicKey && !epic) {
192
- throw new Error(`Unknown epic key: ${options.epicKey}`);
193
- }
194
- const story = options.storyKey ? await this.getStory(options.storyKey, epic?.id ?? project?.id) : undefined;
195
- if (options.storyKey && !story) {
196
- throw new Error(`Unknown user story key: ${options.storyKey}`);
197
- }
198
-
199
- const tasks = await this.fetchTasks({
200
- projectId: project?.id,
201
- epicId: epic?.id,
202
- storyId: story?.id,
203
- assignee: options.assignee,
204
- statuses: options.statuses,
205
- });
206
- const dependencyMap = await this.fetchDependencies(tasks.map((t) => t.task_id));
207
-
208
- const totals = emptyTotals();
209
- const epics = new Map<string, EpicBacklogSummary & { storiesMap: Map<string, StoryBacklogSummary & { statuses: Set<string> }> }>();
210
- const tasksRows: TaskBacklogRow[] = [];
211
-
212
- for (const row of tasks) {
213
- const lane = bucketForStatus(row.task_status);
214
- addToTotals(totals, lane, row.task_story_points);
215
-
216
- let epicSummary = epics.get(row.epic_id);
217
- if (!epicSummary) {
218
- epicSummary = {
219
- epic_id: row.epic_id,
220
- epic_key: row.epic_key,
221
- title: row.epic_title,
222
- priority: row.epic_priority ?? null,
223
- description: row.epic_description ?? undefined,
224
- totals: emptyTotals(),
225
- stories: [],
226
- storiesMap: new Map(),
227
- };
228
- epics.set(row.epic_id, epicSummary);
229
- }
230
- this.epicPriority.set(row.epic_key, row.epic_priority ?? null);
231
- addToTotals(epicSummary.totals, lane, row.task_story_points);
232
-
233
- let storySummary = epicSummary.storiesMap.get(row.story_id);
234
- if (!storySummary) {
235
- storySummary = {
236
- user_story_id: row.story_id,
237
- user_story_key: row.story_key,
238
- epic_key: row.epic_key,
239
- title: row.story_title,
240
- description: row.story_description ?? undefined,
241
- priority: row.story_priority ?? null,
242
- status: undefined,
243
- totals: emptyTotals(),
244
- statuses: new Set<string>(),
245
- };
246
- epicSummary.storiesMap.set(row.story_id, storySummary);
247
- }
248
- this.storyPriority.set(row.story_key, row.story_priority ?? null);
249
- addToTotals(storySummary.totals, lane, row.task_story_points);
250
- storySummary.statuses.add(row.task_status.toLowerCase());
251
-
252
- const dependencies = dependencyMap.get(row.task_id) ?? [];
253
- tasksRows.push({
254
- task_id: row.task_id,
255
- task_key: row.task_key,
256
- epic_key: row.epic_key,
257
- user_story_key: row.story_key,
258
- title: row.task_title,
259
- description: row.task_description ?? "",
260
- status: row.task_status,
261
- story_points: row.task_story_points ?? null,
262
- priority: row.task_priority ?? null,
263
- assignee: row.assignee_human ?? null,
264
- dependency_keys: dependencies,
265
- });
266
- }
267
-
268
- let orderedTasks: TaskBacklogRow[];
269
- if (options.orderByDependencies) {
270
- if (!project) {
271
- this.warnings.push("Dependency ordering requires a project scope; using default ordering.");
272
- orderedTasks = this.orderTasks(tasksRows, options.verbose === true);
273
- } else {
274
- const orderingService = await TaskOrderingService.create(this.workspace, { recordTelemetry: false });
275
- try {
276
- const ordering = await orderingService.orderTasks({
277
- projectKey: project.key,
278
- epicKey: epic?.key,
279
- storyKey: story?.key,
280
- assignee: options.assignee,
281
- statusFilter: options.statuses,
282
- includeBlocked: true,
283
- });
284
- const orderMap = new Map<string, number>(ordering.ordered.map((t, idx) => [t.taskId, idx]));
285
- orderedTasks = tasksRows
286
- .slice()
287
- .sort((a, b) => {
288
- const ai = orderMap.get(a.task_id) ?? Number.MAX_SAFE_INTEGER;
289
- const bi = orderMap.get(b.task_id) ?? Number.MAX_SAFE_INTEGER;
290
- if (ai !== bi) return ai - bi;
291
- return a.task_key.localeCompare(b.task_key);
292
- });
293
- this.warnings.push(...ordering.warnings);
294
- } catch (error) {
295
- if (options.verbose) {
296
- this.warnings.push(`Dependency ordering failed; falling back to heuristic ordering. ${(error as Error).message}`);
297
- }
298
- orderedTasks = this.orderTasks(tasksRows, options.verbose === true);
299
- } finally {
300
- await orderingService.close();
301
- }
302
- }
303
- } else {
304
- orderedTasks = this.defaultOrder(tasksRows);
305
- }
306
-
307
- const epicSummaries = Array.from(epics.values()).map((e) => {
308
- const stories = Array.from(e.storiesMap.values()).map((s) => ({
309
- user_story_id: s.user_story_id,
310
- user_story_key: s.user_story_key,
311
- epic_key: s.epic_key,
312
- title: s.title,
313
- description: s.description,
314
- priority: s.priority,
315
- status: deriveStoryStatus(s.statuses),
316
- totals: s.totals,
317
- }));
318
- return {
319
- epic_id: e.epic_id,
320
- epic_key: e.epic_key,
321
- title: e.title,
322
- priority: e.priority,
323
- description: e.description,
324
- totals: e.totals,
325
- stories,
326
- };
327
- });
328
-
329
- return {
330
- summary: {
331
- scope: {
332
- project_id: project?.id ?? null,
333
- project_key: project?.key ?? null,
334
- epic_key: epic?.key,
335
- user_story_key: story?.key,
336
- assignee: options.assignee,
337
- },
338
- totals,
339
- epics: this.sortEpics(epicSummaries),
340
- tasks: orderedTasks,
341
- },
342
- warnings: this.warnings,
343
- };
344
- }
345
-
346
- private async getProject(projectKey: string): Promise<{ id: string; key: string } | undefined> {
347
- const row = await this.db.get(`SELECT id, key FROM projects WHERE key = ?`, projectKey);
348
- if (!row) return undefined;
349
- return { id: row.id, key: row.key };
350
- }
351
-
352
- private async getEpic(epicKey: string, projectId?: string): Promise<{ id: string; key: string; project_id: string } | undefined> {
353
- const row = await this.db.get(
354
- `SELECT id, key, project_id FROM epics WHERE key = ? ${projectId ? "AND project_id = ?" : ""}`,
355
- projectId ? [epicKey, projectId] : [epicKey],
356
- );
357
- if (!row) return undefined;
358
- return { id: row.id, key: row.key, project_id: row.project_id };
359
- }
360
-
361
- private async getStory(storyKey: string, scopeId?: string): Promise<{ id: string; key: string; epic_id: string } | undefined> {
362
- const row = await this.db.get(
363
- `SELECT id, key, epic_id FROM user_stories WHERE key = ? ${scopeId ? "AND (epic_id = ? OR project_id = ?)" : ""}`,
364
- scopeId ? [storyKey, scopeId, scopeId] : [storyKey],
365
- );
366
- if (!row) return undefined;
367
- return { id: row.id, key: row.key, epic_id: row.epic_id };
368
- }
369
-
370
- private async fetchTasks(filters: {
371
- projectId?: string;
372
- epicId?: string;
373
- storyId?: string;
374
- assignee?: string;
375
- statuses?: string[];
376
- }): Promise<RawTaskRow[]> {
377
- const clauses: string[] = [];
378
- const params: any[] = [];
379
- if (filters.projectId) {
380
- clauses.push("t.project_id = ?");
381
- params.push(filters.projectId);
382
- }
383
- if (filters.epicId) {
384
- clauses.push("t.epic_id = ?");
385
- params.push(filters.epicId);
386
- }
387
- if (filters.storyId) {
388
- clauses.push("t.user_story_id = ?");
389
- params.push(filters.storyId);
390
- }
391
- if (filters.assignee) {
392
- clauses.push("LOWER(t.assignee_human) = LOWER(?)");
393
- params.push(filters.assignee);
394
- }
395
- if (filters.statuses && filters.statuses.length > 0) {
396
- const placeholders = filters.statuses.map(() => "?").join(", ");
397
- clauses.push(`LOWER(t.status) IN (${placeholders})`);
398
- params.push(...filters.statuses.map((s) => s.toLowerCase()));
399
- }
400
- const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
401
- const rows = await this.db.all<RawTaskRow[]>(
402
- `
403
- SELECT
404
- t.id AS task_id,
405
- t.key AS task_key,
406
- t.title AS task_title,
407
- t.description AS task_description,
408
- t.status AS task_status,
409
- t.story_points AS task_story_points,
410
- t.priority AS task_priority,
411
- t.assignee_human AS assignee_human,
412
- e.id AS epic_id,
413
- e.key AS epic_key,
414
- e.title AS epic_title,
415
- e.priority AS epic_priority,
416
- e.description AS epic_description,
417
- s.id AS story_id,
418
- s.key AS story_key,
419
- s.title AS story_title,
420
- s.priority AS story_priority,
421
- s.description AS story_description
422
- FROM tasks t
423
- INNER JOIN epics e ON t.epic_id = e.id
424
- INNER JOIN user_stories s ON t.user_story_id = s.id
425
- ${where}
426
- `,
427
- params,
428
- );
429
- return rows;
430
- }
431
-
432
- private async fetchDependencies(taskIds: string[]): Promise<Map<string, string[]>> {
433
- const map = new Map<string, string[]>();
434
- if (taskIds.length === 0) return map;
435
- const placeholders = taskIds.map(() => "?").join(", ");
436
- const rows = await this.db.all<{ task_id: string; dependency_key: string }[]>(
437
- `
438
- SELECT td.task_id, dep.key AS dependency_key
439
- FROM task_dependencies td
440
- INNER JOIN tasks dep ON dep.id = td.depends_on_task_id
441
- WHERE td.task_id IN (${placeholders})
442
- `,
443
- taskIds,
444
- );
445
- for (const row of rows) {
446
- const list = map.get(row.task_id) ?? [];
447
- list.push(row.dependency_key);
448
- map.set(row.task_id, list);
449
- }
450
- return map;
451
- }
452
-
453
- private defaultOrder(tasks: TaskBacklogRow[]): TaskBacklogRow[] {
454
- const bucketOrder: Record<BacklogLane, number> = {
455
- implementation: 0,
456
- review: 1,
457
- qa: 2,
458
- done: 3,
459
- };
460
- const toNum = (value: number | null) => (value === null || value === undefined ? Number.MAX_SAFE_INTEGER : value);
461
- return tasks
462
- .slice()
463
- .sort((a, b) => {
464
- const laneA = bucketOrder[bucketForStatus(a.status)];
465
- const laneB = bucketOrder[bucketForStatus(b.status)];
466
- if (laneA !== laneB) return laneA - laneB;
467
- const epicPriorityA = toNum(this.epicPriority.get(a.epic_key) ?? null);
468
- const epicPriorityB = toNum(this.epicPriority.get(b.epic_key) ?? null);
469
- if (epicPriorityA !== epicPriorityB) return epicPriorityA - epicPriorityB;
470
- const storyPriorityA = toNum(this.storyPriority.get(a.user_story_key) ?? null);
471
- const storyPriorityB = toNum(this.storyPriority.get(b.user_story_key) ?? null);
472
- if (storyPriorityA !== storyPriorityB) return storyPriorityA - storyPriorityB;
473
- const taskPriorityA = toNum(a.priority);
474
- const taskPriorityB = toNum(b.priority);
475
- if (taskPriorityA !== taskPriorityB) return taskPriorityA - taskPriorityB;
476
- return a.task_key.localeCompare(b.task_key);
477
- });
478
- }
479
-
480
- private orderTasks(tasks: TaskBacklogRow[], verbose: boolean): TaskBacklogRow[] {
481
- const bucketOrder: BacklogLane[] = ["implementation", "review", "qa", "done"];
482
- const allKeys = new Set(tasks.map((t) => t.task_key));
483
- const ordered: TaskBacklogRow[] = [];
484
- for (const bucket of bucketOrder) {
485
- const bucketTasks = tasks.filter((t) => bucketForStatus(t.status) === bucket);
486
- const { sorted, hadCycle, missingReference } = this.topologicalSort(bucketTasks, allKeys);
487
- if (hadCycle && verbose) {
488
- this.warnings.push(`Dependency cycle detected in ${bucket} bucket. Falling back to priority order.`);
489
- }
490
- if (missingReference && verbose) {
491
- this.warnings.push(`Missing dependency reference in ${bucket} bucket. Ordering may be partial.`);
492
- }
493
- ordered.push(...sorted);
494
- }
495
- return ordered;
496
- }
497
-
498
- private topologicalSort(tasks: TaskBacklogRow[], allKeys: Set<string>): { sorted: TaskBacklogRow[]; hadCycle: boolean; missingReference: boolean } {
499
- if (tasks.length === 0) return { sorted: [], hadCycle: false, missingReference: false };
500
- const idByKey = new Map(tasks.map((t, idx) => [t.task_key, idx]));
501
- const indegree = new Array<number>(tasks.length).fill(0);
502
- const edges: Map<number, number[]> = new Map();
503
- const fallback = this.defaultOrder(tasks);
504
- const indexByTask = new Map<string, number>();
505
- fallback.forEach((task, idx) => indexByTask.set(task.task_id, idx));
506
- let missingReference = false;
507
-
508
- tasks.forEach((task, idx) => {
509
- for (const depKey of task.dependency_keys) {
510
- if (!allKeys.has(depKey)) {
511
- missingReference = true;
512
- continue;
513
- }
514
- const depIdx = idByKey.get(depKey);
515
- if (depIdx === undefined) {
516
- continue;
517
- }
518
- indegree[idx] += 1;
519
- const list = edges.get(depIdx) ?? [];
520
- list.push(idx);
521
- edges.set(depIdx, list);
522
- }
523
- });
524
-
525
- const queue: number[] = [];
526
- indegree.forEach((value, idx) => {
527
- if (value === 0) queue.push(idx);
528
- });
529
-
530
- const stableSort = (arr: number[]) =>
531
- arr.sort((a, b) => {
532
- const fallbackA = indexByTask.get(tasks[a].task_id) ?? 0;
533
- const fallbackB = indexByTask.get(tasks[b].task_id) ?? 0;
534
- return fallbackA - fallbackB;
535
- });
536
-
537
- stableSort(queue);
538
-
539
- const result: TaskBacklogRow[] = [];
540
- while (queue.length > 0) {
541
- const current = queue.shift() as number;
542
- result.push(tasks[current]);
543
- const neighbors = edges.get(current) ?? [];
544
- for (const next of neighbors) {
545
- indegree[next] -= 1;
546
- if (indegree[next] === 0) {
547
- queue.push(next);
548
- }
549
- }
550
- stableSort(queue);
551
- }
552
-
553
- const hadCycle = result.length !== tasks.length;
554
- if (hadCycle) {
555
- return { sorted: fallback, hadCycle: true, missingReference };
556
- }
557
- return { sorted: result, hadCycle: false, missingReference };
558
- }
559
-
560
- private sortEpics(epics: EpicBacklogSummary[]): EpicBacklogSummary[] {
561
- const toNum = (value: number | null | undefined) => (value === null || value === undefined ? Number.MAX_SAFE_INTEGER : value);
562
- return epics
563
- .slice()
564
- .sort((a, b) => {
565
- const priority = toNum(a.priority) - toNum(b.priority);
566
- if (priority !== 0) return priority;
567
- return a.epic_key.localeCompare(b.epic_key);
568
- })
569
- .map((epic) => ({
570
- ...epic,
571
- stories: epic.stories
572
- .slice()
573
- .sort((a, b) => {
574
- const priority = toNum(a.priority) - toNum(b.priority);
575
- if (priority !== 0) return priority;
576
- return a.user_story_key.localeCompare(b.user_story_key);
577
- }),
578
- }));
579
- }
580
- }