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,350 +0,0 @@
1
- import { describe, it } from "node:test";
2
- import assert from "node:assert/strict";
3
- import os from "node:os";
4
- import path from "node:path";
5
- import { promises as fs } from "node:fs";
6
- import { Agent } from "@mcoda/shared";
7
- import { DocdexClient } from "@mcoda/integrations";
8
- import { DocsService } from "../DocsService.js";
9
- import { JobService } from "../../jobs/JobService.js";
10
- import { WorkspaceResolution } from "../../../workspace/WorkspaceManager.js";
11
-
12
- // Disable sqlite usage in tests to avoid FK constraints from incomplete fixtures.
13
- process.env.MCODA_DISABLE_DB = "1";
14
-
15
- class FakeAgentService {
16
- constructor(private agent: Agent, private response?: string) {}
17
-
18
- async close(): Promise<void> {
19
- // no-op
20
- }
21
-
22
- async resolveAgent(): Promise<Agent> {
23
- return this.agent;
24
- }
25
-
26
- async getCapabilities(): Promise<string[]> {
27
- return ["docdex_query", "doc_generation"];
28
- }
29
-
30
- async getPrompts() {
31
- return { jobPrompt: "# Job\nFollow runbook", characterPrompt: "character" };
32
- }
33
-
34
- async invoke(_agentId: string, request: any) {
35
- const jobId = request.metadata?.jobId ?? "job";
36
- const output =
37
- this.response ??
38
- `# Product Design Review\n\n## Introduction\nGenerated draft for ${jobId}\n\n## Scope\nscope\n\n## Requirements & Constraints\n- goal\n\n## Architecture Overview\narch\n\n## Interfaces / APIs\napi\n\n## Non-Functional Requirements\nnfr\n\n## Risks & Mitigations\nrisk\n\n## Open Questions\nq`;
39
- return {
40
- output,
41
- adapter: "fake",
42
- metadata: { request },
43
- };
44
- }
45
-
46
- async invokeStream() {
47
- async function* generator() {
48
- yield { output: "streamed-output", adapter: "fake" };
49
- }
50
- return generator();
51
- }
52
- }
53
-
54
- class FakeRepo {
55
- constructor(private agent: Agent) {}
56
-
57
- async close(): Promise<void> {
58
- // no-op
59
- }
60
-
61
- async getWorkspaceDefaults(): Promise<any[]> {
62
- return [];
63
- }
64
-
65
- async listAgents(): Promise<Agent[]> {
66
- return [this.agent];
67
- }
68
-
69
- async getAgentCapabilities(): Promise<string[]> {
70
- return ["docdex_query", "doc_generation"];
71
- }
72
- }
73
-
74
- class FakeRoutingService {
75
- constructor(private agent: Agent) {}
76
-
77
- async resolveAgentForCommand(params: { commandName: string; overrideAgentSlug?: string }): Promise<any> {
78
- return {
79
- agent: this.agent,
80
- agentId: this.agent.id,
81
- agentSlug: this.agent.slug,
82
- model: this.agent.defaultModel,
83
- capabilities: ["docdex_query", "doc_generation"],
84
- healthStatus: "healthy",
85
- source: params.overrideAgentSlug ? "override" : "workspace_default",
86
- routingPreview: { workspaceId: "ws", commandName: params.commandName } as any,
87
- };
88
- }
89
- }
90
-
91
- class FailingDocdex {
92
- async fetchDocumentById(): Promise<never> {
93
- throw new Error("docdex down");
94
- }
95
- async ensureRegisteredFromFile(): Promise<never> {
96
- throw new Error("docdex down");
97
- }
98
- async search(): Promise<any[]> {
99
- throw new Error("docdex down");
100
- }
101
- }
102
-
103
- describe("DocsService.generatePdr", () => {
104
- it("writes a PDR and records job + telemetry artifacts", async () => {
105
- process.env.MCODA_SKIP_PDR_VALIDATION = "1";
106
- const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "mcoda-workspace-"));
107
- const workspace: WorkspaceResolution = {
108
- workspaceRoot,
109
- workspaceId: workspaceRoot,
110
- mcodaDir: path.join(workspaceRoot, ".mcoda"),
111
- id: workspaceRoot,
112
- legacyWorkspaceIds: [],
113
- workspaceDbPath: path.join(workspaceRoot, ".mcoda", "mcoda.db"),
114
- globalDbPath: path.join(os.homedir(), ".mcoda", "mcoda.db"),
115
- };
116
- const agent: Agent = {
117
- id: "agent-1",
118
- slug: "fake",
119
- adapter: "codex-api",
120
- createdAt: new Date().toISOString(),
121
- updatedAt: new Date().toISOString(),
122
- };
123
- const agentService = new FakeAgentService(agent);
124
- const repo = new FakeRepo(agent);
125
- const routingService = new FakeRoutingService(agent);
126
- const jobService = new JobService(workspace);
127
- const docdex = new DocdexClient({ workspaceRoot });
128
- const service = new DocsService(workspace, {
129
- agentService: agentService as any,
130
- repo: repo as any,
131
- routingService: routingService as any,
132
- jobService,
133
- docdex,
134
- });
135
-
136
- const rfpPath = path.join(workspaceRoot, "rfp.md");
137
- await fs.writeFile(rfpPath, "- goal one\n- goal two\n", "utf8");
138
-
139
- const result = await service.generatePdr({
140
- workspace,
141
- projectKey: "TEST",
142
- rfpPath,
143
- agentName: "fake",
144
- agentStream: false,
145
- dryRun: false,
146
- json: false,
147
- });
148
-
149
- assert.ok(result.outputPath);
150
- const content = await fs.readFile(result.outputPath ?? "", "utf8");
151
- assert.match(content, /Product Design Review/);
152
- const manifestPath = path.join(workspace.mcodaDir, "jobs", result.jobId, "manifest.json");
153
- const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
154
- assert.equal(manifest.state ?? manifest.status, "completed");
155
-
156
- const tokenPath = path.join(workspace.mcodaDir, "token_usage.json");
157
- const tokenUsage = JSON.parse(await fs.readFile(tokenPath, "utf8"));
158
- assert.ok(Array.isArray(tokenUsage));
159
- assert.ok(tokenUsage.length > 0);
160
-
161
- await service.close();
162
- });
163
-
164
- it("supports dry-run without writing files", async () => {
165
- process.env.MCODA_SKIP_PDR_VALIDATION = "1";
166
- const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "mcoda-workspace-"));
167
- const workspace: WorkspaceResolution = {
168
- workspaceRoot,
169
- workspaceId: workspaceRoot,
170
- mcodaDir: path.join(workspaceRoot, ".mcoda"),
171
- id: workspaceRoot,
172
- legacyWorkspaceIds: [],
173
- workspaceDbPath: path.join(workspaceRoot, ".mcoda", "mcoda.db"),
174
- globalDbPath: path.join(os.homedir(), ".mcoda", "mcoda.db"),
175
- };
176
- const agent: Agent = {
177
- id: "agent-2",
178
- slug: "fake",
179
- adapter: "codex-api",
180
- createdAt: new Date().toISOString(),
181
- updatedAt: new Date().toISOString(),
182
- };
183
- const agentService = new FakeAgentService(agent);
184
- const repo = new FakeRepo(agent);
185
- const routingService = new FakeRoutingService(agent);
186
- const jobService = new JobService(workspace);
187
- const docdex = new DocdexClient({ workspaceRoot });
188
- const service = new DocsService(workspace, {
189
- agentService: agentService as any,
190
- repo: repo as any,
191
- routingService: routingService as any,
192
- jobService,
193
- docdex,
194
- });
195
- const rfpPath = path.join(workspaceRoot, "rfp.md");
196
- await fs.writeFile(rfpPath, "- goal one\n", "utf8");
197
-
198
- const result = await service.generatePdr({
199
- workspace,
200
- projectKey: "DRY",
201
- rfpPath,
202
- agentName: "fake",
203
- agentStream: false,
204
- dryRun: true,
205
- json: true,
206
- });
207
-
208
- assert.ok(result.warnings.some((w) => w.toLowerCase().includes("dry run")));
209
- const outputPath = result.outputPath ?? path.join(workspace.mcodaDir, "docs", "pdr");
210
- await assert.rejects(fs.access(outputPath));
211
- await service.close();
212
- });
213
-
214
- it("emits degraded warning when docdex unavailable", async () => {
215
- process.env.MCODA_SKIP_PDR_VALIDATION = "1";
216
- const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "mcoda-workspace-"));
217
- const workspace: WorkspaceResolution = {
218
- workspaceRoot,
219
- workspaceId: workspaceRoot,
220
- mcodaDir: path.join(workspaceRoot, ".mcoda"),
221
- id: workspaceRoot,
222
- legacyWorkspaceIds: [],
223
- workspaceDbPath: path.join(workspaceRoot, ".mcoda", "mcoda.db"),
224
- globalDbPath: path.join(os.homedir(), ".mcoda", "mcoda.db"),
225
- };
226
- const agent: Agent = {
227
- id: "agent-3",
228
- slug: "fake",
229
- adapter: "codex-api",
230
- createdAt: new Date().toISOString(),
231
- updatedAt: new Date().toISOString(),
232
- };
233
- const agentService = new FakeAgentService(agent);
234
- const repo = new FakeRepo(agent);
235
- const routingService = new FakeRoutingService(agent);
236
- const jobService = new JobService(workspace);
237
- const service = new DocsService(workspace, {
238
- agentService: agentService as any,
239
- repo: repo as any,
240
- routingService: routingService as any,
241
- jobService,
242
- docdex: new FailingDocdex() as any,
243
- });
244
- const rfpPath = path.join(workspaceRoot, "rfp.md");
245
- await fs.writeFile(rfpPath, "- goal\n", "utf8");
246
-
247
- const result = await service.generatePdr({
248
- workspace,
249
- projectKey: "DOWN",
250
- rfpPath,
251
- agentName: "fake",
252
- agentStream: false,
253
- dryRun: true,
254
- json: false,
255
- });
256
- assert.ok(result.warnings.some((w) => w.toLowerCase().includes("docdex")));
257
- await service.close();
258
- });
259
-
260
- it("writes an SDS and records job + telemetry artifacts", async () => {
261
- process.env.MCODA_SKIP_SDS_VALIDATION = "1";
262
- const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "mcoda-workspace-"));
263
- const workspace: WorkspaceResolution = {
264
- workspaceRoot,
265
- workspaceId: workspaceRoot,
266
- mcodaDir: path.join(workspaceRoot, ".mcoda"),
267
- id: workspaceRoot,
268
- legacyWorkspaceIds: [],
269
- workspaceDbPath: path.join(workspaceRoot, ".mcoda", "mcoda.db"),
270
- globalDbPath: path.join(os.homedir(), ".mcoda", "mcoda.db"),
271
- };
272
- const agent: Agent = {
273
- id: "agent-sds",
274
- slug: "fake-sds",
275
- adapter: "codex-api",
276
- createdAt: new Date().toISOString(),
277
- updatedAt: new Date().toISOString(),
278
- };
279
- const sdsDraft = [
280
- "# Software Design Specification",
281
- "## Introduction",
282
- "intro",
283
- "## Goals & Scope",
284
- "scope",
285
- "## Architecture Overview",
286
- "arch",
287
- "## Components & Responsibilities",
288
- "components",
289
- "## Data Model & Persistence",
290
- "data",
291
- "## Interfaces & Contracts",
292
- "interfaces",
293
- "## Non-Functional Requirements",
294
- "nfr",
295
- "## Security & Compliance",
296
- "security",
297
- "## Failure Modes & Resilience",
298
- "failures",
299
- "## Risks & Mitigations",
300
- "risks",
301
- "## Assumptions",
302
- "assumptions",
303
- "## Open Questions",
304
- "questions",
305
- "## Acceptance Criteria",
306
- "criteria",
307
- ].join("\n");
308
- const agentService = new FakeAgentService(agent, sdsDraft);
309
- const repo = new FakeRepo(agent);
310
- const routingService = new FakeRoutingService(agent);
311
- const jobService = new JobService(workspace);
312
- const docdex = new DocdexClient({ workspaceRoot });
313
- await docdex.registerDocument({
314
- docType: "PDR",
315
- path: path.join(workspaceRoot, "pdr.md"),
316
- content: "- goal from pdr",
317
- metadata: { projectKey: "SDS" },
318
- });
319
- const service = new DocsService(workspace, {
320
- agentService: agentService as any,
321
- repo: repo as any,
322
- routingService: routingService as any,
323
- jobService,
324
- docdex,
325
- });
326
-
327
- const result = await service.generateSds({
328
- workspace,
329
- projectKey: "SDS",
330
- agentName: "fake-sds",
331
- agentStream: false,
332
- dryRun: false,
333
- json: false,
334
- force: true,
335
- });
336
-
337
- assert.ok(result.outputPath);
338
- const content = await fs.readFile(result.outputPath ?? "", "utf8");
339
- assert.match(content, /Software Design Specification/);
340
- const manifestPath = path.join(workspace.mcodaDir, "jobs", result.jobId, "manifest.json");
341
- const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
342
- assert.equal(manifest.type, "sds_generate");
343
-
344
- const tokenPath = path.join(workspace.mcodaDir, "token_usage.json");
345
- const tokenUsage = JSON.parse(await fs.readFile(tokenPath, "utf8"));
346
- assert.ok(tokenUsage.some((entry: any) => entry.commandName === "docs-sds-generate"));
347
-
348
- await service.close();
349
- });
350
- });
@@ -1,111 +0,0 @@
1
- import { BacklogService } from "../backlog/BacklogService.js";
2
- import type { BacklogTotals } from "../backlog/BacklogService.js";
3
- import { VelocityService } from "./VelocityService.js";
4
- import type { EstimateDurations, EstimateEtas, EstimateOptions, EstimateResult } from "./types.js";
5
- import type { EffectiveVelocity } from "./types.js";
6
- import type { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
7
-
8
- const HOURS_IN_MS = 3600 * 1000;
9
-
10
- export class EstimateService {
11
- private constructor(private workspace: WorkspaceResolution) {}
12
-
13
- static async create(workspace: WorkspaceResolution): Promise<EstimateService> {
14
- return new EstimateService(workspace);
15
- }
16
-
17
- private computeDurations(totals: BacklogTotals, velocity: EffectiveVelocity): EstimateDurations {
18
- const safeDivide = (sp: number, spPerHour: number): number | null => {
19
- if (!sp || sp <= 0) return 0;
20
- if (!spPerHour || spPerHour <= 0) return null;
21
- return sp / spPerHour;
22
- };
23
- const implementationHours = safeDivide(totals.implementation.story_points, velocity.implementationSpPerHour);
24
- const reviewHours = safeDivide(totals.review.story_points, velocity.reviewSpPerHour);
25
- const qaHours = safeDivide(totals.qa.story_points, velocity.qaSpPerHour);
26
- const durationsList = [implementationHours, reviewHours, qaHours];
27
- const hasNull = durationsList.some((value) => value === null);
28
- const numeric = durationsList.filter((value) => value !== null) as number[];
29
- const totalHours = hasNull || numeric.length === 0 ? null : Math.max(...numeric);
30
- return {
31
- implementationHours,
32
- reviewHours,
33
- qaHours,
34
- totalHours,
35
- };
36
- }
37
-
38
- private computeEtas(durations: EstimateDurations): EstimateEtas {
39
- const now = Date.now();
40
- const addHours = (hours: number | null | undefined): string | undefined => {
41
- if (hours === null || hours === undefined || hours < 0) return undefined;
42
- return new Date(now + hours * HOURS_IN_MS).toISOString();
43
- };
44
- const readyToReviewEta = durations.implementationHours !== null ? addHours(durations.implementationHours ?? undefined) : undefined;
45
- const readyToQaEta =
46
- durations.implementationHours !== null && durations.reviewHours !== null
47
- ? addHours(Math.max(durations.implementationHours ?? 0, durations.reviewHours ?? 0))
48
- : undefined;
49
- const completeEta = durations.totalHours !== null ? addHours(durations.totalHours ?? undefined) : undefined;
50
- return {
51
- readyToReviewEta,
52
- readyToQaEta,
53
- completeEta,
54
- };
55
- }
56
-
57
- async estimate(options: Omit<EstimateOptions, "workspace">): Promise<EstimateResult> {
58
- const backlogService = await BacklogService.create(this.workspace);
59
- let backlogTotals: BacklogTotals;
60
- try {
61
- const { summary } = await backlogService.getBacklog({
62
- projectKey: options.projectKey,
63
- epicKey: options.epicKey,
64
- storyKey: options.storyKey,
65
- assignee: options.assignee,
66
- });
67
- backlogTotals = summary.totals;
68
- } finally {
69
- await backlogService.close();
70
- }
71
-
72
- const velocityService = await VelocityService.create(this.workspace);
73
- let effectiveVelocity: EffectiveVelocity;
74
- try {
75
- effectiveVelocity = await velocityService.getEffectiveVelocity({
76
- projectKey: options.projectKey,
77
- epicKey: options.epicKey,
78
- storyKey: options.storyKey,
79
- assignee: options.assignee,
80
- mode: options.mode,
81
- windowTasks: options.windowTasks,
82
- spPerHourAll: options.spPerHourAll,
83
- spPerHourReview: options.spPerHourReview,
84
- spPerHourQa: options.spPerHourQa,
85
- });
86
- } finally {
87
- await velocityService.close();
88
- }
89
-
90
- const durationsHours = this.computeDurations(backlogTotals, effectiveVelocity);
91
- const etas = this.computeEtas(durationsHours);
92
-
93
- return {
94
- scope: {
95
- workspaceId: this.workspace.workspaceId,
96
- project: options.projectKey,
97
- epic: options.epicKey,
98
- story: options.storyKey,
99
- assignee: options.assignee,
100
- },
101
- backlogTotals,
102
- effectiveVelocity,
103
- durationsHours,
104
- etas,
105
- };
106
- }
107
-
108
- async close(): Promise<void> {
109
- // No long-lived resources to release yet, placeholder for symmetry with other services.
110
- }
111
- }