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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (795) hide show
  1. package/bin/adapter/entry-points/cli/index.js +1 -3
  2. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  3. package/bin/adapter/entry-points/console/consoleOperationApi.js +6 -12
  4. package/bin/adapter/entry-points/console/consoleOperationApi.js.map +1 -1
  5. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +1 -1
  6. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
  7. package/bin/adapter/repositories/issue/RestIssueRepository.js +9 -2
  8. package/bin/adapter/repositories/issue/RestIssueRepository.js.map +1 -1
  9. package/package.json +5 -1
  10. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  11. package/types/adapter/entry-points/console/consoleOperationApi.d.ts.map +1 -1
  12. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +1 -1
  13. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
  14. package/types/adapter/repositories/issue/RestIssueRepository.d.ts +5 -1
  15. package/types/adapter/repositories/issue/RestIssueRepository.d.ts.map +1 -1
  16. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +1 -1
  17. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
  18. package/.env.example +0 -7
  19. package/.gitattributes +0 -2
  20. package/.github/CODEOWNERS +0 -6
  21. package/.github/copilot-instructions.md +0 -6
  22. package/.github/dependabot.yml +0 -19
  23. package/.github/instructions/code-review.instructions.md +0 -50
  24. package/.github/workflows/api-created_issue_pr.yml +0 -97
  25. package/.github/workflows/ci-failure-issue-creator.yml +0 -48
  26. package/.github/workflows/close-manual-prs.yml +0 -80
  27. package/.github/workflows/codeql.yml +0 -107
  28. package/.github/workflows/commit-lint.yml +0 -85
  29. package/.github/workflows/configs/commitlint.config.cjs +0 -32
  30. package/.github/workflows/configs/commitlint.config.js +0 -32
  31. package/.github/workflows/console-ui.yml +0 -68
  32. package/.github/workflows/create-pr.yml +0 -116
  33. package/.github/workflows/empty-format-test-job.yml +0 -34
  34. package/.github/workflows/format.yml +0 -28
  35. package/.github/workflows/publish.yml +0 -111
  36. package/.github/workflows/secret-scan.yml +0 -51
  37. package/.github/workflows/test.yml +0 -58
  38. package/.github/workflows/umino-project.yml +0 -207
  39. package/.gitleaks.toml +0 -22
  40. package/.prettierignore +0 -31
  41. package/.prettierrc +0 -5
  42. package/CHANGELOG.md +0 -4162
  43. package/CONTRIBUTING.md +0 -60
  44. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js +0 -12
  45. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js.map +0 -1
  46. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js +0 -125
  47. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js.map +0 -1
  48. package/bin/adapter/repositories/issue/issueTimelineUtils.js +0 -38
  49. package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +0 -1
  50. package/bin/domain/entities/UnansweredOwnerCall.js +0 -3
  51. package/bin/domain/entities/UnansweredOwnerCall.js.map +0 -1
  52. package/bin/domain/entities/WorkingTime.js +0 -3
  53. package/bin/domain/entities/WorkingTime.js.map +0 -1
  54. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js +0 -37
  55. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js.map +0 -1
  56. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js +0 -118
  57. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js.map +0 -1
  58. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +0 -180
  59. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +0 -1
  60. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js +0 -160
  61. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js.map +0 -1
  62. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js +0 -3
  63. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js.map +0 -1
  64. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js +0 -7
  65. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js.map +0 -1
  66. package/bin/domain/usecases/findLastAgentDeclaringReport.js +0 -12
  67. package/bin/domain/usecases/findLastAgentDeclaringReport.js.map +0 -1
  68. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js +0 -25
  69. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js.map +0 -1
  70. package/bin/domain/usecases/isWaitingForOwnerApproval.js +0 -16
  71. package/bin/domain/usecases/isWaitingForOwnerApproval.js.map +0 -1
  72. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js +0 -7
  73. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js.map +0 -1
  74. package/commitlint.config.js +0 -6
  75. package/eslint.config.mjs +0 -76
  76. package/jest.config.js +0 -84
  77. package/jest.setup.js +0 -1
  78. package/lib/buffer-equal-constant-time-compat/index.js +0 -17
  79. package/lib/buffer-equal-constant-time-compat/index.test.js +0 -54
  80. package/lib/buffer-equal-constant-time-compat/package.json +0 -5
  81. package/lib/typescript-compat/bin/tsc +0 -2
  82. package/lib/typescript-compat/bin/tsserver +0 -2
  83. package/lib/typescript-compat/lib/typescript.js +0 -1
  84. package/lib/typescript-compat/package.json +0 -13
  85. package/renovate.json +0 -46
  86. package/scripts/copyConsoleUiDist.mjs +0 -35
  87. package/scripts/defaultBranchTipVerify.sh +0 -23
  88. package/scripts/testWorkflowRunVerify.sh +0 -47
  89. package/scripts/verifyConsoleUiDist.mjs +0 -96
  90. package/src/adapter/ci/consoleUiWorkflowTimeout.test.ts +0 -61
  91. package/src/adapter/ci/publishTestWorkflowGate.test.ts +0 -653
  92. package/src/adapter/ci/workflowRunCancellation.test.ts +0 -72
  93. package/src/adapter/entry-points/cli/fleetConfig.test.ts +0 -553
  94. package/src/adapter/entry-points/cli/fleetConfig.ts +0 -266
  95. package/src/adapter/entry-points/cli/index.test.ts +0 -2837
  96. package/src/adapter/entry-points/cli/index.ts +0 -1488
  97. package/src/adapter/entry-points/cli/projectConfig.test.ts +0 -342
  98. package/src/adapter/entry-points/cli/projectConfig.ts +0 -500
  99. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.test.ts +0 -658
  100. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.ts +0 -482
  101. package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +0 -222
  102. package/src/adapter/entry-points/console/consoleDataDelivery.ts +0 -134
  103. package/src/adapter/entry-points/console/consoleDoneStore.test.ts +0 -169
  104. package/src/adapter/entry-points/console/consoleDoneStore.ts +0 -139
  105. package/src/adapter/entry-points/console/consoleGithubTokenResolver.test.ts +0 -275
  106. package/src/adapter/entry-points/console/consoleGithubTokenResolver.ts +0 -113
  107. package/src/adapter/entry-points/console/consoleImageProxy.test.ts +0 -140
  108. package/src/adapter/entry-points/console/consoleImageProxy.ts +0 -111
  109. package/src/adapter/entry-points/console/consoleItemUrlLookup.test.ts +0 -63
  110. package/src/adapter/entry-points/console/consoleItemUrlLookup.ts +0 -66
  111. package/src/adapter/entry-points/console/consoleOperationApi.test.ts +0 -2523
  112. package/src/adapter/entry-points/console/consoleOperationApi.ts +0 -936
  113. package/src/adapter/entry-points/console/consoleProjectResolver.test.ts +0 -246
  114. package/src/adapter/entry-points/console/consoleProjectResolver.ts +0 -111
  115. package/src/adapter/entry-points/console/consoleReadApi.test.ts +0 -714
  116. package/src/adapter/entry-points/console/consoleReadApi.ts +0 -361
  117. package/src/adapter/entry-points/console/consoleTabNames.test.ts +0 -52
  118. package/src/adapter/entry-points/console/consoleTabNames.ts +0 -37
  119. package/src/adapter/entry-points/console/consoleUiDistSync.test.ts +0 -66
  120. package/src/adapter/entry-points/console/dashboardComposeService.test.ts +0 -595
  121. package/src/adapter/entry-points/console/dashboardComposeService.ts +0 -256
  122. package/src/adapter/entry-points/console/dashboardEmitterComposerKey.test.ts +0 -180
  123. package/src/adapter/entry-points/console/ensureConsoleRunning.test.ts +0 -115
  124. package/src/adapter/entry-points/console/ensureConsoleRunning.ts +0 -64
  125. package/src/adapter/entry-points/console/ui/.storybook/main.ts +0 -12
  126. package/src/adapter/entry-points/console/ui/.storybook/preview.ts +0 -15
  127. package/src/adapter/entry-points/console/ui/biome.json +0 -53
  128. package/src/adapter/entry-points/console/ui/components.json +0 -20
  129. package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +0 -725
  130. package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +0 -831
  131. package/src/adapter/entry-points/console/ui/e2e/playwright.config.ts +0 -30
  132. package/src/adapter/entry-points/console/ui/e2e/tsconfig.json +0 -18
  133. package/src/adapter/entry-points/console/ui/index.html +0 -12
  134. package/src/adapter/entry-points/console/ui/jest-globals.cjs +0 -26
  135. package/src/adapter/entry-points/console/ui/jest.setup.ts +0 -1
  136. package/src/adapter/entry-points/console/ui/jest.styleMock.js +0 -1
  137. package/src/adapter/entry-points/console/ui/public/sw.js +0 -60
  138. package/src/adapter/entry-points/console/ui/src/components/ui/badge.stories.tsx +0 -35
  139. package/src/adapter/entry-points/console/ui/src/components/ui/badge.tsx +0 -28
  140. package/src/adapter/entry-points/console/ui/src/components/ui/button.stories.tsx +0 -34
  141. package/src/adapter/entry-points/console/ui/src/components/ui/button.tsx +0 -50
  142. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.stories.tsx +0 -28
  143. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.test.tsx +0 -65
  144. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.tsx +0 -19
  145. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.stories.tsx +0 -61
  146. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.test.tsx +0 -199
  147. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.tsx +0 -166
  148. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.stories.tsx +0 -22
  149. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.test.tsx +0 -74
  150. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.tsx +0 -84
  151. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.stories.tsx +0 -27
  152. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.test.tsx +0 -85
  153. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.tsx +0 -97
  154. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.stories.tsx +0 -76
  155. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.test.tsx +0 -56
  156. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.tsx +0 -39
  157. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.stories.tsx +0 -32
  158. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.test.tsx +0 -105
  159. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.tsx +0 -157
  160. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.stories.tsx +0 -68
  161. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.test.tsx +0 -612
  162. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.tsx +0 -276
  163. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.stories.tsx +0 -33
  164. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.test.tsx +0 -57
  165. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.tsx +0 -76
  166. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.stories.tsx +0 -25
  167. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.test.tsx +0 -55
  168. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.tsx +0 -49
  169. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.stories.tsx +0 -24
  170. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.test.tsx +0 -63
  171. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.tsx +0 -19
  172. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.stories.tsx +0 -33
  173. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.test.tsx +0 -62
  174. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.tsx +0 -59
  175. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.stories.tsx +0 -38
  176. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.test.tsx +0 -151
  177. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.tsx +0 -245
  178. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.stories.tsx +0 -514
  179. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.test.tsx +0 -727
  180. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.tsx +0 -387
  181. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.stories.tsx +0 -82
  182. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.test.tsx +0 -52
  183. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.tsx +0 -32
  184. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.stories.tsx +0 -48
  185. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.test.tsx +0 -235
  186. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.tsx +0 -145
  187. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.stories.tsx +0 -29
  188. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.test.tsx +0 -30
  189. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.tsx +0 -50
  190. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.stories.tsx +0 -38
  191. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.test.tsx +0 -54
  192. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.tsx +0 -60
  193. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.stories.tsx +0 -56
  194. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.test.tsx +0 -111
  195. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.tsx +0 -92
  196. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.stories.tsx +0 -51
  197. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.test.tsx +0 -59
  198. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.tsx +0 -39
  199. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +0 -207
  200. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +0 -332
  201. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.tsx +0 -211
  202. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.stories.tsx +0 -49
  203. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.test.tsx +0 -157
  204. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.tsx +0 -118
  205. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.stories.tsx +0 -23
  206. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.test.tsx +0 -40
  207. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.tsx +0 -17
  208. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.stories.tsx +0 -101
  209. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.test.tsx +0 -102
  210. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.tsx +0 -75
  211. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.stories.tsx +0 -40
  212. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.test.tsx +0 -213
  213. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.tsx +0 -115
  214. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.stories.tsx +0 -50
  215. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.test.tsx +0 -98
  216. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.tsx +0 -66
  217. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.stories.tsx +0 -69
  218. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.test.tsx +0 -101
  219. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.tsx +0 -75
  220. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.stories.tsx +0 -137
  221. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.test.tsx +0 -554
  222. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.tsx +0 -400
  223. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.stories.tsx +0 -30
  224. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.test.tsx +0 -111
  225. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.tsx +0 -91
  226. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.stories.tsx +0 -27
  227. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.test.tsx +0 -24
  228. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.tsx +0 -28
  229. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.stories.tsx +0 -14
  230. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.test.tsx +0 -21
  231. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.tsx +0 -26
  232. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.stories.tsx +0 -14
  233. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.test.tsx +0 -40
  234. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.tsx +0 -37
  235. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleErrorToast.stories.tsx +0 -33
  236. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.stories.tsx +0 -20
  237. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.test.tsx +0 -48
  238. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.tsx +0 -42
  239. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.stories.tsx +0 -115
  240. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.test.tsx +0 -262
  241. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.tsx +0 -123
  242. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +0 -65
  243. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +0 -159
  244. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +0 -55
  245. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.stories.tsx +0 -20
  246. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.test.tsx +0 -93
  247. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.tsx +0 -45
  248. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.stories.tsx +0 -17
  249. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.test.tsx +0 -49
  250. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.tsx +0 -66
  251. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.stories.tsx +0 -47
  252. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.test.tsx +0 -95
  253. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.tsx +0 -62
  254. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.stories.tsx +0 -32
  255. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.test.tsx +0 -101
  256. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.tsx +0 -80
  257. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.test.ts +0 -304
  258. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.ts +0 -167
  259. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.test.ts +0 -498
  260. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.ts +0 -277
  261. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.test.ts +0 -99
  262. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.ts +0 -90
  263. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.test.ts +0 -110
  264. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.ts +0 -83
  265. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.test.ts +0 -51
  266. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.ts +0 -39
  267. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.test.ts +0 -229
  268. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.ts +0 -194
  269. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +0 -151
  270. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.ts +0 -128
  271. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.test.ts +0 -629
  272. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.ts +0 -417
  273. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.test.ts +0 -40
  274. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.ts +0 -71
  275. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.test.ts +0 -24
  276. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.ts +0 -17
  277. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.test.ts +0 -97
  278. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.ts +0 -44
  279. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.test.ts +0 -59
  280. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.ts +0 -26
  281. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.test.ts +0 -48
  282. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.ts +0 -39
  283. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.test.ts +0 -41
  284. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.ts +0 -57
  285. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.test.ts +0 -115
  286. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.ts +0 -115
  287. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +0 -546
  288. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.ts +0 -278
  289. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.test.ts +0 -110
  290. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.ts +0 -70
  291. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.test.ts +0 -387
  292. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.ts +0 -407
  293. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.test.ts +0 -446
  294. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.ts +0 -533
  295. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.test.ts +0 -78
  296. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.ts +0 -34
  297. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.test.ts +0 -252
  298. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.ts +0 -207
  299. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.test.ts +0 -27
  300. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.ts +0 -71
  301. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.test.ts +0 -88
  302. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.ts +0 -34
  303. package/src/adapter/entry-points/console/ui/src/features/console/lib/navigation.ts +0 -7
  304. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.test.ts +0 -104
  305. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.ts +0 -79
  306. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +0 -200
  307. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.ts +0 -122
  308. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.test.ts +0 -90
  309. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.ts +0 -37
  310. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.test.ts +0 -34
  311. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.ts +0 -85
  312. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.test.ts +0 -81
  313. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.ts +0 -61
  314. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.test.ts +0 -35
  315. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.ts +0 -21
  316. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.test.ts +0 -96
  317. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.ts +0 -93
  318. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +0 -229
  319. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.ts +0 -106
  320. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.test.ts +0 -18
  321. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.ts +0 -16
  322. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.test.ts +0 -97
  323. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.ts +0 -95
  324. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.test.ts +0 -53
  325. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.ts +0 -33
  326. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.test.ts +0 -72
  327. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.ts +0 -61
  328. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +0 -325
  329. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.ts +0 -94
  330. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.test.ts +0 -44
  331. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.ts +0 -17
  332. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.test.ts +0 -103
  333. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.ts +0 -64
  334. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.test.ts +0 -74
  335. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.ts +0 -53
  336. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.test.ts +0 -34
  337. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.ts +0 -28
  338. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +0 -89
  339. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.ts +0 -30
  340. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.test.ts +0 -61
  341. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.ts +0 -77
  342. package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +0 -173
  343. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +0 -629
  344. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +0 -351
  345. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.test.tsx +0 -1469
  346. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +0 -736
  347. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleReferenceLinkContainer.tsx +0 -25
  348. package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +0 -418
  349. package/src/adapter/entry-points/console/ui/src/index.css +0 -1592
  350. package/src/adapter/entry-points/console/ui/src/lib/utils.ts +0 -4
  351. package/src/adapter/entry-points/console/ui/src/main.tsx +0 -21
  352. package/src/adapter/entry-points/console/ui/src/vite-env.d.ts +0 -1
  353. package/src/adapter/entry-points/console/ui/tsconfig.json +0 -26
  354. package/src/adapter/entry-points/console/ui/vite.config.ts +0 -24
  355. package/src/adapter/entry-points/console/ui-dist/assets/index-BYDbK1Fj.js +0 -88
  356. package/src/adapter/entry-points/console/ui-dist/assets/index-KyQISRuQ.css +0 -2
  357. package/src/adapter/entry-points/console/ui-dist/index.html +0 -13
  358. package/src/adapter/entry-points/console/ui-dist/sw.js +0 -60
  359. package/src/adapter/entry-points/console/webServer.test.ts +0 -2945
  360. package/src/adapter/entry-points/console/webServer.ts +0 -940
  361. package/src/adapter/entry-points/function/getStoryObjectMap.ts +0 -3
  362. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.test.ts +0 -218
  363. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.ts +0 -113
  364. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.test.ts +0 -110
  365. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.ts +0 -116
  366. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +0 -859
  367. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +0 -984
  368. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.test.ts +0 -126
  369. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.ts +0 -80
  370. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.test.ts +0 -491
  371. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts +0 -137
  372. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.test.ts +0 -508
  373. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts +0 -156
  374. package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +0 -332
  375. package/src/adapter/entry-points/handlers/consoleListsWriter.ts +0 -60
  376. package/src/adapter/entry-points/handlers/dashboardRowWriter.test.ts +0 -112
  377. package/src/adapter/entry-points/handlers/dashboardRowWriter.ts +0 -51
  378. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.test.ts +0 -285
  379. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts +0 -109
  380. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.test.ts +0 -170
  381. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.ts +0 -40
  382. package/src/adapter/entry-points/handlers/machineStatusWriter.test.ts +0 -191
  383. package/src/adapter/entry-points/handlers/machineStatusWriter.ts +0 -110
  384. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +0 -548
  385. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +0 -192
  386. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.test.ts +0 -111
  387. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.ts +0 -25
  388. package/src/adapter/entry-points/handlers/ownerCallFileStore.test.ts +0 -286
  389. package/src/adapter/entry-points/handlers/ownerCallFileStore.ts +0 -145
  390. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.test.ts +0 -55
  391. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.ts +0 -36
  392. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.test.ts +0 -72
  393. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.ts +0 -74
  394. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.test.ts +0 -181
  395. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.ts +0 -18
  396. package/src/adapter/entry-points/handlers/situationFileWriter.test.ts +0 -489
  397. package/src/adapter/entry-points/handlers/situationFileWriter.ts +0 -176
  398. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.test.ts +0 -169
  399. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.ts +0 -32
  400. package/src/adapter/entry-points/handlers/subscriptionDisabledTokenHandler.ts +0 -41
  401. package/src/adapter/entry-points/handlers/tokenExhaustionHandover.ts +0 -81
  402. package/src/adapter/entry-points/handlers/tokenStatusWriter.test.ts +0 -266
  403. package/src/adapter/entry-points/handlers/tokenStatusWriter.ts +0 -262
  404. package/src/adapter/proxy/ClaudeMessageResponseParser.test.ts +0 -211
  405. package/src/adapter/proxy/ClaudeMessageResponseParser.ts +0 -181
  406. package/src/adapter/proxy/RateLimitCache.test.ts +0 -1077
  407. package/src/adapter/proxy/RateLimitCache.ts +0 -385
  408. package/src/adapter/proxy/TokenListLoader.test.ts +0 -183
  409. package/src/adapter/proxy/TokenListLoader.ts +0 -75
  410. package/src/adapter/proxy/ensureProxyRunning.test.ts +0 -85
  411. package/src/adapter/proxy/ensureProxyRunning.ts +0 -41
  412. package/src/adapter/proxy/proxyEntry.test.ts +0 -552
  413. package/src/adapter/proxy/proxyEntry.ts +0 -214
  414. package/src/adapter/repositories/BaseGitHubRepository.test.ts +0 -26
  415. package/src/adapter/repositories/BaseGitHubRepository.ts +0 -26
  416. package/src/adapter/repositories/BrowserGitHubProjectRepository.test.ts +0 -108
  417. package/src/adapter/repositories/BrowserGitHubProjectRepository.ts +0 -118
  418. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.test.ts +0 -71
  419. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.ts +0 -21
  420. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.test.ts +0 -324
  421. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts +0 -148
  422. package/src/adapter/repositories/FetchWebhookRepository.ts +0 -8
  423. package/src/adapter/repositories/FileHandoverStateRepository.test.ts +0 -114
  424. package/src/adapter/repositories/FileHandoverStateRepository.ts +0 -73
  425. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.test.ts +0 -514
  426. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.ts +0 -109
  427. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.test.ts +0 -284
  428. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.ts +0 -128
  429. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.test.ts +0 -138
  430. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.ts +0 -113
  431. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.test.ts +0 -121
  432. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.ts +0 -103
  433. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +0 -360
  434. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +0 -77
  435. package/src/adapter/repositories/FileSystemSessionRecordReader.test.ts +0 -59
  436. package/src/adapter/repositories/FileSystemSessionRecordReader.ts +0 -31
  437. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.test.ts +0 -287
  438. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.ts +0 -125
  439. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.test.ts +0 -285
  440. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.ts +0 -119
  441. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.test.ts +0 -237
  442. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.ts +0 -57
  443. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.test.ts +0 -56
  444. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.ts +0 -32
  445. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.test.ts +0 -68
  446. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.ts +0 -23
  447. package/src/adapter/repositories/GitHubIssueCheckpointRepository.test.ts +0 -51
  448. package/src/adapter/repositories/GitHubIssueCheckpointRepository.ts +0 -47
  449. package/src/adapter/repositories/GitHubIssueCommentRepository.test.ts +0 -278
  450. package/src/adapter/repositories/GitHubIssueCommentRepository.ts +0 -109
  451. package/src/adapter/repositories/GoogleSpreadsheetRepository.integration.test.ts +0 -265
  452. package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +0 -431
  453. package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +0 -268
  454. package/src/adapter/repositories/GraphqlProjectRepository.diskCache.test.ts +0 -272
  455. package/src/adapter/repositories/GraphqlProjectRepository.errorHandling.test.ts +0 -111
  456. package/src/adapter/repositories/GraphqlProjectRepository.fetchProjectId.test.ts +0 -254
  457. package/src/adapter/repositories/GraphqlProjectRepository.test.ts +0 -209
  458. package/src/adapter/repositories/GraphqlProjectRepository.ts +0 -707
  459. package/src/adapter/repositories/GraphqlProjectRepositoryProjectLocation.test.ts +0 -297
  460. package/src/adapter/repositories/KyHttpRepository.ts +0 -8
  461. package/src/adapter/repositories/KySlackRepository.test.ts +0 -172
  462. package/src/adapter/repositories/KySlackRepository.ts +0 -298
  463. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.test.ts +0 -193
  464. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.ts +0 -106
  465. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.test.ts +0 -190
  466. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.ts +0 -102
  467. package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +0 -265
  468. package/src/adapter/repositories/LocalStorageCacheRepository.ts +0 -79
  469. package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +0 -142
  470. package/src/adapter/repositories/LocalStorageRepository.test.ts +0 -173
  471. package/src/adapter/repositories/LocalStorageRepository.ts +0 -30
  472. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +0 -15
  473. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +0 -9
  474. package/src/adapter/repositories/NodeLocalCommandRunner.largeOutput.test.ts +0 -16
  475. package/src/adapter/repositories/NodeLocalCommandRunner.test.ts +0 -118
  476. package/src/adapter/repositories/NodeLocalCommandRunner.ts +0 -66
  477. package/src/adapter/repositories/NodeProcessSignalRepository.test.ts +0 -82
  478. package/src/adapter/repositories/NodeProcessSignalRepository.ts +0 -47
  479. package/src/adapter/repositories/NodeSubAgentProcessLister.test.ts +0 -44
  480. package/src/adapter/repositories/NodeSubAgentProcessLister.ts +0 -40
  481. package/src/adapter/repositories/NodeTmuxSessionRepository.test.ts +0 -546
  482. package/src/adapter/repositories/NodeTmuxSessionRepository.ts +0 -245
  483. package/src/adapter/repositories/OauthAPIClaudeRepository.ts +0 -279
  484. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.test.ts +0 -166
  485. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.ts +0 -32
  486. package/src/adapter/repositories/OauthProxyClaudeRepository.test.ts +0 -428
  487. package/src/adapter/repositories/OauthProxyClaudeRepository.ts +0 -124
  488. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.test.ts +0 -242
  489. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.ts +0 -261
  490. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.test.ts +0 -184
  491. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.ts +0 -138
  492. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.test.ts +0 -208
  493. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.ts +0 -130
  494. package/src/adapter/repositories/ProcFsProcessEnvironReader.test.ts +0 -60
  495. package/src/adapter/repositories/ProcFsProcessEnvironReader.ts +0 -38
  496. package/src/adapter/repositories/ProcHostMetricsRepository.test.ts +0 -207
  497. package/src/adapter/repositories/ProcHostMetricsRepository.ts +0 -181
  498. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.test.ts +0 -231
  499. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.ts +0 -134
  500. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.test.ts +0 -121
  501. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.ts +0 -58
  502. package/src/adapter/repositories/ProjectIssuesCacheRepository.test.ts +0 -218
  503. package/src/adapter/repositories/ProjectIssuesCacheRepository.ts +0 -141
  504. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +0 -1195
  505. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +0 -185
  506. package/src/adapter/repositories/ProxyRateLimitCacheRepository.test.ts +0 -116
  507. package/src/adapter/repositories/ProxyRateLimitCacheRepository.ts +0 -67
  508. package/src/adapter/repositories/RateLimitSnapshotRepository.ts +0 -50
  509. package/src/adapter/repositories/RealSleeper.test.ts +0 -19
  510. package/src/adapter/repositories/RealSleeper.ts +0 -12
  511. package/src/adapter/repositories/RestProjectRepository.test.ts +0 -277
  512. package/src/adapter/repositories/RestProjectRepository.ts +0 -129
  513. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.test.ts +0 -313
  514. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.ts +0 -164
  515. package/src/adapter/repositories/SystemDateRepository.test.ts +0 -60
  516. package/src/adapter/repositories/SystemDateRepository.ts +0 -34
  517. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.test.ts +0 -253
  518. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.ts +0 -158
  519. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.queuedReply.test.ts +0 -171
  520. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.singleScan.test.ts +0 -86
  521. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +0 -996
  522. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +0 -396
  523. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.test.ts +0 -208
  524. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.ts +0 -80
  525. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +0 -1674
  526. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +0 -459
  527. package/src/adapter/repositories/clSessionScopeUnitName.test.ts +0 -76
  528. package/src/adapter/repositories/clSessionScopeUnitName.ts +0 -5
  529. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.test.ts +0 -34
  530. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.ts +0 -8
  531. package/src/adapter/repositories/githubGraphqlClient.test.ts +0 -479
  532. package/src/adapter/repositories/githubGraphqlClient.ts +0 -243
  533. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +0 -5182
  534. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +0 -3303
  535. package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +0 -46
  536. package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +0 -88
  537. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +0 -1776
  538. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +0 -1552
  539. package/src/adapter/repositories/issue/RestIssueRepository.test.ts +0 -393
  540. package/src/adapter/repositories/issue/RestIssueRepository.ts +0 -252
  541. package/src/adapter/repositories/issue/gitHubRawUrl.test.ts +0 -29
  542. package/src/adapter/repositories/issue/gitHubRawUrl.ts +0 -30
  543. package/src/adapter/repositories/issue/githubRateLimitRetry.test.ts +0 -167
  544. package/src/adapter/repositories/issue/githubRateLimitRetry.ts +0 -109
  545. package/src/adapter/repositories/localStorageCacheDirectory.test.ts +0 -81
  546. package/src/adapter/repositories/localStorageCacheDirectory.ts +0 -13
  547. package/src/adapter/repositories/projectFieldDefinition.test.ts +0 -191
  548. package/src/adapter/repositories/projectFieldDefinition.ts +0 -144
  549. package/src/adapter/repositories/utils.test.ts +0 -55
  550. package/src/adapter/repositories/utils.ts +0 -45
  551. package/src/domain/entities/ClaudeHandoverSession.ts +0 -12
  552. package/src/domain/entities/ClaudeMessageResponse.ts +0 -31
  553. package/src/domain/entities/ClaudeTokenUsage.ts +0 -17
  554. package/src/domain/entities/ClaudeWindowUsage.ts +0 -5
  555. package/src/domain/entities/Comment.ts +0 -5
  556. package/src/domain/entities/InteractiveLiveSession.ts +0 -6
  557. package/src/domain/entities/Issue.ts +0 -31
  558. package/src/domain/entities/KevReportWatermark.ts +0 -4
  559. package/src/domain/entities/LiveSessionActivitySnapshot.ts +0 -14
  560. package/src/domain/entities/LiveSessionOutputActivity.ts +0 -4
  561. package/src/domain/entities/LiveSessionProcessSnapshot.ts +0 -18
  562. package/src/domain/entities/LiveTmuxSession.ts +0 -4
  563. package/src/domain/entities/Member.ts +0 -3
  564. package/src/domain/entities/OutputDegeneration.ts +0 -10
  565. package/src/domain/entities/Project.ts +0 -88
  566. package/src/domain/entities/ProjectField.ts +0 -3
  567. package/src/domain/entities/ProjectFieldName.ts +0 -2
  568. package/src/domain/entities/ProjectFieldSingleSelect.ts +0 -8
  569. package/src/domain/entities/ProjectFieldSingleSelectOption.ts +0 -8
  570. package/src/domain/entities/RequiredProjectField.ts +0 -68
  571. package/src/domain/entities/SearchedIssue.ts +0 -11
  572. package/src/domain/entities/StoryObjectMap.ts +0 -12
  573. package/src/domain/entities/TokenExhaustionHandoverState.ts +0 -8
  574. package/src/domain/entities/WorkflowStatus.ts +0 -66
  575. package/src/domain/usecases/ActionAnnouncementUseCase.test.ts +0 -91
  576. package/src/domain/usecases/ActionAnnouncementUseCase.ts +0 -78
  577. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.test.ts +0 -222
  578. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.ts +0 -76
  579. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.test.ts +0 -118
  580. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +0 -112
  581. package/src/domain/usecases/AnalyzeStoriesUseCase.test.ts +0 -82
  582. package/src/domain/usecases/AnalyzeStoriesUseCase.ts +0 -296
  583. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.test.ts +0 -578
  584. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.ts +0 -137
  585. package/src/domain/usecases/CONTRIBUTING_FOR_TEST.md +0 -259
  586. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.test.ts +0 -437
  587. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.ts +0 -80
  588. package/src/domain/usecases/ChangeTargetPullRequestApprover.test.ts +0 -248
  589. package/src/domain/usecases/ChangeTargetPullRequestApprover.ts +0 -69
  590. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +0 -411
  591. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +0 -142
  592. package/src/domain/usecases/ClearDependedIssueURLUseCase.test.ts +0 -1120
  593. package/src/domain/usecases/ClearDependedIssueURLUseCase.ts +0 -161
  594. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.test.ts +0 -345
  595. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.ts +0 -81
  596. package/src/domain/usecases/CliErrorReportUseCase.test.ts +0 -162
  597. package/src/domain/usecases/CliErrorReportUseCase.ts +0 -72
  598. package/src/domain/usecases/ConflictedIssueRevertUseCase.test.ts +0 -886
  599. package/src/domain/usecases/ConflictedIssueRevertUseCase.ts +0 -146
  600. package/src/domain/usecases/CreateEstimationIssueUseCase.test.ts +0 -227
  601. package/src/domain/usecases/CreateEstimationIssueUseCase.ts +0 -205
  602. package/src/domain/usecases/CreateNewStoryByLabelUseCase.test.ts +0 -1084
  603. package/src/domain/usecases/CreateNewStoryByLabelUseCase.ts +0 -146
  604. package/src/domain/usecases/DailySecurityScanUseCase.test.ts +0 -1709
  605. package/src/domain/usecases/DailySecurityScanUseCase.ts +0 -476
  606. package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +0 -533
  607. package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +0 -122
  608. package/src/domain/usecases/GetStoryObjectMapUseCase.test.ts +0 -330
  609. package/src/domain/usecases/GetStoryObjectMapUseCase.ts +0 -79
  610. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +0 -1913
  611. package/src/domain/usecases/HandleScheduledEventUseCase.ts +0 -846
  612. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.test.ts +0 -175
  613. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.ts +0 -63
  614. package/src/domain/usecases/IssueNoStatusUpdateUseCase.test.ts +0 -165
  615. package/src/domain/usecases/IssueNoStatusUpdateUseCase.ts +0 -44
  616. package/src/domain/usecases/IssueRejectionEvaluator.test.ts +0 -1137
  617. package/src/domain/usecases/IssueRejectionEvaluator.ts +0 -340
  618. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.test.ts +0 -679
  619. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.ts +0 -178
  620. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +0 -5441
  621. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +0 -891
  622. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +0 -2069
  623. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +0 -489
  624. package/src/domain/usecases/OauthTokenSelectUseCase.test.ts +0 -662
  625. package/src/domain/usecases/OauthTokenSelectUseCase.ts +0 -274
  626. package/src/domain/usecases/OutputDegenerationDetector.test.ts +0 -167
  627. package/src/domain/usecases/OutputDegenerationDetector.ts +0 -169
  628. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.test.ts +0 -711
  629. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.ts +0 -146
  630. package/src/domain/usecases/QualityCheckAdvanceUseCase.test.ts +0 -421
  631. package/src/domain/usecases/QualityCheckAdvanceUseCase.ts +0 -76
  632. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.test.ts +0 -188
  633. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.ts +0 -57
  634. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.test.ts +0 -303
  635. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.ts +0 -155
  636. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +0 -1838
  637. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +0 -221
  638. package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +0 -2392
  639. package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +0 -499
  640. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.test.ts +0 -224
  641. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.ts +0 -142
  642. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.test.ts +0 -360
  643. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.ts +0 -70
  644. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.test.ts +0 -400
  645. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.ts +0 -48
  646. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.test.ts +0 -696
  647. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +0 -201
  648. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.test.ts +0 -1363
  649. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.ts +0 -215
  650. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.test.ts +0 -170
  651. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.ts +0 -38
  652. package/src/domain/usecases/StaleTmuxSessionKillUseCase.test.ts +0 -283
  653. package/src/domain/usecases/StaleTmuxSessionKillUseCase.ts +0 -98
  654. package/src/domain/usecases/StartPreparationUseCase.test.ts +0 -7822
  655. package/src/domain/usecases/StartPreparationUseCase.ts +0 -876
  656. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.test.ts +0 -200
  657. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.ts +0 -74
  658. package/src/domain/usecases/TokenExhaustionHandoverUseCase.test.ts +0 -838
  659. package/src/domain/usecases/TokenExhaustionHandoverUseCase.ts +0 -439
  660. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.test.ts +0 -306
  661. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.ts +0 -64
  662. package/src/domain/usecases/UpdateRateLimitCacheUseCase.test.ts +0 -178
  663. package/src/domain/usecases/UpdateRateLimitCacheUseCase.ts +0 -22
  664. package/src/domain/usecases/adapter-interfaces/ClaudeHandoverSessionRepository.ts +0 -5
  665. package/src/domain/usecases/adapter-interfaces/ClaudeInteractiveSessionRepository.ts +0 -9
  666. package/src/domain/usecases/adapter-interfaces/ClaudeLiveSessionRepository.ts +0 -8
  667. package/src/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.ts +0 -5
  668. package/src/domain/usecases/adapter-interfaces/ClaudeRepository.ts +0 -6
  669. package/src/domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository.ts +0 -8
  670. package/src/domain/usecases/adapter-interfaces/ConsoleTabsRepository.ts +0 -12
  671. package/src/domain/usecases/adapter-interfaces/CopilotRepository.ts +0 -3
  672. package/src/domain/usecases/adapter-interfaces/DateRepository.ts +0 -7
  673. package/src/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.ts +0 -3
  674. package/src/domain/usecases/adapter-interfaces/HttpRepository.ts +0 -3
  675. package/src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts +0 -7
  676. package/src/domain/usecases/adapter-interfaces/IssueAttachmentRepository.ts +0 -9
  677. package/src/domain/usecases/adapter-interfaces/IssueCheckpointRepository.ts +0 -3
  678. package/src/domain/usecases/adapter-interfaces/IssueCommentRepository.ts +0 -7
  679. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +0 -229
  680. package/src/domain/usecases/adapter-interfaces/KevReportWatermarkRepository.ts +0 -11
  681. package/src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts +0 -5
  682. package/src/domain/usecases/adapter-interfaces/LocalCommandRunner.ts +0 -16
  683. package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +0 -5
  684. package/src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts +0 -3
  685. package/src/domain/usecases/adapter-interfaces/ProcessSignalRepository.ts +0 -5
  686. package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +0 -29
  687. package/src/domain/usecases/adapter-interfaces/RateLimitCacheRepository.ts +0 -10
  688. package/src/domain/usecases/adapter-interfaces/RefusalTailStatusProvider.ts +0 -5
  689. package/src/domain/usecases/adapter-interfaces/SessionAssistantTurnsRepository.ts +0 -6
  690. package/src/domain/usecases/adapter-interfaces/SessionDegenerationCooldownStateRepository.ts +0 -4
  691. package/src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts +0 -7
  692. package/src/domain/usecases/adapter-interfaces/SessionRecordReader.ts +0 -3
  693. package/src/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.ts +0 -8
  694. package/src/domain/usecases/adapter-interfaces/SilentSessionCandidateStateRepository.ts +0 -10
  695. package/src/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.ts +0 -20
  696. package/src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts +0 -18
  697. package/src/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.ts +0 -6
  698. package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +0 -20
  699. package/src/domain/usecases/adapter-interfaces/Sleeper.ts +0 -3
  700. package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +0 -18
  701. package/src/domain/usecases/adapter-interfaces/StatusDefaultRepository.ts +0 -5
  702. package/src/domain/usecases/adapter-interfaces/SubAgentLivenessResolver.ts +0 -6
  703. package/src/domain/usecases/adapter-interfaces/SubAgentProcessLister.ts +0 -8
  704. package/src/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.ts +0 -3
  705. package/src/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.ts +0 -6
  706. package/src/domain/usecases/adapter-interfaces/TakeOwnershipSpawnRepository.ts +0 -9
  707. package/src/domain/usecases/adapter-interfaces/TmuxSessionRepository.ts +0 -20
  708. package/src/domain/usecases/adapter-interfaces/TokenExhaustionHandoverStateRepository.ts +0 -6
  709. package/src/domain/usecases/adapter-interfaces/TokenRateLimitSnapshotRepository.ts +0 -22
  710. package/src/domain/usecases/adapter-interfaces/WebhookRepository.ts +0 -3
  711. package/src/domain/usecases/agentReportPrefix.ts +0 -1
  712. package/src/domain/usecases/autoStatusCheckComments.ts +0 -1
  713. package/src/domain/usecases/console/.gitkeep +0 -0
  714. package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +0 -887
  715. package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +0 -368
  716. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.test.ts +0 -654
  717. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.ts +0 -318
  718. package/src/domain/usecases/dashboard/DashboardProjectCode.test.ts +0 -34
  719. package/src/domain/usecases/dashboard/DashboardProjectCode.ts +0 -27
  720. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.test.ts +0 -160
  721. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.ts +0 -69
  722. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.test.ts +0 -362
  723. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.ts +0 -234
  724. package/src/domain/usecases/ensureAgentOptionAndGetId.ts +0 -47
  725. package/src/domain/usecases/extractFencedJsonBlocks.test.ts +0 -40
  726. package/src/domain/usecases/extractFencedJsonBlocks.ts +0 -21
  727. package/src/domain/usecases/extractNextStepAgent.test.ts +0 -58
  728. package/src/domain/usecases/extractNextStepAgent.ts +0 -18
  729. package/src/domain/usecases/extractNextStepAgentFromComments.ts +0 -13
  730. package/src/domain/usecases/findLastAgentReport.test.ts +0 -121
  731. package/src/domain/usecases/findLastAgentReport.ts +0 -14
  732. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.test.ts +0 -339
  733. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts +0 -188
  734. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.test.ts +0 -389
  735. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.ts +0 -103
  736. package/src/domain/usecases/intmux/OwnerCallFile.test.ts +0 -184
  737. package/src/domain/usecases/intmux/OwnerCallFile.ts +0 -80
  738. package/src/domain/usecases/isAgentReportBody.test.ts +0 -108
  739. package/src/domain/usecases/isAgentReportBody.ts +0 -52
  740. package/src/domain/usecases/isAuthorAuthorizedForAutoStatusCheck.ts +0 -12
  741. package/src/domain/usecases/isHumanComment.test.ts +0 -77
  742. package/src/domain/usecases/isHumanComment.ts +0 -23
  743. package/src/domain/usecases/isRecord.ts +0 -2
  744. package/src/domain/usecases/issueReactivationTriggerIsPending.test.ts +0 -541
  745. package/src/domain/usecases/issueReactivationTriggerIsPending.ts +0 -25
  746. package/src/domain/usecases/nextStepAgentDispatchRepeatedMessage.ts +0 -2
  747. package/src/domain/usecases/normalizeReportBody.test.ts +0 -24
  748. package/src/domain/usecases/normalizeReportBody.ts +0 -2
  749. package/src/domain/usecases/resolveAllowedIssueAuthors.test.ts +0 -51
  750. package/src/domain/usecases/resolveAllowedIssueAuthors.ts +0 -6
  751. package/src/domain/usecases/resolveLabelsAsLlmAgentName.test.ts +0 -42
  752. package/src/domain/usecases/resolveLabelsAsLlmAgentName.ts +0 -6
  753. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.test.ts +0 -33
  754. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.ts +0 -7
  755. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.test.ts +0 -337
  756. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.ts +0 -133
  757. package/src/domain/usecases/silentSessionReminderSentinel.ts +0 -9
  758. package/src/domain/usecases/triagerAgentName.ts +0 -4
  759. package/src/domain/usecases/utils.test.ts +0 -35
  760. package/src/domain/usecases/utils.ts +0 -6
  761. package/src/index.test.ts +0 -8
  762. package/src/index.ts +0 -10
  763. package/src/releaseConfig.test.ts +0 -40
  764. package/tsconfig.build.json +0 -18
  765. package/tsconfig.json +0 -25
  766. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts +0 -13
  767. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts.map +0 -1
  768. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts +0 -16
  769. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts.map +0 -1
  770. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +0 -12
  771. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +0 -1
  772. package/types/domain/entities/UnansweredOwnerCall.d.ts +0 -5
  773. package/types/domain/entities/UnansweredOwnerCall.d.ts.map +0 -1
  774. package/types/domain/entities/WorkingTime.d.ts +0 -8
  775. package/types/domain/entities/WorkingTime.d.ts.map +0 -1
  776. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts +0 -17
  777. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts.map +0 -1
  778. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts +0 -23
  779. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts.map +0 -1
  780. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +0 -50
  781. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +0 -1
  782. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts +0 -15
  783. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts.map +0 -1
  784. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts +0 -11
  785. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts.map +0 -1
  786. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts +0 -3
  787. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts.map +0 -1
  788. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts +0 -5
  789. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts.map +0 -1
  790. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts +0 -5
  791. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts.map +0 -1
  792. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts +0 -2
  793. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts.map +0 -1
  794. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts +0 -3
  795. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts.map +0 -1
@@ -1,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
- });