github-issue-tower-defence-management 2.19.1 → 2.19.3

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 (795) hide show
  1. package/bin/adapter/entry-points/cli/index.js +1 -3
  2. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  3. package/bin/adapter/entry-points/console/consoleOperationApi.js +6 -12
  4. package/bin/adapter/entry-points/console/consoleOperationApi.js.map +1 -1
  5. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +1 -1
  6. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
  7. package/bin/adapter/repositories/issue/RestIssueRepository.js +9 -2
  8. package/bin/adapter/repositories/issue/RestIssueRepository.js.map +1 -1
  9. package/package.json +5 -1
  10. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  11. package/types/adapter/entry-points/console/consoleOperationApi.d.ts.map +1 -1
  12. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +1 -1
  13. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
  14. package/types/adapter/repositories/issue/RestIssueRepository.d.ts +5 -1
  15. package/types/adapter/repositories/issue/RestIssueRepository.d.ts.map +1 -1
  16. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +1 -1
  17. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
  18. package/.env.example +0 -7
  19. package/.gitattributes +0 -2
  20. package/.github/CODEOWNERS +0 -6
  21. package/.github/copilot-instructions.md +0 -6
  22. package/.github/dependabot.yml +0 -19
  23. package/.github/instructions/code-review.instructions.md +0 -50
  24. package/.github/workflows/api-created_issue_pr.yml +0 -97
  25. package/.github/workflows/ci-failure-issue-creator.yml +0 -48
  26. package/.github/workflows/close-manual-prs.yml +0 -80
  27. package/.github/workflows/codeql.yml +0 -107
  28. package/.github/workflows/commit-lint.yml +0 -85
  29. package/.github/workflows/configs/commitlint.config.cjs +0 -32
  30. package/.github/workflows/configs/commitlint.config.js +0 -32
  31. package/.github/workflows/console-ui.yml +0 -68
  32. package/.github/workflows/create-pr.yml +0 -116
  33. package/.github/workflows/empty-format-test-job.yml +0 -34
  34. package/.github/workflows/format.yml +0 -28
  35. package/.github/workflows/publish.yml +0 -111
  36. package/.github/workflows/secret-scan.yml +0 -51
  37. package/.github/workflows/test.yml +0 -58
  38. package/.github/workflows/umino-project.yml +0 -207
  39. package/.gitleaks.toml +0 -22
  40. package/.prettierignore +0 -31
  41. package/.prettierrc +0 -5
  42. package/CHANGELOG.md +0 -4162
  43. package/CONTRIBUTING.md +0 -60
  44. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js +0 -12
  45. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js.map +0 -1
  46. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js +0 -125
  47. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js.map +0 -1
  48. package/bin/adapter/repositories/issue/issueTimelineUtils.js +0 -38
  49. package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +0 -1
  50. package/bin/domain/entities/UnansweredOwnerCall.js +0 -3
  51. package/bin/domain/entities/UnansweredOwnerCall.js.map +0 -1
  52. package/bin/domain/entities/WorkingTime.js +0 -3
  53. package/bin/domain/entities/WorkingTime.js.map +0 -1
  54. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js +0 -37
  55. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js.map +0 -1
  56. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js +0 -118
  57. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js.map +0 -1
  58. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +0 -180
  59. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +0 -1
  60. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js +0 -160
  61. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js.map +0 -1
  62. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js +0 -3
  63. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js.map +0 -1
  64. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js +0 -7
  65. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js.map +0 -1
  66. package/bin/domain/usecases/findLastAgentDeclaringReport.js +0 -12
  67. package/bin/domain/usecases/findLastAgentDeclaringReport.js.map +0 -1
  68. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js +0 -25
  69. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js.map +0 -1
  70. package/bin/domain/usecases/isWaitingForOwnerApproval.js +0 -16
  71. package/bin/domain/usecases/isWaitingForOwnerApproval.js.map +0 -1
  72. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js +0 -7
  73. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js.map +0 -1
  74. package/commitlint.config.js +0 -6
  75. package/eslint.config.mjs +0 -76
  76. package/jest.config.js +0 -84
  77. package/jest.setup.js +0 -1
  78. package/lib/buffer-equal-constant-time-compat/index.js +0 -17
  79. package/lib/buffer-equal-constant-time-compat/index.test.js +0 -54
  80. package/lib/buffer-equal-constant-time-compat/package.json +0 -5
  81. package/lib/typescript-compat/bin/tsc +0 -2
  82. package/lib/typescript-compat/bin/tsserver +0 -2
  83. package/lib/typescript-compat/lib/typescript.js +0 -1
  84. package/lib/typescript-compat/package.json +0 -13
  85. package/renovate.json +0 -46
  86. package/scripts/copyConsoleUiDist.mjs +0 -35
  87. package/scripts/defaultBranchTipVerify.sh +0 -23
  88. package/scripts/testWorkflowRunVerify.sh +0 -47
  89. package/scripts/verifyConsoleUiDist.mjs +0 -96
  90. package/src/adapter/ci/consoleUiWorkflowTimeout.test.ts +0 -61
  91. package/src/adapter/ci/publishTestWorkflowGate.test.ts +0 -653
  92. package/src/adapter/ci/workflowRunCancellation.test.ts +0 -72
  93. package/src/adapter/entry-points/cli/fleetConfig.test.ts +0 -553
  94. package/src/adapter/entry-points/cli/fleetConfig.ts +0 -266
  95. package/src/adapter/entry-points/cli/index.test.ts +0 -2837
  96. package/src/adapter/entry-points/cli/index.ts +0 -1488
  97. package/src/adapter/entry-points/cli/projectConfig.test.ts +0 -342
  98. package/src/adapter/entry-points/cli/projectConfig.ts +0 -500
  99. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.test.ts +0 -658
  100. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.ts +0 -482
  101. package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +0 -222
  102. package/src/adapter/entry-points/console/consoleDataDelivery.ts +0 -134
  103. package/src/adapter/entry-points/console/consoleDoneStore.test.ts +0 -169
  104. package/src/adapter/entry-points/console/consoleDoneStore.ts +0 -139
  105. package/src/adapter/entry-points/console/consoleGithubTokenResolver.test.ts +0 -275
  106. package/src/adapter/entry-points/console/consoleGithubTokenResolver.ts +0 -113
  107. package/src/adapter/entry-points/console/consoleImageProxy.test.ts +0 -140
  108. package/src/adapter/entry-points/console/consoleImageProxy.ts +0 -111
  109. package/src/adapter/entry-points/console/consoleItemUrlLookup.test.ts +0 -63
  110. package/src/adapter/entry-points/console/consoleItemUrlLookup.ts +0 -66
  111. package/src/adapter/entry-points/console/consoleOperationApi.test.ts +0 -2523
  112. package/src/adapter/entry-points/console/consoleOperationApi.ts +0 -936
  113. package/src/adapter/entry-points/console/consoleProjectResolver.test.ts +0 -246
  114. package/src/adapter/entry-points/console/consoleProjectResolver.ts +0 -111
  115. package/src/adapter/entry-points/console/consoleReadApi.test.ts +0 -714
  116. package/src/adapter/entry-points/console/consoleReadApi.ts +0 -361
  117. package/src/adapter/entry-points/console/consoleTabNames.test.ts +0 -52
  118. package/src/adapter/entry-points/console/consoleTabNames.ts +0 -37
  119. package/src/adapter/entry-points/console/consoleUiDistSync.test.ts +0 -66
  120. package/src/adapter/entry-points/console/dashboardComposeService.test.ts +0 -595
  121. package/src/adapter/entry-points/console/dashboardComposeService.ts +0 -256
  122. package/src/adapter/entry-points/console/dashboardEmitterComposerKey.test.ts +0 -180
  123. package/src/adapter/entry-points/console/ensureConsoleRunning.test.ts +0 -115
  124. package/src/adapter/entry-points/console/ensureConsoleRunning.ts +0 -64
  125. package/src/adapter/entry-points/console/ui/.storybook/main.ts +0 -12
  126. package/src/adapter/entry-points/console/ui/.storybook/preview.ts +0 -15
  127. package/src/adapter/entry-points/console/ui/biome.json +0 -53
  128. package/src/adapter/entry-points/console/ui/components.json +0 -20
  129. package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +0 -725
  130. package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +0 -831
  131. package/src/adapter/entry-points/console/ui/e2e/playwright.config.ts +0 -30
  132. package/src/adapter/entry-points/console/ui/e2e/tsconfig.json +0 -18
  133. package/src/adapter/entry-points/console/ui/index.html +0 -12
  134. package/src/adapter/entry-points/console/ui/jest-globals.cjs +0 -26
  135. package/src/adapter/entry-points/console/ui/jest.setup.ts +0 -1
  136. package/src/adapter/entry-points/console/ui/jest.styleMock.js +0 -1
  137. package/src/adapter/entry-points/console/ui/public/sw.js +0 -60
  138. package/src/adapter/entry-points/console/ui/src/components/ui/badge.stories.tsx +0 -35
  139. package/src/adapter/entry-points/console/ui/src/components/ui/badge.tsx +0 -28
  140. package/src/adapter/entry-points/console/ui/src/components/ui/button.stories.tsx +0 -34
  141. package/src/adapter/entry-points/console/ui/src/components/ui/button.tsx +0 -50
  142. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.stories.tsx +0 -28
  143. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.test.tsx +0 -65
  144. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.tsx +0 -19
  145. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.stories.tsx +0 -61
  146. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.test.tsx +0 -199
  147. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.tsx +0 -166
  148. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.stories.tsx +0 -22
  149. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.test.tsx +0 -74
  150. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.tsx +0 -84
  151. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.stories.tsx +0 -27
  152. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.test.tsx +0 -85
  153. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.tsx +0 -97
  154. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.stories.tsx +0 -76
  155. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.test.tsx +0 -56
  156. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.tsx +0 -39
  157. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.stories.tsx +0 -32
  158. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.test.tsx +0 -105
  159. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.tsx +0 -157
  160. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.stories.tsx +0 -68
  161. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.test.tsx +0 -612
  162. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.tsx +0 -276
  163. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.stories.tsx +0 -33
  164. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.test.tsx +0 -57
  165. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.tsx +0 -76
  166. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.stories.tsx +0 -25
  167. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.test.tsx +0 -55
  168. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.tsx +0 -49
  169. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.stories.tsx +0 -24
  170. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.test.tsx +0 -63
  171. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.tsx +0 -19
  172. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.stories.tsx +0 -33
  173. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.test.tsx +0 -62
  174. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.tsx +0 -59
  175. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.stories.tsx +0 -38
  176. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.test.tsx +0 -151
  177. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.tsx +0 -245
  178. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.stories.tsx +0 -514
  179. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.test.tsx +0 -727
  180. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.tsx +0 -387
  181. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.stories.tsx +0 -82
  182. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.test.tsx +0 -52
  183. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.tsx +0 -32
  184. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.stories.tsx +0 -48
  185. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.test.tsx +0 -235
  186. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.tsx +0 -145
  187. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.stories.tsx +0 -29
  188. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.test.tsx +0 -30
  189. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.tsx +0 -50
  190. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.stories.tsx +0 -38
  191. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.test.tsx +0 -54
  192. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.tsx +0 -60
  193. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.stories.tsx +0 -56
  194. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.test.tsx +0 -111
  195. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.tsx +0 -92
  196. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.stories.tsx +0 -51
  197. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.test.tsx +0 -59
  198. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.tsx +0 -39
  199. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +0 -207
  200. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +0 -332
  201. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.tsx +0 -211
  202. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.stories.tsx +0 -49
  203. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.test.tsx +0 -157
  204. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.tsx +0 -118
  205. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.stories.tsx +0 -23
  206. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.test.tsx +0 -40
  207. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.tsx +0 -17
  208. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.stories.tsx +0 -101
  209. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.test.tsx +0 -102
  210. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.tsx +0 -75
  211. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.stories.tsx +0 -40
  212. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.test.tsx +0 -213
  213. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.tsx +0 -115
  214. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.stories.tsx +0 -50
  215. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.test.tsx +0 -98
  216. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.tsx +0 -66
  217. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.stories.tsx +0 -69
  218. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.test.tsx +0 -101
  219. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.tsx +0 -75
  220. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.stories.tsx +0 -137
  221. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.test.tsx +0 -554
  222. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.tsx +0 -400
  223. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.stories.tsx +0 -30
  224. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.test.tsx +0 -111
  225. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.tsx +0 -91
  226. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.stories.tsx +0 -27
  227. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.test.tsx +0 -24
  228. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.tsx +0 -28
  229. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.stories.tsx +0 -14
  230. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.test.tsx +0 -21
  231. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.tsx +0 -26
  232. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.stories.tsx +0 -14
  233. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.test.tsx +0 -40
  234. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.tsx +0 -37
  235. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleErrorToast.stories.tsx +0 -33
  236. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.stories.tsx +0 -20
  237. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.test.tsx +0 -48
  238. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.tsx +0 -42
  239. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.stories.tsx +0 -115
  240. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.test.tsx +0 -262
  241. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.tsx +0 -123
  242. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +0 -65
  243. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +0 -159
  244. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +0 -55
  245. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.stories.tsx +0 -20
  246. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.test.tsx +0 -93
  247. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.tsx +0 -45
  248. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.stories.tsx +0 -17
  249. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.test.tsx +0 -49
  250. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.tsx +0 -66
  251. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.stories.tsx +0 -47
  252. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.test.tsx +0 -95
  253. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.tsx +0 -62
  254. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.stories.tsx +0 -32
  255. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.test.tsx +0 -101
  256. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.tsx +0 -80
  257. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.test.ts +0 -304
  258. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.ts +0 -167
  259. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.test.ts +0 -498
  260. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.ts +0 -277
  261. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.test.ts +0 -99
  262. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.ts +0 -90
  263. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.test.ts +0 -110
  264. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.ts +0 -83
  265. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.test.ts +0 -51
  266. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.ts +0 -39
  267. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.test.ts +0 -229
  268. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.ts +0 -194
  269. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +0 -151
  270. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.ts +0 -128
  271. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.test.ts +0 -629
  272. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.ts +0 -417
  273. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.test.ts +0 -40
  274. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.ts +0 -71
  275. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.test.ts +0 -24
  276. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.ts +0 -17
  277. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.test.ts +0 -97
  278. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.ts +0 -44
  279. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.test.ts +0 -59
  280. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.ts +0 -26
  281. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.test.ts +0 -48
  282. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.ts +0 -39
  283. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.test.ts +0 -41
  284. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.ts +0 -57
  285. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.test.ts +0 -115
  286. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.ts +0 -115
  287. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +0 -546
  288. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.ts +0 -278
  289. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.test.ts +0 -110
  290. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.ts +0 -70
  291. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.test.ts +0 -387
  292. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.ts +0 -407
  293. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.test.ts +0 -446
  294. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.ts +0 -533
  295. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.test.ts +0 -78
  296. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.ts +0 -34
  297. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.test.ts +0 -252
  298. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.ts +0 -207
  299. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.test.ts +0 -27
  300. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.ts +0 -71
  301. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.test.ts +0 -88
  302. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.ts +0 -34
  303. package/src/adapter/entry-points/console/ui/src/features/console/lib/navigation.ts +0 -7
  304. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.test.ts +0 -104
  305. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.ts +0 -79
  306. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +0 -200
  307. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.ts +0 -122
  308. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.test.ts +0 -90
  309. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.ts +0 -37
  310. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.test.ts +0 -34
  311. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.ts +0 -85
  312. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.test.ts +0 -81
  313. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.ts +0 -61
  314. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.test.ts +0 -35
  315. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.ts +0 -21
  316. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.test.ts +0 -96
  317. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.ts +0 -93
  318. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +0 -229
  319. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.ts +0 -106
  320. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.test.ts +0 -18
  321. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.ts +0 -16
  322. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.test.ts +0 -97
  323. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.ts +0 -95
  324. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.test.ts +0 -53
  325. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.ts +0 -33
  326. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.test.ts +0 -72
  327. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.ts +0 -61
  328. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +0 -325
  329. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.ts +0 -94
  330. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.test.ts +0 -44
  331. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.ts +0 -17
  332. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.test.ts +0 -103
  333. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.ts +0 -64
  334. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.test.ts +0 -74
  335. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.ts +0 -53
  336. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.test.ts +0 -34
  337. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.ts +0 -28
  338. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +0 -89
  339. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.ts +0 -30
  340. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.test.ts +0 -61
  341. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.ts +0 -77
  342. package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +0 -173
  343. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +0 -629
  344. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +0 -351
  345. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.test.tsx +0 -1469
  346. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +0 -736
  347. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleReferenceLinkContainer.tsx +0 -25
  348. package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +0 -418
  349. package/src/adapter/entry-points/console/ui/src/index.css +0 -1592
  350. package/src/adapter/entry-points/console/ui/src/lib/utils.ts +0 -4
  351. package/src/adapter/entry-points/console/ui/src/main.tsx +0 -21
  352. package/src/adapter/entry-points/console/ui/src/vite-env.d.ts +0 -1
  353. package/src/adapter/entry-points/console/ui/tsconfig.json +0 -26
  354. package/src/adapter/entry-points/console/ui/vite.config.ts +0 -24
  355. package/src/adapter/entry-points/console/ui-dist/assets/index-BYDbK1Fj.js +0 -88
  356. package/src/adapter/entry-points/console/ui-dist/assets/index-KyQISRuQ.css +0 -2
  357. package/src/adapter/entry-points/console/ui-dist/index.html +0 -13
  358. package/src/adapter/entry-points/console/ui-dist/sw.js +0 -60
  359. package/src/adapter/entry-points/console/webServer.test.ts +0 -2945
  360. package/src/adapter/entry-points/console/webServer.ts +0 -940
  361. package/src/adapter/entry-points/function/getStoryObjectMap.ts +0 -3
  362. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.test.ts +0 -218
  363. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.ts +0 -113
  364. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.test.ts +0 -110
  365. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.ts +0 -116
  366. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +0 -859
  367. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +0 -984
  368. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.test.ts +0 -126
  369. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.ts +0 -80
  370. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.test.ts +0 -491
  371. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts +0 -137
  372. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.test.ts +0 -508
  373. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts +0 -156
  374. package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +0 -332
  375. package/src/adapter/entry-points/handlers/consoleListsWriter.ts +0 -60
  376. package/src/adapter/entry-points/handlers/dashboardRowWriter.test.ts +0 -112
  377. package/src/adapter/entry-points/handlers/dashboardRowWriter.ts +0 -51
  378. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.test.ts +0 -285
  379. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts +0 -109
  380. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.test.ts +0 -170
  381. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.ts +0 -40
  382. package/src/adapter/entry-points/handlers/machineStatusWriter.test.ts +0 -191
  383. package/src/adapter/entry-points/handlers/machineStatusWriter.ts +0 -110
  384. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +0 -548
  385. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +0 -192
  386. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.test.ts +0 -111
  387. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.ts +0 -25
  388. package/src/adapter/entry-points/handlers/ownerCallFileStore.test.ts +0 -286
  389. package/src/adapter/entry-points/handlers/ownerCallFileStore.ts +0 -145
  390. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.test.ts +0 -55
  391. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.ts +0 -36
  392. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.test.ts +0 -72
  393. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.ts +0 -74
  394. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.test.ts +0 -181
  395. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.ts +0 -18
  396. package/src/adapter/entry-points/handlers/situationFileWriter.test.ts +0 -489
  397. package/src/adapter/entry-points/handlers/situationFileWriter.ts +0 -176
  398. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.test.ts +0 -169
  399. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.ts +0 -32
  400. package/src/adapter/entry-points/handlers/subscriptionDisabledTokenHandler.ts +0 -41
  401. package/src/adapter/entry-points/handlers/tokenExhaustionHandover.ts +0 -81
  402. package/src/adapter/entry-points/handlers/tokenStatusWriter.test.ts +0 -266
  403. package/src/adapter/entry-points/handlers/tokenStatusWriter.ts +0 -262
  404. package/src/adapter/proxy/ClaudeMessageResponseParser.test.ts +0 -211
  405. package/src/adapter/proxy/ClaudeMessageResponseParser.ts +0 -181
  406. package/src/adapter/proxy/RateLimitCache.test.ts +0 -1077
  407. package/src/adapter/proxy/RateLimitCache.ts +0 -385
  408. package/src/adapter/proxy/TokenListLoader.test.ts +0 -183
  409. package/src/adapter/proxy/TokenListLoader.ts +0 -75
  410. package/src/adapter/proxy/ensureProxyRunning.test.ts +0 -85
  411. package/src/adapter/proxy/ensureProxyRunning.ts +0 -41
  412. package/src/adapter/proxy/proxyEntry.test.ts +0 -552
  413. package/src/adapter/proxy/proxyEntry.ts +0 -214
  414. package/src/adapter/repositories/BaseGitHubRepository.test.ts +0 -26
  415. package/src/adapter/repositories/BaseGitHubRepository.ts +0 -26
  416. package/src/adapter/repositories/BrowserGitHubProjectRepository.test.ts +0 -108
  417. package/src/adapter/repositories/BrowserGitHubProjectRepository.ts +0 -118
  418. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.test.ts +0 -71
  419. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.ts +0 -21
  420. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.test.ts +0 -324
  421. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts +0 -148
  422. package/src/adapter/repositories/FetchWebhookRepository.ts +0 -8
  423. package/src/adapter/repositories/FileHandoverStateRepository.test.ts +0 -114
  424. package/src/adapter/repositories/FileHandoverStateRepository.ts +0 -73
  425. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.test.ts +0 -514
  426. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.ts +0 -109
  427. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.test.ts +0 -284
  428. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.ts +0 -128
  429. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.test.ts +0 -138
  430. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.ts +0 -113
  431. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.test.ts +0 -121
  432. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.ts +0 -103
  433. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +0 -360
  434. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +0 -77
  435. package/src/adapter/repositories/FileSystemSessionRecordReader.test.ts +0 -59
  436. package/src/adapter/repositories/FileSystemSessionRecordReader.ts +0 -31
  437. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.test.ts +0 -287
  438. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.ts +0 -125
  439. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.test.ts +0 -285
  440. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.ts +0 -119
  441. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.test.ts +0 -237
  442. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.ts +0 -57
  443. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.test.ts +0 -56
  444. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.ts +0 -32
  445. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.test.ts +0 -68
  446. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.ts +0 -23
  447. package/src/adapter/repositories/GitHubIssueCheckpointRepository.test.ts +0 -51
  448. package/src/adapter/repositories/GitHubIssueCheckpointRepository.ts +0 -47
  449. package/src/adapter/repositories/GitHubIssueCommentRepository.test.ts +0 -278
  450. package/src/adapter/repositories/GitHubIssueCommentRepository.ts +0 -109
  451. package/src/adapter/repositories/GoogleSpreadsheetRepository.integration.test.ts +0 -265
  452. package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +0 -431
  453. package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +0 -268
  454. package/src/adapter/repositories/GraphqlProjectRepository.diskCache.test.ts +0 -272
  455. package/src/adapter/repositories/GraphqlProjectRepository.errorHandling.test.ts +0 -111
  456. package/src/adapter/repositories/GraphqlProjectRepository.fetchProjectId.test.ts +0 -254
  457. package/src/adapter/repositories/GraphqlProjectRepository.test.ts +0 -209
  458. package/src/adapter/repositories/GraphqlProjectRepository.ts +0 -707
  459. package/src/adapter/repositories/GraphqlProjectRepositoryProjectLocation.test.ts +0 -297
  460. package/src/adapter/repositories/KyHttpRepository.ts +0 -8
  461. package/src/adapter/repositories/KySlackRepository.test.ts +0 -172
  462. package/src/adapter/repositories/KySlackRepository.ts +0 -298
  463. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.test.ts +0 -193
  464. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.ts +0 -106
  465. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.test.ts +0 -190
  466. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.ts +0 -102
  467. package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +0 -265
  468. package/src/adapter/repositories/LocalStorageCacheRepository.ts +0 -79
  469. package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +0 -142
  470. package/src/adapter/repositories/LocalStorageRepository.test.ts +0 -173
  471. package/src/adapter/repositories/LocalStorageRepository.ts +0 -30
  472. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +0 -15
  473. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +0 -9
  474. package/src/adapter/repositories/NodeLocalCommandRunner.largeOutput.test.ts +0 -16
  475. package/src/adapter/repositories/NodeLocalCommandRunner.test.ts +0 -118
  476. package/src/adapter/repositories/NodeLocalCommandRunner.ts +0 -66
  477. package/src/adapter/repositories/NodeProcessSignalRepository.test.ts +0 -82
  478. package/src/adapter/repositories/NodeProcessSignalRepository.ts +0 -47
  479. package/src/adapter/repositories/NodeSubAgentProcessLister.test.ts +0 -44
  480. package/src/adapter/repositories/NodeSubAgentProcessLister.ts +0 -40
  481. package/src/adapter/repositories/NodeTmuxSessionRepository.test.ts +0 -546
  482. package/src/adapter/repositories/NodeTmuxSessionRepository.ts +0 -245
  483. package/src/adapter/repositories/OauthAPIClaudeRepository.ts +0 -279
  484. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.test.ts +0 -166
  485. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.ts +0 -32
  486. package/src/adapter/repositories/OauthProxyClaudeRepository.test.ts +0 -428
  487. package/src/adapter/repositories/OauthProxyClaudeRepository.ts +0 -124
  488. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.test.ts +0 -242
  489. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.ts +0 -261
  490. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.test.ts +0 -184
  491. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.ts +0 -138
  492. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.test.ts +0 -208
  493. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.ts +0 -130
  494. package/src/adapter/repositories/ProcFsProcessEnvironReader.test.ts +0 -60
  495. package/src/adapter/repositories/ProcFsProcessEnvironReader.ts +0 -38
  496. package/src/adapter/repositories/ProcHostMetricsRepository.test.ts +0 -207
  497. package/src/adapter/repositories/ProcHostMetricsRepository.ts +0 -181
  498. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.test.ts +0 -231
  499. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.ts +0 -134
  500. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.test.ts +0 -121
  501. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.ts +0 -58
  502. package/src/adapter/repositories/ProjectIssuesCacheRepository.test.ts +0 -218
  503. package/src/adapter/repositories/ProjectIssuesCacheRepository.ts +0 -141
  504. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +0 -1195
  505. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +0 -185
  506. package/src/adapter/repositories/ProxyRateLimitCacheRepository.test.ts +0 -116
  507. package/src/adapter/repositories/ProxyRateLimitCacheRepository.ts +0 -67
  508. package/src/adapter/repositories/RateLimitSnapshotRepository.ts +0 -50
  509. package/src/adapter/repositories/RealSleeper.test.ts +0 -19
  510. package/src/adapter/repositories/RealSleeper.ts +0 -12
  511. package/src/adapter/repositories/RestProjectRepository.test.ts +0 -277
  512. package/src/adapter/repositories/RestProjectRepository.ts +0 -129
  513. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.test.ts +0 -313
  514. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.ts +0 -164
  515. package/src/adapter/repositories/SystemDateRepository.test.ts +0 -60
  516. package/src/adapter/repositories/SystemDateRepository.ts +0 -34
  517. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.test.ts +0 -253
  518. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.ts +0 -158
  519. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.queuedReply.test.ts +0 -171
  520. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.singleScan.test.ts +0 -86
  521. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +0 -996
  522. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +0 -396
  523. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.test.ts +0 -208
  524. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.ts +0 -80
  525. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +0 -1674
  526. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +0 -459
  527. package/src/adapter/repositories/clSessionScopeUnitName.test.ts +0 -76
  528. package/src/adapter/repositories/clSessionScopeUnitName.ts +0 -5
  529. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.test.ts +0 -34
  530. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.ts +0 -8
  531. package/src/adapter/repositories/githubGraphqlClient.test.ts +0 -479
  532. package/src/adapter/repositories/githubGraphqlClient.ts +0 -243
  533. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +0 -5182
  534. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +0 -3303
  535. package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +0 -46
  536. package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +0 -88
  537. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +0 -1776
  538. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +0 -1552
  539. package/src/adapter/repositories/issue/RestIssueRepository.test.ts +0 -393
  540. package/src/adapter/repositories/issue/RestIssueRepository.ts +0 -252
  541. package/src/adapter/repositories/issue/gitHubRawUrl.test.ts +0 -29
  542. package/src/adapter/repositories/issue/gitHubRawUrl.ts +0 -30
  543. package/src/adapter/repositories/issue/githubRateLimitRetry.test.ts +0 -167
  544. package/src/adapter/repositories/issue/githubRateLimitRetry.ts +0 -109
  545. package/src/adapter/repositories/localStorageCacheDirectory.test.ts +0 -81
  546. package/src/adapter/repositories/localStorageCacheDirectory.ts +0 -13
  547. package/src/adapter/repositories/projectFieldDefinition.test.ts +0 -191
  548. package/src/adapter/repositories/projectFieldDefinition.ts +0 -144
  549. package/src/adapter/repositories/utils.test.ts +0 -55
  550. package/src/adapter/repositories/utils.ts +0 -45
  551. package/src/domain/entities/ClaudeHandoverSession.ts +0 -12
  552. package/src/domain/entities/ClaudeMessageResponse.ts +0 -31
  553. package/src/domain/entities/ClaudeTokenUsage.ts +0 -17
  554. package/src/domain/entities/ClaudeWindowUsage.ts +0 -5
  555. package/src/domain/entities/Comment.ts +0 -5
  556. package/src/domain/entities/InteractiveLiveSession.ts +0 -6
  557. package/src/domain/entities/Issue.ts +0 -31
  558. package/src/domain/entities/KevReportWatermark.ts +0 -4
  559. package/src/domain/entities/LiveSessionActivitySnapshot.ts +0 -14
  560. package/src/domain/entities/LiveSessionOutputActivity.ts +0 -4
  561. package/src/domain/entities/LiveSessionProcessSnapshot.ts +0 -18
  562. package/src/domain/entities/LiveTmuxSession.ts +0 -4
  563. package/src/domain/entities/Member.ts +0 -3
  564. package/src/domain/entities/OutputDegeneration.ts +0 -10
  565. package/src/domain/entities/Project.ts +0 -88
  566. package/src/domain/entities/ProjectField.ts +0 -3
  567. package/src/domain/entities/ProjectFieldName.ts +0 -2
  568. package/src/domain/entities/ProjectFieldSingleSelect.ts +0 -8
  569. package/src/domain/entities/ProjectFieldSingleSelectOption.ts +0 -8
  570. package/src/domain/entities/RequiredProjectField.ts +0 -68
  571. package/src/domain/entities/SearchedIssue.ts +0 -11
  572. package/src/domain/entities/StoryObjectMap.ts +0 -12
  573. package/src/domain/entities/TokenExhaustionHandoverState.ts +0 -8
  574. package/src/domain/entities/WorkflowStatus.ts +0 -66
  575. package/src/domain/usecases/ActionAnnouncementUseCase.test.ts +0 -91
  576. package/src/domain/usecases/ActionAnnouncementUseCase.ts +0 -78
  577. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.test.ts +0 -222
  578. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.ts +0 -76
  579. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.test.ts +0 -118
  580. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +0 -112
  581. package/src/domain/usecases/AnalyzeStoriesUseCase.test.ts +0 -82
  582. package/src/domain/usecases/AnalyzeStoriesUseCase.ts +0 -296
  583. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.test.ts +0 -578
  584. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.ts +0 -137
  585. package/src/domain/usecases/CONTRIBUTING_FOR_TEST.md +0 -259
  586. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.test.ts +0 -437
  587. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.ts +0 -80
  588. package/src/domain/usecases/ChangeTargetPullRequestApprover.test.ts +0 -248
  589. package/src/domain/usecases/ChangeTargetPullRequestApprover.ts +0 -69
  590. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +0 -411
  591. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +0 -142
  592. package/src/domain/usecases/ClearDependedIssueURLUseCase.test.ts +0 -1120
  593. package/src/domain/usecases/ClearDependedIssueURLUseCase.ts +0 -161
  594. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.test.ts +0 -345
  595. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.ts +0 -81
  596. package/src/domain/usecases/CliErrorReportUseCase.test.ts +0 -162
  597. package/src/domain/usecases/CliErrorReportUseCase.ts +0 -72
  598. package/src/domain/usecases/ConflictedIssueRevertUseCase.test.ts +0 -886
  599. package/src/domain/usecases/ConflictedIssueRevertUseCase.ts +0 -146
  600. package/src/domain/usecases/CreateEstimationIssueUseCase.test.ts +0 -227
  601. package/src/domain/usecases/CreateEstimationIssueUseCase.ts +0 -205
  602. package/src/domain/usecases/CreateNewStoryByLabelUseCase.test.ts +0 -1084
  603. package/src/domain/usecases/CreateNewStoryByLabelUseCase.ts +0 -146
  604. package/src/domain/usecases/DailySecurityScanUseCase.test.ts +0 -1709
  605. package/src/domain/usecases/DailySecurityScanUseCase.ts +0 -476
  606. package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +0 -533
  607. package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +0 -122
  608. package/src/domain/usecases/GetStoryObjectMapUseCase.test.ts +0 -330
  609. package/src/domain/usecases/GetStoryObjectMapUseCase.ts +0 -79
  610. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +0 -1913
  611. package/src/domain/usecases/HandleScheduledEventUseCase.ts +0 -846
  612. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.test.ts +0 -175
  613. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.ts +0 -63
  614. package/src/domain/usecases/IssueNoStatusUpdateUseCase.test.ts +0 -165
  615. package/src/domain/usecases/IssueNoStatusUpdateUseCase.ts +0 -44
  616. package/src/domain/usecases/IssueRejectionEvaluator.test.ts +0 -1137
  617. package/src/domain/usecases/IssueRejectionEvaluator.ts +0 -340
  618. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.test.ts +0 -679
  619. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.ts +0 -178
  620. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +0 -5441
  621. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +0 -891
  622. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +0 -2069
  623. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +0 -489
  624. package/src/domain/usecases/OauthTokenSelectUseCase.test.ts +0 -662
  625. package/src/domain/usecases/OauthTokenSelectUseCase.ts +0 -274
  626. package/src/domain/usecases/OutputDegenerationDetector.test.ts +0 -167
  627. package/src/domain/usecases/OutputDegenerationDetector.ts +0 -169
  628. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.test.ts +0 -711
  629. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.ts +0 -146
  630. package/src/domain/usecases/QualityCheckAdvanceUseCase.test.ts +0 -421
  631. package/src/domain/usecases/QualityCheckAdvanceUseCase.ts +0 -76
  632. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.test.ts +0 -188
  633. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.ts +0 -57
  634. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.test.ts +0 -303
  635. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.ts +0 -155
  636. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +0 -1838
  637. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +0 -221
  638. package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +0 -2392
  639. package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +0 -499
  640. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.test.ts +0 -224
  641. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.ts +0 -142
  642. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.test.ts +0 -360
  643. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.ts +0 -70
  644. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.test.ts +0 -400
  645. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.ts +0 -48
  646. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.test.ts +0 -696
  647. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +0 -201
  648. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.test.ts +0 -1363
  649. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.ts +0 -215
  650. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.test.ts +0 -170
  651. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.ts +0 -38
  652. package/src/domain/usecases/StaleTmuxSessionKillUseCase.test.ts +0 -283
  653. package/src/domain/usecases/StaleTmuxSessionKillUseCase.ts +0 -98
  654. package/src/domain/usecases/StartPreparationUseCase.test.ts +0 -7822
  655. package/src/domain/usecases/StartPreparationUseCase.ts +0 -876
  656. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.test.ts +0 -200
  657. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.ts +0 -74
  658. package/src/domain/usecases/TokenExhaustionHandoverUseCase.test.ts +0 -838
  659. package/src/domain/usecases/TokenExhaustionHandoverUseCase.ts +0 -439
  660. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.test.ts +0 -306
  661. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.ts +0 -64
  662. package/src/domain/usecases/UpdateRateLimitCacheUseCase.test.ts +0 -178
  663. package/src/domain/usecases/UpdateRateLimitCacheUseCase.ts +0 -22
  664. package/src/domain/usecases/adapter-interfaces/ClaudeHandoverSessionRepository.ts +0 -5
  665. package/src/domain/usecases/adapter-interfaces/ClaudeInteractiveSessionRepository.ts +0 -9
  666. package/src/domain/usecases/adapter-interfaces/ClaudeLiveSessionRepository.ts +0 -8
  667. package/src/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.ts +0 -5
  668. package/src/domain/usecases/adapter-interfaces/ClaudeRepository.ts +0 -6
  669. package/src/domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository.ts +0 -8
  670. package/src/domain/usecases/adapter-interfaces/ConsoleTabsRepository.ts +0 -12
  671. package/src/domain/usecases/adapter-interfaces/CopilotRepository.ts +0 -3
  672. package/src/domain/usecases/adapter-interfaces/DateRepository.ts +0 -7
  673. package/src/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.ts +0 -3
  674. package/src/domain/usecases/adapter-interfaces/HttpRepository.ts +0 -3
  675. package/src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts +0 -7
  676. package/src/domain/usecases/adapter-interfaces/IssueAttachmentRepository.ts +0 -9
  677. package/src/domain/usecases/adapter-interfaces/IssueCheckpointRepository.ts +0 -3
  678. package/src/domain/usecases/adapter-interfaces/IssueCommentRepository.ts +0 -7
  679. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +0 -229
  680. package/src/domain/usecases/adapter-interfaces/KevReportWatermarkRepository.ts +0 -11
  681. package/src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts +0 -5
  682. package/src/domain/usecases/adapter-interfaces/LocalCommandRunner.ts +0 -16
  683. package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +0 -5
  684. package/src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts +0 -3
  685. package/src/domain/usecases/adapter-interfaces/ProcessSignalRepository.ts +0 -5
  686. package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +0 -29
  687. package/src/domain/usecases/adapter-interfaces/RateLimitCacheRepository.ts +0 -10
  688. package/src/domain/usecases/adapter-interfaces/RefusalTailStatusProvider.ts +0 -5
  689. package/src/domain/usecases/adapter-interfaces/SessionAssistantTurnsRepository.ts +0 -6
  690. package/src/domain/usecases/adapter-interfaces/SessionDegenerationCooldownStateRepository.ts +0 -4
  691. package/src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts +0 -7
  692. package/src/domain/usecases/adapter-interfaces/SessionRecordReader.ts +0 -3
  693. package/src/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.ts +0 -8
  694. package/src/domain/usecases/adapter-interfaces/SilentSessionCandidateStateRepository.ts +0 -10
  695. package/src/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.ts +0 -20
  696. package/src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts +0 -18
  697. package/src/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.ts +0 -6
  698. package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +0 -20
  699. package/src/domain/usecases/adapter-interfaces/Sleeper.ts +0 -3
  700. package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +0 -18
  701. package/src/domain/usecases/adapter-interfaces/StatusDefaultRepository.ts +0 -5
  702. package/src/domain/usecases/adapter-interfaces/SubAgentLivenessResolver.ts +0 -6
  703. package/src/domain/usecases/adapter-interfaces/SubAgentProcessLister.ts +0 -8
  704. package/src/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.ts +0 -3
  705. package/src/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.ts +0 -6
  706. package/src/domain/usecases/adapter-interfaces/TakeOwnershipSpawnRepository.ts +0 -9
  707. package/src/domain/usecases/adapter-interfaces/TmuxSessionRepository.ts +0 -20
  708. package/src/domain/usecases/adapter-interfaces/TokenExhaustionHandoverStateRepository.ts +0 -6
  709. package/src/domain/usecases/adapter-interfaces/TokenRateLimitSnapshotRepository.ts +0 -22
  710. package/src/domain/usecases/adapter-interfaces/WebhookRepository.ts +0 -3
  711. package/src/domain/usecases/agentReportPrefix.ts +0 -1
  712. package/src/domain/usecases/autoStatusCheckComments.ts +0 -1
  713. package/src/domain/usecases/console/.gitkeep +0 -0
  714. package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +0 -887
  715. package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +0 -368
  716. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.test.ts +0 -654
  717. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.ts +0 -318
  718. package/src/domain/usecases/dashboard/DashboardProjectCode.test.ts +0 -34
  719. package/src/domain/usecases/dashboard/DashboardProjectCode.ts +0 -27
  720. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.test.ts +0 -160
  721. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.ts +0 -69
  722. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.test.ts +0 -362
  723. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.ts +0 -234
  724. package/src/domain/usecases/ensureAgentOptionAndGetId.ts +0 -47
  725. package/src/domain/usecases/extractFencedJsonBlocks.test.ts +0 -40
  726. package/src/domain/usecases/extractFencedJsonBlocks.ts +0 -21
  727. package/src/domain/usecases/extractNextStepAgent.test.ts +0 -58
  728. package/src/domain/usecases/extractNextStepAgent.ts +0 -18
  729. package/src/domain/usecases/extractNextStepAgentFromComments.ts +0 -13
  730. package/src/domain/usecases/findLastAgentReport.test.ts +0 -121
  731. package/src/domain/usecases/findLastAgentReport.ts +0 -14
  732. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.test.ts +0 -339
  733. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts +0 -188
  734. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.test.ts +0 -389
  735. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.ts +0 -103
  736. package/src/domain/usecases/intmux/OwnerCallFile.test.ts +0 -184
  737. package/src/domain/usecases/intmux/OwnerCallFile.ts +0 -80
  738. package/src/domain/usecases/isAgentReportBody.test.ts +0 -108
  739. package/src/domain/usecases/isAgentReportBody.ts +0 -52
  740. package/src/domain/usecases/isAuthorAuthorizedForAutoStatusCheck.ts +0 -12
  741. package/src/domain/usecases/isHumanComment.test.ts +0 -77
  742. package/src/domain/usecases/isHumanComment.ts +0 -23
  743. package/src/domain/usecases/isRecord.ts +0 -2
  744. package/src/domain/usecases/issueReactivationTriggerIsPending.test.ts +0 -541
  745. package/src/domain/usecases/issueReactivationTriggerIsPending.ts +0 -25
  746. package/src/domain/usecases/nextStepAgentDispatchRepeatedMessage.ts +0 -2
  747. package/src/domain/usecases/normalizeReportBody.test.ts +0 -24
  748. package/src/domain/usecases/normalizeReportBody.ts +0 -2
  749. package/src/domain/usecases/resolveAllowedIssueAuthors.test.ts +0 -51
  750. package/src/domain/usecases/resolveAllowedIssueAuthors.ts +0 -6
  751. package/src/domain/usecases/resolveLabelsAsLlmAgentName.test.ts +0 -42
  752. package/src/domain/usecases/resolveLabelsAsLlmAgentName.ts +0 -6
  753. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.test.ts +0 -33
  754. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.ts +0 -7
  755. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.test.ts +0 -337
  756. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.ts +0 -133
  757. package/src/domain/usecases/silentSessionReminderSentinel.ts +0 -9
  758. package/src/domain/usecases/triagerAgentName.ts +0 -4
  759. package/src/domain/usecases/utils.test.ts +0 -35
  760. package/src/domain/usecases/utils.ts +0 -6
  761. package/src/index.test.ts +0 -8
  762. package/src/index.ts +0 -10
  763. package/src/releaseConfig.test.ts +0 -40
  764. package/tsconfig.build.json +0 -18
  765. package/tsconfig.json +0 -25
  766. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts +0 -13
  767. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts.map +0 -1
  768. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts +0 -16
  769. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts.map +0 -1
  770. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +0 -12
  771. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +0 -1
  772. package/types/domain/entities/UnansweredOwnerCall.d.ts +0 -5
  773. package/types/domain/entities/UnansweredOwnerCall.d.ts.map +0 -1
  774. package/types/domain/entities/WorkingTime.d.ts +0 -8
  775. package/types/domain/entities/WorkingTime.d.ts.map +0 -1
  776. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts +0 -17
  777. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts.map +0 -1
  778. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts +0 -23
  779. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts.map +0 -1
  780. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +0 -50
  781. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +0 -1
  782. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts +0 -15
  783. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts.map +0 -1
  784. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts +0 -11
  785. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts.map +0 -1
  786. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts +0 -3
  787. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts.map +0 -1
  788. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts +0 -5
  789. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts.map +0 -1
  790. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts +0 -5
  791. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts.map +0 -1
  792. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts +0 -2
  793. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts.map +0 -1
  794. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts +0 -3
  795. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts.map +0 -1
@@ -1,1838 +0,0 @@
1
- import { RevertNotReadyReviewQueueIssueUseCase } from './RevertNotReadyReviewQueueIssueUseCase';
2
- import { Issue } from '../entities/Issue';
3
- import { Project } from '../entities/Project';
4
- import { RelatedPullRequest } from './adapter-interfaces/IssueRepository';
5
-
6
- const createMockProject = (overrides: Partial<Project> = {}): Project => ({
7
- id: 'project-1',
8
- url: 'https://github.com/users/user/projects/1',
9
- databaseId: 1,
10
- name: 'Test Project',
11
- status: {
12
- name: 'Status',
13
- fieldId: 'field-1',
14
- statuses: [
15
- {
16
- id: 'awaiting-workspace-id',
17
- name: 'Awaiting Workspace',
18
- color: 'GRAY',
19
- description: '',
20
- },
21
- {
22
- id: 'awaiting-quality-check-id',
23
- name: 'Awaiting Quality Check',
24
- color: 'BLUE',
25
- description: '',
26
- },
27
- ],
28
- },
29
- nextActionDate: null,
30
- nextActionHour: null,
31
- story: {
32
- name: 'Story',
33
- fieldId: 'story-field-1',
34
- databaseId: 2,
35
- stories: [
36
- {
37
- id: 'workflow-management-story-id',
38
- name: 'workflow management',
39
- color: 'GRAY',
40
- description: '',
41
- },
42
- ],
43
- workflowManagementStory: {
44
- id: 'workflow-management-story-id',
45
- name: 'workflow management',
46
- },
47
- },
48
- remainingEstimationMinutes: null,
49
- dependedIssueUrlSeparatedByComma: null,
50
- completionDate50PercentConfidence: null,
51
- agent: null,
52
- ...overrides,
53
- });
54
-
55
- const createMockIssue = (overrides: Partial<Issue> = {}): Issue => ({
56
- nameWithOwner: 'user/repo',
57
- number: 1,
58
- title: 'Test Issue',
59
- state: 'OPEN',
60
- status: 'Awaiting Quality Check',
61
- story: null,
62
- nextActionDate: null,
63
- nextActionHour: null,
64
- estimationMinutes: null,
65
- dependedIssueUrls: [],
66
- completionDate50PercentConfidence: null,
67
- url: 'https://github.com/user/repo/issues/1',
68
- assignees: ['manager-user'],
69
- labels: [],
70
- org: 'user',
71
- repo: 'repo',
72
- body: '',
73
- itemId: 'item-1',
74
- isPr: false,
75
- isInProgress: false,
76
- isClosed: false,
77
- createdAt: new Date(),
78
- author: 'owner',
79
- closingIssueReferenceUrls: [],
80
- agent: null,
81
- stateReason: null,
82
- ...overrides,
83
- });
84
-
85
- const createMockPullRequest = (overrides: Partial<Issue> = {}): Issue =>
86
- createMockIssue({
87
- title: 'Test PR',
88
- status: 'Awaiting Workspace',
89
- url: 'https://github.com/user/repo/pull/1',
90
- isPr: true,
91
- ...overrides,
92
- });
93
-
94
- type RelatedPrLike = {
95
- url: string;
96
- isConflicted: boolean;
97
- isPassedAllCiJob: boolean;
98
- isCiStateSuccess: boolean;
99
- isResolvedAllReviewComments: boolean;
100
- isBranchOutOfDate: boolean;
101
- missingRequiredCheckNames: string[];
102
- isDraft?: boolean;
103
- };
104
-
105
- const createReadyPr = (
106
- url = 'https://github.com/user/repo/pull/1',
107
- ): RelatedPrLike => ({
108
- url,
109
- isConflicted: false,
110
- isPassedAllCiJob: true,
111
- isCiStateSuccess: true,
112
- isResolvedAllReviewComments: true,
113
- isBranchOutOfDate: false,
114
- missingRequiredCheckNames: [],
115
- });
116
-
117
- // Builds the in-memory linkage the production code now relies on instead of the
118
- // per-issue findRelatedOpenPRs timeline query: each related pull request becomes
119
- // an open PR project item whose closingIssueReferenceUrls points at the AQC
120
- // issue, and getOpenPullRequest is routed by URL to return that PR's status.
121
- // This proves the review-readiness outcome is identical to the previous
122
- // findRelatedOpenPRs-based path while removing the per-issue timeline call.
123
- const linkRelatedOpenPrsToIssue = (
124
- mockIssueRepository: {
125
- getAllIssues: jest.Mock;
126
- getOpenPullRequest: jest.Mock;
127
- },
128
- issue: Issue,
129
- relatedPrs: RelatedPrLike[],
130
- ): void => {
131
- const prItems = relatedPrs.map((pr, index) =>
132
- createMockPullRequest({
133
- url: pr.url,
134
- number: 1000 + index,
135
- closingIssueReferenceUrls: [issue.url],
136
- }),
137
- );
138
- mockIssueRepository.getAllIssues.mockResolvedValue({
139
- project: createMockProject(),
140
- issues: [issue, ...prItems],
141
- cacheUsed: false,
142
- });
143
- const prByUrl = new Map(relatedPrs.map((pr) => [pr.url, pr]));
144
- mockIssueRepository.getOpenPullRequest.mockImplementation((prUrl: string) =>
145
- Promise.resolve(prByUrl.get(prUrl) ?? null),
146
- );
147
- };
148
-
149
- describe('RevertNotReadyReviewQueueIssueUseCase', () => {
150
- let mockProjectRepository: {
151
- findProjectIdByUrl: jest.Mock;
152
- getProject: jest.Mock;
153
- };
154
- let mockIssueRepository: {
155
- getAllIssues: jest.Mock;
156
- updateStatus: jest.Mock;
157
- updateStory: jest.Mock;
158
- findRelatedOpenPRs: jest.Mock;
159
- getOpenPullRequest: jest.Mock;
160
- getOpenPullRequests: jest.Mock;
161
- getPullRequestChangedFilePaths: jest.Mock;
162
- approvePullRequest: jest.Mock;
163
- requestChangesWithInlineComment: jest.Mock;
164
- };
165
- let mockIssueCommentRepository: {
166
- createComment: jest.Mock;
167
- getCommentsFromIssue: jest.Mock;
168
- };
169
- let mockProject: Project;
170
- let useCase: RevertNotReadyReviewQueueIssueUseCase;
171
-
172
- beforeEach(() => {
173
- jest.resetAllMocks();
174
-
175
- mockProject = createMockProject();
176
-
177
- mockProjectRepository = {
178
- findProjectIdByUrl: jest.fn().mockResolvedValue('project-1'),
179
- getProject: jest.fn().mockResolvedValue(mockProject),
180
- };
181
-
182
- mockIssueRepository = {
183
- getAllIssues: jest.fn().mockResolvedValue({
184
- project: mockProject,
185
- issues: [],
186
- cacheUsed: false,
187
- }),
188
- updateStatus: jest.fn().mockResolvedValue(undefined),
189
- updateStory: jest.fn().mockResolvedValue(undefined),
190
- findRelatedOpenPRs: jest.fn().mockResolvedValue([]),
191
- getOpenPullRequest: jest.fn().mockResolvedValue(null),
192
- getOpenPullRequests: jest.fn().mockResolvedValue(new Map()),
193
- getPullRequestChangedFilePaths: jest.fn().mockResolvedValue([]),
194
- approvePullRequest: jest.fn().mockResolvedValue(undefined),
195
- requestChangesWithInlineComment: jest.fn().mockResolvedValue(undefined),
196
- };
197
-
198
- mockIssueCommentRepository = {
199
- createComment: jest.fn().mockResolvedValue(undefined),
200
- getCommentsFromIssue: jest.fn().mockResolvedValue([]),
201
- };
202
-
203
- useCase = new RevertNotReadyReviewQueueIssueUseCase(
204
- mockProjectRepository,
205
- mockIssueRepository,
206
- mockIssueCommentRepository,
207
- );
208
- });
209
-
210
- describe('Awaiting Quality Check processing', () => {
211
- it('should do nothing when there are no Awaiting Quality Check issues', async () => {
212
- mockIssueRepository.getAllIssues.mockResolvedValue({
213
- project: mockProject,
214
- issues: [
215
- createMockIssue({ status: 'Awaiting Workspace' }),
216
- createMockIssue({ status: 'Preparation' }),
217
- ],
218
- cacheUsed: false,
219
- });
220
-
221
- await useCase.run({
222
- manager: 'manager-user',
223
- projectUrl: 'https://github.com/users/user/projects/1',
224
- allowedIssueAuthors: ['owner'],
225
- });
226
-
227
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
228
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
229
- });
230
-
231
- it('should skip Awaiting Quality Check issue with non-developer agent field', async () => {
232
- const issue = createMockIssue({
233
- status: 'Awaiting Quality Check',
234
- labels: [],
235
- agent: 'chore',
236
- });
237
- mockIssueRepository.getAllIssues.mockResolvedValue({
238
- project: mockProject,
239
- issues: [issue],
240
- cacheUsed: false,
241
- });
242
-
243
- await useCase.run({
244
- manager: 'manager-user',
245
- projectUrl: 'https://github.com/users/user/projects/1',
246
- allowedIssueAuthors: ['owner'],
247
- });
248
-
249
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
250
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
251
- });
252
-
253
- it('should revert chore agent issue to Awaiting Workspace when its linked PR is conflicted', async () => {
254
- const issue = createMockIssue({
255
- status: 'Awaiting Quality Check',
256
- agent: 'chore',
257
- });
258
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
259
- { ...createReadyPr(), isConflicted: true },
260
- ]);
261
-
262
- await useCase.run({
263
- manager: 'manager-user',
264
- projectUrl: 'https://github.com/users/user/projects/1',
265
- allowedIssueAuthors: ['owner'],
266
- });
267
-
268
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
269
- mockProject,
270
- issue,
271
- 'awaiting-workspace-id',
272
- );
273
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
274
- issue,
275
- expect.stringContaining('PULL_REQUEST_CONFLICTED'),
276
- );
277
- });
278
-
279
- it('should not revert chore agent issue when its linked PR is not conflicted', async () => {
280
- const issue = createMockIssue({
281
- status: 'Awaiting Quality Check',
282
- agent: 'chore',
283
- });
284
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [createReadyPr()]);
285
-
286
- await useCase.run({
287
- manager: 'manager-user',
288
- projectUrl: 'https://github.com/users/user/projects/1',
289
- allowedIssueAuthors: ['owner'],
290
- });
291
-
292
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
293
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
294
- });
295
-
296
- it('should keep sweeping without calling findRelatedOpenPRs when an Awaiting Quality Check item is itself a pull request', async () => {
297
- const pullRequestItem = createMockPullRequest({
298
- status: 'Awaiting Quality Check',
299
- url: 'https://github.com/user/repo/pull/9',
300
- agent: 'chore',
301
- });
302
- mockIssueRepository.getAllIssues.mockResolvedValue({
303
- project: mockProject,
304
- issues: [pullRequestItem],
305
- cacheUsed: false,
306
- });
307
- mockIssueRepository.findRelatedOpenPRs.mockRejectedValue(
308
- new Error(
309
- 'findRelatedOpenPRs only supports issue URLs, not pull request URLs',
310
- ),
311
- );
312
- mockIssueRepository.getOpenPullRequest.mockResolvedValue({
313
- ...createReadyPr('https://github.com/user/repo/pull/9'),
314
- isConflicted: true,
315
- });
316
-
317
- await useCase.run({
318
- manager: 'manager-user',
319
- projectUrl: 'https://github.com/users/user/projects/1',
320
- allowedIssueAuthors: ['owner'],
321
- });
322
-
323
- expect(mockIssueRepository.findRelatedOpenPRs).not.toHaveBeenCalled();
324
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
325
- mockProject,
326
- pullRequestItem,
327
- 'awaiting-workspace-id',
328
- );
329
- });
330
-
331
- it('should revert Awaiting Quality Check issue with developer agent field and no linked PR', async () => {
332
- const issue = createMockIssue({
333
- status: 'Awaiting Quality Check',
334
- labels: ['llm-agent:developer'],
335
- agent: 'developer',
336
- });
337
- mockIssueRepository.getAllIssues.mockResolvedValue({
338
- project: mockProject,
339
- issues: [issue],
340
- cacheUsed: false,
341
- });
342
-
343
- await useCase.run({
344
- manager: 'manager-user',
345
- projectUrl: 'https://github.com/users/user/projects/1',
346
- allowedIssueAuthors: ['owner'],
347
- });
348
-
349
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
350
- mockProject,
351
- issue,
352
- 'awaiting-workspace-id',
353
- );
354
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
355
- issue,
356
- expect.stringContaining('PULL_REQUEST_NOT_FOUND'),
357
- );
358
- });
359
-
360
- it('should revert issue when no linked PR is found', async () => {
361
- const issue = createMockIssue({
362
- status: 'Awaiting Quality Check',
363
- });
364
- mockIssueRepository.getAllIssues.mockResolvedValue({
365
- project: mockProject,
366
- issues: [issue],
367
- cacheUsed: false,
368
- });
369
-
370
- await useCase.run({
371
- manager: 'manager-user',
372
- projectUrl: 'https://github.com/users/user/projects/1',
373
- allowedIssueAuthors: ['owner'],
374
- });
375
-
376
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
377
- mockProject,
378
- issue,
379
- 'awaiting-workspace-id',
380
- );
381
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
382
- issue,
383
- expect.stringContaining('Auto Status Check: REJECTED'),
384
- );
385
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
386
- issue,
387
- expect.stringContaining('PULL_REQUEST_NOT_FOUND'),
388
- );
389
- });
390
-
391
- it('should not revert an issue whose last agent report designates the triager', async () => {
392
- const issue = createMockIssue({
393
- status: 'Awaiting Quality Check',
394
- });
395
- mockIssueRepository.getAllIssues.mockResolvedValue({
396
- project: mockProject,
397
- issues: [issue],
398
- cacheUsed: false,
399
- });
400
- mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
401
- {
402
- author: 'owner',
403
- content:
404
- 'From: :robot: Agent report\n```json\n{"nextStepAgent": "triager"}\n```',
405
- createdAt: new Date(),
406
- },
407
- ]);
408
-
409
- await useCase.run({
410
- manager: 'manager-user',
411
- projectUrl: 'https://github.com/users/user/projects/1',
412
- allowedIssueAuthors: ['owner'],
413
- });
414
-
415
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
416
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
417
- });
418
-
419
- it('should still revert an issue whose linked PR is conflicted even when the last agent report designates the triager', async () => {
420
- const issue = createMockIssue({
421
- status: 'Awaiting Quality Check',
422
- });
423
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
424
- { ...createReadyPr(), isConflicted: true },
425
- ]);
426
- mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
427
- {
428
- author: 'owner',
429
- content:
430
- 'From: :robot: Agent report\n```json\n{"nextStepAgent": "triager"}\n```',
431
- createdAt: new Date(),
432
- },
433
- ]);
434
-
435
- await useCase.run({
436
- manager: 'manager-user',
437
- projectUrl: 'https://github.com/users/user/projects/1',
438
- allowedIssueAuthors: ['owner'],
439
- });
440
-
441
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
442
- mockProject,
443
- issue,
444
- 'awaiting-workspace-id',
445
- );
446
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
447
- issue,
448
- expect.stringContaining('PULL_REQUEST_CONFLICTED'),
449
- );
450
- });
451
-
452
- it('should not read the comments of an issue whose linked PR is ready', async () => {
453
- const issue = createMockIssue({
454
- status: 'Awaiting Quality Check',
455
- });
456
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [createReadyPr()]);
457
-
458
- await useCase.run({
459
- manager: 'manager-user',
460
- projectUrl: 'https://github.com/users/user/projects/1',
461
- allowedIssueAuthors: ['owner'],
462
- });
463
-
464
- expect(
465
- mockIssueCommentRepository.getCommentsFromIssue,
466
- ).not.toHaveBeenCalled();
467
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
468
- });
469
-
470
- it('should not revert a story-labeled issue with no linked PR when story is in labelsAsLlmAgentName', async () => {
471
- const issue = createMockIssue({
472
- status: 'Awaiting Quality Check',
473
- labels: ['story'],
474
- });
475
- mockIssueRepository.getAllIssues.mockResolvedValue({
476
- project: mockProject,
477
- issues: [issue],
478
- cacheUsed: false,
479
- });
480
-
481
- await useCase.run({
482
- manager: 'manager-user',
483
- projectUrl: 'https://github.com/users/user/projects/1',
484
- labelsAsLlmAgentName: ['story', 'chore', 'accounting'],
485
- allowedIssueAuthors: ['owner'],
486
- });
487
-
488
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
489
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
490
- });
491
-
492
- it('should not revert a story-labeled issue with no linked PR when story is only in labelsNotRequiringPullRequest', async () => {
493
- const issue = createMockIssue({
494
- status: 'Awaiting Quality Check',
495
- labels: ['story'],
496
- });
497
- mockIssueRepository.getAllIssues.mockResolvedValue({
498
- project: mockProject,
499
- issues: [issue],
500
- cacheUsed: false,
501
- });
502
-
503
- await useCase.run({
504
- manager: 'manager-user',
505
- projectUrl: 'https://github.com/users/user/projects/1',
506
- labelsAsLlmAgentName: ['chore', 'accounting'],
507
- labelsNotRequiringPullRequest: ['story'],
508
- allowedIssueAuthors: ['owner'],
509
- });
510
-
511
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
512
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
513
- });
514
-
515
- it('should not revert a chore-labeled issue with no linked PR when chore is in labelsAsLlmAgentName', async () => {
516
- const issue = createMockIssue({
517
- status: 'Awaiting Quality Check',
518
- labels: ['chore'],
519
- });
520
- mockIssueRepository.getAllIssues.mockResolvedValue({
521
- project: mockProject,
522
- issues: [issue],
523
- cacheUsed: false,
524
- });
525
-
526
- await useCase.run({
527
- manager: 'manager-user',
528
- projectUrl: 'https://github.com/users/user/projects/1',
529
- labelsAsLlmAgentName: ['story', 'chore'],
530
- allowedIssueAuthors: ['owner'],
531
- });
532
-
533
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
534
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
535
- });
536
-
537
- it('should still revert a story-labeled issue with no linked PR when labelsAsLlmAgentName is not provided', async () => {
538
- const issue = createMockIssue({
539
- status: 'Awaiting Quality Check',
540
- labels: ['story'],
541
- });
542
- mockIssueRepository.getAllIssues.mockResolvedValue({
543
- project: mockProject,
544
- issues: [issue],
545
- cacheUsed: false,
546
- });
547
-
548
- await useCase.run({
549
- manager: 'manager-user',
550
- projectUrl: 'https://github.com/users/user/projects/1',
551
- allowedIssueAuthors: ['owner'],
552
- });
553
-
554
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
555
- mockProject,
556
- issue,
557
- 'awaiting-workspace-id',
558
- );
559
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
560
- issue,
561
- expect.stringContaining('PULL_REQUEST_NOT_FOUND'),
562
- );
563
- });
564
-
565
- it('should not revert a story-labeled issue with no linked PR when labelsAsLlmAgentName is null', async () => {
566
- const issue = createMockIssue({
567
- status: 'Awaiting Quality Check',
568
- labels: ['story'],
569
- });
570
- mockIssueRepository.getAllIssues.mockResolvedValue({
571
- project: mockProject,
572
- issues: [issue],
573
- cacheUsed: false,
574
- });
575
-
576
- await useCase.run({
577
- manager: 'manager-user',
578
- projectUrl: 'https://github.com/users/user/projects/1',
579
- labelsAsLlmAgentName: null,
580
- allowedIssueAuthors: ['owner'],
581
- });
582
-
583
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
584
- mockProject,
585
- issue,
586
- 'awaiting-workspace-id',
587
- );
588
- });
589
-
590
- it('should not revert issue when PR is ready', async () => {
591
- const issue = createMockIssue({
592
- status: 'Awaiting Quality Check',
593
- });
594
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [createReadyPr()]);
595
-
596
- await useCase.run({
597
- manager: 'manager-user',
598
- projectUrl: 'https://github.com/users/user/projects/1',
599
- allowedIssueAuthors: ['owner'],
600
- });
601
-
602
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
603
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
604
- });
605
-
606
- it('should revert issue when PR is conflicted', async () => {
607
- const issue = createMockIssue({
608
- status: 'Awaiting Quality Check',
609
- });
610
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
611
- { ...createReadyPr(), isConflicted: true },
612
- ]);
613
-
614
- await useCase.run({
615
- manager: 'manager-user',
616
- projectUrl: 'https://github.com/users/user/projects/1',
617
- allowedIssueAuthors: ['owner'],
618
- });
619
-
620
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
621
- mockProject,
622
- issue,
623
- 'awaiting-workspace-id',
624
- );
625
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
626
- issue,
627
- expect.stringContaining('Auto Status Check: REJECTED'),
628
- );
629
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
630
- issue,
631
- expect.stringContaining('PULL_REQUEST_CONFLICTED'),
632
- );
633
- });
634
-
635
- it('should revert issue when CI is failing', async () => {
636
- const issue = createMockIssue({
637
- status: 'Awaiting Quality Check',
638
- });
639
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
640
- {
641
- ...createReadyPr(),
642
- isPassedAllCiJob: false,
643
- isCiStateSuccess: false,
644
- },
645
- ]);
646
-
647
- await useCase.run({
648
- manager: 'manager-user',
649
- projectUrl: 'https://github.com/users/user/projects/1',
650
- allowedIssueAuthors: ['owner'],
651
- });
652
-
653
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
654
- mockProject,
655
- issue,
656
- 'awaiting-workspace-id',
657
- );
658
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
659
- issue,
660
- expect.stringContaining('Auto Status Check: REJECTED'),
661
- );
662
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
663
- issue,
664
- expect.stringContaining('ANY_CI_JOB_FAILED_OR_IN_PROGRESS'),
665
- );
666
- });
667
-
668
- it('should revert issue when review comments are not resolved', async () => {
669
- const issue = createMockIssue({
670
- status: 'Awaiting Quality Check',
671
- });
672
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
673
- { ...createReadyPr(), isResolvedAllReviewComments: false },
674
- ]);
675
-
676
- await useCase.run({
677
- manager: 'manager-user',
678
- projectUrl: 'https://github.com/users/user/projects/1',
679
- allowedIssueAuthors: ['owner'],
680
- });
681
-
682
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
683
- mockProject,
684
- issue,
685
- 'awaiting-workspace-id',
686
- );
687
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
688
- issue,
689
- expect.stringContaining('Auto Status Check: REJECTED'),
690
- );
691
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
692
- issue,
693
- expect.stringContaining('ANY_REVIEW_COMMENT_NOT_RESOLVED'),
694
- );
695
- });
696
-
697
- it('should revert issue when linked PR is in draft state', async () => {
698
- const issue = createMockIssue({
699
- status: 'Awaiting Quality Check',
700
- });
701
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
702
- { ...createReadyPr(), isDraft: true },
703
- ]);
704
-
705
- await useCase.run({
706
- manager: 'manager-user',
707
- projectUrl: 'https://github.com/users/user/projects/1',
708
- allowedIssueAuthors: ['owner'],
709
- });
710
-
711
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
712
- mockProject,
713
- issue,
714
- 'awaiting-workspace-id',
715
- );
716
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
717
- issue,
718
- expect.stringContaining('Auto Status Check: REJECTED'),
719
- );
720
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
721
- issue,
722
- expect.stringContaining('PULL_REQUEST_IS_DRAFT'),
723
- );
724
- });
725
-
726
- it('should revert issue when multiple linked open PRs are found', async () => {
727
- const issue = createMockIssue({
728
- status: 'Awaiting Quality Check',
729
- });
730
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
731
- createReadyPr('https://github.com/user/repo/pull/1'),
732
- createReadyPr('https://github.com/user/repo/pull/2'),
733
- ]);
734
-
735
- await useCase.run({
736
- manager: 'manager-user',
737
- projectUrl: 'https://github.com/users/user/projects/1',
738
- allowedIssueAuthors: ['owner'],
739
- });
740
-
741
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
742
- mockProject,
743
- issue,
744
- 'awaiting-workspace-id',
745
- );
746
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
747
- issue,
748
- expect.stringContaining('Auto Status Check: REJECTED'),
749
- );
750
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
751
- issue,
752
- expect.stringContaining('MULTIPLE_PULL_REQUESTS_FOUND'),
753
- );
754
- });
755
-
756
- it('should revert issue when CI is SUCCESS but required check never started', async () => {
757
- const issue = createMockIssue({
758
- status: 'Awaiting Quality Check',
759
- });
760
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
761
- {
762
- ...createReadyPr(),
763
- isPassedAllCiJob: false,
764
- isCiStateSuccess: true,
765
- missingRequiredCheckNames: ['E2E Tests'],
766
- },
767
- ]);
768
-
769
- await useCase.run({
770
- manager: 'manager-user',
771
- projectUrl: 'https://github.com/users/user/projects/1',
772
- allowedIssueAuthors: ['owner'],
773
- });
774
-
775
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
776
- mockProject,
777
- issue,
778
- 'awaiting-workspace-id',
779
- );
780
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
781
- issue,
782
- expect.stringContaining('Auto Status Check: REJECTED'),
783
- );
784
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
785
- issue,
786
- expect.stringContaining('REQUIRED_CI_JOB_NEVER_STARTED'),
787
- );
788
- });
789
-
790
- describe('in-memory related-PR derivation (no per-issue timeline call)', () => {
791
- it('should never call findRelatedOpenPRs while sweeping Awaiting Quality Check issues', async () => {
792
- const readyIssue = createMockIssue({
793
- status: 'Awaiting Quality Check',
794
- url: 'https://github.com/user/repo/issues/1',
795
- });
796
- const notReadyIssue = createMockIssue({
797
- status: 'Awaiting Quality Check',
798
- number: 2,
799
- url: 'https://github.com/user/repo/issues/2',
800
- });
801
- const readyPrItem = createMockPullRequest({
802
- status: 'In Progress',
803
- url: 'https://github.com/user/repo/pull/100',
804
- number: 100,
805
- closingIssueReferenceUrls: ['https://github.com/user/repo/issues/1'],
806
- });
807
- const conflictedPrItem = createMockPullRequest({
808
- status: 'In Progress',
809
- url: 'https://github.com/user/repo/pull/200',
810
- number: 200,
811
- closingIssueReferenceUrls: ['https://github.com/user/repo/issues/2'],
812
- });
813
- mockIssueRepository.getAllIssues.mockResolvedValue({
814
- project: mockProject,
815
- issues: [readyIssue, notReadyIssue, readyPrItem, conflictedPrItem],
816
- cacheUsed: false,
817
- });
818
- mockIssueRepository.getOpenPullRequest.mockImplementation(
819
- (prUrl: string) => {
820
- if (prUrl === 'https://github.com/user/repo/pull/100') {
821
- return Promise.resolve(createReadyPr(prUrl));
822
- }
823
- if (prUrl === 'https://github.com/user/repo/pull/200') {
824
- return Promise.resolve({
825
- ...createReadyPr(prUrl),
826
- isConflicted: true,
827
- });
828
- }
829
- return Promise.resolve(null);
830
- },
831
- );
832
-
833
- await useCase.run({
834
- manager: 'manager-user',
835
- projectUrl: 'https://github.com/users/user/projects/1',
836
- allowedIssueAuthors: ['owner'],
837
- });
838
-
839
- expect(mockIssueRepository.findRelatedOpenPRs).not.toHaveBeenCalled();
840
- expect(mockIssueRepository.getOpenPullRequest).toHaveBeenCalledWith(
841
- 'https://github.com/user/repo/pull/100',
842
- );
843
- expect(mockIssueRepository.getOpenPullRequest).toHaveBeenCalledWith(
844
- 'https://github.com/user/repo/pull/200',
845
- );
846
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledTimes(1);
847
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
848
- mockProject,
849
- notReadyIssue,
850
- 'awaiting-workspace-id',
851
- );
852
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
853
- notReadyIssue,
854
- expect.stringContaining('PULL_REQUEST_CONFLICTED'),
855
- );
856
- });
857
-
858
- it('should match a PR to its issue via closingIssueReferenceUrls even when the PR item is listed before the issue', async () => {
859
- const issue = createMockIssue({
860
- status: 'Awaiting Quality Check',
861
- url: 'https://github.com/user/repo/issues/42',
862
- number: 42,
863
- });
864
- const prItem = createMockPullRequest({
865
- status: 'In Progress',
866
- url: 'https://github.com/user/repo/pull/77',
867
- number: 77,
868
- closingIssueReferenceUrls: ['https://github.com/user/repo/issues/42'],
869
- });
870
- mockIssueRepository.getAllIssues.mockResolvedValue({
871
- project: mockProject,
872
- issues: [prItem, issue],
873
- cacheUsed: false,
874
- });
875
- mockIssueRepository.getOpenPullRequest.mockResolvedValue(
876
- createReadyPr('https://github.com/user/repo/pull/77'),
877
- );
878
-
879
- await useCase.run({
880
- manager: 'manager-user',
881
- projectUrl: 'https://github.com/users/user/projects/1',
882
- allowedIssueAuthors: ['owner'],
883
- });
884
-
885
- expect(mockIssueRepository.getOpenPullRequest).toHaveBeenCalledWith(
886
- 'https://github.com/user/repo/pull/77',
887
- );
888
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
889
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
890
- });
891
-
892
- it('should not match a closed PR even when its closingIssueReferenceUrls points at the issue', async () => {
893
- const issue = createMockIssue({
894
- status: 'Awaiting Quality Check',
895
- url: 'https://github.com/user/repo/issues/9',
896
- number: 9,
897
- });
898
- const closedPrItem = createMockPullRequest({
899
- status: 'In Progress',
900
- url: 'https://github.com/user/repo/pull/9',
901
- number: 9,
902
- isClosed: true,
903
- state: 'CLOSED',
904
- closingIssueReferenceUrls: ['https://github.com/user/repo/issues/9'],
905
- });
906
- mockIssueRepository.getAllIssues.mockResolvedValue({
907
- project: mockProject,
908
- issues: [issue, closedPrItem],
909
- cacheUsed: false,
910
- });
911
-
912
- await useCase.run({
913
- manager: 'manager-user',
914
- projectUrl: 'https://github.com/users/user/projects/1',
915
- allowedIssueAuthors: ['owner'],
916
- });
917
-
918
- expect(mockIssueRepository.getOpenPullRequest).not.toHaveBeenCalled();
919
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
920
- mockProject,
921
- issue,
922
- 'awaiting-workspace-id',
923
- );
924
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
925
- issue,
926
- expect.stringContaining('PULL_REQUEST_NOT_FOUND'),
927
- );
928
- });
929
-
930
- it('should fall back to findRelatedOpenPRs when the linked PR is absent from the allIssues cache', async () => {
931
- const issue = createMockIssue({
932
- status: 'Awaiting Quality Check',
933
- url: 'https://github.com/user/repo/issues/99',
934
- number: 99,
935
- });
936
- mockIssueRepository.getAllIssues.mockResolvedValue({
937
- project: mockProject,
938
- issues: [issue],
939
- cacheUsed: false,
940
- });
941
- const readyPr: RelatedPullRequest = {
942
- url: 'https://github.com/user/repo/pull/99',
943
- branchName: 'fix/issue-99',
944
- createdAt: new Date(),
945
- isDraft: false,
946
- isConflicted: false,
947
- mergeable: 'MERGEABLE',
948
- isPassedAllCiJob: true,
949
- isCiStateSuccess: true,
950
- isResolvedAllReviewComments: true,
951
- isBranchOutOfDate: false,
952
- missingRequiredCheckNames: [],
953
- };
954
- mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([readyPr]);
955
-
956
- await useCase.run({
957
- manager: 'manager-user',
958
- projectUrl: 'https://github.com/users/user/projects/1',
959
- allowedIssueAuthors: ['owner'],
960
- });
961
-
962
- expect(mockIssueRepository.findRelatedOpenPRs).toHaveBeenCalledWith(
963
- 'https://github.com/user/repo/issues/99',
964
- );
965
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
966
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
967
- });
968
- });
969
-
970
- describe('change-target label auto-approve', () => {
971
- const setupReadyIssue = (labels: string[]) => {
972
- const issue = createMockIssue({
973
- status: 'Awaiting Quality Check',
974
- labels,
975
- });
976
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
977
- createReadyPr(),
978
- ]);
979
- return issue;
980
- };
981
-
982
- const runCycle = () =>
983
- useCase.run({
984
- manager: 'manager-user',
985
- projectUrl: 'https://github.com/users/user/projects/1',
986
- allowedIssueAuthors: ['owner'],
987
- });
988
-
989
- it('should not approve PR when issue has no change-target label', async () => {
990
- setupReadyIssue([]);
991
-
992
- await runCycle();
993
-
994
- expect(
995
- mockIssueRepository.getPullRequestChangedFilePaths,
996
- ).not.toHaveBeenCalled();
997
- expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
998
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
999
- });
1000
-
1001
- it('should approve PR when issue has change-target label and all files are confined', async () => {
1002
- setupReadyIssue(['change-target:src/domain']);
1003
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
1004
- 'src/domain/entities/Foo.ts',
1005
- 'src/domain/usecases/Bar.ts',
1006
- ]);
1007
-
1008
- await runCycle();
1009
-
1010
- expect(
1011
- mockIssueRepository.getPullRequestChangedFilePaths,
1012
- ).toHaveBeenCalledWith('https://github.com/user/repo/pull/1');
1013
- expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
1014
- 'https://github.com/user/repo/pull/1',
1015
- );
1016
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
1017
- });
1018
-
1019
- it('should not approve PR when any changed file is outside the labeled path', async () => {
1020
- setupReadyIssue(['change-target:src/domain']);
1021
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
1022
- 'src/domain/entities/Foo.ts',
1023
- 'src/adapter/repositories/Outside.ts',
1024
- ]);
1025
-
1026
- await runCycle();
1027
-
1028
- expect(
1029
- mockIssueRepository.getPullRequestChangedFilePaths,
1030
- ).toHaveBeenCalledWith('https://github.com/user/repo/pull/1');
1031
- expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
1032
- });
1033
-
1034
- it('should approve when files are confined under any of multiple change-target labels', async () => {
1035
- setupReadyIssue(['change-target:src/domain', 'change-target:docs']);
1036
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
1037
- 'src/domain/entities/Foo.ts',
1038
- 'docs/intro.md',
1039
- ]);
1040
-
1041
- await runCycle();
1042
-
1043
- expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
1044
- 'https://github.com/user/repo/pull/1',
1045
- );
1046
- });
1047
-
1048
- it('should not approve when PR has more than 100 changed files and one file beyond entry 100 is outside the labeled path', async () => {
1049
- setupReadyIssue(['change-target:src/domain']);
1050
- const filePaths: string[] = [];
1051
- for (let i = 0; i < 150; i += 1) {
1052
- filePaths.push(`src/domain/file${i}.ts`);
1053
- }
1054
- filePaths.push('src/adapter/Outside.ts');
1055
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue(
1056
- filePaths,
1057
- );
1058
-
1059
- await runCycle();
1060
-
1061
- expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
1062
- });
1063
-
1064
- it('should match boundary-safely (change-target:foo matches foo/bar.ts but not foobar/baz.ts)', async () => {
1065
- setupReadyIssue(['change-target:foo']);
1066
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
1067
- 'foo/bar.ts',
1068
- 'foobar/baz.ts',
1069
- ]);
1070
-
1071
- await runCycle();
1072
-
1073
- expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
1074
- });
1075
-
1076
- it('should approve when changed files match exact path or subpath of the labeled path', async () => {
1077
- setupReadyIssue(['change-target:foo']);
1078
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
1079
- 'foo/bar.ts',
1080
- 'foo/nested/baz.ts',
1081
- ]);
1082
-
1083
- await runCycle();
1084
-
1085
- expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
1086
- 'https://github.com/user/repo/pull/1',
1087
- );
1088
- });
1089
-
1090
- it('should not approve when PR has zero changed files', async () => {
1091
- setupReadyIssue(['change-target:src/domain']);
1092
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue(
1093
- [],
1094
- );
1095
-
1096
- await runCycle();
1097
-
1098
- expect(
1099
- mockIssueRepository.getPullRequestChangedFilePaths,
1100
- ).toHaveBeenCalledWith('https://github.com/user/repo/pull/1');
1101
- expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
1102
- });
1103
-
1104
- it('should not approve when there is no ready PR even if change-target label is present', async () => {
1105
- const issue = createMockIssue({
1106
- status: 'Awaiting Quality Check',
1107
- labels: ['change-target:src/domain'],
1108
- });
1109
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, []);
1110
-
1111
- await runCycle();
1112
-
1113
- expect(
1114
- mockIssueRepository.getPullRequestChangedFilePaths,
1115
- ).not.toHaveBeenCalled();
1116
- expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
1117
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1118
- mockProject,
1119
- issue,
1120
- 'awaiting-workspace-id',
1121
- );
1122
- });
1123
-
1124
- it('should not approve when PR has unresolved rejections even with change-target label', async () => {
1125
- const issue = createMockIssue({
1126
- status: 'Awaiting Quality Check',
1127
- labels: ['change-target:src/domain'],
1128
- });
1129
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
1130
- { ...createReadyPr(), isConflicted: true },
1131
- ]);
1132
-
1133
- await runCycle();
1134
-
1135
- expect(
1136
- mockIssueRepository.getPullRequestChangedFilePaths,
1137
- ).not.toHaveBeenCalled();
1138
- expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
1139
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1140
- mockProject,
1141
- issue,
1142
- 'awaiting-workspace-id',
1143
- );
1144
- });
1145
-
1146
- it('should skip change-target auto-approve for issue with non-developer agent field', async () => {
1147
- const issue = createMockIssue({
1148
- status: 'Awaiting Quality Check',
1149
- labels: ['change-target:src/domain'],
1150
- agent: 'chore',
1151
- });
1152
- linkRelatedOpenPrsToIssue(mockIssueRepository, issue, [
1153
- createReadyPr(),
1154
- ]);
1155
-
1156
- await runCycle();
1157
-
1158
- expect(
1159
- mockIssueRepository.getPullRequestChangedFilePaths,
1160
- ).not.toHaveBeenCalled();
1161
- expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
1162
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
1163
- });
1164
-
1165
- it('should normalize trailing slashes in change-target label paths', async () => {
1166
- setupReadyIssue(['change-target:src/domain/']);
1167
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
1168
- 'src/domain/entities/Foo.ts',
1169
- ]);
1170
-
1171
- await runCycle();
1172
-
1173
- expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
1174
- 'https://github.com/user/repo/pull/1',
1175
- );
1176
- });
1177
-
1178
- it('should expand changeTargetPathAliases when alias matches a change-target label', async () => {
1179
- setupReadyIssue(['change-target:adapters']);
1180
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
1181
- 'src/domain/usecases/adapter-interfaces/IssueRepository.ts',
1182
- ]);
1183
-
1184
- await useCase.run({
1185
- manager: 'manager-user',
1186
- projectUrl: 'https://github.com/users/user/projects/1',
1187
- allowedIssueAuthors: ['owner'],
1188
- changeTargetPathAliases: {
1189
- adapters: 'src/domain/usecases/adapter-interfaces',
1190
- },
1191
- });
1192
-
1193
- expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
1194
- 'https://github.com/user/repo/pull/1',
1195
- );
1196
- });
1197
-
1198
- it('should not approve when file is outside the alias-expanded path', async () => {
1199
- setupReadyIssue(['change-target:adapters']);
1200
- mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
1201
- 'src/domain/usecases/SomeOtherUseCase.ts',
1202
- ]);
1203
-
1204
- await useCase.run({
1205
- manager: 'manager-user',
1206
- projectUrl: 'https://github.com/users/user/projects/1',
1207
- allowedIssueAuthors: ['owner'],
1208
- changeTargetPathAliases: {
1209
- adapters: 'src/domain/usecases/adapter-interfaces',
1210
- },
1211
- });
1212
-
1213
- expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
1214
- });
1215
- });
1216
- });
1217
-
1218
- describe('archived project item containment', () => {
1219
- let warnSpy: jest.SpyInstance;
1220
-
1221
- beforeEach(() => {
1222
- warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});
1223
- });
1224
-
1225
- afterEach(() => {
1226
- warnSpy.mockRestore();
1227
- });
1228
-
1229
- it('should skip an archived issue on updateStatus failure and continue with remaining issues', async () => {
1230
- const archivedIssue = createMockIssue({
1231
- number: 1,
1232
- url: 'https://github.com/user/repo/issues/1',
1233
- itemId: 'archived-item',
1234
- status: 'Awaiting Quality Check',
1235
- });
1236
- const normalIssue = createMockIssue({
1237
- number: 2,
1238
- url: 'https://github.com/user/repo/issues/2',
1239
- itemId: 'normal-item',
1240
- status: 'Awaiting Quality Check',
1241
- });
1242
- mockIssueRepository.getAllIssues.mockResolvedValue({
1243
- project: mockProject,
1244
- issues: [archivedIssue, normalIssue],
1245
- cacheUsed: false,
1246
- });
1247
- mockIssueRepository.updateStatus.mockImplementation(
1248
- (_project: Project, issue: Issue) =>
1249
- issue.url === archivedIssue.url
1250
- ? Promise.reject(
1251
- new Error('The item is archived and cannot be updated'),
1252
- )
1253
- : Promise.resolve(undefined),
1254
- );
1255
-
1256
- await useCase.run({
1257
- manager: 'manager-user',
1258
- projectUrl: 'https://github.com/users/user/projects/1',
1259
- allowedIssueAuthors: ['owner'],
1260
- });
1261
-
1262
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1263
- mockProject,
1264
- archivedIssue,
1265
- 'awaiting-workspace-id',
1266
- );
1267
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1268
- mockProject,
1269
- normalIssue,
1270
- 'awaiting-workspace-id',
1271
- );
1272
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalledWith(
1273
- archivedIssue,
1274
- expect.anything(),
1275
- );
1276
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
1277
- normalIssue,
1278
- expect.stringContaining('Auto Status Check: REJECTED'),
1279
- );
1280
- expect(warnSpy).toHaveBeenCalledWith(
1281
- expect.stringContaining(archivedIssue.url),
1282
- );
1283
- });
1284
-
1285
- it('should propagate a non-archived updateStatus error for issues unchanged', async () => {
1286
- const issue = createMockIssue({
1287
- status: 'Awaiting Quality Check',
1288
- });
1289
- mockIssueRepository.getAllIssues.mockResolvedValue({
1290
- project: mockProject,
1291
- issues: [issue],
1292
- cacheUsed: false,
1293
- });
1294
- mockIssueRepository.updateStatus.mockRejectedValue(
1295
- new Error('Something went wrong'),
1296
- );
1297
-
1298
- await expect(
1299
- useCase.run({
1300
- manager: 'manager-user',
1301
- projectUrl: 'https://github.com/users/user/projects/1',
1302
- allowedIssueAuthors: ['owner'],
1303
- }),
1304
- ).rejects.toThrow('Something went wrong');
1305
-
1306
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
1307
- });
1308
-
1309
- it('should skip an archived Awaiting Quality Check pull request on updateStatus failure and continue with remaining pull requests', async () => {
1310
- const archivedPullRequest = createMockPullRequest({
1311
- number: 1,
1312
- url: 'https://github.com/user/repo/pull/1',
1313
- itemId: 'archived-pr-item',
1314
- status: 'Awaiting Quality Check',
1315
- });
1316
- const normalPullRequest = createMockPullRequest({
1317
- number: 2,
1318
- url: 'https://github.com/user/repo/pull/2',
1319
- itemId: 'normal-pr-item',
1320
- status: 'Awaiting Quality Check',
1321
- });
1322
- mockIssueRepository.getAllIssues.mockResolvedValue({
1323
- project: mockProject,
1324
- issues: [archivedPullRequest, normalPullRequest],
1325
- cacheUsed: false,
1326
- });
1327
- mockIssueRepository.getOpenPullRequest.mockImplementation(
1328
- (prUrl: string) =>
1329
- Promise.resolve({
1330
- ...createReadyPr(prUrl),
1331
- isConflicted: true,
1332
- }),
1333
- );
1334
- mockIssueRepository.updateStatus.mockImplementation(
1335
- (_project: Project, issue: Issue) =>
1336
- issue.url === archivedPullRequest.url
1337
- ? Promise.reject(
1338
- new Error('The item is archived and cannot be updated'),
1339
- )
1340
- : Promise.resolve(undefined),
1341
- );
1342
-
1343
- await useCase.run({
1344
- manager: 'manager-user',
1345
- projectUrl: 'https://github.com/users/user/projects/1',
1346
- allowedIssueAuthors: ['owner'],
1347
- });
1348
-
1349
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1350
- mockProject,
1351
- archivedPullRequest,
1352
- 'awaiting-workspace-id',
1353
- );
1354
- expect(mockIssueRepository.updateStory).not.toHaveBeenCalledWith(
1355
- expect.anything(),
1356
- archivedPullRequest,
1357
- expect.anything(),
1358
- );
1359
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalledWith(
1360
- archivedPullRequest,
1361
- expect.anything(),
1362
- );
1363
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1364
- mockProject,
1365
- normalPullRequest,
1366
- 'awaiting-workspace-id',
1367
- );
1368
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
1369
- normalPullRequest,
1370
- expect.stringContaining('Auto Status Check: REJECTED'),
1371
- );
1372
- expect(warnSpy).toHaveBeenCalledWith(
1373
- expect.stringContaining(archivedPullRequest.url),
1374
- );
1375
- });
1376
-
1377
- it('should propagate a non-archived updateStatus error for Awaiting Quality Check pull requests unchanged', async () => {
1378
- const pullRequest = createMockPullRequest({
1379
- status: 'Awaiting Quality Check',
1380
- });
1381
- mockIssueRepository.getAllIssues.mockResolvedValue({
1382
- project: mockProject,
1383
- issues: [pullRequest],
1384
- cacheUsed: false,
1385
- });
1386
- mockIssueRepository.getOpenPullRequest.mockResolvedValue({
1387
- ...createReadyPr(),
1388
- isConflicted: true,
1389
- });
1390
- mockIssueRepository.updateStatus.mockRejectedValue(
1391
- new Error('Something went wrong'),
1392
- );
1393
-
1394
- await expect(
1395
- useCase.run({
1396
- manager: 'manager-user',
1397
- projectUrl: 'https://github.com/users/user/projects/1',
1398
- allowedIssueAuthors: ['owner'],
1399
- }),
1400
- ).rejects.toThrow('Something went wrong');
1401
-
1402
- expect(mockIssueRepository.updateStory).not.toHaveBeenCalled();
1403
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
1404
- });
1405
- });
1406
-
1407
- describe('ky TimeoutError containment', () => {
1408
- let warnSpy: jest.SpyInstance;
1409
-
1410
- const createKyTimeoutError = (): Error => {
1411
- const error = new Error(
1412
- 'Request timed out: POST https://api.github.com/graphql',
1413
- );
1414
- error.name = 'TimeoutError';
1415
- return error;
1416
- };
1417
-
1418
- beforeEach(() => {
1419
- warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});
1420
- });
1421
-
1422
- afterEach(() => {
1423
- warnSpy.mockRestore();
1424
- });
1425
-
1426
- it('should skip an issue whose updateStatus times out and continue with remaining issues', async () => {
1427
- const timedOutIssue = createMockIssue({
1428
- number: 1,
1429
- url: 'https://github.com/user/repo/issues/1',
1430
- itemId: 'timed-out-item',
1431
- status: 'Awaiting Quality Check',
1432
- });
1433
- const normalIssue = createMockIssue({
1434
- number: 2,
1435
- url: 'https://github.com/user/repo/issues/2',
1436
- itemId: 'normal-item',
1437
- status: 'Awaiting Quality Check',
1438
- });
1439
- mockIssueRepository.getAllIssues.mockResolvedValue({
1440
- project: mockProject,
1441
- issues: [timedOutIssue, normalIssue],
1442
- cacheUsed: false,
1443
- });
1444
- mockIssueRepository.updateStatus.mockImplementation(
1445
- (_project: Project, issue: Issue) =>
1446
- issue.url === timedOutIssue.url
1447
- ? Promise.reject(createKyTimeoutError())
1448
- : Promise.resolve(undefined),
1449
- );
1450
-
1451
- await useCase.run({
1452
- manager: 'manager-user',
1453
- projectUrl: 'https://github.com/users/user/projects/1',
1454
- allowedIssueAuthors: ['owner'],
1455
- });
1456
-
1457
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1458
- mockProject,
1459
- timedOutIssue,
1460
- 'awaiting-workspace-id',
1461
- );
1462
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1463
- mockProject,
1464
- normalIssue,
1465
- 'awaiting-workspace-id',
1466
- );
1467
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalledWith(
1468
- timedOutIssue,
1469
- expect.anything(),
1470
- );
1471
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
1472
- normalIssue,
1473
- expect.stringContaining('Auto Status Check: REJECTED'),
1474
- );
1475
- expect(warnSpy).toHaveBeenCalledWith(
1476
- expect.stringContaining(timedOutIssue.url),
1477
- );
1478
- });
1479
-
1480
- it('should skip an issue whose createComment times out and continue with remaining issues', async () => {
1481
- const timedOutIssue = createMockIssue({
1482
- number: 1,
1483
- url: 'https://github.com/user/repo/issues/1',
1484
- itemId: 'timed-out-item',
1485
- status: 'Awaiting Quality Check',
1486
- });
1487
- const normalIssue = createMockIssue({
1488
- number: 2,
1489
- url: 'https://github.com/user/repo/issues/2',
1490
- itemId: 'normal-item',
1491
- status: 'Awaiting Quality Check',
1492
- });
1493
- mockIssueRepository.getAllIssues.mockResolvedValue({
1494
- project: mockProject,
1495
- issues: [timedOutIssue, normalIssue],
1496
- cacheUsed: false,
1497
- });
1498
- mockIssueCommentRepository.createComment.mockImplementation(
1499
- (issue: Issue) =>
1500
- issue.url === timedOutIssue.url
1501
- ? Promise.reject(createKyTimeoutError())
1502
- : Promise.resolve(undefined),
1503
- );
1504
-
1505
- await useCase.run({
1506
- manager: 'manager-user',
1507
- projectUrl: 'https://github.com/users/user/projects/1',
1508
- allowedIssueAuthors: ['owner'],
1509
- });
1510
-
1511
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
1512
- normalIssue,
1513
- expect.stringContaining('Auto Status Check: REJECTED'),
1514
- );
1515
- expect(warnSpy).toHaveBeenCalledWith(
1516
- expect.stringContaining(timedOutIssue.url),
1517
- );
1518
- });
1519
-
1520
- it('should skip an Awaiting Quality Check pull request whose updateStatus times out and continue with remaining pull requests', async () => {
1521
- const timedOutPullRequest = createMockPullRequest({
1522
- number: 1,
1523
- url: 'https://github.com/user/repo/pull/1',
1524
- itemId: 'timed-out-pr-item',
1525
- status: 'Awaiting Quality Check',
1526
- });
1527
- const normalPullRequest = createMockPullRequest({
1528
- number: 2,
1529
- url: 'https://github.com/user/repo/pull/2',
1530
- itemId: 'normal-pr-item',
1531
- status: 'Awaiting Quality Check',
1532
- });
1533
- mockIssueRepository.getAllIssues.mockResolvedValue({
1534
- project: mockProject,
1535
- issues: [timedOutPullRequest, normalPullRequest],
1536
- cacheUsed: false,
1537
- });
1538
- mockIssueRepository.getOpenPullRequest.mockImplementation(
1539
- (prUrl: string) =>
1540
- Promise.resolve({
1541
- ...createReadyPr(prUrl),
1542
- isConflicted: true,
1543
- }),
1544
- );
1545
- mockIssueRepository.updateStatus.mockImplementation(
1546
- (_project: Project, issue: Issue) =>
1547
- issue.url === timedOutPullRequest.url
1548
- ? Promise.reject(createKyTimeoutError())
1549
- : Promise.resolve(undefined),
1550
- );
1551
-
1552
- await useCase.run({
1553
- manager: 'manager-user',
1554
- projectUrl: 'https://github.com/users/user/projects/1',
1555
- allowedIssueAuthors: ['owner'],
1556
- });
1557
-
1558
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1559
- mockProject,
1560
- timedOutPullRequest,
1561
- 'awaiting-workspace-id',
1562
- );
1563
- expect(mockIssueRepository.updateStory).not.toHaveBeenCalledWith(
1564
- expect.anything(),
1565
- timedOutPullRequest,
1566
- expect.anything(),
1567
- );
1568
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalledWith(
1569
- timedOutPullRequest,
1570
- expect.anything(),
1571
- );
1572
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1573
- mockProject,
1574
- normalPullRequest,
1575
- 'awaiting-workspace-id',
1576
- );
1577
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
1578
- normalPullRequest,
1579
- expect.stringContaining('Auto Status Check: REJECTED'),
1580
- );
1581
- expect(warnSpy).toHaveBeenCalledWith(
1582
- expect.stringContaining(timedOutPullRequest.url),
1583
- );
1584
- });
1585
-
1586
- it('should propagate a non-timeout non-archived error from createComment unchanged', async () => {
1587
- const issue = createMockIssue({
1588
- status: 'Awaiting Quality Check',
1589
- });
1590
- mockIssueRepository.getAllIssues.mockResolvedValue({
1591
- project: mockProject,
1592
- issues: [issue],
1593
- cacheUsed: false,
1594
- });
1595
- mockIssueCommentRepository.createComment.mockRejectedValue(
1596
- new Error('Something went wrong'),
1597
- );
1598
-
1599
- await expect(
1600
- useCase.run({
1601
- manager: 'manager-user',
1602
- projectUrl: 'https://github.com/users/user/projects/1',
1603
- allowedIssueAuthors: ['owner'],
1604
- }),
1605
- ).rejects.toThrow('Something went wrong');
1606
- });
1607
- });
1608
-
1609
- describe('manager-assignee gating', () => {
1610
- it('should not revert a rejected Awaiting Quality Check issue that is not assigned to the manager', async () => {
1611
- const issue = createMockIssue({
1612
- status: 'Awaiting Quality Check',
1613
- assignees: ['other-user'],
1614
- });
1615
- mockIssueRepository.getAllIssues.mockResolvedValue({
1616
- project: mockProject,
1617
- issues: [issue],
1618
- cacheUsed: false,
1619
- });
1620
-
1621
- await useCase.run({
1622
- manager: 'manager-user',
1623
- projectUrl: 'https://github.com/users/user/projects/1',
1624
- allowedIssueAuthors: ['owner'],
1625
- });
1626
-
1627
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
1628
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
1629
- });
1630
-
1631
- it('should revert a rejected Awaiting Quality Check issue that is assigned to the manager', async () => {
1632
- const issue = createMockIssue({
1633
- status: 'Awaiting Quality Check',
1634
- assignees: ['manager-user'],
1635
- });
1636
- mockIssueRepository.getAllIssues.mockResolvedValue({
1637
- project: mockProject,
1638
- issues: [issue],
1639
- cacheUsed: false,
1640
- });
1641
-
1642
- await useCase.run({
1643
- manager: 'manager-user',
1644
- projectUrl: 'https://github.com/users/user/projects/1',
1645
- allowedIssueAuthors: ['owner'],
1646
- });
1647
-
1648
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1649
- mockProject,
1650
- issue,
1651
- 'awaiting-workspace-id',
1652
- );
1653
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
1654
- issue,
1655
- expect.stringContaining('Auto Status Check: REJECTED'),
1656
- );
1657
- });
1658
-
1659
- it('should not revert a rejected Awaiting Quality Check pull request that is not assigned to the manager', async () => {
1660
- const pullRequest = createMockPullRequest({
1661
- status: 'Awaiting Quality Check',
1662
- assignees: ['other-user'],
1663
- });
1664
- mockIssueRepository.getAllIssues.mockResolvedValue({
1665
- project: mockProject,
1666
- issues: [pullRequest],
1667
- cacheUsed: false,
1668
- });
1669
- mockIssueRepository.getOpenPullRequest.mockResolvedValue({
1670
- ...createReadyPr(),
1671
- isConflicted: true,
1672
- });
1673
-
1674
- await useCase.run({
1675
- manager: 'manager-user',
1676
- projectUrl: 'https://github.com/users/user/projects/1',
1677
- allowedIssueAuthors: ['owner'],
1678
- });
1679
-
1680
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
1681
- expect(mockIssueRepository.updateStory).not.toHaveBeenCalled();
1682
- expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
1683
- });
1684
-
1685
- it('should revert a rejected Awaiting Quality Check pull request that is assigned to the manager', async () => {
1686
- const pullRequest = createMockPullRequest({
1687
- status: 'Awaiting Quality Check',
1688
- assignees: ['manager-user'],
1689
- });
1690
- mockIssueRepository.getAllIssues.mockResolvedValue({
1691
- project: mockProject,
1692
- issues: [pullRequest],
1693
- cacheUsed: false,
1694
- });
1695
- mockIssueRepository.getOpenPullRequest.mockResolvedValue({
1696
- ...createReadyPr(),
1697
- isConflicted: true,
1698
- });
1699
-
1700
- await useCase.run({
1701
- manager: 'manager-user',
1702
- projectUrl: 'https://github.com/users/user/projects/1',
1703
- allowedIssueAuthors: ['owner'],
1704
- });
1705
-
1706
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1707
- mockProject,
1708
- pullRequest,
1709
- 'awaiting-workspace-id',
1710
- );
1711
- expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
1712
- pullRequest,
1713
- expect.stringContaining('Auto Status Check: REJECTED'),
1714
- );
1715
- });
1716
- });
1717
-
1718
- describe('batched pull request state resolution', () => {
1719
- const projectUrl = 'https://github.com/users/user/projects/1';
1720
-
1721
- const buildAwaitingQualityCheckBoard = (
1722
- issueCount: number,
1723
- ): { boardIssues: Issue[]; relatedPrs: RelatedPrLike[] } => {
1724
- const boardIssues: Issue[] = [];
1725
- const relatedPrs: RelatedPrLike[] = [];
1726
- for (let index = 0; index < issueCount; index += 1) {
1727
- const issueUrl = `https://github.com/user/repo/issues/${200 + index}`;
1728
- const prUrl = `https://github.com/user/repo/pull/${300 + index}`;
1729
- boardIssues.push(
1730
- createMockIssue({
1731
- url: issueUrl,
1732
- number: 200 + index,
1733
- itemId: `item-issue-${index}`,
1734
- }),
1735
- );
1736
- boardIssues.push(
1737
- createMockPullRequest({
1738
- url: prUrl,
1739
- number: 300 + index,
1740
- itemId: `item-pr-${index}`,
1741
- status: 'In Progress',
1742
- closingIssueReferenceUrls: [issueUrl],
1743
- }),
1744
- );
1745
- relatedPrs.push(createReadyPr(prUrl));
1746
- }
1747
- return { boardIssues, relatedPrs };
1748
- };
1749
-
1750
- const resolveBatchFrom = (relatedPrs: RelatedPrLike[]): void => {
1751
- const prByUrl = new Map(relatedPrs.map((pr) => [pr.url, pr]));
1752
- mockIssueRepository.getOpenPullRequests.mockImplementation(
1753
- (prUrls: string[]) =>
1754
- Promise.resolve(
1755
- new Map(prUrls.map((prUrl) => [prUrl, prByUrl.get(prUrl) ?? null])),
1756
- ),
1757
- );
1758
- };
1759
-
1760
- it('resolves every related pull request in one batched call and makes no per-pull-request call', async () => {
1761
- const { boardIssues, relatedPrs } = buildAwaitingQualityCheckBoard(3);
1762
- mockIssueRepository.getAllIssues.mockResolvedValue({
1763
- project: mockProject,
1764
- issues: boardIssues,
1765
- cacheUsed: false,
1766
- });
1767
- resolveBatchFrom(relatedPrs);
1768
-
1769
- await useCase.run({
1770
- projectUrl,
1771
- manager: 'manager-user',
1772
- allowedIssueAuthors: ['owner'],
1773
- });
1774
-
1775
- expect(mockIssueRepository.getOpenPullRequests).toHaveBeenCalledTimes(1);
1776
- expect(mockIssueRepository.getOpenPullRequests).toHaveBeenCalledWith(
1777
- relatedPrs.map((pr) => pr.url),
1778
- );
1779
- expect(mockIssueRepository.getOpenPullRequest).not.toHaveBeenCalled();
1780
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
1781
- });
1782
-
1783
- it('falls back to the single pull request query only for a url the batch left unresolved', async () => {
1784
- const { boardIssues, relatedPrs } = buildAwaitingQualityCheckBoard(2);
1785
- const resolvedPr = relatedPrs[0];
1786
- const omittedPr = relatedPrs[1];
1787
- mockIssueRepository.getAllIssues.mockResolvedValue({
1788
- project: mockProject,
1789
- issues: boardIssues,
1790
- cacheUsed: false,
1791
- });
1792
- mockIssueRepository.getOpenPullRequests.mockResolvedValue(
1793
- new Map([[resolvedPr.url, resolvedPr]]),
1794
- );
1795
- mockIssueRepository.getOpenPullRequest.mockImplementation(
1796
- (prUrl: string) =>
1797
- Promise.resolve(prUrl === omittedPr.url ? omittedPr : null),
1798
- );
1799
-
1800
- await useCase.run({
1801
- projectUrl,
1802
- manager: 'manager-user',
1803
- allowedIssueAuthors: ['owner'],
1804
- });
1805
-
1806
- expect(mockIssueRepository.getOpenPullRequest).toHaveBeenCalledTimes(1);
1807
- expect(mockIssueRepository.getOpenPullRequest).toHaveBeenCalledWith(
1808
- omittedPr.url,
1809
- );
1810
- expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
1811
- });
1812
-
1813
- it('reverts the issue whose pull request the batch resolved as absent', async () => {
1814
- const { boardIssues, relatedPrs } = buildAwaitingQualityCheckBoard(1);
1815
- mockIssueRepository.getAllIssues.mockResolvedValue({
1816
- project: mockProject,
1817
- issues: boardIssues,
1818
- cacheUsed: false,
1819
- });
1820
- mockIssueRepository.getOpenPullRequests.mockResolvedValue(
1821
- new Map([[relatedPrs[0].url, null]]),
1822
- );
1823
-
1824
- await useCase.run({
1825
- projectUrl,
1826
- manager: 'manager-user',
1827
- allowedIssueAuthors: ['owner'],
1828
- });
1829
-
1830
- expect(mockIssueRepository.getOpenPullRequest).not.toHaveBeenCalled();
1831
- expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
1832
- mockProject,
1833
- expect.objectContaining({ url: boardIssues[0].url }),
1834
- 'awaiting-workspace-id',
1835
- );
1836
- });
1837
- });
1838
- });