github-issue-tower-defence-management 2.19.0 → 2.19.2

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