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

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