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,348 +0,0 @@
1
- import path from "node:path";
2
- import { JobService, TelemetryService, TokenUsageSummaryRow, TelemetryConfigState, WorkspaceResolver } from "@mcoda/core";
3
-
4
- type OutputFormat = "table" | "json";
5
-
6
- interface TokensArgs {
7
- workspaceRoot?: string;
8
- project?: string;
9
- agent?: string;
10
- command?: string;
11
- job?: string;
12
- since?: string;
13
- until?: string;
14
- groupBy: string[];
15
- format: OutputFormat;
16
- }
17
-
18
- interface TelemetryArgs {
19
- workspaceRoot?: string;
20
- subcommand: "show" | "opt-out" | "opt-in";
21
- format: OutputFormat;
22
- strict?: boolean;
23
- }
24
-
25
- const tokensUsage = `mcoda tokens \\
26
- [--workspace-root <PATH>] \\
27
- [--project <PROJECT_KEY|ID>] \\
28
- [--agent <NAME|ID>] \\
29
- [--command <COMMAND_NAME>] \\
30
- [--job <JOB_ID>] \\
31
- [--since <ISO_TIMESTAMP|DURATION>] \\
32
- [--until <ISO_TIMESTAMP>] \\
33
- [--group-by <project|agent|command|day|model|job|action>] \\
34
- [--format <table|json>]`;
35
-
36
- const telemetryUsage = `mcoda telemetry <show|opt-out|opt-in> \\
37
- [--workspace-root <PATH>] \\
38
- [--format <table|json>] \\
39
- [--strict] (opt-out only)`;
40
-
41
- const normalizeGroupBy = (input?: string[]): string[] => {
42
- const allowed = new Set(["project", "agent", "command", "day", "model", "job", "action"]);
43
- const selected = (input ?? []).filter((dim) => allowed.has(dim));
44
- if (selected.length === 0) {
45
- return ["project", "command", "agent"];
46
- }
47
- return Array.from(new Set(selected));
48
- };
49
-
50
- export const parseTokensArgs = (argv: string[]): TokensArgs => {
51
- const parsed: TokensArgs = {
52
- groupBy: [],
53
- format: "table",
54
- };
55
- for (let i = 0; i < argv.length; i += 1) {
56
- const arg = argv[i];
57
- switch (arg) {
58
- case "--workspace-root":
59
- case "--workspace":
60
- parsed.workspaceRoot = argv[i + 1] ? path.resolve(argv[i + 1]) : undefined;
61
- i += 1;
62
- break;
63
- case "--project":
64
- parsed.project = argv[i + 1];
65
- i += 1;
66
- break;
67
- case "--agent":
68
- parsed.agent = argv[i + 1];
69
- i += 1;
70
- break;
71
- case "--command":
72
- parsed.command = argv[i + 1];
73
- i += 1;
74
- break;
75
- case "--job":
76
- parsed.job = argv[i + 1];
77
- i += 1;
78
- break;
79
- case "--since":
80
- parsed.since = argv[i + 1];
81
- i += 1;
82
- break;
83
- case "--until":
84
- parsed.until = argv[i + 1];
85
- i += 1;
86
- break;
87
- case "--group-by":
88
- parsed.groupBy = (argv[i + 1] ?? "").split(",").map((v) => v.trim()).filter(Boolean);
89
- i += 1;
90
- break;
91
- case "--format":
92
- parsed.format = argv[i + 1] === "json" ? "json" : "table";
93
- i += 1;
94
- break;
95
- case "--help":
96
- case "-h":
97
- // eslint-disable-next-line no-console
98
- console.log(tokensUsage);
99
- process.exit(0);
100
- break;
101
- default:
102
- if (arg.startsWith("--group-by=")) {
103
- parsed.groupBy = arg
104
- .split("=")[1]
105
- .split(",")
106
- .map((v) => v.trim())
107
- .filter(Boolean);
108
- } else if (arg.startsWith("--format=")) {
109
- parsed.format = arg.endsWith("json") ? "json" : "table";
110
- } else if (arg.startsWith("--job=")) {
111
- parsed.job = arg.split("=")[1];
112
- }
113
- break;
114
- }
115
- }
116
- parsed.groupBy = normalizeGroupBy(parsed.groupBy);
117
- return parsed;
118
- };
119
-
120
- export const parseTelemetryArgs = (argv: string[]): TelemetryArgs => {
121
- let subcommand: TelemetryArgs["subcommand"] = "show";
122
- const parsed: TelemetryArgs = {
123
- subcommand,
124
- format: "table",
125
- };
126
- for (let i = 0; i < argv.length; i += 1) {
127
- const arg = argv[i];
128
- if (!arg.startsWith("--") && i === 0) {
129
- subcommand = (arg as TelemetryArgs["subcommand"]) ?? "show";
130
- parsed.subcommand = subcommand;
131
- continue;
132
- }
133
- switch (arg) {
134
- case "--workspace-root":
135
- case "--workspace":
136
- parsed.workspaceRoot = argv[i + 1] ? path.resolve(argv[i + 1]) : undefined;
137
- i += 1;
138
- break;
139
- case "--format":
140
- parsed.format = argv[i + 1] === "json" ? "json" : "table";
141
- i += 1;
142
- break;
143
- case "--strict":
144
- parsed.strict = true;
145
- break;
146
- case "--help":
147
- case "-h":
148
- // eslint-disable-next-line no-console
149
- console.log(telemetryUsage);
150
- process.exit(0);
151
- break;
152
- default:
153
- if (arg.startsWith("--format=")) {
154
- parsed.format = arg.endsWith("json") ? "json" : "table";
155
- }
156
- break;
157
- }
158
- }
159
- return parsed;
160
- };
161
-
162
- const pad = (value: string, width: number): string => value.padEnd(width, " ");
163
-
164
- const formatTable = (headers: string[], rows: string[][]): string => {
165
- const widths = headers.map((header, idx) => Math.max(header.length, ...rows.map((row) => (row[idx] ?? "").length)));
166
- const headerLine = headers.map((h, idx) => pad(h, widths[idx])).join(" | ");
167
- const sepLine = widths.map((w) => "-".repeat(w)).join("-+-");
168
- const body = rows.map((row) => row.map((cell, idx) => pad(cell ?? "", widths[idx])).join(" | ")).join("\n");
169
- return [headerLine, sepLine, body].filter(Boolean).join("\n");
170
- };
171
-
172
- const formatNumber = (value: number | null | undefined, digits = 0): string => {
173
- if (value === null || value === undefined) return "-";
174
- if (digits > 0) return value.toFixed(digits);
175
- return `${value}`;
176
- };
177
-
178
- const renderTokensTable = (rows: TokenUsageSummaryRow[], groupBy: string[]): void => {
179
- const dims = new Set(groupBy);
180
- const headers: string[] = [];
181
- const extractors: ((row: TokenUsageSummaryRow) => string)[] = [];
182
-
183
- if (dims.has("project")) {
184
- headers.push("PROJECT");
185
- extractors.push((row) => row.project_id ?? "-");
186
- }
187
- if (dims.has("command")) {
188
- headers.push("COMMAND");
189
- extractors.push((row) => row.command_name ?? "-");
190
- }
191
- if (dims.has("agent")) {
192
- headers.push("AGENT");
193
- extractors.push((row) => row.agent_id ?? "-");
194
- }
195
- if (dims.has("model")) {
196
- headers.push("MODEL");
197
- extractors.push((row) => row.model_name ?? "-");
198
- }
199
- if (dims.has("day")) {
200
- headers.push("DAY");
201
- extractors.push((row) => row.day ?? "-");
202
- }
203
- if (dims.has("job")) {
204
- headers.push("JOB");
205
- extractors.push((row) => row.job_id ?? "-");
206
- }
207
- if (dims.has("action")) {
208
- headers.push("ACTION");
209
- extractors.push((row) => row.action ?? "-");
210
- }
211
-
212
- headers.push("CALLS", "TOKENS_IN", "TOKENS_OUT", "TOKENS_TOTAL", "COST");
213
- extractors.push(
214
- (row) => `${row.calls}`,
215
- (row) => formatNumber(row.tokens_prompt),
216
- (row) => formatNumber(row.tokens_completion),
217
- (row) => formatNumber(row.tokens_total),
218
- (row) => formatNumber(row.cost_estimate, 4),
219
- );
220
-
221
- const tableRows = rows.map((row) => extractors.map((fn) => fn(row)));
222
- // eslint-disable-next-line no-console
223
- console.log(formatTable(headers, tableRows));
224
- };
225
-
226
- const renderTelemetryConfig = (config: TelemetryConfigState): void => {
227
- const rows = [
228
- ["Local recording", config.localRecording ? "enabled" : "disabled"],
229
- ["Remote export", config.remoteExport ? "enabled" : "disabled"],
230
- ["Strict mode", config.strict ? "on" : "off"],
231
- ["Config path", config.configPath],
232
- ];
233
- // eslint-disable-next-line no-console
234
- console.log(formatTable(["SETTING", "VALUE"], rows));
235
- };
236
-
237
- export class TelemetryCommands {
238
- static async runTokens(argv: string[]): Promise<void> {
239
- const parsed = parseTokensArgs(argv);
240
- const workspace = await WorkspaceResolver.resolveWorkspace({
241
- cwd: process.cwd(),
242
- explicitWorkspace: parsed.workspaceRoot,
243
- });
244
- const jobService = new JobService(workspace, undefined, { noTelemetry: true });
245
- const commandRun = await jobService.startCommandRun("tokens", parsed.project);
246
- const telemetry = await TelemetryService.create(workspace);
247
- try {
248
- const config = await telemetry.getConfig();
249
- const summary = await telemetry.getSummary({
250
- projectKey: parsed.project,
251
- agent: parsed.agent,
252
- command: parsed.command,
253
- jobId: parsed.job,
254
- since: parsed.since,
255
- until: parsed.until,
256
- groupBy: parsed.groupBy as any,
257
- });
258
- if (!config.localRecording && summary.length === 0) {
259
- // eslint-disable-next-line no-console
260
- console.log("Local token tracking is disabled; no data available.");
261
- return;
262
- }
263
- if (summary.length === 0) {
264
- // eslint-disable-next-line no-console
265
- console.log("No telemetry data for the selected filters/time window.");
266
- await jobService.finishCommandRun(commandRun.id, "succeeded");
267
- return;
268
- }
269
- if (parsed.format === "json") {
270
- // eslint-disable-next-line no-console
271
- console.log(JSON.stringify(summary, null, 2));
272
- await jobService.finishCommandRun(commandRun.id, "succeeded");
273
- return;
274
- }
275
- renderTokensTable(summary, parsed.groupBy);
276
- await jobService.finishCommandRun(commandRun.id, "succeeded");
277
- } catch (error) {
278
- await jobService.finishCommandRun(commandRun.id, "failed", (error as Error).message);
279
- const message = (error as Error).message ?? "Unknown error";
280
- if (message.includes("workspace DB") || message.includes("workspace")) {
281
- // eslint-disable-next-line no-console
282
- console.error("No mcoda workspace/DB found. Run mcoda init or create-tasks in this repo first.");
283
- } else {
284
- // eslint-disable-next-line no-console
285
- console.error(`tokens failed: ${message}`);
286
- }
287
- process.exitCode = 1;
288
- } finally {
289
- await jobService.close();
290
- await telemetry.close();
291
- }
292
- }
293
-
294
- static async runTelemetry(argv: string[]): Promise<void> {
295
- const parsed = parseTelemetryArgs(argv);
296
- const workspace = await WorkspaceResolver.resolveWorkspace({
297
- cwd: process.cwd(),
298
- explicitWorkspace: parsed.workspaceRoot,
299
- });
300
- const jobService = new JobService(workspace, undefined, { noTelemetry: true });
301
- const commandRun = await jobService.startCommandRun(`telemetry-${parsed.subcommand}`, undefined);
302
- const telemetry = await TelemetryService.create(workspace, { allowMissingTelemetry: true });
303
- try {
304
- if (parsed.subcommand === "show") {
305
- const config = await telemetry.getConfig();
306
- if (parsed.format === "json") {
307
- // eslint-disable-next-line no-console
308
- console.log(JSON.stringify(config, null, 2));
309
- } else {
310
- renderTelemetryConfig(config);
311
- }
312
- await jobService.finishCommandRun(commandRun.id, "succeeded");
313
- return;
314
- }
315
- if (parsed.subcommand === "opt-out") {
316
- const config = await telemetry.optOut(parsed.strict ?? false);
317
- // eslint-disable-next-line no-console
318
- console.log(
319
- `Telemetry opted out.${config.strict ? " Strict mode enabled; local recording disabled." : " Local recording still enabled."}`,
320
- );
321
- await jobService.finishCommandRun(commandRun.id, "succeeded");
322
- return;
323
- }
324
- if (parsed.subcommand === "opt-in") {
325
- const config = await telemetry.optIn();
326
- // eslint-disable-next-line no-console
327
- console.log(
328
- `Telemetry opted in. Local recording ${config.localRecording ? "enabled" : "disabled"}, remote export ${config.remoteExport ? "enabled" : "disabled"}.`,
329
- );
330
- await jobService.finishCommandRun(commandRun.id, "succeeded");
331
- }
332
- } catch (error) {
333
- await jobService.finishCommandRun(commandRun.id, "failed", (error as Error).message);
334
- const message = (error as Error).message ?? "Unknown error";
335
- if (message.includes("workspace DB") || message.includes("workspace")) {
336
- // eslint-disable-next-line no-console
337
- console.error("No mcoda workspace/DB found. Run mcoda init or create-tasks in this repo first.");
338
- } else {
339
- // eslint-disable-next-line no-console
340
- console.error(`telemetry ${parsed.subcommand} failed: ${message}`);
341
- }
342
- process.exitCode = 1;
343
- } finally {
344
- await jobService.close();
345
- await telemetry.close();
346
- }
347
- }
348
- }
File without changes
@@ -1,301 +0,0 @@
1
- import { createRequire } from "node:module";
2
- import readline from "node:readline/promises";
3
- import { stdin as input, stdout as output } from "node:process";
4
- import { SystemUpdateService } from "@mcoda/core";
5
- import { ApplyUpdateResponse, UpdateChannel } from "@mcoda/shared";
6
-
7
- interface UpdateArgs {
8
- checkOnly: boolean;
9
- channel?: UpdateChannel;
10
- version?: string;
11
- force: boolean;
12
- json: boolean;
13
- quiet: boolean;
14
- debug: boolean;
15
- }
16
-
17
- const usage = `mcoda update \\
18
- [--check] \\
19
- [--channel <stable|beta|nightly>] \\
20
- [--version <SEMVER>] \\
21
- [--force] \\
22
- [--json] \\
23
- [--quiet]`;
24
-
25
- const readCliVersion = (): string => {
26
- const require = createRequire(import.meta.url);
27
- try {
28
- // eslint-disable-next-line @typescript-eslint/no-var-requires
29
- const pkg = require("../../package.json") as { version?: string };
30
- return pkg.version ?? "0.0.0";
31
- } catch {
32
- return "0.0.0";
33
- }
34
- };
35
-
36
- const parseUpdateArgs = (argv: string[]): UpdateArgs => {
37
- const parsed: UpdateArgs = {
38
- checkOnly: false,
39
- force: false,
40
- json: false,
41
- quiet: false,
42
- debug: false,
43
- };
44
- for (let i = 0; i < argv.length; i += 1) {
45
- const arg = argv[i];
46
- switch (arg) {
47
- case "--check":
48
- parsed.checkOnly = true;
49
- break;
50
- case "--channel":
51
- parsed.channel = argv[i + 1] as UpdateChannel | undefined;
52
- i += 1;
53
- break;
54
- case "--version":
55
- parsed.version = argv[i + 1];
56
- i += 1;
57
- break;
58
- case "--force":
59
- parsed.force = true;
60
- break;
61
- case "--json":
62
- parsed.json = true;
63
- break;
64
- case "--quiet":
65
- parsed.quiet = true;
66
- break;
67
- case "--debug":
68
- parsed.debug = true;
69
- break;
70
- case "--workspace":
71
- case "--workspace-root":
72
- i += 1;
73
- break;
74
- case "--help":
75
- case "-h":
76
- // eslint-disable-next-line no-console
77
- console.log(usage);
78
- process.exit(0);
79
- break;
80
- case "--no-color":
81
- case "--no-telemetry":
82
- // ignored global flags
83
- break;
84
- default:
85
- if (arg.startsWith("--channel=")) {
86
- parsed.channel = arg.split("=")[1] as UpdateChannel;
87
- } else if (arg.startsWith("--version=")) {
88
- parsed.version = arg.split("=")[1];
89
- } else {
90
- throw new Error(`Unknown flag: ${arg}\n\n${usage}`);
91
- }
92
- break;
93
- }
94
- }
95
- return parsed;
96
- };
97
-
98
- const isValidVersion = (value?: string): boolean => {
99
- if (!value) return true;
100
- return /^\d+\.\d+\.\d+(-[\w.-]+)?$/.test(value);
101
- };
102
-
103
- const confirmInteractive = async (prompt: string): Promise<boolean> => {
104
- const rl = readline.createInterface({ input, output });
105
- const answer = await rl.question(prompt);
106
- rl.close();
107
- return /^y(es)?$/i.test(answer.trim());
108
- };
109
-
110
- export class UpdateCommands {
111
- static async run(argv: string[]): Promise<void> {
112
- let runId: string | undefined;
113
- let service: SystemUpdateService | undefined;
114
- let exitCode = 0;
115
- let errorSummary: string | null = null;
116
- let result: Record<string, unknown> | undefined;
117
- const cliVersion = readCliVersion();
118
- try {
119
- const parsed = parseUpdateArgs(argv);
120
- if (!isValidVersion(parsed.version)) {
121
- throw new Error(`Invalid --version value (expected semver): ${parsed.version}`);
122
- }
123
- service = await SystemUpdateService.create();
124
-
125
- runId = await service.startRun({
126
- cliVersion,
127
- channel: parsed.channel ?? "stable",
128
- versionOverride: parsed.version,
129
- checkOnly: parsed.checkOnly,
130
- force: parsed.force,
131
- });
132
-
133
- const channel = await service.resolveChannel(parsed.channel);
134
- if (parsed.channel) {
135
- await service.savePreferredChannel(channel);
136
- }
137
-
138
- let check;
139
- try {
140
- check = await service.checkUpdate(channel);
141
- } catch (error) {
142
- errorSummary = error instanceof Error ? error.message : String(error);
143
- exitCode = 4;
144
- if (!parsed.quiet) {
145
- // eslint-disable-next-line no-console
146
- console.error(errorSummary);
147
- }
148
- return;
149
- }
150
-
151
- const targetVersion = parsed.version ?? check.info.latestVersion;
152
- const npmCommand = `npm install -g mcoda@${targetVersion}`;
153
- result = { check, targetVersion, npmCommand };
154
-
155
- if (parsed.checkOnly) {
156
- if (parsed.json) {
157
- // eslint-disable-next-line no-console
158
- console.log(JSON.stringify({ ...check.info, channel: check.channel, checkedAt: check.checkedAt }, null, 2));
159
- } else if (!parsed.quiet) {
160
- const summary = `Current: ${check.info.currentVersion}, Latest (channel=${check.channel}): ${check.info.latestVersion}, updateAvailable: ${check.info.updateAvailable}`;
161
- // eslint-disable-next-line no-console
162
- console.log(summary);
163
- if (check.info.notes) {
164
- // eslint-disable-next-line no-console
165
- console.log(check.info.notes);
166
- }
167
- }
168
- return;
169
- }
170
-
171
- const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
172
- const requiresForce = !interactive || Boolean(process.env.CI);
173
- if (requiresForce && !parsed.force) {
174
- exitCode = 2;
175
- errorSummary = "Non-interactive update requires --force.";
176
- if (!parsed.quiet) {
177
- // eslint-disable-next-line no-console
178
- console.error(`${errorSummary} Planned npm command: ${npmCommand}`);
179
- }
180
- return;
181
- }
182
-
183
- if (interactive && !parsed.force) {
184
- const proceed = await confirmInteractive(
185
- `Update mcoda from ${check.info.currentVersion} -> ${targetVersion} on channel ${channel}? [y/N] `,
186
- );
187
- if (!proceed) {
188
- exitCode = 2;
189
- errorSummary = "Update cancelled by user.";
190
- return;
191
- }
192
- }
193
-
194
- if (!check.info.updateAvailable && !parsed.version) {
195
- if (!parsed.quiet) {
196
- // eslint-disable-next-line no-console
197
- console.log("Already up to date.");
198
- }
199
- await service.recordApplyState(check.info, channel, check.info.currentVersion);
200
- return;
201
- }
202
-
203
- if (!parsed.quiet) {
204
- // eslint-disable-next-line no-console
205
- console.log(`Applying update via API (npm command: ${npmCommand})...`);
206
- }
207
-
208
- let applyResponse: ApplyUpdateResponse | undefined;
209
- let npmFallbackSucceeded = false;
210
- try {
211
- applyResponse = await service.applyUpdate(channel);
212
- result = { ...result, applyResponse };
213
- } catch (error) {
214
- errorSummary = error instanceof Error ? error.message : String(error);
215
- try {
216
- const npmResult = await service.runNpmInstall(targetVersion, { quiet: parsed.quiet });
217
- result = { ...result, npmResult };
218
- if (npmResult.code !== 0) {
219
- exitCode = 6;
220
- errorSummary = `npm install exited with code ${npmResult.code}`;
221
- } else {
222
- npmFallbackSucceeded = true;
223
- exitCode = 0;
224
- errorSummary = null;
225
- }
226
- } catch (installError) {
227
- exitCode = 6;
228
- errorSummary = installError instanceof Error ? installError.message : String(installError);
229
- }
230
- }
231
-
232
- if (applyResponse) {
233
- if (applyResponse.status === "already_up_to_date") {
234
- if (!parsed.quiet) {
235
- // eslint-disable-next-line no-console
236
- console.log("Already up to date.");
237
- }
238
- exitCode = 0;
239
- } else if (applyResponse.status === "started") {
240
- if (!parsed.quiet) {
241
- // eslint-disable-next-line no-console
242
- console.log(`Update started. Logs: ${applyResponse.logFile ?? "n/a"}`);
243
- }
244
- } else if (applyResponse.status === "completed") {
245
- if (!parsed.quiet) {
246
- // eslint-disable-next-line no-console
247
- console.log(`Update completed. Logs: ${applyResponse.logFile ?? "n/a"}`);
248
- }
249
- }
250
- await service.recordApplyState(check.info, channel, targetVersion);
251
- if (parsed.json) {
252
- // eslint-disable-next-line no-console
253
- console.log(
254
- JSON.stringify(
255
- {
256
- status: applyResponse.status,
257
- logFile: applyResponse.logFile,
258
- targetVersion,
259
- channel,
260
- npmCommand,
261
- },
262
- null,
263
- 2,
264
- ),
265
- );
266
- }
267
- } else if (npmFallbackSucceeded) {
268
- // npm fallback succeeded
269
- await service.recordApplyState(check.info, channel, targetVersion);
270
- if (parsed.json) {
271
- // eslint-disable-next-line no-console
272
- console.log(JSON.stringify({ status: "completed", targetVersion, channel, npmCommand }, null, 2));
273
- }
274
- } else if (exitCode === 4 && !parsed.quiet) {
275
- // eslint-disable-next-line no-console
276
- console.error(`Update apply failed; run manually: ${npmCommand}`);
277
- }
278
- } catch (error) {
279
- const message = error instanceof Error ? error.message : String(error);
280
- // eslint-disable-next-line no-console
281
- console.error(message);
282
- exitCode = exitCode || 1;
283
- errorSummary = message;
284
- } finally {
285
- if (service && runId) {
286
- await service.finishRun(runId, {
287
- status: exitCode === 0 ? "succeeded" : "failed",
288
- exitCode,
289
- errorSummary,
290
- result,
291
- });
292
- }
293
- if (service) {
294
- await service.close();
295
- }
296
- if (exitCode) {
297
- process.exitCode = exitCode;
298
- }
299
- }
300
- }
301
- }