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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (783) hide show
  1. package/README.md +1 -1
  2. package/bin/adapter/entry-points/cli/index.js +0 -0
  3. package/bin/domain/usecases/OauthTokenSelectUseCase.js +1 -1
  4. package/package.json +5 -1
  5. package/types/domain/usecases/OauthTokenSelectUseCase.d.ts +1 -1
  6. package/.env.example +0 -7
  7. package/.gitattributes +0 -2
  8. package/.github/CODEOWNERS +0 -6
  9. package/.github/copilot-instructions.md +0 -6
  10. package/.github/dependabot.yml +0 -19
  11. package/.github/instructions/code-review.instructions.md +0 -50
  12. package/.github/workflows/api-created_issue_pr.yml +0 -97
  13. package/.github/workflows/ci-failure-issue-creator.yml +0 -48
  14. package/.github/workflows/close-manual-prs.yml +0 -80
  15. package/.github/workflows/codeql.yml +0 -107
  16. package/.github/workflows/commit-lint.yml +0 -85
  17. package/.github/workflows/configs/commitlint.config.cjs +0 -32
  18. package/.github/workflows/configs/commitlint.config.js +0 -32
  19. package/.github/workflows/console-ui.yml +0 -68
  20. package/.github/workflows/create-pr.yml +0 -116
  21. package/.github/workflows/empty-format-test-job.yml +0 -34
  22. package/.github/workflows/format.yml +0 -28
  23. package/.github/workflows/publish.yml +0 -111
  24. package/.github/workflows/secret-scan.yml +0 -51
  25. package/.github/workflows/test.yml +0 -58
  26. package/.github/workflows/umino-project.yml +0 -207
  27. package/.gitleaks.toml +0 -22
  28. package/.prettierignore +0 -31
  29. package/.prettierrc +0 -5
  30. package/CHANGELOG.md +0 -4155
  31. package/CONTRIBUTING.md +0 -60
  32. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js +0 -12
  33. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js.map +0 -1
  34. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js +0 -125
  35. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js.map +0 -1
  36. package/bin/adapter/repositories/issue/issueTimelineUtils.js +0 -38
  37. package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +0 -1
  38. package/bin/domain/entities/UnansweredOwnerCall.js +0 -3
  39. package/bin/domain/entities/UnansweredOwnerCall.js.map +0 -1
  40. package/bin/domain/entities/WorkingTime.js +0 -3
  41. package/bin/domain/entities/WorkingTime.js.map +0 -1
  42. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js +0 -37
  43. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js.map +0 -1
  44. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js +0 -118
  45. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js.map +0 -1
  46. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +0 -180
  47. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +0 -1
  48. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js +0 -160
  49. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js.map +0 -1
  50. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js +0 -3
  51. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js.map +0 -1
  52. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js +0 -7
  53. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js.map +0 -1
  54. package/bin/domain/usecases/findLastAgentDeclaringReport.js +0 -12
  55. package/bin/domain/usecases/findLastAgentDeclaringReport.js.map +0 -1
  56. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js +0 -25
  57. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js.map +0 -1
  58. package/bin/domain/usecases/isWaitingForOwnerApproval.js +0 -16
  59. package/bin/domain/usecases/isWaitingForOwnerApproval.js.map +0 -1
  60. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js +0 -7
  61. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js.map +0 -1
  62. package/commitlint.config.js +0 -6
  63. package/eslint.config.mjs +0 -76
  64. package/jest.config.js +0 -84
  65. package/jest.setup.js +0 -1
  66. package/lib/buffer-equal-constant-time-compat/index.js +0 -17
  67. package/lib/buffer-equal-constant-time-compat/index.test.js +0 -54
  68. package/lib/buffer-equal-constant-time-compat/package.json +0 -5
  69. package/lib/typescript-compat/bin/tsc +0 -2
  70. package/lib/typescript-compat/bin/tsserver +0 -2
  71. package/lib/typescript-compat/lib/typescript.js +0 -1
  72. package/lib/typescript-compat/package.json +0 -13
  73. package/renovate.json +0 -46
  74. package/scripts/copyConsoleUiDist.mjs +0 -35
  75. package/scripts/defaultBranchTipVerify.sh +0 -23
  76. package/scripts/testWorkflowRunVerify.sh +0 -47
  77. package/scripts/verifyConsoleUiDist.mjs +0 -96
  78. package/src/adapter/ci/consoleUiWorkflowTimeout.test.ts +0 -61
  79. package/src/adapter/ci/publishTestWorkflowGate.test.ts +0 -653
  80. package/src/adapter/ci/workflowRunCancellation.test.ts +0 -72
  81. package/src/adapter/entry-points/cli/fleetConfig.test.ts +0 -553
  82. package/src/adapter/entry-points/cli/fleetConfig.ts +0 -266
  83. package/src/adapter/entry-points/cli/index.test.ts +0 -2837
  84. package/src/adapter/entry-points/cli/index.ts +0 -1488
  85. package/src/adapter/entry-points/cli/projectConfig.test.ts +0 -342
  86. package/src/adapter/entry-points/cli/projectConfig.ts +0 -500
  87. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.test.ts +0 -658
  88. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.ts +0 -482
  89. package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +0 -222
  90. package/src/adapter/entry-points/console/consoleDataDelivery.ts +0 -134
  91. package/src/adapter/entry-points/console/consoleDoneStore.test.ts +0 -169
  92. package/src/adapter/entry-points/console/consoleDoneStore.ts +0 -139
  93. package/src/adapter/entry-points/console/consoleGithubTokenResolver.test.ts +0 -275
  94. package/src/adapter/entry-points/console/consoleGithubTokenResolver.ts +0 -113
  95. package/src/adapter/entry-points/console/consoleImageProxy.test.ts +0 -140
  96. package/src/adapter/entry-points/console/consoleImageProxy.ts +0 -111
  97. package/src/adapter/entry-points/console/consoleItemUrlLookup.test.ts +0 -63
  98. package/src/adapter/entry-points/console/consoleItemUrlLookup.ts +0 -66
  99. package/src/adapter/entry-points/console/consoleOperationApi.test.ts +0 -2523
  100. package/src/adapter/entry-points/console/consoleOperationApi.ts +0 -936
  101. package/src/adapter/entry-points/console/consoleProjectResolver.test.ts +0 -246
  102. package/src/adapter/entry-points/console/consoleProjectResolver.ts +0 -111
  103. package/src/adapter/entry-points/console/consoleReadApi.test.ts +0 -714
  104. package/src/adapter/entry-points/console/consoleReadApi.ts +0 -361
  105. package/src/adapter/entry-points/console/consoleTabNames.test.ts +0 -52
  106. package/src/adapter/entry-points/console/consoleTabNames.ts +0 -37
  107. package/src/adapter/entry-points/console/consoleUiDistSync.test.ts +0 -66
  108. package/src/adapter/entry-points/console/dashboardComposeService.test.ts +0 -595
  109. package/src/adapter/entry-points/console/dashboardComposeService.ts +0 -256
  110. package/src/adapter/entry-points/console/dashboardEmitterComposerKey.test.ts +0 -180
  111. package/src/adapter/entry-points/console/ensureConsoleRunning.test.ts +0 -115
  112. package/src/adapter/entry-points/console/ensureConsoleRunning.ts +0 -64
  113. package/src/adapter/entry-points/console/ui/.storybook/main.ts +0 -12
  114. package/src/adapter/entry-points/console/ui/.storybook/preview.ts +0 -15
  115. package/src/adapter/entry-points/console/ui/biome.json +0 -53
  116. package/src/adapter/entry-points/console/ui/components.json +0 -20
  117. package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +0 -725
  118. package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +0 -831
  119. package/src/adapter/entry-points/console/ui/e2e/playwright.config.ts +0 -30
  120. package/src/adapter/entry-points/console/ui/e2e/tsconfig.json +0 -18
  121. package/src/adapter/entry-points/console/ui/index.html +0 -12
  122. package/src/adapter/entry-points/console/ui/jest-globals.cjs +0 -26
  123. package/src/adapter/entry-points/console/ui/jest.setup.ts +0 -1
  124. package/src/adapter/entry-points/console/ui/jest.styleMock.js +0 -1
  125. package/src/adapter/entry-points/console/ui/public/sw.js +0 -60
  126. package/src/adapter/entry-points/console/ui/src/components/ui/badge.stories.tsx +0 -35
  127. package/src/adapter/entry-points/console/ui/src/components/ui/badge.tsx +0 -28
  128. package/src/adapter/entry-points/console/ui/src/components/ui/button.stories.tsx +0 -34
  129. package/src/adapter/entry-points/console/ui/src/components/ui/button.tsx +0 -50
  130. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.stories.tsx +0 -28
  131. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.test.tsx +0 -65
  132. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.tsx +0 -19
  133. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.stories.tsx +0 -61
  134. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.test.tsx +0 -199
  135. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.tsx +0 -166
  136. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.stories.tsx +0 -22
  137. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.test.tsx +0 -74
  138. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.tsx +0 -84
  139. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.stories.tsx +0 -27
  140. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.test.tsx +0 -85
  141. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.tsx +0 -97
  142. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.stories.tsx +0 -76
  143. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.test.tsx +0 -56
  144. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.tsx +0 -39
  145. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.stories.tsx +0 -32
  146. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.test.tsx +0 -105
  147. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.tsx +0 -157
  148. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.stories.tsx +0 -68
  149. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.test.tsx +0 -612
  150. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.tsx +0 -276
  151. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.stories.tsx +0 -33
  152. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.test.tsx +0 -57
  153. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.tsx +0 -76
  154. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.stories.tsx +0 -25
  155. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.test.tsx +0 -55
  156. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.tsx +0 -49
  157. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.stories.tsx +0 -24
  158. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.test.tsx +0 -63
  159. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.tsx +0 -19
  160. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.stories.tsx +0 -33
  161. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.test.tsx +0 -62
  162. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.tsx +0 -59
  163. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.stories.tsx +0 -38
  164. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.test.tsx +0 -151
  165. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.tsx +0 -245
  166. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.stories.tsx +0 -514
  167. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.test.tsx +0 -727
  168. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.tsx +0 -387
  169. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.stories.tsx +0 -82
  170. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.test.tsx +0 -52
  171. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.tsx +0 -32
  172. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.stories.tsx +0 -48
  173. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.test.tsx +0 -235
  174. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.tsx +0 -145
  175. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.stories.tsx +0 -29
  176. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.test.tsx +0 -30
  177. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.tsx +0 -50
  178. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.stories.tsx +0 -38
  179. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.test.tsx +0 -54
  180. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.tsx +0 -60
  181. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.stories.tsx +0 -56
  182. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.test.tsx +0 -111
  183. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.tsx +0 -92
  184. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.stories.tsx +0 -51
  185. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.test.tsx +0 -59
  186. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.tsx +0 -39
  187. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +0 -207
  188. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +0 -332
  189. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.tsx +0 -211
  190. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.stories.tsx +0 -49
  191. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.test.tsx +0 -157
  192. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.tsx +0 -118
  193. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.stories.tsx +0 -23
  194. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.test.tsx +0 -40
  195. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.tsx +0 -17
  196. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.stories.tsx +0 -101
  197. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.test.tsx +0 -102
  198. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.tsx +0 -75
  199. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.stories.tsx +0 -40
  200. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.test.tsx +0 -213
  201. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.tsx +0 -115
  202. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.stories.tsx +0 -50
  203. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.test.tsx +0 -98
  204. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.tsx +0 -66
  205. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.stories.tsx +0 -69
  206. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.test.tsx +0 -101
  207. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.tsx +0 -75
  208. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.stories.tsx +0 -137
  209. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.test.tsx +0 -554
  210. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.tsx +0 -400
  211. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.stories.tsx +0 -30
  212. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.test.tsx +0 -111
  213. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.tsx +0 -91
  214. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.stories.tsx +0 -27
  215. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.test.tsx +0 -24
  216. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.tsx +0 -28
  217. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.stories.tsx +0 -14
  218. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.test.tsx +0 -21
  219. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.tsx +0 -26
  220. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.stories.tsx +0 -14
  221. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.test.tsx +0 -40
  222. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.tsx +0 -37
  223. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleErrorToast.stories.tsx +0 -33
  224. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.stories.tsx +0 -20
  225. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.test.tsx +0 -48
  226. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.tsx +0 -42
  227. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.stories.tsx +0 -115
  228. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.test.tsx +0 -262
  229. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.tsx +0 -123
  230. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +0 -65
  231. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +0 -159
  232. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +0 -55
  233. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.stories.tsx +0 -20
  234. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.test.tsx +0 -93
  235. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.tsx +0 -45
  236. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.stories.tsx +0 -17
  237. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.test.tsx +0 -49
  238. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.tsx +0 -66
  239. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.stories.tsx +0 -47
  240. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.test.tsx +0 -95
  241. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.tsx +0 -62
  242. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.stories.tsx +0 -32
  243. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.test.tsx +0 -101
  244. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.tsx +0 -80
  245. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.test.ts +0 -304
  246. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.ts +0 -167
  247. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.test.ts +0 -498
  248. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.ts +0 -277
  249. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.test.ts +0 -99
  250. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.ts +0 -90
  251. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.test.ts +0 -110
  252. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.ts +0 -83
  253. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.test.ts +0 -51
  254. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.ts +0 -39
  255. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.test.ts +0 -229
  256. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.ts +0 -194
  257. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +0 -151
  258. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.ts +0 -128
  259. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.test.ts +0 -629
  260. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.ts +0 -417
  261. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.test.ts +0 -40
  262. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.ts +0 -71
  263. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.test.ts +0 -24
  264. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.ts +0 -17
  265. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.test.ts +0 -97
  266. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.ts +0 -44
  267. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.test.ts +0 -59
  268. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.ts +0 -26
  269. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.test.ts +0 -48
  270. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.ts +0 -39
  271. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.test.ts +0 -41
  272. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.ts +0 -57
  273. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.test.ts +0 -115
  274. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.ts +0 -115
  275. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +0 -546
  276. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.ts +0 -278
  277. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.test.ts +0 -110
  278. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.ts +0 -70
  279. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.test.ts +0 -387
  280. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.ts +0 -407
  281. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.test.ts +0 -446
  282. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.ts +0 -533
  283. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.test.ts +0 -78
  284. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.ts +0 -34
  285. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.test.ts +0 -252
  286. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.ts +0 -207
  287. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.test.ts +0 -27
  288. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.ts +0 -71
  289. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.test.ts +0 -88
  290. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.ts +0 -34
  291. package/src/adapter/entry-points/console/ui/src/features/console/lib/navigation.ts +0 -7
  292. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.test.ts +0 -104
  293. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.ts +0 -79
  294. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +0 -200
  295. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.ts +0 -122
  296. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.test.ts +0 -90
  297. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.ts +0 -37
  298. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.test.ts +0 -34
  299. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.ts +0 -85
  300. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.test.ts +0 -81
  301. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.ts +0 -61
  302. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.test.ts +0 -35
  303. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.ts +0 -21
  304. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.test.ts +0 -96
  305. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.ts +0 -93
  306. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +0 -229
  307. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.ts +0 -106
  308. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.test.ts +0 -18
  309. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.ts +0 -16
  310. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.test.ts +0 -97
  311. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.ts +0 -95
  312. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.test.ts +0 -53
  313. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.ts +0 -33
  314. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.test.ts +0 -72
  315. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.ts +0 -61
  316. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +0 -325
  317. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.ts +0 -94
  318. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.test.ts +0 -44
  319. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.ts +0 -17
  320. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.test.ts +0 -103
  321. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.ts +0 -64
  322. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.test.ts +0 -74
  323. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.ts +0 -53
  324. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.test.ts +0 -34
  325. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.ts +0 -28
  326. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +0 -89
  327. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.ts +0 -30
  328. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.test.ts +0 -61
  329. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.ts +0 -77
  330. package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +0 -173
  331. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +0 -629
  332. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +0 -351
  333. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.test.tsx +0 -1469
  334. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +0 -736
  335. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleReferenceLinkContainer.tsx +0 -25
  336. package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +0 -418
  337. package/src/adapter/entry-points/console/ui/src/index.css +0 -1592
  338. package/src/adapter/entry-points/console/ui/src/lib/utils.ts +0 -4
  339. package/src/adapter/entry-points/console/ui/src/main.tsx +0 -21
  340. package/src/adapter/entry-points/console/ui/src/vite-env.d.ts +0 -1
  341. package/src/adapter/entry-points/console/ui/tsconfig.json +0 -26
  342. package/src/adapter/entry-points/console/ui/vite.config.ts +0 -24
  343. package/src/adapter/entry-points/console/ui-dist/assets/index-BYDbK1Fj.js +0 -88
  344. package/src/adapter/entry-points/console/ui-dist/assets/index-KyQISRuQ.css +0 -2
  345. package/src/adapter/entry-points/console/ui-dist/index.html +0 -13
  346. package/src/adapter/entry-points/console/ui-dist/sw.js +0 -60
  347. package/src/adapter/entry-points/console/webServer.test.ts +0 -2945
  348. package/src/adapter/entry-points/console/webServer.ts +0 -940
  349. package/src/adapter/entry-points/function/getStoryObjectMap.ts +0 -3
  350. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.test.ts +0 -218
  351. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.ts +0 -113
  352. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.test.ts +0 -110
  353. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.ts +0 -116
  354. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +0 -859
  355. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +0 -984
  356. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.test.ts +0 -126
  357. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.ts +0 -80
  358. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.test.ts +0 -491
  359. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts +0 -137
  360. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.test.ts +0 -508
  361. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts +0 -156
  362. package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +0 -332
  363. package/src/adapter/entry-points/handlers/consoleListsWriter.ts +0 -60
  364. package/src/adapter/entry-points/handlers/dashboardRowWriter.test.ts +0 -112
  365. package/src/adapter/entry-points/handlers/dashboardRowWriter.ts +0 -51
  366. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.test.ts +0 -285
  367. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts +0 -109
  368. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.test.ts +0 -170
  369. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.ts +0 -40
  370. package/src/adapter/entry-points/handlers/machineStatusWriter.test.ts +0 -191
  371. package/src/adapter/entry-points/handlers/machineStatusWriter.ts +0 -110
  372. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +0 -548
  373. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +0 -192
  374. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.test.ts +0 -111
  375. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.ts +0 -25
  376. package/src/adapter/entry-points/handlers/ownerCallFileStore.test.ts +0 -286
  377. package/src/adapter/entry-points/handlers/ownerCallFileStore.ts +0 -145
  378. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.test.ts +0 -55
  379. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.ts +0 -36
  380. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.test.ts +0 -72
  381. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.ts +0 -74
  382. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.test.ts +0 -181
  383. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.ts +0 -18
  384. package/src/adapter/entry-points/handlers/situationFileWriter.test.ts +0 -489
  385. package/src/adapter/entry-points/handlers/situationFileWriter.ts +0 -176
  386. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.test.ts +0 -169
  387. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.ts +0 -32
  388. package/src/adapter/entry-points/handlers/subscriptionDisabledTokenHandler.ts +0 -41
  389. package/src/adapter/entry-points/handlers/tokenExhaustionHandover.ts +0 -81
  390. package/src/adapter/entry-points/handlers/tokenStatusWriter.test.ts +0 -266
  391. package/src/adapter/entry-points/handlers/tokenStatusWriter.ts +0 -262
  392. package/src/adapter/proxy/ClaudeMessageResponseParser.test.ts +0 -211
  393. package/src/adapter/proxy/ClaudeMessageResponseParser.ts +0 -181
  394. package/src/adapter/proxy/RateLimitCache.test.ts +0 -1077
  395. package/src/adapter/proxy/RateLimitCache.ts +0 -385
  396. package/src/adapter/proxy/TokenListLoader.test.ts +0 -183
  397. package/src/adapter/proxy/TokenListLoader.ts +0 -75
  398. package/src/adapter/proxy/ensureProxyRunning.test.ts +0 -85
  399. package/src/adapter/proxy/ensureProxyRunning.ts +0 -41
  400. package/src/adapter/proxy/proxyEntry.test.ts +0 -552
  401. package/src/adapter/proxy/proxyEntry.ts +0 -214
  402. package/src/adapter/repositories/BaseGitHubRepository.test.ts +0 -26
  403. package/src/adapter/repositories/BaseGitHubRepository.ts +0 -26
  404. package/src/adapter/repositories/BrowserGitHubProjectRepository.test.ts +0 -108
  405. package/src/adapter/repositories/BrowserGitHubProjectRepository.ts +0 -118
  406. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.test.ts +0 -71
  407. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.ts +0 -21
  408. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.test.ts +0 -324
  409. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts +0 -148
  410. package/src/adapter/repositories/FetchWebhookRepository.ts +0 -8
  411. package/src/adapter/repositories/FileHandoverStateRepository.test.ts +0 -114
  412. package/src/adapter/repositories/FileHandoverStateRepository.ts +0 -73
  413. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.test.ts +0 -514
  414. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.ts +0 -109
  415. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.test.ts +0 -284
  416. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.ts +0 -128
  417. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.test.ts +0 -138
  418. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.ts +0 -113
  419. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.test.ts +0 -121
  420. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.ts +0 -103
  421. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +0 -360
  422. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +0 -77
  423. package/src/adapter/repositories/FileSystemSessionRecordReader.test.ts +0 -59
  424. package/src/adapter/repositories/FileSystemSessionRecordReader.ts +0 -31
  425. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.test.ts +0 -287
  426. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.ts +0 -125
  427. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.test.ts +0 -285
  428. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.ts +0 -119
  429. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.test.ts +0 -237
  430. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.ts +0 -57
  431. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.test.ts +0 -56
  432. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.ts +0 -32
  433. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.test.ts +0 -68
  434. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.ts +0 -23
  435. package/src/adapter/repositories/GitHubIssueCheckpointRepository.test.ts +0 -51
  436. package/src/adapter/repositories/GitHubIssueCheckpointRepository.ts +0 -47
  437. package/src/adapter/repositories/GitHubIssueCommentRepository.test.ts +0 -278
  438. package/src/adapter/repositories/GitHubIssueCommentRepository.ts +0 -109
  439. package/src/adapter/repositories/GoogleSpreadsheetRepository.integration.test.ts +0 -265
  440. package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +0 -431
  441. package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +0 -268
  442. package/src/adapter/repositories/GraphqlProjectRepository.diskCache.test.ts +0 -272
  443. package/src/adapter/repositories/GraphqlProjectRepository.errorHandling.test.ts +0 -111
  444. package/src/adapter/repositories/GraphqlProjectRepository.fetchProjectId.test.ts +0 -254
  445. package/src/adapter/repositories/GraphqlProjectRepository.test.ts +0 -209
  446. package/src/adapter/repositories/GraphqlProjectRepository.ts +0 -707
  447. package/src/adapter/repositories/GraphqlProjectRepositoryProjectLocation.test.ts +0 -297
  448. package/src/adapter/repositories/KyHttpRepository.ts +0 -8
  449. package/src/adapter/repositories/KySlackRepository.test.ts +0 -172
  450. package/src/adapter/repositories/KySlackRepository.ts +0 -298
  451. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.test.ts +0 -193
  452. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.ts +0 -106
  453. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.test.ts +0 -190
  454. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.ts +0 -102
  455. package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +0 -265
  456. package/src/adapter/repositories/LocalStorageCacheRepository.ts +0 -79
  457. package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +0 -142
  458. package/src/adapter/repositories/LocalStorageRepository.test.ts +0 -173
  459. package/src/adapter/repositories/LocalStorageRepository.ts +0 -30
  460. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +0 -15
  461. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +0 -9
  462. package/src/adapter/repositories/NodeLocalCommandRunner.largeOutput.test.ts +0 -16
  463. package/src/adapter/repositories/NodeLocalCommandRunner.test.ts +0 -118
  464. package/src/adapter/repositories/NodeLocalCommandRunner.ts +0 -66
  465. package/src/adapter/repositories/NodeProcessSignalRepository.test.ts +0 -82
  466. package/src/adapter/repositories/NodeProcessSignalRepository.ts +0 -47
  467. package/src/adapter/repositories/NodeSubAgentProcessLister.test.ts +0 -44
  468. package/src/adapter/repositories/NodeSubAgentProcessLister.ts +0 -40
  469. package/src/adapter/repositories/NodeTmuxSessionRepository.test.ts +0 -546
  470. package/src/adapter/repositories/NodeTmuxSessionRepository.ts +0 -245
  471. package/src/adapter/repositories/OauthAPIClaudeRepository.ts +0 -279
  472. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.test.ts +0 -166
  473. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.ts +0 -32
  474. package/src/adapter/repositories/OauthProxyClaudeRepository.test.ts +0 -428
  475. package/src/adapter/repositories/OauthProxyClaudeRepository.ts +0 -124
  476. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.test.ts +0 -242
  477. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.ts +0 -261
  478. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.test.ts +0 -184
  479. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.ts +0 -138
  480. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.test.ts +0 -208
  481. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.ts +0 -130
  482. package/src/adapter/repositories/ProcFsProcessEnvironReader.test.ts +0 -60
  483. package/src/adapter/repositories/ProcFsProcessEnvironReader.ts +0 -38
  484. package/src/adapter/repositories/ProcHostMetricsRepository.test.ts +0 -207
  485. package/src/adapter/repositories/ProcHostMetricsRepository.ts +0 -181
  486. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.test.ts +0 -231
  487. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.ts +0 -134
  488. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.test.ts +0 -121
  489. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.ts +0 -58
  490. package/src/adapter/repositories/ProjectIssuesCacheRepository.test.ts +0 -218
  491. package/src/adapter/repositories/ProjectIssuesCacheRepository.ts +0 -141
  492. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +0 -1195
  493. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +0 -185
  494. package/src/adapter/repositories/ProxyRateLimitCacheRepository.test.ts +0 -116
  495. package/src/adapter/repositories/ProxyRateLimitCacheRepository.ts +0 -67
  496. package/src/adapter/repositories/RateLimitSnapshotRepository.ts +0 -50
  497. package/src/adapter/repositories/RealSleeper.test.ts +0 -19
  498. package/src/adapter/repositories/RealSleeper.ts +0 -12
  499. package/src/adapter/repositories/RestProjectRepository.test.ts +0 -277
  500. package/src/adapter/repositories/RestProjectRepository.ts +0 -129
  501. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.test.ts +0 -313
  502. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.ts +0 -164
  503. package/src/adapter/repositories/SystemDateRepository.test.ts +0 -60
  504. package/src/adapter/repositories/SystemDateRepository.ts +0 -34
  505. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.test.ts +0 -253
  506. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.ts +0 -158
  507. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.queuedReply.test.ts +0 -171
  508. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.singleScan.test.ts +0 -86
  509. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +0 -996
  510. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +0 -396
  511. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.test.ts +0 -208
  512. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.ts +0 -80
  513. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +0 -1674
  514. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +0 -459
  515. package/src/adapter/repositories/clSessionScopeUnitName.test.ts +0 -76
  516. package/src/adapter/repositories/clSessionScopeUnitName.ts +0 -5
  517. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.test.ts +0 -34
  518. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.ts +0 -8
  519. package/src/adapter/repositories/githubGraphqlClient.test.ts +0 -479
  520. package/src/adapter/repositories/githubGraphqlClient.ts +0 -243
  521. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +0 -5182
  522. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +0 -3303
  523. package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +0 -46
  524. package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +0 -88
  525. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +0 -1776
  526. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +0 -1552
  527. package/src/adapter/repositories/issue/RestIssueRepository.test.ts +0 -393
  528. package/src/adapter/repositories/issue/RestIssueRepository.ts +0 -252
  529. package/src/adapter/repositories/issue/gitHubRawUrl.test.ts +0 -29
  530. package/src/adapter/repositories/issue/gitHubRawUrl.ts +0 -30
  531. package/src/adapter/repositories/issue/githubRateLimitRetry.test.ts +0 -167
  532. package/src/adapter/repositories/issue/githubRateLimitRetry.ts +0 -109
  533. package/src/adapter/repositories/localStorageCacheDirectory.test.ts +0 -81
  534. package/src/adapter/repositories/localStorageCacheDirectory.ts +0 -13
  535. package/src/adapter/repositories/projectFieldDefinition.test.ts +0 -191
  536. package/src/adapter/repositories/projectFieldDefinition.ts +0 -144
  537. package/src/adapter/repositories/utils.test.ts +0 -55
  538. package/src/adapter/repositories/utils.ts +0 -45
  539. package/src/domain/entities/ClaudeHandoverSession.ts +0 -12
  540. package/src/domain/entities/ClaudeMessageResponse.ts +0 -31
  541. package/src/domain/entities/ClaudeTokenUsage.ts +0 -17
  542. package/src/domain/entities/ClaudeWindowUsage.ts +0 -5
  543. package/src/domain/entities/Comment.ts +0 -5
  544. package/src/domain/entities/InteractiveLiveSession.ts +0 -6
  545. package/src/domain/entities/Issue.ts +0 -31
  546. package/src/domain/entities/KevReportWatermark.ts +0 -4
  547. package/src/domain/entities/LiveSessionActivitySnapshot.ts +0 -14
  548. package/src/domain/entities/LiveSessionOutputActivity.ts +0 -4
  549. package/src/domain/entities/LiveSessionProcessSnapshot.ts +0 -18
  550. package/src/domain/entities/LiveTmuxSession.ts +0 -4
  551. package/src/domain/entities/Member.ts +0 -3
  552. package/src/domain/entities/OutputDegeneration.ts +0 -10
  553. package/src/domain/entities/Project.ts +0 -88
  554. package/src/domain/entities/ProjectField.ts +0 -3
  555. package/src/domain/entities/ProjectFieldName.ts +0 -2
  556. package/src/domain/entities/ProjectFieldSingleSelect.ts +0 -8
  557. package/src/domain/entities/ProjectFieldSingleSelectOption.ts +0 -8
  558. package/src/domain/entities/RequiredProjectField.ts +0 -68
  559. package/src/domain/entities/SearchedIssue.ts +0 -11
  560. package/src/domain/entities/StoryObjectMap.ts +0 -12
  561. package/src/domain/entities/TokenExhaustionHandoverState.ts +0 -8
  562. package/src/domain/entities/WorkflowStatus.ts +0 -66
  563. package/src/domain/usecases/ActionAnnouncementUseCase.test.ts +0 -91
  564. package/src/domain/usecases/ActionAnnouncementUseCase.ts +0 -78
  565. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.test.ts +0 -222
  566. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.ts +0 -76
  567. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.test.ts +0 -118
  568. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +0 -112
  569. package/src/domain/usecases/AnalyzeStoriesUseCase.test.ts +0 -82
  570. package/src/domain/usecases/AnalyzeStoriesUseCase.ts +0 -296
  571. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.test.ts +0 -578
  572. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.ts +0 -137
  573. package/src/domain/usecases/CONTRIBUTING_FOR_TEST.md +0 -259
  574. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.test.ts +0 -437
  575. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.ts +0 -80
  576. package/src/domain/usecases/ChangeTargetPullRequestApprover.test.ts +0 -248
  577. package/src/domain/usecases/ChangeTargetPullRequestApprover.ts +0 -69
  578. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +0 -411
  579. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +0 -142
  580. package/src/domain/usecases/ClearDependedIssueURLUseCase.test.ts +0 -1120
  581. package/src/domain/usecases/ClearDependedIssueURLUseCase.ts +0 -161
  582. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.test.ts +0 -345
  583. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.ts +0 -81
  584. package/src/domain/usecases/CliErrorReportUseCase.test.ts +0 -162
  585. package/src/domain/usecases/CliErrorReportUseCase.ts +0 -72
  586. package/src/domain/usecases/ConflictedIssueRevertUseCase.test.ts +0 -886
  587. package/src/domain/usecases/ConflictedIssueRevertUseCase.ts +0 -146
  588. package/src/domain/usecases/CreateEstimationIssueUseCase.test.ts +0 -227
  589. package/src/domain/usecases/CreateEstimationIssueUseCase.ts +0 -205
  590. package/src/domain/usecases/CreateNewStoryByLabelUseCase.test.ts +0 -1084
  591. package/src/domain/usecases/CreateNewStoryByLabelUseCase.ts +0 -146
  592. package/src/domain/usecases/DailySecurityScanUseCase.test.ts +0 -1709
  593. package/src/domain/usecases/DailySecurityScanUseCase.ts +0 -476
  594. package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +0 -533
  595. package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +0 -122
  596. package/src/domain/usecases/GetStoryObjectMapUseCase.test.ts +0 -330
  597. package/src/domain/usecases/GetStoryObjectMapUseCase.ts +0 -79
  598. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +0 -1913
  599. package/src/domain/usecases/HandleScheduledEventUseCase.ts +0 -846
  600. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.test.ts +0 -175
  601. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.ts +0 -63
  602. package/src/domain/usecases/IssueNoStatusUpdateUseCase.test.ts +0 -165
  603. package/src/domain/usecases/IssueNoStatusUpdateUseCase.ts +0 -44
  604. package/src/domain/usecases/IssueRejectionEvaluator.test.ts +0 -1137
  605. package/src/domain/usecases/IssueRejectionEvaluator.ts +0 -340
  606. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.test.ts +0 -679
  607. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.ts +0 -178
  608. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +0 -5441
  609. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +0 -891
  610. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +0 -2069
  611. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +0 -489
  612. package/src/domain/usecases/OauthTokenSelectUseCase.test.ts +0 -651
  613. package/src/domain/usecases/OauthTokenSelectUseCase.ts +0 -274
  614. package/src/domain/usecases/OutputDegenerationDetector.test.ts +0 -167
  615. package/src/domain/usecases/OutputDegenerationDetector.ts +0 -169
  616. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.test.ts +0 -711
  617. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.ts +0 -146
  618. package/src/domain/usecases/QualityCheckAdvanceUseCase.test.ts +0 -421
  619. package/src/domain/usecases/QualityCheckAdvanceUseCase.ts +0 -76
  620. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.test.ts +0 -188
  621. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.ts +0 -57
  622. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.test.ts +0 -303
  623. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.ts +0 -155
  624. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +0 -1838
  625. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +0 -221
  626. package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +0 -2392
  627. package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +0 -499
  628. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.test.ts +0 -224
  629. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.ts +0 -142
  630. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.test.ts +0 -360
  631. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.ts +0 -70
  632. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.test.ts +0 -400
  633. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.ts +0 -48
  634. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.test.ts +0 -696
  635. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +0 -201
  636. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.test.ts +0 -1363
  637. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.ts +0 -215
  638. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.test.ts +0 -170
  639. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.ts +0 -38
  640. package/src/domain/usecases/StaleTmuxSessionKillUseCase.test.ts +0 -283
  641. package/src/domain/usecases/StaleTmuxSessionKillUseCase.ts +0 -98
  642. package/src/domain/usecases/StartPreparationUseCase.test.ts +0 -7822
  643. package/src/domain/usecases/StartPreparationUseCase.ts +0 -876
  644. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.test.ts +0 -200
  645. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.ts +0 -74
  646. package/src/domain/usecases/TokenExhaustionHandoverUseCase.test.ts +0 -838
  647. package/src/domain/usecases/TokenExhaustionHandoverUseCase.ts +0 -439
  648. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.test.ts +0 -306
  649. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.ts +0 -64
  650. package/src/domain/usecases/UpdateRateLimitCacheUseCase.test.ts +0 -178
  651. package/src/domain/usecases/UpdateRateLimitCacheUseCase.ts +0 -22
  652. package/src/domain/usecases/adapter-interfaces/ClaudeHandoverSessionRepository.ts +0 -5
  653. package/src/domain/usecases/adapter-interfaces/ClaudeInteractiveSessionRepository.ts +0 -9
  654. package/src/domain/usecases/adapter-interfaces/ClaudeLiveSessionRepository.ts +0 -8
  655. package/src/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.ts +0 -5
  656. package/src/domain/usecases/adapter-interfaces/ClaudeRepository.ts +0 -6
  657. package/src/domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository.ts +0 -8
  658. package/src/domain/usecases/adapter-interfaces/ConsoleTabsRepository.ts +0 -12
  659. package/src/domain/usecases/adapter-interfaces/CopilotRepository.ts +0 -3
  660. package/src/domain/usecases/adapter-interfaces/DateRepository.ts +0 -7
  661. package/src/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.ts +0 -3
  662. package/src/domain/usecases/adapter-interfaces/HttpRepository.ts +0 -3
  663. package/src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts +0 -7
  664. package/src/domain/usecases/adapter-interfaces/IssueAttachmentRepository.ts +0 -9
  665. package/src/domain/usecases/adapter-interfaces/IssueCheckpointRepository.ts +0 -3
  666. package/src/domain/usecases/adapter-interfaces/IssueCommentRepository.ts +0 -7
  667. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +0 -229
  668. package/src/domain/usecases/adapter-interfaces/KevReportWatermarkRepository.ts +0 -11
  669. package/src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts +0 -5
  670. package/src/domain/usecases/adapter-interfaces/LocalCommandRunner.ts +0 -16
  671. package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +0 -5
  672. package/src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts +0 -3
  673. package/src/domain/usecases/adapter-interfaces/ProcessSignalRepository.ts +0 -5
  674. package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +0 -29
  675. package/src/domain/usecases/adapter-interfaces/RateLimitCacheRepository.ts +0 -10
  676. package/src/domain/usecases/adapter-interfaces/RefusalTailStatusProvider.ts +0 -5
  677. package/src/domain/usecases/adapter-interfaces/SessionAssistantTurnsRepository.ts +0 -6
  678. package/src/domain/usecases/adapter-interfaces/SessionDegenerationCooldownStateRepository.ts +0 -4
  679. package/src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts +0 -7
  680. package/src/domain/usecases/adapter-interfaces/SessionRecordReader.ts +0 -3
  681. package/src/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.ts +0 -8
  682. package/src/domain/usecases/adapter-interfaces/SilentSessionCandidateStateRepository.ts +0 -10
  683. package/src/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.ts +0 -20
  684. package/src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts +0 -18
  685. package/src/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.ts +0 -6
  686. package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +0 -20
  687. package/src/domain/usecases/adapter-interfaces/Sleeper.ts +0 -3
  688. package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +0 -18
  689. package/src/domain/usecases/adapter-interfaces/StatusDefaultRepository.ts +0 -5
  690. package/src/domain/usecases/adapter-interfaces/SubAgentLivenessResolver.ts +0 -6
  691. package/src/domain/usecases/adapter-interfaces/SubAgentProcessLister.ts +0 -8
  692. package/src/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.ts +0 -3
  693. package/src/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.ts +0 -6
  694. package/src/domain/usecases/adapter-interfaces/TakeOwnershipSpawnRepository.ts +0 -9
  695. package/src/domain/usecases/adapter-interfaces/TmuxSessionRepository.ts +0 -20
  696. package/src/domain/usecases/adapter-interfaces/TokenExhaustionHandoverStateRepository.ts +0 -6
  697. package/src/domain/usecases/adapter-interfaces/TokenRateLimitSnapshotRepository.ts +0 -22
  698. package/src/domain/usecases/adapter-interfaces/WebhookRepository.ts +0 -3
  699. package/src/domain/usecases/agentReportPrefix.ts +0 -1
  700. package/src/domain/usecases/autoStatusCheckComments.ts +0 -1
  701. package/src/domain/usecases/console/.gitkeep +0 -0
  702. package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +0 -887
  703. package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +0 -368
  704. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.test.ts +0 -654
  705. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.ts +0 -318
  706. package/src/domain/usecases/dashboard/DashboardProjectCode.test.ts +0 -34
  707. package/src/domain/usecases/dashboard/DashboardProjectCode.ts +0 -27
  708. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.test.ts +0 -160
  709. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.ts +0 -69
  710. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.test.ts +0 -362
  711. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.ts +0 -234
  712. package/src/domain/usecases/ensureAgentOptionAndGetId.ts +0 -47
  713. package/src/domain/usecases/extractFencedJsonBlocks.test.ts +0 -40
  714. package/src/domain/usecases/extractFencedJsonBlocks.ts +0 -21
  715. package/src/domain/usecases/extractNextStepAgent.test.ts +0 -58
  716. package/src/domain/usecases/extractNextStepAgent.ts +0 -18
  717. package/src/domain/usecases/extractNextStepAgentFromComments.ts +0 -13
  718. package/src/domain/usecases/findLastAgentReport.test.ts +0 -121
  719. package/src/domain/usecases/findLastAgentReport.ts +0 -14
  720. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.test.ts +0 -339
  721. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts +0 -188
  722. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.test.ts +0 -389
  723. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.ts +0 -103
  724. package/src/domain/usecases/intmux/OwnerCallFile.test.ts +0 -184
  725. package/src/domain/usecases/intmux/OwnerCallFile.ts +0 -80
  726. package/src/domain/usecases/isAgentReportBody.test.ts +0 -108
  727. package/src/domain/usecases/isAgentReportBody.ts +0 -52
  728. package/src/domain/usecases/isAuthorAuthorizedForAutoStatusCheck.ts +0 -12
  729. package/src/domain/usecases/isHumanComment.test.ts +0 -77
  730. package/src/domain/usecases/isHumanComment.ts +0 -23
  731. package/src/domain/usecases/isRecord.ts +0 -2
  732. package/src/domain/usecases/issueReactivationTriggerIsPending.test.ts +0 -541
  733. package/src/domain/usecases/issueReactivationTriggerIsPending.ts +0 -25
  734. package/src/domain/usecases/nextStepAgentDispatchRepeatedMessage.ts +0 -2
  735. package/src/domain/usecases/normalizeReportBody.test.ts +0 -24
  736. package/src/domain/usecases/normalizeReportBody.ts +0 -2
  737. package/src/domain/usecases/resolveAllowedIssueAuthors.test.ts +0 -51
  738. package/src/domain/usecases/resolveAllowedIssueAuthors.ts +0 -6
  739. package/src/domain/usecases/resolveLabelsAsLlmAgentName.test.ts +0 -42
  740. package/src/domain/usecases/resolveLabelsAsLlmAgentName.ts +0 -6
  741. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.test.ts +0 -33
  742. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.ts +0 -7
  743. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.test.ts +0 -337
  744. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.ts +0 -133
  745. package/src/domain/usecases/silentSessionReminderSentinel.ts +0 -9
  746. package/src/domain/usecases/triagerAgentName.ts +0 -4
  747. package/src/domain/usecases/utils.test.ts +0 -35
  748. package/src/domain/usecases/utils.ts +0 -6
  749. package/src/index.test.ts +0 -8
  750. package/src/index.ts +0 -10
  751. package/src/releaseConfig.test.ts +0 -40
  752. package/tsconfig.build.json +0 -18
  753. package/tsconfig.json +0 -25
  754. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts +0 -13
  755. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts.map +0 -1
  756. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts +0 -16
  757. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts.map +0 -1
  758. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +0 -12
  759. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +0 -1
  760. package/types/domain/entities/UnansweredOwnerCall.d.ts +0 -5
  761. package/types/domain/entities/UnansweredOwnerCall.d.ts.map +0 -1
  762. package/types/domain/entities/WorkingTime.d.ts +0 -8
  763. package/types/domain/entities/WorkingTime.d.ts.map +0 -1
  764. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts +0 -17
  765. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts.map +0 -1
  766. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts +0 -23
  767. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts.map +0 -1
  768. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +0 -50
  769. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +0 -1
  770. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts +0 -15
  771. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts.map +0 -1
  772. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts +0 -11
  773. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts.map +0 -1
  774. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts +0 -3
  775. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts.map +0 -1
  776. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts +0 -5
  777. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts.map +0 -1
  778. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts +0 -5
  779. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts.map +0 -1
  780. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts +0 -2
  781. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts.map +0 -1
  782. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts +0 -3
  783. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts.map +0 -1
@@ -1,1709 +0,0 @@
1
- import { DailySecurityScanUseCase } from './DailySecurityScanUseCase';
2
- import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
3
- import { IssueRepository } from './adapter-interfaces/IssueRepository';
4
- import { HttpRepository } from './adapter-interfaces/HttpRepository';
5
- import { KevReportWatermarkRepository } from './adapter-interfaces/KevReportWatermarkRepository';
6
- import { mock } from 'jest-mock-extended';
7
-
8
- const KEV_CATALOG_URL =
9
- 'https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json';
10
-
11
- describe('DailySecurityScanUseCase', () => {
12
- const buildUseCase = () => {
13
- const mockLocalCommandRunner = mock<LocalCommandRunner>();
14
- const mockIssueRepository = mock<IssueRepository>();
15
- const mockHttpRepository = mock<HttpRepository>();
16
- const mockKevReportWatermarkRepository =
17
- mock<KevReportWatermarkRepository>();
18
- mockKevReportWatermarkRepository.load.mockResolvedValue({ type: 'absent' });
19
- const useCase = new DailySecurityScanUseCase(
20
- mockLocalCommandRunner,
21
- mockIssueRepository,
22
- mockHttpRepository,
23
- mockKevReportWatermarkRepository,
24
- );
25
- return {
26
- useCase,
27
- mockLocalCommandRunner,
28
- mockIssueRepository,
29
- mockHttpRepository,
30
- mockKevReportWatermarkRepository,
31
- };
32
- };
33
-
34
- describe('run', () => {
35
- it('does nothing when no target date matches the configured hour', async () => {
36
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
37
- buildUseCase();
38
-
39
- await useCase.run({
40
- targetDates: [new Date('2024-01-01T03:30:00Z')],
41
- org: 'example-org',
42
- manager: 'manager-name',
43
- dailySecurityScan: {
44
- scanBaseDirectory: '/repos',
45
- targetHourUtc: 5,
46
- },
47
- });
48
-
49
- expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
50
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(0);
51
- });
52
-
53
- it('does not run when the matching hour is not at minute zero', async () => {
54
- const { useCase, mockLocalCommandRunner } = buildUseCase();
55
-
56
- await useCase.run({
57
- targetDates: [new Date('2024-01-01T05:15:00Z')],
58
- org: 'example-org',
59
- manager: 'manager-name',
60
- dailySecurityScan: {
61
- scanBaseDirectory: '/repos',
62
- targetHourUtc: 5,
63
- },
64
- });
65
-
66
- expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
67
- });
68
-
69
- it('scans repositories and creates an issue when osv-scanner finds vulnerabilities', async () => {
70
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
71
- buildUseCase();
72
-
73
- mockIssueRepository.searchIssue.mockResolvedValue([]);
74
-
75
- mockLocalCommandRunner.runCommand.mockImplementation(
76
- async (program, args) => {
77
- if (program === 'find') {
78
- return {
79
- stdout: '/repos/example-org/app/.git\n',
80
- stderr: '',
81
- exitCode: 0,
82
- };
83
- }
84
- if (program === 'mktemp') {
85
- return {
86
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
87
- stderr: '',
88
- exitCode: 0,
89
- };
90
- }
91
- if (program === 'git') {
92
- return {
93
- stdout: 'git@github.com:example-org/app.git\n',
94
- stderr: '',
95
- exitCode: 0,
96
- };
97
- }
98
- if (program === 'osv-scanner') {
99
- return {
100
- stdout: 'vulnerability detected in ' + args[args.length - 1],
101
- stderr: '',
102
- exitCode: 1,
103
- };
104
- }
105
- return { stdout: '', stderr: '', exitCode: 0 };
106
- },
107
- );
108
-
109
- await useCase.run({
110
- targetDates: [new Date('2024-01-02T05:00:00Z')],
111
- org: 'example-org',
112
- manager: 'manager-name',
113
- dailySecurityScan: {
114
- scanBaseDirectory: '/repos',
115
- targetHourUtc: 5,
116
- },
117
- });
118
-
119
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(1);
120
- expect(mockIssueRepository.createNewIssue.mock.calls[0][0]).toBe(
121
- 'example-org',
122
- );
123
- expect(mockIssueRepository.createNewIssue.mock.calls[0][1]).toBe('app');
124
- expect(mockIssueRepository.createNewIssue.mock.calls[0][2]).toBe(
125
- 'Daily security scan findings',
126
- );
127
- expect(mockIssueRepository.createNewIssue.mock.calls[0][4]).toEqual([
128
- 'manager-name',
129
- ]);
130
- expect(mockIssueRepository.createNewIssue.mock.calls[0][3]).toContain(
131
- 'From: :robot: DailySecurityScanUseCase',
132
- );
133
- });
134
-
135
- const buildDefaultBranchScanRunner = () => {
136
- const scannerFindings = JSON.stringify({
137
- results: [
138
- {
139
- packages: [
140
- {
141
- package: {
142
- name: 'example-library',
143
- version: '1.2.3',
144
- ecosystem: 'npm',
145
- },
146
- vulnerabilities: [
147
- {
148
- id: 'GHSA-1111-2222-3333',
149
- aliases: [],
150
- summary: 'Example Library Deserialization',
151
- },
152
- ],
153
- },
154
- ],
155
- },
156
- ],
157
- });
158
- return async (program: string, args: string[]) => {
159
- if (program === 'find') {
160
- return {
161
- stdout: '/repos/workspace1/app/.git\n/repos/workspace2/app/.git\n',
162
- stderr: '',
163
- exitCode: 0,
164
- };
165
- }
166
- if (program === 'mktemp') {
167
- return {
168
- stdout: '/tmp/tdpm-daily-security-scan-app-abc123\n',
169
- stderr: '',
170
- exitCode: 0,
171
- };
172
- }
173
- if (program === 'git') {
174
- return {
175
- stdout: 'git@github.com:example-org/app.git\n',
176
- stderr: '',
177
- exitCode: 0,
178
- };
179
- }
180
- if (program === 'osv-scanner') {
181
- return { stdout: scannerFindings, stderr: '', exitCode: 1 };
182
- }
183
- if (program === 'rm') {
184
- return { stdout: args.join(' '), stderr: '', exitCode: 0 };
185
- }
186
- return { stdout: '', stderr: '', exitCode: 0 };
187
- };
188
- };
189
-
190
- it('scans one fresh checkout of the default branch instead of the working copies on disk', async () => {
191
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
192
- buildUseCase();
193
-
194
- mockIssueRepository.searchIssue.mockResolvedValue([]);
195
- mockLocalCommandRunner.runCommand.mockImplementation(
196
- buildDefaultBranchScanRunner(),
197
- );
198
-
199
- await useCase.run({
200
- targetDates: [new Date('2024-01-02T05:00:00Z')],
201
- org: 'example-org',
202
- manager: 'manager-name',
203
- dailySecurityScan: {
204
- scanBaseDirectory: '/repos',
205
- targetHourUtc: 5,
206
- },
207
- });
208
-
209
- const cloneCalls = mockLocalCommandRunner.runCommand.mock.calls.filter(
210
- (call) => call[0] === 'git' && call[1][0] === 'clone',
211
- );
212
- expect(cloneCalls).toHaveLength(1);
213
- expect(cloneCalls[0][1]).toEqual([
214
- 'clone',
215
- '--depth',
216
- '1',
217
- 'git@github.com:example-org/app.git',
218
- '/tmp/tdpm-daily-security-scan-app-abc123',
219
- ]);
220
-
221
- const scanCalls = mockLocalCommandRunner.runCommand.mock.calls.filter(
222
- (call) => call[0] === 'osv-scanner',
223
- );
224
- expect(scanCalls).toHaveLength(1);
225
- expect(scanCalls[0][1][scanCalls[0][1].indexOf('-r') + 1]).toBe(
226
- '/tmp/tdpm-daily-security-scan-app-abc123',
227
- );
228
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(1);
229
- expect(mockIssueRepository.createNewIssue.mock.calls[0][1]).toBe('app');
230
- });
231
-
232
- it('logs an error and scans nothing for a repository whose default branch clone fails', async () => {
233
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
234
- buildUseCase();
235
- const errorSpy = jest
236
- .spyOn(console, 'error')
237
- .mockImplementation(() => undefined);
238
-
239
- mockIssueRepository.searchIssue.mockResolvedValue([]);
240
- mockLocalCommandRunner.runCommand.mockImplementation(
241
- async (program, args) => {
242
- if (program === 'find') {
243
- return {
244
- stdout: '/repos/workspace1/app/.git\n',
245
- stderr: '',
246
- exitCode: 0,
247
- };
248
- }
249
- if (program === 'mktemp') {
250
- return {
251
- stdout: '/tmp/tdpm-daily-security-scan-app-abc123\n',
252
- stderr: '',
253
- exitCode: 0,
254
- };
255
- }
256
- if (program === 'git' && args[0] === 'clone') {
257
- return {
258
- stdout: '',
259
- stderr: 'fatal: repository not found',
260
- exitCode: 128,
261
- };
262
- }
263
- if (program === 'git') {
264
- return {
265
- stdout: 'git@github.com:example-org/app.git\n',
266
- stderr: '',
267
- exitCode: 0,
268
- };
269
- }
270
- return { stdout: '', stderr: '', exitCode: 0 };
271
- },
272
- );
273
-
274
- await useCase.run({
275
- targetDates: [new Date('2024-01-02T05:00:00Z')],
276
- org: 'example-org',
277
- manager: 'manager-name',
278
- dailySecurityScan: {
279
- scanBaseDirectory: '/repos',
280
- targetHourUtc: 5,
281
- },
282
- });
283
-
284
- expect(errorSpy).toHaveBeenCalledWith(
285
- expect.stringContaining('Failed to clone the default branch of app'),
286
- );
287
- const scanCalls = mockLocalCommandRunner.runCommand.mock.calls.filter(
288
- (call) => call[0] === 'osv-scanner',
289
- );
290
- expect(scanCalls).toHaveLength(0);
291
- const removeCalls = mockLocalCommandRunner.runCommand.mock.calls.filter(
292
- (call) => call[0] === 'rm',
293
- );
294
- expect(removeCalls).toHaveLength(1);
295
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(0);
296
- errorSpy.mockRestore();
297
- });
298
-
299
- it('removes the temporary checkout after scanning it', async () => {
300
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
301
- buildUseCase();
302
-
303
- mockIssueRepository.searchIssue.mockResolvedValue([]);
304
- mockLocalCommandRunner.runCommand.mockImplementation(
305
- buildDefaultBranchScanRunner(),
306
- );
307
-
308
- await useCase.run({
309
- targetDates: [new Date('2024-01-02T05:00:00Z')],
310
- org: 'example-org',
311
- manager: 'manager-name',
312
- dailySecurityScan: {
313
- scanBaseDirectory: '/repos',
314
- targetHourUtc: 5,
315
- },
316
- });
317
-
318
- const removeCalls = mockLocalCommandRunner.runCommand.mock.calls.filter(
319
- (call) => call[0] === 'rm',
320
- );
321
- expect(removeCalls).toHaveLength(1);
322
- expect(removeCalls[0][1]).toEqual([
323
- '-rf',
324
- '/tmp/tdpm-daily-security-scan-app-abc123',
325
- ]);
326
- });
327
-
328
- it('does not create an issue when osv-scanner reports no vulnerabilities', async () => {
329
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
330
- buildUseCase();
331
-
332
- mockLocalCommandRunner.runCommand.mockImplementation(
333
- async (program, args) => {
334
- if (program === 'find') {
335
- return {
336
- stdout: '/repos/example-org/app/.git\n',
337
- stderr: '',
338
- exitCode: 0,
339
- };
340
- }
341
- if (program === 'mktemp') {
342
- return {
343
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
344
- stderr: '',
345
- exitCode: 0,
346
- };
347
- }
348
- if (program === 'git') {
349
- return {
350
- stdout: 'git@github.com:example-org/app.git\n',
351
- stderr: '',
352
- exitCode: 0,
353
- };
354
- }
355
- return { stdout: 'no vulnerabilities', stderr: '', exitCode: 0 };
356
- },
357
- );
358
-
359
- await useCase.run({
360
- targetDates: [new Date('2024-01-02T05:00:00Z')],
361
- org: 'example-org',
362
- manager: 'manager-name',
363
- dailySecurityScan: {
364
- scanBaseDirectory: '/repos',
365
- targetHourUtc: 5,
366
- },
367
- });
368
-
369
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(0);
370
- });
371
-
372
- it('skips repositories whose origin remote does not belong to the org', async () => {
373
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
374
- buildUseCase();
375
-
376
- mockLocalCommandRunner.runCommand.mockImplementation(
377
- async (program, args) => {
378
- if (program === 'find') {
379
- return {
380
- stdout: '/repos/other-org/app/.git\n',
381
- stderr: '',
382
- exitCode: 0,
383
- };
384
- }
385
- if (program === 'mktemp') {
386
- return {
387
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
388
- stderr: '',
389
- exitCode: 0,
390
- };
391
- }
392
- if (program === 'git') {
393
- return {
394
- stdout: 'git@github.com:other-org/app.git\n',
395
- stderr: '',
396
- exitCode: 0,
397
- };
398
- }
399
- return { stdout: '', stderr: '', exitCode: 1 };
400
- },
401
- );
402
-
403
- await useCase.run({
404
- targetDates: [new Date('2024-01-02T05:00:00Z')],
405
- org: 'example-org',
406
- manager: 'manager-name',
407
- dailySecurityScan: {
408
- scanBaseDirectory: '/repos',
409
- targetHourUtc: 5,
410
- },
411
- });
412
-
413
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(0);
414
- const osvScannerInvoked =
415
- mockLocalCommandRunner.runCommand.mock.calls.some(
416
- (call) => call[0] === 'osv-scanner',
417
- );
418
- expect(osvScannerInvoked).toBe(false);
419
- });
420
-
421
- it('skips repositories whose origin remote cannot be resolved', async () => {
422
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
423
- buildUseCase();
424
-
425
- mockLocalCommandRunner.runCommand.mockImplementation(
426
- async (program, args) => {
427
- if (program === 'find') {
428
- return {
429
- stdout: '/repos/example-org/app/.git\n',
430
- stderr: '',
431
- exitCode: 0,
432
- };
433
- }
434
- if (program === 'mktemp') {
435
- return {
436
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
437
- stderr: '',
438
- exitCode: 0,
439
- };
440
- }
441
- if (program === 'git') {
442
- return {
443
- stdout: '',
444
- stderr: 'fatal: No such remote',
445
- exitCode: 2,
446
- };
447
- }
448
- return { stdout: '', stderr: '', exitCode: 1 };
449
- },
450
- );
451
-
452
- await useCase.run({
453
- targetDates: [new Date('2024-01-02T05:00:00Z')],
454
- org: 'example-org',
455
- manager: 'manager-name',
456
- dailySecurityScan: {
457
- scanBaseDirectory: '/repos',
458
- targetHourUtc: 5,
459
- },
460
- });
461
-
462
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(0);
463
- const osvScannerInvoked =
464
- mockLocalCommandRunner.runCommand.mock.calls.some(
465
- (call) => call[0] === 'osv-scanner',
466
- );
467
- expect(osvScannerInvoked).toBe(false);
468
- });
469
-
470
- it('does not fetch the KEV catalog when KEV reporting is disabled', async () => {
471
- const { useCase, mockLocalCommandRunner, mockHttpRepository } =
472
- buildUseCase();
473
-
474
- mockLocalCommandRunner.runCommand.mockImplementation(
475
- async (program, args) => {
476
- if (program === 'find') {
477
- return {
478
- stdout: '/repos/example-org/app/.git\n',
479
- stderr: '',
480
- exitCode: 0,
481
- };
482
- }
483
- if (program === 'mktemp') {
484
- return {
485
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
486
- stderr: '',
487
- exitCode: 0,
488
- };
489
- }
490
- if (program === 'git') {
491
- return {
492
- stdout: 'git@github.com:example-org/app.git\n',
493
- stderr: '',
494
- exitCode: 0,
495
- };
496
- }
497
- return { stdout: '', stderr: '', exitCode: 0 };
498
- },
499
- );
500
-
501
- await useCase.run({
502
- targetDates: [new Date('2024-01-02T05:00:00Z')],
503
- org: 'example-org',
504
- manager: 'manager-name',
505
- dailySecurityScan: {
506
- scanBaseDirectory: '/repos',
507
- targetHourUtc: 5,
508
- enableKevNvdReport: false,
509
- },
510
- });
511
-
512
- expect(mockHttpRepository.get.mock.calls).toHaveLength(0);
513
- });
514
-
515
- it('does not fetch the KEV catalog when the report repo is missing', async () => {
516
- const { useCase, mockLocalCommandRunner, mockHttpRepository } =
517
- buildUseCase();
518
-
519
- mockLocalCommandRunner.runCommand.mockImplementation(
520
- async (program, args) => {
521
- if (program === 'find') {
522
- return {
523
- stdout: '/repos/example-org/app/.git\n',
524
- stderr: '',
525
- exitCode: 0,
526
- };
527
- }
528
- if (program === 'mktemp') {
529
- return {
530
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
531
- stderr: '',
532
- exitCode: 0,
533
- };
534
- }
535
- if (program === 'git') {
536
- return {
537
- stdout: 'git@github.com:example-org/app.git\n',
538
- stderr: '',
539
- exitCode: 0,
540
- };
541
- }
542
- return { stdout: '', stderr: '', exitCode: 0 };
543
- },
544
- );
545
-
546
- await useCase.run({
547
- targetDates: [new Date('2024-01-02T05:00:00Z')],
548
- org: 'example-org',
549
- manager: 'manager-name',
550
- dailySecurityScan: {
551
- scanBaseDirectory: '/repos',
552
- targetHourUtc: 5,
553
- enableKevNvdReport: true,
554
- },
555
- });
556
-
557
- expect(mockHttpRepository.get.mock.calls).toHaveLength(0);
558
- });
559
-
560
- it('creates a KEV report issue for vulnerabilities added since yesterday', async () => {
561
- const {
562
- useCase,
563
- mockLocalCommandRunner,
564
- mockIssueRepository,
565
- mockHttpRepository,
566
- } = buildUseCase();
567
-
568
- mockIssueRepository.searchIssue.mockResolvedValue([]);
569
- mockLocalCommandRunner.runCommand.mockImplementation(
570
- async (program, args) => {
571
- if (program === 'find') {
572
- return {
573
- stdout: '/repos/example-org/app/.git\n',
574
- stderr: '',
575
- exitCode: 0,
576
- };
577
- }
578
- if (program === 'mktemp') {
579
- return {
580
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
581
- stderr: '',
582
- exitCode: 0,
583
- };
584
- }
585
- if (program === 'git') {
586
- return {
587
- stdout: 'git@github.com:example-org/app.git\n',
588
- stderr: '',
589
- exitCode: 0,
590
- };
591
- }
592
- if (program === 'osv-scanner') {
593
- return {
594
- stdout: JSON.stringify({
595
- results: [
596
- {
597
- source: {
598
- path: '/repos/example-org/app',
599
- type: 'lockfile',
600
- },
601
- packages: [
602
- {
603
- package: {
604
- name: 'example-library',
605
- version: '1.2.3',
606
- ecosystem: 'npm',
607
- },
608
- vulnerabilities: [
609
- {
610
- id: 'GHSA-1111-2222-3333',
611
- aliases: ['CVE-2024-0001', 'CVE-2023-9999'],
612
- summary: 'New Vulnerability',
613
- },
614
- ],
615
- },
616
- ],
617
- },
618
- ],
619
- }),
620
- stderr: '',
621
- exitCode: 1,
622
- };
623
- }
624
- return { stdout: '', stderr: '', exitCode: 0 };
625
- },
626
- );
627
- mockHttpRepository.get.mockResolvedValue(
628
- JSON.stringify({
629
- vulnerabilities: [
630
- {
631
- cveID: 'CVE-2024-0001',
632
- vendorProject: 'Example',
633
- product: 'NewProduct',
634
- vulnerabilityName: 'New Vulnerability',
635
- dateAdded: '2024-01-02',
636
- },
637
- {
638
- cveID: 'CVE-2023-9999',
639
- vendorProject: 'Example',
640
- product: 'OldProduct',
641
- vulnerabilityName: 'Old Vulnerability',
642
- dateAdded: '2023-12-31',
643
- },
644
- ],
645
- }),
646
- );
647
-
648
- await useCase.run({
649
- targetDates: [new Date('2024-01-02T05:00:00Z')],
650
- org: 'example-org',
651
- manager: 'manager-name',
652
- dailySecurityScan: {
653
- scanBaseDirectory: '/repos',
654
- targetHourUtc: 5,
655
- enableKevNvdReport: true,
656
- kevReportRepo: 'security-reports',
657
- },
658
- });
659
-
660
- expect(mockHttpRepository.get.mock.calls).toHaveLength(1);
661
- expect(mockHttpRepository.get.mock.calls[0][0]).toBe(KEV_CATALOG_URL);
662
- const kevIssueCalls =
663
- mockIssueRepository.createNewIssue.mock.calls.filter(
664
- (call) => call[1] === 'security-reports',
665
- );
666
- expect(kevIssueCalls).toHaveLength(1);
667
- expect(kevIssueCalls[0][0]).toBe('example-org');
668
- expect(kevIssueCalls[0][2]).toBe(
669
- 'CISA KEV new additions since 2024-01-01',
670
- );
671
- expect(kevIssueCalls[0][3]).toContain('CVE-2024-0001');
672
- expect(kevIssueCalls[0][3]).not.toContain('CVE-2023-9999');
673
- expect(kevIssueCalls[0][3]).toContain(
674
- 'From: :robot: DailySecurityScanUseCase',
675
- );
676
- });
677
-
678
- it('does not create a KEV report issue when there are no new additions', async () => {
679
- const {
680
- useCase,
681
- mockLocalCommandRunner,
682
- mockIssueRepository,
683
- mockHttpRepository,
684
- } = buildUseCase();
685
-
686
- mockLocalCommandRunner.runCommand.mockImplementation(
687
- async (program, args) => {
688
- if (program === 'find') {
689
- return {
690
- stdout: '/repos/example-org/app/.git\n',
691
- stderr: '',
692
- exitCode: 0,
693
- };
694
- }
695
- if (program === 'mktemp') {
696
- return {
697
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
698
- stderr: '',
699
- exitCode: 0,
700
- };
701
- }
702
- if (program === 'git') {
703
- return {
704
- stdout: 'git@github.com:example-org/app.git\n',
705
- stderr: '',
706
- exitCode: 0,
707
- };
708
- }
709
- return { stdout: '', stderr: '', exitCode: 0 };
710
- },
711
- );
712
- mockHttpRepository.get.mockResolvedValue(
713
- JSON.stringify({
714
- vulnerabilities: [
715
- {
716
- cveID: 'CVE-2023-9999',
717
- vendorProject: 'Example',
718
- product: 'OldProduct',
719
- vulnerabilityName: 'Old Vulnerability',
720
- dateAdded: '2023-12-31',
721
- },
722
- ],
723
- }),
724
- );
725
-
726
- await useCase.run({
727
- targetDates: [new Date('2024-01-02T05:00:00Z')],
728
- org: 'example-org',
729
- manager: 'manager-name',
730
- dailySecurityScan: {
731
- scanBaseDirectory: '/repos',
732
- targetHourUtc: 5,
733
- enableKevNvdReport: true,
734
- kevReportRepo: 'security-reports',
735
- },
736
- });
737
-
738
- expect(mockHttpRepository.get.mock.calls).toHaveLength(1);
739
- expect(mockHttpRepository.get.mock.calls[0][0]).toBe(KEV_CATALOG_URL);
740
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(0);
741
- });
742
-
743
- it('throws when the KEV catalog format is unexpected', async () => {
744
- const { useCase, mockLocalCommandRunner, mockHttpRepository } =
745
- buildUseCase();
746
-
747
- mockLocalCommandRunner.runCommand.mockImplementation(
748
- async (program, args) => {
749
- if (program === 'find') {
750
- return {
751
- stdout: '/repos/example-org/app/.git\n',
752
- stderr: '',
753
- exitCode: 0,
754
- };
755
- }
756
- if (program === 'mktemp') {
757
- return {
758
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
759
- stderr: '',
760
- exitCode: 0,
761
- };
762
- }
763
- if (program === 'git') {
764
- return {
765
- stdout: 'git@github.com:example-org/app.git\n',
766
- stderr: '',
767
- exitCode: 0,
768
- };
769
- }
770
- return { stdout: '', stderr: '', exitCode: 0 };
771
- },
772
- );
773
- mockHttpRepository.get.mockResolvedValue(
774
- JSON.stringify({ unexpected: 'structure' }),
775
- );
776
-
777
- await expect(
778
- useCase.run({
779
- targetDates: [new Date('2024-01-02T05:00:00Z')],
780
- org: 'example-org',
781
- manager: 'manager-name',
782
- dailySecurityScan: {
783
- scanBaseDirectory: '/repos',
784
- targetHourUtc: 5,
785
- enableKevNvdReport: true,
786
- kevReportRepo: 'security-reports',
787
- },
788
- }),
789
- ).rejects.toThrow('Unexpected CISA KEV catalog format');
790
- });
791
-
792
- it('logs an error and returns without throwing when no repositories are found in the scan base directory', async () => {
793
- const { useCase, mockLocalCommandRunner } = buildUseCase();
794
- const errorSpy = jest
795
- .spyOn(console, 'error')
796
- .mockImplementation(() => undefined);
797
-
798
- mockLocalCommandRunner.runCommand.mockImplementation(async (program) => {
799
- if (program === 'find') {
800
- return { stdout: '', stderr: '', exitCode: 0 };
801
- }
802
- return { stdout: '', stderr: '', exitCode: 0 };
803
- });
804
-
805
- await expect(
806
- useCase.run({
807
- targetDates: [new Date('2024-01-02T05:00:00Z')],
808
- org: 'example-org',
809
- manager: 'manager-name',
810
- dailySecurityScan: {
811
- scanBaseDirectory: '/repos',
812
- targetHourUtc: 5,
813
- },
814
- }),
815
- ).resolves.toBeUndefined();
816
-
817
- expect(errorSpy).toHaveBeenCalledWith(
818
- 'No repositories found in scan base directory: /repos',
819
- );
820
-
821
- errorSpy.mockRestore();
822
- });
823
-
824
- it('logs an error and continues scanning remaining repositories when osv-scanner exits with an unexpected code', async () => {
825
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
826
- buildUseCase();
827
- const errorSpy = jest
828
- .spyOn(console, 'error')
829
- .mockImplementation(() => undefined);
830
-
831
- mockIssueRepository.searchIssue.mockResolvedValue([]);
832
-
833
- mockLocalCommandRunner.runCommand.mockImplementation(
834
- async (program, args) => {
835
- if (program === 'find') {
836
- return {
837
- stdout:
838
- '/repos/example-org/broken/.git\n/repos/example-org/app/.git\n',
839
- stderr: '',
840
- exitCode: 0,
841
- };
842
- }
843
- if (program === 'mktemp') {
844
- return {
845
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
846
- stderr: '',
847
- exitCode: 0,
848
- };
849
- }
850
- if (program === 'git') {
851
- const dir = args[1];
852
- const repo = dir.split('/').pop() ?? '';
853
- return {
854
- stdout: `git@github.com:example-org/${repo}.git\n`,
855
- stderr: '',
856
- exitCode: 0,
857
- };
858
- }
859
- if (program === 'osv-scanner') {
860
- const scannedDirectory = args[args.indexOf('-r') + 1];
861
- if (scannedDirectory.includes('broken')) {
862
- return {
863
- stdout: '',
864
- stderr: 'osv-scanner: command not found',
865
- exitCode: 127,
866
- };
867
- }
868
- return {
869
- stdout: JSON.stringify({
870
- results: [
871
- {
872
- source: { path: scannedDirectory, type: 'lockfile' },
873
- packages: [
874
- {
875
- package: {
876
- name: 'example-library',
877
- version: '1.2.3',
878
- ecosystem: 'npm',
879
- },
880
- vulnerabilities: [
881
- {
882
- id: 'GHSA-1111-2222-3333',
883
- aliases: [],
884
- summary: 'Example Library Deserialization',
885
- },
886
- ],
887
- },
888
- ],
889
- },
890
- ],
891
- }),
892
- stderr: '',
893
- exitCode: 1,
894
- };
895
- }
896
- return { stdout: '', stderr: '', exitCode: 0 };
897
- },
898
- );
899
-
900
- await useCase.run({
901
- targetDates: [new Date('2024-01-02T05:00:00Z')],
902
- org: 'example-org',
903
- manager: 'manager-name',
904
- dailySecurityScan: {
905
- scanBaseDirectory: '/repos',
906
- targetHourUtc: 5,
907
- },
908
- });
909
-
910
- expect(errorSpy).toHaveBeenCalledWith(
911
- expect.stringContaining('osv-scanner failed with exit code 127'),
912
- );
913
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(1);
914
- expect(mockIssueRepository.createNewIssue.mock.calls[0][1]).toBe('app');
915
- errorSpy.mockRestore();
916
- });
917
-
918
- it('logs an error and continues scanning remaining repositories when creating the findings issue fails', async () => {
919
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
920
- buildUseCase();
921
- const errorSpy = jest
922
- .spyOn(console, 'error')
923
- .mockImplementation(() => undefined);
924
-
925
- mockIssueRepository.searchIssue.mockResolvedValue([]);
926
- mockIssueRepository.createNewIssue.mockImplementation(
927
- async (_org, repositoryName) => {
928
- if (repositoryName === 'archived') {
929
- throw new Error(
930
- 'Request failed with status code 403: Repository was archived so is read-only.',
931
- );
932
- }
933
- return 1;
934
- },
935
- );
936
-
937
- mockLocalCommandRunner.runCommand.mockImplementation(
938
- async (program, args) => {
939
- if (program === 'find') {
940
- return {
941
- stdout:
942
- '/repos/example-org/archived/.git\n/repos/example-org/app/.git\n',
943
- stderr: '',
944
- exitCode: 0,
945
- };
946
- }
947
- if (program === 'mktemp') {
948
- return {
949
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
950
- stderr: '',
951
- exitCode: 0,
952
- };
953
- }
954
- if (program === 'git') {
955
- const dir = args[1];
956
- const repo = dir.split('/').pop() ?? '';
957
- return {
958
- stdout: `git@github.com:example-org/${repo}.git\n`,
959
- stderr: '',
960
- exitCode: 0,
961
- };
962
- }
963
- if (program === 'osv-scanner') {
964
- return {
965
- stdout: JSON.stringify({
966
- results: [
967
- {
968
- source: {
969
- path: args[args.indexOf('-r') + 1],
970
- type: 'lockfile',
971
- },
972
- packages: [
973
- {
974
- package: {
975
- name: 'example-library',
976
- version: '1.2.3',
977
- ecosystem: 'npm',
978
- },
979
- vulnerabilities: [
980
- {
981
- id: 'GHSA-1111-2222-3333',
982
- aliases: [],
983
- summary: 'Example Library Deserialization',
984
- },
985
- ],
986
- },
987
- ],
988
- },
989
- ],
990
- }),
991
- stderr: '',
992
- exitCode: 1,
993
- };
994
- }
995
- return { stdout: '', stderr: '', exitCode: 0 };
996
- },
997
- );
998
-
999
- await useCase.run({
1000
- targetDates: [new Date('2024-01-02T05:00:00Z')],
1001
- org: 'example-org',
1002
- manager: 'manager-name',
1003
- dailySecurityScan: {
1004
- scanBaseDirectory: '/repos',
1005
- targetHourUtc: 5,
1006
- },
1007
- });
1008
-
1009
- expect(errorSpy).toHaveBeenCalledWith(
1010
- expect.stringContaining('archived'),
1011
- );
1012
- expect(
1013
- mockIssueRepository.createNewIssue.mock.calls.map((call) => call[1]),
1014
- ).toEqual(['archived', 'app']);
1015
- errorSpy.mockRestore();
1016
- });
1017
-
1018
- it('logs an error and continues scanning remaining repositories when commenting on the existing findings issue fails', async () => {
1019
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
1020
- buildUseCase();
1021
- const errorSpy = jest
1022
- .spyOn(console, 'error')
1023
- .mockImplementation(() => undefined);
1024
-
1025
- mockIssueRepository.searchIssue.mockImplementation(
1026
- async ({ repositoryName }) =>
1027
- repositoryName === 'oversized'
1028
- ? [
1029
- {
1030
- url: 'https://github.com/example-org/oversized/issues/1',
1031
- title: 'Daily security scan findings',
1032
- number: '1',
1033
- },
1034
- ]
1035
- : [],
1036
- );
1037
- mockIssueRepository.createCommentByUrl.mockRejectedValue(
1038
- new Error('Request failed with status code 422: Validation Failed'),
1039
- );
1040
-
1041
- mockLocalCommandRunner.runCommand.mockImplementation(
1042
- async (program, args) => {
1043
- if (program === 'find') {
1044
- return {
1045
- stdout:
1046
- '/repos/example-org/oversized/.git\n/repos/example-org/app/.git\n',
1047
- stderr: '',
1048
- exitCode: 0,
1049
- };
1050
- }
1051
- if (program === 'mktemp') {
1052
- return {
1053
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
1054
- stderr: '',
1055
- exitCode: 0,
1056
- };
1057
- }
1058
- if (program === 'git') {
1059
- const dir = args[1];
1060
- const repo = dir.split('/').pop() ?? '';
1061
- return {
1062
- stdout: `git@github.com:example-org/${repo}.git\n`,
1063
- stderr: '',
1064
- exitCode: 0,
1065
- };
1066
- }
1067
- if (program === 'osv-scanner') {
1068
- return {
1069
- stdout: JSON.stringify({
1070
- results: [
1071
- {
1072
- source: {
1073
- path: args[args.indexOf('-r') + 1],
1074
- type: 'lockfile',
1075
- },
1076
- packages: [
1077
- {
1078
- package: {
1079
- name: 'example-library',
1080
- version: '1.2.3',
1081
- ecosystem: 'npm',
1082
- },
1083
- vulnerabilities: [
1084
- {
1085
- id: 'GHSA-1111-2222-3333',
1086
- aliases: [],
1087
- summary: 'Example Library Deserialization',
1088
- },
1089
- ],
1090
- },
1091
- ],
1092
- },
1093
- ],
1094
- }),
1095
- stderr: '',
1096
- exitCode: 1,
1097
- };
1098
- }
1099
- return { stdout: '', stderr: '', exitCode: 0 };
1100
- },
1101
- );
1102
-
1103
- await useCase.run({
1104
- targetDates: [new Date('2024-01-02T05:00:00Z')],
1105
- org: 'example-org',
1106
- manager: 'manager-name',
1107
- dailySecurityScan: {
1108
- scanBaseDirectory: '/repos',
1109
- targetHourUtc: 5,
1110
- },
1111
- });
1112
-
1113
- expect(errorSpy).toHaveBeenCalledWith(
1114
- expect.stringContaining('oversized'),
1115
- );
1116
- expect(
1117
- mockIssueRepository.createNewIssue.mock.calls.map((call) => call[1]),
1118
- ).toEqual(['app']);
1119
- errorSpy.mockRestore();
1120
- });
1121
-
1122
- it('adds a comment to the existing open issue for the repository instead of creating a new one', async () => {
1123
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
1124
- buildUseCase();
1125
-
1126
- mockIssueRepository.searchIssue.mockResolvedValue([
1127
- {
1128
- url: 'https://github.com/example-org/app/issues/42',
1129
- title: 'Daily security scan findings',
1130
- number: '42',
1131
- },
1132
- ]);
1133
-
1134
- mockLocalCommandRunner.runCommand.mockImplementation(
1135
- async (program, args) => {
1136
- if (program === 'find') {
1137
- return {
1138
- stdout: '/repos/example-org/app/.git\n',
1139
- stderr: '',
1140
- exitCode: 0,
1141
- };
1142
- }
1143
- if (program === 'mktemp') {
1144
- return {
1145
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
1146
- stderr: '',
1147
- exitCode: 0,
1148
- };
1149
- }
1150
- if (program === 'git') {
1151
- return {
1152
- stdout: 'git@github.com:example-org/app.git\n',
1153
- stderr: '',
1154
- exitCode: 0,
1155
- };
1156
- }
1157
- if (program === 'osv-scanner') {
1158
- return { stdout: 'vulnerability found', stderr: '', exitCode: 1 };
1159
- }
1160
- return { stdout: '', stderr: '', exitCode: 0 };
1161
- },
1162
- );
1163
-
1164
- await useCase.run({
1165
- targetDates: [new Date('2024-01-02T05:00:00Z')],
1166
- org: 'example-org',
1167
- manager: 'manager-name',
1168
- dailySecurityScan: {
1169
- scanBaseDirectory: '/repos',
1170
- targetHourUtc: 5,
1171
- },
1172
- });
1173
-
1174
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(0);
1175
- expect(mockIssueRepository.createCommentByUrl.mock.calls).toHaveLength(1);
1176
- expect(mockIssueRepository.createCommentByUrl.mock.calls[0][0]).toBe(
1177
- 'https://github.com/example-org/app/issues/42',
1178
- );
1179
- expect(mockIssueRepository.createCommentByUrl.mock.calls[0][1]).toContain(
1180
- '2024-01-02',
1181
- );
1182
- });
1183
-
1184
- it('creates a new issue when no existing open issue exists for the repository', async () => {
1185
- const { useCase, mockLocalCommandRunner, mockIssueRepository } =
1186
- buildUseCase();
1187
-
1188
- mockIssueRepository.searchIssue.mockResolvedValue([]);
1189
-
1190
- mockLocalCommandRunner.runCommand.mockImplementation(
1191
- async (program, args) => {
1192
- if (program === 'find') {
1193
- return {
1194
- stdout: '/repos/example-org/app/.git\n',
1195
- stderr: '',
1196
- exitCode: 0,
1197
- };
1198
- }
1199
- if (program === 'mktemp') {
1200
- return {
1201
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
1202
- stderr: '',
1203
- exitCode: 0,
1204
- };
1205
- }
1206
- if (program === 'git') {
1207
- return {
1208
- stdout: 'git@github.com:example-org/app.git\n',
1209
- stderr: '',
1210
- exitCode: 0,
1211
- };
1212
- }
1213
- if (program === 'osv-scanner') {
1214
- return { stdout: 'vulnerability found', stderr: '', exitCode: 1 };
1215
- }
1216
- return { stdout: '', stderr: '', exitCode: 0 };
1217
- },
1218
- );
1219
-
1220
- await useCase.run({
1221
- targetDates: [new Date('2024-01-02T05:00:00Z')],
1222
- org: 'example-org',
1223
- manager: 'manager-name',
1224
- dailySecurityScan: {
1225
- scanBaseDirectory: '/repos',
1226
- targetHourUtc: 5,
1227
- },
1228
- });
1229
-
1230
- expect(mockIssueRepository.createNewIssue.mock.calls).toHaveLength(1);
1231
- expect(mockIssueRepository.createNewIssue.mock.calls[0][2]).toBe(
1232
- 'Daily security scan findings',
1233
- );
1234
- expect(mockIssueRepository.createCommentByUrl.mock.calls).toHaveLength(0);
1235
- });
1236
-
1237
- const osvScanOutput = (
1238
- vulnerablePackages: {
1239
- name: string;
1240
- version: string;
1241
- ecosystem: string;
1242
- id: string;
1243
- aliases: string[];
1244
- summary: string;
1245
- }[],
1246
- ): string =>
1247
- JSON.stringify({
1248
- results: [
1249
- {
1250
- source: { path: '/repos/example-org/app', type: 'lockfile' },
1251
- packages: vulnerablePackages.map((vulnerablePackage) => ({
1252
- package: {
1253
- name: vulnerablePackage.name,
1254
- version: vulnerablePackage.version,
1255
- ecosystem: vulnerablePackage.ecosystem,
1256
- },
1257
- vulnerabilities: [
1258
- {
1259
- id: vulnerablePackage.id,
1260
- aliases: vulnerablePackage.aliases,
1261
- summary: vulnerablePackage.summary,
1262
- },
1263
- ],
1264
- })),
1265
- },
1266
- ],
1267
- });
1268
-
1269
- const buildScanEnvironment = (scanOutput: string, kevCatalog: unknown) => {
1270
- const built = buildUseCase();
1271
- built.mockIssueRepository.searchIssue.mockResolvedValue([]);
1272
- built.mockLocalCommandRunner.runCommand.mockImplementation(
1273
- async (program, args) => {
1274
- if (program === 'find') {
1275
- return {
1276
- stdout: '/repos/example-org/app/.git\n',
1277
- stderr: '',
1278
- exitCode: 0,
1279
- };
1280
- }
1281
- if (program === 'mktemp') {
1282
- return {
1283
- stdout: `/tmp/${args[args.length - 1].replace('XXXXXX', 'abc123')}\n`,
1284
- stderr: '',
1285
- exitCode: 0,
1286
- };
1287
- }
1288
- if (program === 'git') {
1289
- return {
1290
- stdout: 'git@github.com:example-org/app.git\n',
1291
- stderr: '',
1292
- exitCode: 0,
1293
- };
1294
- }
1295
- if (program === 'osv-scanner') {
1296
- return { stdout: scanOutput, stderr: '', exitCode: 1 };
1297
- }
1298
- return { stdout: '', stderr: '', exitCode: 0 };
1299
- },
1300
- );
1301
- built.mockHttpRepository.get.mockResolvedValue(
1302
- JSON.stringify(kevCatalog),
1303
- );
1304
- return built;
1305
- };
1306
-
1307
- const kevReportCalls = (
1308
- calls: [string, string, string, string, string[], string[]][],
1309
- ) => calls.filter((call) => call[1] === 'security-reports');
1310
-
1311
- const runWithKevReporting = async (useCase: DailySecurityScanUseCase) =>
1312
- useCase.run({
1313
- targetDates: [new Date('2024-01-02T05:00:00Z')],
1314
- org: 'example-org',
1315
- manager: 'manager-name',
1316
- dailySecurityScan: {
1317
- scanBaseDirectory: '/repos',
1318
- targetHourUtc: 5,
1319
- enableKevNvdReport: true,
1320
- kevReportRepo: 'security-reports',
1321
- },
1322
- });
1323
-
1324
- it('still reports KEV additions when the scanned repository findings issue cannot be written', async () => {
1325
- const { useCase, mockIssueRepository } = buildScanEnvironment(
1326
- osvScanOutput([
1327
- {
1328
- name: 'example-library',
1329
- version: '1.2.3',
1330
- ecosystem: 'npm',
1331
- id: 'GHSA-1111-2222-3333',
1332
- aliases: ['CVE-2024-0001'],
1333
- summary: 'Example Library Deserialization',
1334
- },
1335
- ]),
1336
- {
1337
- vulnerabilities: [
1338
- {
1339
- cveID: 'CVE-2024-0001',
1340
- vendorProject: 'Example',
1341
- product: 'Example Library',
1342
- vulnerabilityName: 'Example Library Deserialization',
1343
- dateAdded: '2024-01-02',
1344
- },
1345
- ],
1346
- },
1347
- );
1348
- const errorSpy = jest
1349
- .spyOn(console, 'error')
1350
- .mockImplementation(() => undefined);
1351
- mockIssueRepository.createNewIssue.mockImplementation(
1352
- async (_org, repositoryName) => {
1353
- if (repositoryName === 'app') {
1354
- throw new Error(
1355
- 'Request failed with status code 403: Repository was archived so is read-only.',
1356
- );
1357
- }
1358
- return 1;
1359
- },
1360
- );
1361
-
1362
- await runWithKevReporting(useCase);
1363
-
1364
- expect(errorSpy).toHaveBeenCalledWith(expect.stringContaining('app'));
1365
- expect(
1366
- kevReportCalls(mockIssueRepository.createNewIssue.mock.calls),
1367
- ).toHaveLength(1);
1368
- errorSpy.mockRestore();
1369
- });
1370
-
1371
- it('reports a KEV addition whose CVE the scanner found at an installed version', async () => {
1372
- const { useCase, mockIssueRepository } = buildScanEnvironment(
1373
- osvScanOutput([
1374
- {
1375
- name: 'example-library',
1376
- version: '1.2.3',
1377
- ecosystem: 'npm',
1378
- id: 'GHSA-1111-2222-3333',
1379
- aliases: ['CVE-2024-0001'],
1380
- summary: 'Example Library Deserialization',
1381
- },
1382
- ]),
1383
- {
1384
- vulnerabilities: [
1385
- {
1386
- cveID: 'CVE-2024-0001',
1387
- vendorProject: 'Example',
1388
- product: 'ExampleLibrary',
1389
- vulnerabilityName: 'Example Library Deserialization',
1390
- dateAdded: '2024-01-02',
1391
- },
1392
- ],
1393
- },
1394
- );
1395
-
1396
- await runWithKevReporting(useCase);
1397
-
1398
- const kevCalls = kevReportCalls(
1399
- mockIssueRepository.createNewIssue.mock.calls,
1400
- );
1401
- expect(kevCalls).toHaveLength(1);
1402
- expect(kevCalls[0][3]).toContain('CVE-2024-0001');
1403
- expect(kevCalls[0][3]).toContain('app');
1404
- expect(kevCalls[0][3]).toContain('example-library');
1405
- expect(kevCalls[0][3]).toContain('1.2.3');
1406
- });
1407
-
1408
- it('does not report a KEV addition that the scanner did not find in any repository', async () => {
1409
- const { useCase, mockIssueRepository } = buildScanEnvironment(
1410
- osvScanOutput([
1411
- {
1412
- name: 'example-library',
1413
- version: '1.2.3',
1414
- ecosystem: 'npm',
1415
- id: 'GHSA-1111-2222-3333',
1416
- aliases: ['CVE-2024-0001'],
1417
- summary: 'Example Library Deserialization',
1418
- },
1419
- ]),
1420
- {
1421
- vulnerabilities: [
1422
- {
1423
- cveID: 'CVE-2024-9999',
1424
- vendorProject: 'Progress',
1425
- product: 'LoadMaster',
1426
- vulnerabilityName: 'Progress LoadMaster Command Injection',
1427
- dateAdded: '2024-01-02',
1428
- },
1429
- ],
1430
- },
1431
- );
1432
-
1433
- await runWithKevReporting(useCase);
1434
-
1435
- expect(
1436
- kevReportCalls(mockIssueRepository.createNewIssue.mock.calls),
1437
- ).toHaveLength(0);
1438
- });
1439
-
1440
- it('reports a KEV addition whose CVE the scanner returned as the vulnerability id rather than an alias', async () => {
1441
- const { useCase, mockIssueRepository } = buildScanEnvironment(
1442
- osvScanOutput([
1443
- {
1444
- name: 'example-library',
1445
- version: '1.2.3',
1446
- ecosystem: 'npm',
1447
- id: 'CVE-2024-0001',
1448
- aliases: [],
1449
- summary: 'Example Library Deserialization',
1450
- },
1451
- ]),
1452
- {
1453
- vulnerabilities: [
1454
- {
1455
- cveID: 'CVE-2024-0001',
1456
- vendorProject: 'Example',
1457
- product: 'ExampleLibrary',
1458
- vulnerabilityName: 'Example Library Deserialization',
1459
- dateAdded: '2024-01-02',
1460
- },
1461
- ],
1462
- },
1463
- );
1464
-
1465
- await runWithKevReporting(useCase);
1466
-
1467
- expect(
1468
- kevReportCalls(mockIssueRepository.createNewIssue.mock.calls),
1469
- ).toHaveLength(1);
1470
- });
1471
-
1472
- it('does not search the repositories for the KEV product name', async () => {
1473
- const { useCase, mockLocalCommandRunner } = buildScanEnvironment(
1474
- osvScanOutput([
1475
- {
1476
- name: 'example-library',
1477
- version: '1.2.3',
1478
- ecosystem: 'npm',
1479
- id: 'GHSA-1111-2222-3333',
1480
- aliases: ['CVE-2024-0001'],
1481
- summary: 'Example Library Deserialization',
1482
- },
1483
- ]),
1484
- {
1485
- vulnerabilities: [
1486
- {
1487
- cveID: 'CVE-2024-0001',
1488
- vendorProject: 'Example',
1489
- product: 'ExampleLibrary',
1490
- vulnerabilityName: 'Example Library Deserialization',
1491
- dateAdded: '2024-01-02',
1492
- },
1493
- ],
1494
- },
1495
- );
1496
-
1497
- await runWithKevReporting(useCase);
1498
-
1499
- const grepCalls = mockLocalCommandRunner.runCommand.mock.calls.filter(
1500
- (call) => call[0] === 'git' && call[1].includes('grep'),
1501
- );
1502
- expect(grepCalls).toHaveLength(0);
1503
- });
1504
-
1505
- const scannedExampleLibrary = osvScanOutput([
1506
- {
1507
- name: 'example-library',
1508
- version: '1.2.3',
1509
- ecosystem: 'npm',
1510
- id: 'GHSA-1111-2222-3333',
1511
- aliases: ['CVE-2024-0001', 'CVE-2024-0002', 'CVE-2024-0003'],
1512
- summary: 'Example Library Deserialization',
1513
- },
1514
- ]);
1515
-
1516
- const kevCatalogOf = (
1517
- vulnerabilities: { cveID: string; dateAdded: string }[],
1518
- ) => ({
1519
- vulnerabilities: vulnerabilities.map((vulnerability) => ({
1520
- cveID: vulnerability.cveID,
1521
- vendorProject: 'Example',
1522
- product: 'ExampleLibrary',
1523
- vulnerabilityName: `${vulnerability.cveID} Deserialization`,
1524
- dateAdded: vulnerability.dateAdded,
1525
- })),
1526
- });
1527
-
1528
- it('records every addition it considered in the watermark after the report issue is created', async () => {
1529
- const { useCase, mockIssueRepository, mockKevReportWatermarkRepository } =
1530
- buildScanEnvironment(
1531
- scannedExampleLibrary,
1532
- kevCatalogOf([
1533
- { cveID: 'CVE-2024-0001', dateAdded: '2024-01-01' },
1534
- { cveID: 'CVE-2024-0002', dateAdded: '2024-01-02' },
1535
- ]),
1536
- );
1537
-
1538
- await runWithKevReporting(useCase);
1539
-
1540
- expect(
1541
- kevReportCalls(mockIssueRepository.createNewIssue.mock.calls),
1542
- ).toHaveLength(1);
1543
- expect(mockKevReportWatermarkRepository.save.mock.calls).toEqual([
1544
- [
1545
- {
1546
- lastReportedDateAdded: '2024-01-02',
1547
- reportedCveIdsOnLastReportedDateAdded: ['CVE-2024-0002'],
1548
- },
1549
- ],
1550
- ]);
1551
- });
1552
-
1553
- it('does not report an addition that the stored watermark already covers', async () => {
1554
- const { useCase, mockIssueRepository, mockKevReportWatermarkRepository } =
1555
- buildScanEnvironment(
1556
- scannedExampleLibrary,
1557
- kevCatalogOf([{ cveID: 'CVE-2024-0001', dateAdded: '2024-01-02' }]),
1558
- );
1559
- mockKevReportWatermarkRepository.load.mockResolvedValue({
1560
- type: 'stored',
1561
- watermark: {
1562
- lastReportedDateAdded: '2024-01-02',
1563
- reportedCveIdsOnLastReportedDateAdded: ['CVE-2024-0001'],
1564
- },
1565
- });
1566
-
1567
- await runWithKevReporting(useCase);
1568
-
1569
- expect(
1570
- kevReportCalls(mockIssueRepository.createNewIssue.mock.calls),
1571
- ).toHaveLength(0);
1572
- expect(mockKevReportWatermarkRepository.save.mock.calls).toHaveLength(0);
1573
- });
1574
-
1575
- it('reports an addition sharing the stored watermark date that was not reported before', async () => {
1576
- const { useCase, mockIssueRepository, mockKevReportWatermarkRepository } =
1577
- buildScanEnvironment(
1578
- scannedExampleLibrary,
1579
- kevCatalogOf([
1580
- { cveID: 'CVE-2024-0001', dateAdded: '2024-01-02' },
1581
- { cveID: 'CVE-2024-0002', dateAdded: '2024-01-02' },
1582
- ]),
1583
- );
1584
- mockKevReportWatermarkRepository.load.mockResolvedValue({
1585
- type: 'stored',
1586
- watermark: {
1587
- lastReportedDateAdded: '2024-01-02',
1588
- reportedCveIdsOnLastReportedDateAdded: ['CVE-2024-0001'],
1589
- },
1590
- });
1591
-
1592
- await runWithKevReporting(useCase);
1593
-
1594
- const kevCalls = kevReportCalls(
1595
- mockIssueRepository.createNewIssue.mock.calls,
1596
- );
1597
- expect(kevCalls).toHaveLength(1);
1598
- expect(kevCalls[0][3]).toContain('CVE-2024-0002');
1599
- expect(kevCalls[0][3]).not.toContain('CVE-2024-0001');
1600
- expect(mockKevReportWatermarkRepository.save.mock.calls).toEqual([
1601
- [
1602
- {
1603
- lastReportedDateAdded: '2024-01-02',
1604
- reportedCveIdsOnLastReportedDateAdded: [
1605
- 'CVE-2024-0001',
1606
- 'CVE-2024-0002',
1607
- ],
1608
- },
1609
- ],
1610
- ]);
1611
- });
1612
-
1613
- it('does not select an addition dated strictly before the stored watermark date', async () => {
1614
- const { useCase, mockIssueRepository, mockKevReportWatermarkRepository } =
1615
- buildScanEnvironment(
1616
- scannedExampleLibrary,
1617
- kevCatalogOf([{ cveID: 'CVE-2024-0001', dateAdded: '2024-01-01' }]),
1618
- );
1619
- mockKevReportWatermarkRepository.load.mockResolvedValue({
1620
- type: 'stored',
1621
- watermark: {
1622
- lastReportedDateAdded: '2024-01-02',
1623
- reportedCveIdsOnLastReportedDateAdded: [],
1624
- },
1625
- });
1626
-
1627
- await runWithKevReporting(useCase);
1628
-
1629
- expect(
1630
- kevReportCalls(mockIssueRepository.createNewIssue.mock.calls),
1631
- ).toHaveLength(0);
1632
- expect(mockKevReportWatermarkRepository.save.mock.calls).toHaveLength(0);
1633
- });
1634
-
1635
- it('advances the watermark over an addition that affects no scanned package so it is not weighed again', async () => {
1636
- const { useCase, mockIssueRepository, mockKevReportWatermarkRepository } =
1637
- buildScanEnvironment(
1638
- scannedExampleLibrary,
1639
- kevCatalogOf([{ cveID: 'CVE-2024-9999', dateAdded: '2024-01-02' }]),
1640
- );
1641
-
1642
- await runWithKevReporting(useCase);
1643
-
1644
- expect(
1645
- kevReportCalls(mockIssueRepository.createNewIssue.mock.calls),
1646
- ).toHaveLength(0);
1647
- expect(mockKevReportWatermarkRepository.save.mock.calls).toEqual([
1648
- [
1649
- {
1650
- lastReportedDateAdded: '2024-01-02',
1651
- reportedCveIdsOnLastReportedDateAdded: ['CVE-2024-9999'],
1652
- },
1653
- ],
1654
- ]);
1655
- });
1656
-
1657
- it('skips the report and leaves the watermark untouched when the stored watermark is unreadable', async () => {
1658
- const { useCase, mockIssueRepository, mockKevReportWatermarkRepository } =
1659
- buildScanEnvironment(
1660
- scannedExampleLibrary,
1661
- kevCatalogOf([{ cveID: 'CVE-2024-0001', dateAdded: '2024-01-02' }]),
1662
- );
1663
- mockKevReportWatermarkRepository.load.mockResolvedValue({
1664
- type: 'unreadable',
1665
- reason: 'the stored watermark file holds malformed JSON',
1666
- });
1667
- const errorSpy = jest
1668
- .spyOn(console, 'error')
1669
- .mockImplementation(() => {});
1670
-
1671
- await runWithKevReporting(useCase);
1672
-
1673
- expect(
1674
- kevReportCalls(mockIssueRepository.createNewIssue.mock.calls),
1675
- ).toHaveLength(0);
1676
- expect(mockKevReportWatermarkRepository.save.mock.calls).toHaveLength(0);
1677
- expect(errorSpy).toHaveBeenCalledWith(
1678
- expect.stringContaining(
1679
- 'the stored watermark file holds malformed JSON',
1680
- ),
1681
- );
1682
- errorSpy.mockRestore();
1683
- });
1684
-
1685
- it('creates the report issue and logs when the watermark write fails, so the same additions are weighed again', async () => {
1686
- const { useCase, mockIssueRepository, mockKevReportWatermarkRepository } =
1687
- buildScanEnvironment(
1688
- scannedExampleLibrary,
1689
- kevCatalogOf([{ cveID: 'CVE-2024-0001', dateAdded: '2024-01-02' }]),
1690
- );
1691
- mockKevReportWatermarkRepository.save.mockRejectedValue(
1692
- new Error('disk is read-only'),
1693
- );
1694
- const errorSpy = jest
1695
- .spyOn(console, 'error')
1696
- .mockImplementation(() => {});
1697
-
1698
- await runWithKevReporting(useCase);
1699
-
1700
- expect(
1701
- kevReportCalls(mockIssueRepository.createNewIssue.mock.calls),
1702
- ).toHaveLength(1);
1703
- expect(errorSpy).toHaveBeenCalledWith(
1704
- expect.stringContaining('disk is read-only'),
1705
- );
1706
- errorSpy.mockRestore();
1707
- });
1708
- });
1709
- });