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,773 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import { Connection } from "../../sqlite/connection.js";
3
- import { WorkspaceMigrations } from "../../migrations/workspace/WorkspaceMigrations.js";
4
- export class WorkspaceRepository {
5
- constructor(db, connection) {
6
- this.db = db;
7
- this.connection = connection;
8
- }
9
- static async create(cwd) {
10
- const connection = await Connection.openWorkspace(cwd);
11
- await WorkspaceMigrations.run(connection.db);
12
- return new WorkspaceRepository(connection.db, connection);
13
- }
14
- async close() {
15
- if (this.connection) {
16
- await this.connection.close();
17
- }
18
- }
19
- getDb() {
20
- return this.db;
21
- }
22
- async withTransaction(fn) {
23
- await this.db.exec("BEGIN IMMEDIATE");
24
- try {
25
- const result = await fn();
26
- await this.db.exec("COMMIT");
27
- return result;
28
- }
29
- catch (error) {
30
- await this.db.exec("ROLLBACK");
31
- throw error;
32
- }
33
- }
34
- async getProjectByKey(key) {
35
- const row = await this.db.get(`SELECT id, key, name, description, metadata_json, created_at, updated_at FROM projects WHERE key = ?`, key);
36
- if (!row)
37
- return undefined;
38
- return {
39
- id: row.id,
40
- key: row.key,
41
- name: row.name ?? undefined,
42
- description: row.description ?? undefined,
43
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
44
- createdAt: row.created_at,
45
- updatedAt: row.updated_at,
46
- };
47
- }
48
- async createProjectIfMissing(input) {
49
- const existing = await this.getProjectByKey(input.key);
50
- if (existing)
51
- return existing;
52
- const now = new Date().toISOString();
53
- const id = randomUUID();
54
- await this.db.run(`INSERT INTO projects (id, key, name, description, created_at, updated_at)
55
- VALUES (?, ?, ?, ?, ?, ?)`, id, input.key, input.name ?? null, input.description ?? null, now, now);
56
- return {
57
- id,
58
- key: input.key,
59
- name: input.name,
60
- description: input.description,
61
- createdAt: now,
62
- updatedAt: now,
63
- };
64
- }
65
- async insertEpics(epics, useTransaction = true) {
66
- const now = new Date().toISOString();
67
- const rows = [];
68
- const run = async () => {
69
- for (const epic of epics) {
70
- const id = randomUUID();
71
- await this.db.run(`INSERT INTO epics (id, project_id, key, title, description, story_points_total, priority, metadata_json, created_at, updated_at)
72
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, epic.projectId, epic.key, epic.title, epic.description, epic.storyPointsTotal ?? null, epic.priority ?? null, epic.metadata ? JSON.stringify(epic.metadata) : null, now, now);
73
- rows.push({ ...epic, id, createdAt: now, updatedAt: now });
74
- }
75
- };
76
- if (useTransaction) {
77
- await this.withTransaction(run);
78
- }
79
- else {
80
- await run();
81
- }
82
- return rows;
83
- }
84
- async insertStories(stories, useTransaction = true) {
85
- const now = new Date().toISOString();
86
- const rows = [];
87
- const run = async () => {
88
- for (const story of stories) {
89
- const id = randomUUID();
90
- await this.db.run(`INSERT INTO user_stories (id, project_id, epic_id, key, title, description, acceptance_criteria, story_points_total, priority, metadata_json, created_at, updated_at)
91
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, story.projectId, story.epicId, story.key, story.title, story.description, story.acceptanceCriteria ?? null, story.storyPointsTotal ?? null, story.priority ?? null, story.metadata ? JSON.stringify(story.metadata) : null, now, now);
92
- rows.push({ ...story, id, createdAt: now, updatedAt: now });
93
- }
94
- };
95
- if (useTransaction) {
96
- await this.withTransaction(run);
97
- }
98
- else {
99
- await run();
100
- }
101
- return rows;
102
- }
103
- async insertTasks(tasks, useTransaction = true) {
104
- const now = new Date().toISOString();
105
- const rows = [];
106
- const run = async () => {
107
- for (const task of tasks) {
108
- const id = randomUUID();
109
- await this.db.run(`INSERT INTO tasks (id, project_id, epic_id, user_story_id, key, title, description, type, status, story_points, priority, assigned_agent_id, assignee_human, vcs_branch, vcs_base_branch, vcs_last_commit_sha, metadata_json, openapi_version_at_creation, created_at, updated_at)
110
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, task.projectId, task.epicId, task.userStoryId, task.key, task.title, task.description, task.type ?? null, task.status, task.storyPoints ?? null, task.priority ?? null, task.assignedAgentId ?? null, task.assigneeHuman ?? null, task.vcsBranch ?? null, task.vcsBaseBranch ?? null, task.vcsLastCommitSha ?? null, task.metadata ? JSON.stringify(task.metadata) : null, task.openapiVersionAtCreation ?? null, now, now);
111
- rows.push({ ...task, id, createdAt: now, updatedAt: now });
112
- }
113
- };
114
- if (useTransaction) {
115
- await this.withTransaction(run);
116
- }
117
- else {
118
- await run();
119
- }
120
- return rows;
121
- }
122
- async updateStoryPointsTotal(storyId, total) {
123
- await this.db.run(`UPDATE user_stories SET story_points_total = ?, updated_at = ? WHERE id = ?`, total, new Date().toISOString(), storyId);
124
- }
125
- async updateEpicStoryPointsTotal(epicId, total) {
126
- await this.db.run(`UPDATE epics SET story_points_total = ?, updated_at = ? WHERE id = ?`, total, new Date().toISOString(), epicId);
127
- }
128
- async insertTaskDependencies(deps, useTransaction = true) {
129
- const now = new Date().toISOString();
130
- const rows = [];
131
- const run = async () => {
132
- for (const dep of deps) {
133
- const id = randomUUID();
134
- await this.db.run(`INSERT INTO task_dependencies (id, task_id, depends_on_task_id, relation_type, created_at, updated_at)
135
- VALUES (?, ?, ?, ?, ?, ?)`, id, dep.taskId, dep.dependsOnTaskId, dep.relationType, now, now);
136
- rows.push({ ...dep, id, createdAt: now, updatedAt: now });
137
- }
138
- };
139
- if (useTransaction) {
140
- await this.withTransaction(run);
141
- }
142
- else {
143
- await run();
144
- }
145
- return rows;
146
- }
147
- async deleteTaskDependenciesForTask(taskId) {
148
- await this.db.run(`DELETE FROM task_dependencies WHERE task_id = ? OR depends_on_task_id = ?`, taskId, taskId);
149
- }
150
- async updateTask(taskId, updates) {
151
- const fields = [];
152
- const params = [];
153
- if (updates.title !== undefined) {
154
- fields.push("title = ?");
155
- params.push(updates.title);
156
- }
157
- if (updates.description !== undefined) {
158
- fields.push("description = ?");
159
- params.push(updates.description);
160
- }
161
- if (updates.type !== undefined) {
162
- fields.push("type = ?");
163
- params.push(updates.type);
164
- }
165
- if (updates.status !== undefined) {
166
- fields.push("status = ?");
167
- params.push(updates.status);
168
- }
169
- if (updates.storyPoints !== undefined) {
170
- fields.push("story_points = ?");
171
- params.push(updates.storyPoints);
172
- }
173
- if (updates.priority !== undefined) {
174
- fields.push("priority = ?");
175
- params.push(updates.priority);
176
- }
177
- if (updates.metadata !== undefined) {
178
- fields.push("metadata_json = ?");
179
- params.push(updates.metadata ? JSON.stringify(updates.metadata) : null);
180
- }
181
- if (updates.assignedAgentId !== undefined) {
182
- fields.push("assigned_agent_id = ?");
183
- params.push(updates.assignedAgentId);
184
- }
185
- if (updates.assigneeHuman !== undefined) {
186
- fields.push("assignee_human = ?");
187
- params.push(updates.assigneeHuman);
188
- }
189
- if (updates.vcsBranch !== undefined) {
190
- fields.push("vcs_branch = ?");
191
- params.push(updates.vcsBranch);
192
- }
193
- if (updates.vcsBaseBranch !== undefined) {
194
- fields.push("vcs_base_branch = ?");
195
- params.push(updates.vcsBaseBranch);
196
- }
197
- if (updates.vcsLastCommitSha !== undefined) {
198
- fields.push("vcs_last_commit_sha = ?");
199
- params.push(updates.vcsLastCommitSha);
200
- }
201
- if (fields.length === 0)
202
- return;
203
- fields.push("updated_at = ?");
204
- params.push(new Date().toISOString());
205
- params.push(taskId);
206
- await this.db.run(`UPDATE tasks SET ${fields.join(", ")} WHERE id = ?`, ...params);
207
- }
208
- async getTaskById(taskId) {
209
- const row = await this.db.get(`SELECT id, project_id, epic_id, user_story_id, key, title, description, type, status, story_points, priority, assigned_agent_id, assignee_human, vcs_branch, vcs_base_branch, vcs_last_commit_sha, metadata_json, openapi_version_at_creation, created_at, updated_at
210
- FROM tasks WHERE id = ?`, taskId);
211
- if (!row)
212
- return undefined;
213
- return {
214
- id: row.id,
215
- projectId: row.project_id,
216
- epicId: row.epic_id,
217
- userStoryId: row.user_story_id,
218
- key: row.key,
219
- title: row.title,
220
- description: row.description ?? undefined,
221
- type: row.type ?? undefined,
222
- status: row.status,
223
- storyPoints: row.story_points ?? undefined,
224
- priority: row.priority ?? undefined,
225
- assignedAgentId: row.assigned_agent_id ?? undefined,
226
- assigneeHuman: row.assignee_human ?? undefined,
227
- vcsBranch: row.vcs_branch ?? undefined,
228
- vcsBaseBranch: row.vcs_base_branch ?? undefined,
229
- vcsLastCommitSha: row.vcs_last_commit_sha ?? undefined,
230
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
231
- openapiVersionAtCreation: row.openapi_version_at_creation ?? undefined,
232
- createdAt: row.created_at,
233
- updatedAt: row.updated_at,
234
- };
235
- }
236
- async getTaskByKey(taskKey) {
237
- const row = await this.db.get(`SELECT id, project_id, epic_id, user_story_id, key, title, description, type, status, story_points, priority, assigned_agent_id, assignee_human, vcs_branch, vcs_base_branch, vcs_last_commit_sha, metadata_json, openapi_version_at_creation, created_at, updated_at
238
- FROM tasks WHERE key = ?`, taskKey);
239
- if (!row)
240
- return undefined;
241
- return {
242
- id: row.id,
243
- projectId: row.project_id,
244
- epicId: row.epic_id,
245
- userStoryId: row.user_story_id,
246
- key: row.key,
247
- title: row.title,
248
- description: row.description ?? undefined,
249
- type: row.type ?? undefined,
250
- status: row.status,
251
- storyPoints: row.story_points ?? undefined,
252
- priority: row.priority ?? undefined,
253
- assignedAgentId: row.assigned_agent_id ?? undefined,
254
- assigneeHuman: row.assignee_human ?? undefined,
255
- vcsBranch: row.vcs_branch ?? undefined,
256
- vcsBaseBranch: row.vcs_base_branch ?? undefined,
257
- vcsLastCommitSha: row.vcs_last_commit_sha ?? undefined,
258
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
259
- openapiVersionAtCreation: row.openapi_version_at_creation ?? undefined,
260
- createdAt: row.created_at,
261
- updatedAt: row.updated_at,
262
- };
263
- }
264
- async getTasksByIds(taskIds) {
265
- if (!taskIds.length)
266
- return [];
267
- const placeholders = taskIds.map(() => "?").join(", ");
268
- const rows = await this.db.all(`SELECT id, project_id, epic_id, user_story_id, key, title, description, type, status, story_points, priority, assigned_agent_id, assignee_human, vcs_branch, vcs_base_branch, vcs_last_commit_sha, metadata_json, openapi_version_at_creation, created_at, updated_at
269
- FROM tasks WHERE id IN (${placeholders})`, ...taskIds);
270
- return rows.map((row) => ({
271
- id: row.id,
272
- projectId: row.project_id,
273
- epicId: row.epic_id,
274
- userStoryId: row.user_story_id,
275
- key: row.key,
276
- title: row.title,
277
- description: row.description ?? undefined,
278
- type: row.type ?? undefined,
279
- status: row.status,
280
- storyPoints: row.story_points ?? undefined,
281
- priority: row.priority ?? undefined,
282
- assignedAgentId: row.assigned_agent_id ?? undefined,
283
- assigneeHuman: row.assignee_human ?? undefined,
284
- vcsBranch: row.vcs_branch ?? undefined,
285
- vcsBaseBranch: row.vcs_base_branch ?? undefined,
286
- vcsLastCommitSha: row.vcs_last_commit_sha ?? undefined,
287
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
288
- openapiVersionAtCreation: row.openapi_version_at_creation ?? undefined,
289
- createdAt: row.created_at,
290
- updatedAt: row.updated_at,
291
- }));
292
- }
293
- async listEpicKeys(projectId) {
294
- const rows = await this.db.all(`SELECT key FROM epics WHERE project_id = ? ORDER BY key`, projectId);
295
- return rows.map((r) => r.key);
296
- }
297
- async listStoryKeys(epicId) {
298
- const rows = await this.db.all(`SELECT key FROM user_stories WHERE epic_id = ? ORDER BY key`, epicId);
299
- return rows.map((r) => r.key);
300
- }
301
- async listTaskKeys(userStoryId) {
302
- const rows = await this.db.all(`SELECT key FROM tasks WHERE user_story_id = ? ORDER BY key`, userStoryId);
303
- return rows.map((r) => r.key);
304
- }
305
- async createJob(record) {
306
- const now = new Date().toISOString();
307
- const id = randomUUID();
308
- await this.db.run(`INSERT INTO jobs (id, workspace_id, type, state, command_name, payload_json, total_items, processed_items, last_checkpoint, created_at, updated_at)
309
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, record.workspaceId, record.type, record.state, record.commandName ?? null, record.payload ? JSON.stringify(record.payload) : null, record.totalItems ?? null, record.processedItems ?? null, record.lastCheckpoint ?? null, now, now);
310
- return {
311
- id,
312
- ...record,
313
- createdAt: now,
314
- updatedAt: now,
315
- completedAt: null,
316
- errorSummary: null,
317
- };
318
- }
319
- async listJobs() {
320
- const rows = await this.db.all(`SELECT id, workspace_id, type, state, command_name, payload_json, total_items, processed_items, last_checkpoint, created_at, updated_at, completed_at, error_summary
321
- FROM jobs ORDER BY updated_at DESC`);
322
- return rows.map((row) => ({
323
- id: row.id,
324
- workspaceId: row.workspace_id,
325
- type: row.type,
326
- state: row.state,
327
- commandName: row.command_name ?? undefined,
328
- payload: row.payload_json ? JSON.parse(row.payload_json) : undefined,
329
- totalItems: row.total_items ?? undefined,
330
- processedItems: row.processed_items ?? undefined,
331
- lastCheckpoint: row.last_checkpoint ?? undefined,
332
- createdAt: row.created_at,
333
- updatedAt: row.updated_at,
334
- completedAt: row.completed_at ?? undefined,
335
- errorSummary: row.error_summary ?? undefined,
336
- }));
337
- }
338
- async getJob(id) {
339
- const row = await this.db.get(`SELECT id, workspace_id, type, state, command_name, payload_json, total_items, processed_items, last_checkpoint, created_at, updated_at, completed_at, error_summary
340
- FROM jobs WHERE id = ?`, id);
341
- if (!row)
342
- return undefined;
343
- return {
344
- id: row.id,
345
- workspaceId: row.workspace_id,
346
- type: row.type,
347
- state: row.state,
348
- commandName: row.command_name ?? undefined,
349
- payload: row.payload_json ? JSON.parse(row.payload_json) : undefined,
350
- totalItems: row.total_items ?? undefined,
351
- processedItems: row.processed_items ?? undefined,
352
- lastCheckpoint: row.last_checkpoint ?? undefined,
353
- createdAt: row.created_at,
354
- updatedAt: row.updated_at,
355
- completedAt: row.completed_at ?? undefined,
356
- errorSummary: row.error_summary ?? undefined,
357
- };
358
- }
359
- async updateJobState(id, update) {
360
- const existing = await this.db.get(`SELECT payload_json FROM jobs WHERE id = ?`, id);
361
- const payload = existing?.payload_json ? JSON.parse(existing.payload_json) : undefined;
362
- const mergedPayload = update.payload !== undefined ? { ...(payload ?? {}), ...(update.payload ?? {}) } : payload;
363
- const fields = [];
364
- const params = [];
365
- if (update.state !== undefined) {
366
- fields.push("state = ?");
367
- params.push(update.state);
368
- }
369
- if (update.commandName !== undefined) {
370
- fields.push("command_name = ?");
371
- params.push(update.commandName ?? null);
372
- }
373
- if (update.totalItems !== undefined) {
374
- fields.push("total_items = ?");
375
- params.push(update.totalItems ?? null);
376
- }
377
- if (update.processedItems !== undefined) {
378
- fields.push("processed_items = ?");
379
- params.push(update.processedItems ?? null);
380
- }
381
- if (update.lastCheckpoint !== undefined) {
382
- fields.push("last_checkpoint = ?");
383
- params.push(update.lastCheckpoint ?? null);
384
- }
385
- if (update.errorSummary !== undefined) {
386
- fields.push("error_summary = ?");
387
- params.push(update.errorSummary ?? null);
388
- }
389
- if (update.completedAt !== undefined) {
390
- fields.push("completed_at = ?");
391
- params.push(update.completedAt ?? null);
392
- }
393
- if (mergedPayload !== undefined) {
394
- fields.push("payload_json = ?");
395
- params.push(JSON.stringify(mergedPayload));
396
- }
397
- fields.push("updated_at = ?");
398
- params.push(new Date().toISOString());
399
- params.push(id);
400
- await this.db.run(`UPDATE jobs SET ${fields.join(", ")} WHERE id = ?`, ...params);
401
- }
402
- async createCommandRun(record) {
403
- const id = randomUUID();
404
- await this.db.run(`INSERT INTO command_runs (id, workspace_id, command_name, job_id, task_ids_json, git_branch, git_base_branch, started_at, status, sp_processed)
405
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, record.workspaceId, record.commandName, record.jobId ?? null, record.taskIds ? JSON.stringify(record.taskIds) : null, record.gitBranch ?? null, record.gitBaseBranch ?? null, record.startedAt, record.status, record.spProcessed ?? null);
406
- return { id, ...record, completedAt: null, errorSummary: null, durationSeconds: null };
407
- }
408
- async setCommandRunJobId(id, jobId) {
409
- await this.db.run(`UPDATE command_runs SET job_id = ? WHERE id = ?`, jobId, id);
410
- }
411
- async completeCommandRun(id, update) {
412
- await this.db.run(`UPDATE command_runs
413
- SET status = ?, completed_at = ?, error_summary = ?, duration_seconds = ?, sp_processed = ?
414
- WHERE id = ?`, update.status, update.completedAt, update.errorSummary ?? null, update.durationSeconds ?? null, update.spProcessed ?? null, id);
415
- }
416
- async getTasksWithRelations(taskIds) {
417
- if (!taskIds.length)
418
- return [];
419
- const placeholders = taskIds.map(() => "?").join(", ");
420
- const rows = await this.db.all(`
421
- SELECT
422
- t.id as task_id,
423
- t.project_id as project_id,
424
- t.key as task_key,
425
- t.status as task_status,
426
- t.priority as task_priority,
427
- t.story_points as task_story_points,
428
- t.created_at as task_created_at,
429
- t.updated_at as task_updated_at,
430
- t.description as task_description,
431
- t.title as task_title,
432
- t.type as task_type,
433
- t.metadata_json as task_metadata,
434
- t.assigned_agent_id as task_assigned_agent_id,
435
- t.assignee_human as task_assignee_human,
436
- t.vcs_branch as task_vcs_branch,
437
- t.vcs_base_branch as task_vcs_base_branch,
438
- t.vcs_last_commit_sha as task_vcs_last_commit_sha,
439
- e.id as epic_id,
440
- e.key as epic_key,
441
- e.title as epic_title,
442
- e.description as epic_description,
443
- us.id as story_id,
444
- us.key as story_key,
445
- us.title as story_title,
446
- us.description as story_description,
447
- us.acceptance_criteria as story_acceptance
448
- FROM tasks t
449
- JOIN epics e ON e.id = t.epic_id
450
- JOIN user_stories us ON us.id = t.user_story_id
451
- WHERE t.id IN (${placeholders})
452
- `, ...taskIds);
453
- return rows.map((row) => ({
454
- id: row.task_id,
455
- projectId: row.project_id,
456
- epicId: row.epic_id,
457
- userStoryId: row.story_id,
458
- key: row.task_key,
459
- title: row.task_title,
460
- description: row.task_description ?? "",
461
- type: row.task_type ?? undefined,
462
- status: row.task_status,
463
- storyPoints: row.task_story_points ?? undefined,
464
- priority: row.task_priority ?? undefined,
465
- assignedAgentId: row.task_assigned_agent_id ?? undefined,
466
- assigneeHuman: row.task_assignee_human ?? undefined,
467
- vcsBranch: row.task_vcs_branch ?? undefined,
468
- vcsBaseBranch: row.task_vcs_base_branch ?? undefined,
469
- vcsLastCommitSha: row.task_vcs_last_commit_sha ?? undefined,
470
- metadata: row.task_metadata ? JSON.parse(row.task_metadata) : undefined,
471
- openapiVersionAtCreation: undefined,
472
- createdAt: row.task_created_at,
473
- updatedAt: row.task_updated_at,
474
- epicKey: row.epic_key,
475
- storyKey: row.story_key,
476
- epicTitle: row.epic_title ?? undefined,
477
- storyTitle: row.story_title ?? undefined,
478
- storyDescription: row.story_description ?? undefined,
479
- acceptanceCriteria: row.story_acceptance
480
- ? row.story_acceptance
481
- .split(/\r?\n/)
482
- .map((s) => s.trim())
483
- .filter(Boolean)
484
- : undefined,
485
- }));
486
- }
487
- async createTaskRun(record) {
488
- const id = randomUUID();
489
- await this.db.run(`INSERT INTO task_runs (id, task_id, command, job_id, command_run_id, agent_id, status, started_at, finished_at, story_points_at_run, sp_per_hour_effective, git_branch, git_base_branch, git_commit_sha, run_context_json)
490
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, record.taskId, record.command, record.jobId ?? null, record.commandRunId ?? null, record.agentId ?? null, record.status, record.startedAt, record.finishedAt ?? null, record.storyPointsAtRun ?? null, record.spPerHourEffective ?? null, record.gitBranch ?? null, record.gitBaseBranch ?? null, record.gitCommitSha ?? null, record.runContext ? JSON.stringify(record.runContext) : null);
491
- return { id, ...record };
492
- }
493
- async createTaskQaRun(record) {
494
- const id = randomUUID();
495
- const createdAt = record.createdAt ?? new Date().toISOString();
496
- await this.db.run(`INSERT INTO task_qa_runs (id, task_id, task_run_id, job_id, command_run_id, agent_id, model_name, source, mode, profile_name, runner, raw_outcome, recommendation, evidence_url, artifacts_json, raw_result_json, started_at, finished_at, metadata_json, created_at)
497
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, record.taskId, record.taskRunId ?? null, record.jobId ?? null, record.commandRunId ?? null, record.agentId ?? null, record.modelName ?? null, record.source, record.mode ?? null, record.profileName ?? null, record.runner ?? null, record.rawOutcome ?? null, record.recommendation ?? null, record.evidenceUrl ?? null, record.artifacts ? JSON.stringify(record.artifacts) : null, record.rawResult ? JSON.stringify(record.rawResult) : null, record.startedAt ?? null, record.finishedAt ?? null, record.metadata ? JSON.stringify(record.metadata) : null, createdAt);
498
- return { id, ...record, createdAt };
499
- }
500
- async listTaskQaRuns(taskId) {
501
- const rows = await this.db.all(`SELECT id, task_id, task_run_id, job_id, command_run_id, agent_id, model_name, source, mode, profile_name, runner, raw_outcome, recommendation, evidence_url, artifacts_json, raw_result_json, started_at, finished_at, metadata_json, created_at
502
- FROM task_qa_runs
503
- WHERE task_id = ?
504
- ORDER BY created_at DESC`, taskId);
505
- return rows.map((row) => ({
506
- id: row.id,
507
- taskId: row.task_id,
508
- taskRunId: row.task_run_id ?? undefined,
509
- jobId: row.job_id ?? undefined,
510
- commandRunId: row.command_run_id ?? undefined,
511
- agentId: row.agent_id ?? undefined,
512
- modelName: row.model_name ?? undefined,
513
- source: row.source,
514
- mode: row.mode ?? undefined,
515
- profileName: row.profile_name ?? undefined,
516
- runner: row.runner ?? undefined,
517
- rawOutcome: row.raw_outcome ?? undefined,
518
- recommendation: row.recommendation ?? undefined,
519
- evidenceUrl: row.evidence_url ?? undefined,
520
- artifacts: row.artifacts_json ? JSON.parse(row.artifacts_json) : undefined,
521
- rawResult: row.raw_result_json ? JSON.parse(row.raw_result_json) : undefined,
522
- startedAt: row.started_at ?? undefined,
523
- finishedAt: row.finished_at ?? undefined,
524
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
525
- createdAt: row.created_at,
526
- }));
527
- }
528
- async listTaskQaRunsForJob(taskIds, jobId) {
529
- if (!taskIds.length)
530
- return [];
531
- const placeholders = taskIds.map(() => '?').join(', ');
532
- const rows = await this.db.all(`SELECT id, task_id, task_run_id, job_id, command_run_id, agent_id, model_name, source, mode, profile_name, runner, raw_outcome, recommendation, evidence_url, artifacts_json, raw_result_json, started_at, finished_at, metadata_json, created_at
533
- FROM task_qa_runs
534
- WHERE job_id = ? AND task_id IN (${placeholders})
535
- ORDER BY created_at DESC`, jobId, ...taskIds);
536
- return rows.map((row) => ({
537
- id: row.id,
538
- taskId: row.task_id,
539
- taskRunId: row.task_run_id ?? undefined,
540
- jobId: row.job_id ?? undefined,
541
- commandRunId: row.command_run_id ?? undefined,
542
- agentId: row.agent_id ?? undefined,
543
- modelName: row.model_name ?? undefined,
544
- source: row.source,
545
- mode: row.mode ?? undefined,
546
- profileName: row.profile_name ?? undefined,
547
- runner: row.runner ?? undefined,
548
- rawOutcome: row.raw_outcome ?? undefined,
549
- recommendation: row.recommendation ?? undefined,
550
- evidenceUrl: row.evidence_url ?? undefined,
551
- artifacts: row.artifacts_json ? JSON.parse(row.artifacts_json) : undefined,
552
- rawResult: row.raw_result_json ? JSON.parse(row.raw_result_json) : undefined,
553
- startedAt: row.started_at ?? undefined,
554
- finishedAt: row.finished_at ?? undefined,
555
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
556
- createdAt: row.created_at,
557
- }));
558
- }
559
- async insertTaskLog(entry) {
560
- const id = randomUUID();
561
- await this.db.run(`INSERT INTO task_logs (id, task_run_id, sequence, timestamp, level, source, message, details_json)
562
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, id, entry.taskRunId, entry.sequence, entry.timestamp, entry.level ?? null, entry.source ?? null, entry.message ?? null, entry.details ? JSON.stringify(entry.details) : null);
563
- }
564
- async updateTaskRun(id, update) {
565
- const fields = [];
566
- const params = [];
567
- if (update.status !== undefined) {
568
- fields.push("status = ?");
569
- params.push(update.status);
570
- }
571
- if (update.finishedAt !== undefined) {
572
- fields.push("finished_at = ?");
573
- params.push(update.finishedAt);
574
- }
575
- if (update.gitBranch !== undefined) {
576
- fields.push("git_branch = ?");
577
- params.push(update.gitBranch);
578
- }
579
- if (update.gitBaseBranch !== undefined) {
580
- fields.push("git_base_branch = ?");
581
- params.push(update.gitBaseBranch);
582
- }
583
- if (update.gitCommitSha !== undefined) {
584
- fields.push("git_commit_sha = ?");
585
- params.push(update.gitCommitSha);
586
- }
587
- if (update.storyPointsAtRun !== undefined) {
588
- fields.push("story_points_at_run = ?");
589
- params.push(update.storyPointsAtRun);
590
- }
591
- if (update.spPerHourEffective !== undefined) {
592
- fields.push("sp_per_hour_effective = ?");
593
- params.push(update.spPerHourEffective);
594
- }
595
- if (update.runContext !== undefined) {
596
- fields.push("run_context_json = ?");
597
- params.push(update.runContext ? JSON.stringify(update.runContext) : null);
598
- }
599
- if (!fields.length)
600
- return;
601
- const clauses = fields.join(", ");
602
- params.push(id);
603
- await this.db.run(`UPDATE task_runs SET ${clauses} WHERE id = ?`, ...params);
604
- }
605
- async getTaskDependencies(taskIds) {
606
- if (!taskIds.length)
607
- return [];
608
- const placeholders = taskIds.map(() => "?").join(", ");
609
- const rows = await this.db.all(`SELECT id, task_id, depends_on_task_id, relation_type, created_at, updated_at
610
- FROM task_dependencies
611
- WHERE task_id IN (${placeholders})`, ...taskIds);
612
- return rows.map((row) => ({
613
- id: row.id,
614
- taskId: row.task_id,
615
- dependsOnTaskId: row.depends_on_task_id,
616
- relationType: row.relation_type,
617
- createdAt: row.created_at,
618
- updatedAt: row.updated_at,
619
- }));
620
- }
621
- async createTaskComment(record) {
622
- const id = randomUUID();
623
- await this.db.run(`INSERT INTO task_comments (id, task_id, task_run_id, job_id, source_command, author_type, author_agent_id, category, file, line, path_hint, body, metadata_json, created_at, resolved_at, resolved_by)
624
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, record.taskId, record.taskRunId ?? null, record.jobId ?? null, record.sourceCommand, record.authorType, record.authorAgentId ?? null, record.category ?? null, record.file ?? null, record.line ?? null, record.pathHint ?? null, record.body, record.metadata ? JSON.stringify(record.metadata) : null, record.createdAt, record.resolvedAt ?? null, record.resolvedBy ?? null);
625
- return { ...record, id };
626
- }
627
- async listTaskComments(taskId, options = {}) {
628
- const clauses = ["task_id = ?"];
629
- const params = [taskId];
630
- if (options.sourceCommands && options.sourceCommands.length) {
631
- clauses.push(`source_command IN (${options.sourceCommands.map(() => "?").join(", ")})`);
632
- params.push(...options.sourceCommands);
633
- }
634
- const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
635
- const limitClause = options.limit ? `LIMIT ${options.limit}` : "";
636
- const rows = await this.db.all(`SELECT id, task_id, task_run_id, job_id, source_command, author_type, author_agent_id, category, file, line, path_hint, body, metadata_json, created_at, resolved_at, resolved_by
637
- FROM task_comments
638
- ${where}
639
- ORDER BY datetime(created_at) DESC
640
- ${limitClause}`, ...params);
641
- return rows.map((row) => ({
642
- id: row.id,
643
- taskId: row.task_id,
644
- taskRunId: row.task_run_id ?? undefined,
645
- jobId: row.job_id ?? undefined,
646
- sourceCommand: row.source_command,
647
- authorType: row.author_type,
648
- authorAgentId: row.author_agent_id ?? undefined,
649
- category: row.category ?? undefined,
650
- file: row.file ?? undefined,
651
- line: row.line ?? undefined,
652
- pathHint: row.path_hint ?? undefined,
653
- body: row.body,
654
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
655
- createdAt: row.created_at,
656
- resolvedAt: row.resolved_at ?? undefined,
657
- resolvedBy: row.resolved_by ?? undefined,
658
- }));
659
- }
660
- async createTaskReview(record) {
661
- const id = randomUUID();
662
- await this.db.run(`INSERT INTO task_reviews (id, task_id, job_id, agent_id, model_name, decision, summary, findings_json, test_recommendations_json, metadata_json, created_at, created_by)
663
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, record.taskId, record.jobId ?? null, record.agentId ?? null, record.modelName ?? null, record.decision, record.summary ?? null, record.findingsJson ? JSON.stringify(record.findingsJson) : null, record.testRecommendationsJson ? JSON.stringify(record.testRecommendationsJson) : null, record.metadata ? JSON.stringify(record.metadata) : null, record.createdAt, record.createdBy ?? null);
664
- return { ...record, id };
665
- }
666
- async getLatestTaskReview(taskId) {
667
- const row = await this.db.get(`SELECT id, task_id, job_id, agent_id, model_name, decision, summary, findings_json, test_recommendations_json, metadata_json, created_at, created_by
668
- FROM task_reviews
669
- WHERE task_id = ?
670
- ORDER BY datetime(created_at) DESC
671
- LIMIT 1`, taskId);
672
- if (!row)
673
- return undefined;
674
- return {
675
- id: row.id,
676
- taskId: row.task_id,
677
- jobId: row.job_id ?? undefined,
678
- agentId: row.agent_id ?? undefined,
679
- modelName: row.model_name ?? undefined,
680
- decision: row.decision,
681
- summary: row.summary ?? undefined,
682
- findingsJson: row.findings_json ? JSON.parse(row.findings_json) : undefined,
683
- testRecommendationsJson: row.test_recommendations_json ? JSON.parse(row.test_recommendations_json) : undefined,
684
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
685
- createdAt: row.created_at,
686
- createdBy: row.created_by ?? undefined,
687
- };
688
- }
689
- async recordTokenUsage(entry) {
690
- const id = randomUUID();
691
- await this.db.run(`INSERT INTO token_usage (id, workspace_id, agent_id, model_name, job_id, command_run_id, task_run_id, task_id, project_id, epic_id, user_story_id, tokens_prompt, tokens_completion, tokens_total, cost_estimate, duration_seconds, timestamp, metadata_json)
692
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, id, entry.workspaceId, entry.agentId ?? null, entry.modelName ?? null, entry.jobId ?? null, entry.commandRunId ?? null, entry.taskRunId ?? null, entry.taskId ?? null, entry.projectId ?? null, entry.epicId ?? null, entry.userStoryId ?? null, entry.tokensPrompt ?? null, entry.tokensCompletion ?? null, entry.tokensTotal ?? null, entry.costEstimate ?? null, entry.durationSeconds ?? null, entry.timestamp, entry.metadata ? JSON.stringify(entry.metadata) : null);
693
- }
694
- async insertTaskRevision(record) {
695
- const id = randomUUID();
696
- await this.db.run(`INSERT INTO task_revisions (id, task_id, job_id, command_run_id, snapshot_before_json, snapshot_after_json, created_at)
697
- VALUES (?, ?, ?, ?, ?, ?, ?)`, id, record.taskId, record.jobId ?? null, record.commandRunId ?? null, record.snapshotBefore ? JSON.stringify(record.snapshotBefore) : null, record.snapshotAfter ? JSON.stringify(record.snapshotAfter) : null, record.createdAt);
698
- }
699
- async getEpicByKey(projectId, key) {
700
- const row = await this.db.get(`SELECT id, project_id, key, title, description, story_points_total, priority, metadata_json, created_at, updated_at FROM epics WHERE project_id = ? AND key = ?`, projectId, key);
701
- if (!row)
702
- return undefined;
703
- return {
704
- id: row.id,
705
- projectId: row.project_id,
706
- key: row.key,
707
- title: row.title,
708
- description: row.description ?? undefined,
709
- storyPointsTotal: row.story_points_total ?? undefined,
710
- priority: row.priority ?? undefined,
711
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
712
- createdAt: row.created_at,
713
- updatedAt: row.updated_at,
714
- };
715
- }
716
- async getStoryByKey(epicId, key) {
717
- const row = await this.db.get(`SELECT id, project_id, epic_id, key, title, description, acceptance_criteria, story_points_total, priority, metadata_json, created_at, updated_at FROM user_stories WHERE epic_id = ? AND key = ?`, epicId, key);
718
- if (!row)
719
- return undefined;
720
- return {
721
- id: row.id,
722
- projectId: row.project_id,
723
- epicId: row.epic_id,
724
- key: row.key,
725
- title: row.title,
726
- description: row.description ?? undefined,
727
- acceptanceCriteria: row.acceptance_criteria ?? undefined,
728
- storyPointsTotal: row.story_points_total ?? undefined,
729
- priority: row.priority ?? undefined,
730
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
731
- createdAt: row.created_at,
732
- updatedAt: row.updated_at,
733
- };
734
- }
735
- async getStoryByProjectAndKey(projectId, key) {
736
- const row = await this.db.get(`SELECT id, project_id, epic_id, key, title, description, acceptance_criteria, story_points_total, priority, metadata_json, created_at, updated_at FROM user_stories WHERE project_id = ? AND key = ?`, projectId, key);
737
- if (!row)
738
- return undefined;
739
- return {
740
- id: row.id,
741
- projectId: row.project_id,
742
- epicId: row.epic_id,
743
- key: row.key,
744
- title: row.title,
745
- description: row.description ?? undefined,
746
- acceptanceCriteria: row.acceptance_criteria ?? undefined,
747
- storyPointsTotal: row.story_points_total ?? undefined,
748
- priority: row.priority ?? undefined,
749
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
750
- createdAt: row.created_at,
751
- updatedAt: row.updated_at,
752
- };
753
- }
754
- async getStoryByProjectAndKey(projectId, key) {
755
- const row = await this.db.get(`SELECT id, project_id, epic_id, key, title, description, acceptance_criteria, story_points_total, priority, metadata_json, created_at, updated_at FROM user_stories WHERE project_id = ? AND key = ?`, projectId, key);
756
- if (!row)
757
- return undefined;
758
- return {
759
- id: row.id,
760
- projectId: row.project_id,
761
- epicId: row.epic_id,
762
- key: row.key,
763
- title: row.title,
764
- description: row.description ?? undefined,
765
- acceptanceCriteria: row.acceptance_criteria ?? undefined,
766
- storyPointsTotal: row.story_points_total ?? undefined,
767
- priority: row.priority ?? undefined,
768
- metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
769
- createdAt: row.created_at,
770
- updatedAt: row.updated_at,
771
- };
772
- }
773
- }