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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (795) hide show
  1. package/bin/adapter/entry-points/cli/index.js +1 -3
  2. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  3. package/bin/adapter/entry-points/console/consoleOperationApi.js +6 -12
  4. package/bin/adapter/entry-points/console/consoleOperationApi.js.map +1 -1
  5. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +1 -1
  6. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
  7. package/bin/adapter/repositories/issue/RestIssueRepository.js +9 -2
  8. package/bin/adapter/repositories/issue/RestIssueRepository.js.map +1 -1
  9. package/package.json +5 -1
  10. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  11. package/types/adapter/entry-points/console/consoleOperationApi.d.ts.map +1 -1
  12. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +1 -1
  13. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
  14. package/types/adapter/repositories/issue/RestIssueRepository.d.ts +5 -1
  15. package/types/adapter/repositories/issue/RestIssueRepository.d.ts.map +1 -1
  16. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +1 -1
  17. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
  18. package/.env.example +0 -7
  19. package/.gitattributes +0 -2
  20. package/.github/CODEOWNERS +0 -6
  21. package/.github/copilot-instructions.md +0 -6
  22. package/.github/dependabot.yml +0 -19
  23. package/.github/instructions/code-review.instructions.md +0 -50
  24. package/.github/workflows/api-created_issue_pr.yml +0 -97
  25. package/.github/workflows/ci-failure-issue-creator.yml +0 -48
  26. package/.github/workflows/close-manual-prs.yml +0 -80
  27. package/.github/workflows/codeql.yml +0 -107
  28. package/.github/workflows/commit-lint.yml +0 -85
  29. package/.github/workflows/configs/commitlint.config.cjs +0 -32
  30. package/.github/workflows/configs/commitlint.config.js +0 -32
  31. package/.github/workflows/console-ui.yml +0 -68
  32. package/.github/workflows/create-pr.yml +0 -116
  33. package/.github/workflows/empty-format-test-job.yml +0 -34
  34. package/.github/workflows/format.yml +0 -28
  35. package/.github/workflows/publish.yml +0 -111
  36. package/.github/workflows/secret-scan.yml +0 -51
  37. package/.github/workflows/test.yml +0 -58
  38. package/.github/workflows/umino-project.yml +0 -207
  39. package/.gitleaks.toml +0 -22
  40. package/.prettierignore +0 -31
  41. package/.prettierrc +0 -5
  42. package/CHANGELOG.md +0 -4162
  43. package/CONTRIBUTING.md +0 -60
  44. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js +0 -12
  45. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js.map +0 -1
  46. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js +0 -125
  47. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js.map +0 -1
  48. package/bin/adapter/repositories/issue/issueTimelineUtils.js +0 -38
  49. package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +0 -1
  50. package/bin/domain/entities/UnansweredOwnerCall.js +0 -3
  51. package/bin/domain/entities/UnansweredOwnerCall.js.map +0 -1
  52. package/bin/domain/entities/WorkingTime.js +0 -3
  53. package/bin/domain/entities/WorkingTime.js.map +0 -1
  54. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js +0 -37
  55. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js.map +0 -1
  56. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js +0 -118
  57. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js.map +0 -1
  58. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +0 -180
  59. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +0 -1
  60. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js +0 -160
  61. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js.map +0 -1
  62. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js +0 -3
  63. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js.map +0 -1
  64. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js +0 -7
  65. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js.map +0 -1
  66. package/bin/domain/usecases/findLastAgentDeclaringReport.js +0 -12
  67. package/bin/domain/usecases/findLastAgentDeclaringReport.js.map +0 -1
  68. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js +0 -25
  69. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js.map +0 -1
  70. package/bin/domain/usecases/isWaitingForOwnerApproval.js +0 -16
  71. package/bin/domain/usecases/isWaitingForOwnerApproval.js.map +0 -1
  72. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js +0 -7
  73. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js.map +0 -1
  74. package/commitlint.config.js +0 -6
  75. package/eslint.config.mjs +0 -76
  76. package/jest.config.js +0 -84
  77. package/jest.setup.js +0 -1
  78. package/lib/buffer-equal-constant-time-compat/index.js +0 -17
  79. package/lib/buffer-equal-constant-time-compat/index.test.js +0 -54
  80. package/lib/buffer-equal-constant-time-compat/package.json +0 -5
  81. package/lib/typescript-compat/bin/tsc +0 -2
  82. package/lib/typescript-compat/bin/tsserver +0 -2
  83. package/lib/typescript-compat/lib/typescript.js +0 -1
  84. package/lib/typescript-compat/package.json +0 -13
  85. package/renovate.json +0 -46
  86. package/scripts/copyConsoleUiDist.mjs +0 -35
  87. package/scripts/defaultBranchTipVerify.sh +0 -23
  88. package/scripts/testWorkflowRunVerify.sh +0 -47
  89. package/scripts/verifyConsoleUiDist.mjs +0 -96
  90. package/src/adapter/ci/consoleUiWorkflowTimeout.test.ts +0 -61
  91. package/src/adapter/ci/publishTestWorkflowGate.test.ts +0 -653
  92. package/src/adapter/ci/workflowRunCancellation.test.ts +0 -72
  93. package/src/adapter/entry-points/cli/fleetConfig.test.ts +0 -553
  94. package/src/adapter/entry-points/cli/fleetConfig.ts +0 -266
  95. package/src/adapter/entry-points/cli/index.test.ts +0 -2837
  96. package/src/adapter/entry-points/cli/index.ts +0 -1488
  97. package/src/adapter/entry-points/cli/projectConfig.test.ts +0 -342
  98. package/src/adapter/entry-points/cli/projectConfig.ts +0 -500
  99. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.test.ts +0 -658
  100. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.ts +0 -482
  101. package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +0 -222
  102. package/src/adapter/entry-points/console/consoleDataDelivery.ts +0 -134
  103. package/src/adapter/entry-points/console/consoleDoneStore.test.ts +0 -169
  104. package/src/adapter/entry-points/console/consoleDoneStore.ts +0 -139
  105. package/src/adapter/entry-points/console/consoleGithubTokenResolver.test.ts +0 -275
  106. package/src/adapter/entry-points/console/consoleGithubTokenResolver.ts +0 -113
  107. package/src/adapter/entry-points/console/consoleImageProxy.test.ts +0 -140
  108. package/src/adapter/entry-points/console/consoleImageProxy.ts +0 -111
  109. package/src/adapter/entry-points/console/consoleItemUrlLookup.test.ts +0 -63
  110. package/src/adapter/entry-points/console/consoleItemUrlLookup.ts +0 -66
  111. package/src/adapter/entry-points/console/consoleOperationApi.test.ts +0 -2523
  112. package/src/adapter/entry-points/console/consoleOperationApi.ts +0 -936
  113. package/src/adapter/entry-points/console/consoleProjectResolver.test.ts +0 -246
  114. package/src/adapter/entry-points/console/consoleProjectResolver.ts +0 -111
  115. package/src/adapter/entry-points/console/consoleReadApi.test.ts +0 -714
  116. package/src/adapter/entry-points/console/consoleReadApi.ts +0 -361
  117. package/src/adapter/entry-points/console/consoleTabNames.test.ts +0 -52
  118. package/src/adapter/entry-points/console/consoleTabNames.ts +0 -37
  119. package/src/adapter/entry-points/console/consoleUiDistSync.test.ts +0 -66
  120. package/src/adapter/entry-points/console/dashboardComposeService.test.ts +0 -595
  121. package/src/adapter/entry-points/console/dashboardComposeService.ts +0 -256
  122. package/src/adapter/entry-points/console/dashboardEmitterComposerKey.test.ts +0 -180
  123. package/src/adapter/entry-points/console/ensureConsoleRunning.test.ts +0 -115
  124. package/src/adapter/entry-points/console/ensureConsoleRunning.ts +0 -64
  125. package/src/adapter/entry-points/console/ui/.storybook/main.ts +0 -12
  126. package/src/adapter/entry-points/console/ui/.storybook/preview.ts +0 -15
  127. package/src/adapter/entry-points/console/ui/biome.json +0 -53
  128. package/src/adapter/entry-points/console/ui/components.json +0 -20
  129. package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +0 -725
  130. package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +0 -831
  131. package/src/adapter/entry-points/console/ui/e2e/playwright.config.ts +0 -30
  132. package/src/adapter/entry-points/console/ui/e2e/tsconfig.json +0 -18
  133. package/src/adapter/entry-points/console/ui/index.html +0 -12
  134. package/src/adapter/entry-points/console/ui/jest-globals.cjs +0 -26
  135. package/src/adapter/entry-points/console/ui/jest.setup.ts +0 -1
  136. package/src/adapter/entry-points/console/ui/jest.styleMock.js +0 -1
  137. package/src/adapter/entry-points/console/ui/public/sw.js +0 -60
  138. package/src/adapter/entry-points/console/ui/src/components/ui/badge.stories.tsx +0 -35
  139. package/src/adapter/entry-points/console/ui/src/components/ui/badge.tsx +0 -28
  140. package/src/adapter/entry-points/console/ui/src/components/ui/button.stories.tsx +0 -34
  141. package/src/adapter/entry-points/console/ui/src/components/ui/button.tsx +0 -50
  142. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.stories.tsx +0 -28
  143. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.test.tsx +0 -65
  144. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.tsx +0 -19
  145. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.stories.tsx +0 -61
  146. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.test.tsx +0 -199
  147. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.tsx +0 -166
  148. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.stories.tsx +0 -22
  149. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.test.tsx +0 -74
  150. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.tsx +0 -84
  151. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.stories.tsx +0 -27
  152. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.test.tsx +0 -85
  153. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.tsx +0 -97
  154. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.stories.tsx +0 -76
  155. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.test.tsx +0 -56
  156. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.tsx +0 -39
  157. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.stories.tsx +0 -32
  158. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.test.tsx +0 -105
  159. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.tsx +0 -157
  160. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.stories.tsx +0 -68
  161. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.test.tsx +0 -612
  162. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.tsx +0 -276
  163. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.stories.tsx +0 -33
  164. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.test.tsx +0 -57
  165. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.tsx +0 -76
  166. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.stories.tsx +0 -25
  167. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.test.tsx +0 -55
  168. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.tsx +0 -49
  169. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.stories.tsx +0 -24
  170. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.test.tsx +0 -63
  171. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.tsx +0 -19
  172. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.stories.tsx +0 -33
  173. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.test.tsx +0 -62
  174. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.tsx +0 -59
  175. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.stories.tsx +0 -38
  176. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.test.tsx +0 -151
  177. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.tsx +0 -245
  178. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.stories.tsx +0 -514
  179. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.test.tsx +0 -727
  180. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.tsx +0 -387
  181. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.stories.tsx +0 -82
  182. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.test.tsx +0 -52
  183. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.tsx +0 -32
  184. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.stories.tsx +0 -48
  185. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.test.tsx +0 -235
  186. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.tsx +0 -145
  187. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.stories.tsx +0 -29
  188. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.test.tsx +0 -30
  189. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.tsx +0 -50
  190. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.stories.tsx +0 -38
  191. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.test.tsx +0 -54
  192. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.tsx +0 -60
  193. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.stories.tsx +0 -56
  194. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.test.tsx +0 -111
  195. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.tsx +0 -92
  196. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.stories.tsx +0 -51
  197. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.test.tsx +0 -59
  198. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.tsx +0 -39
  199. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +0 -207
  200. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +0 -332
  201. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.tsx +0 -211
  202. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.stories.tsx +0 -49
  203. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.test.tsx +0 -157
  204. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.tsx +0 -118
  205. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.stories.tsx +0 -23
  206. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.test.tsx +0 -40
  207. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.tsx +0 -17
  208. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.stories.tsx +0 -101
  209. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.test.tsx +0 -102
  210. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.tsx +0 -75
  211. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.stories.tsx +0 -40
  212. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.test.tsx +0 -213
  213. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.tsx +0 -115
  214. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.stories.tsx +0 -50
  215. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.test.tsx +0 -98
  216. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.tsx +0 -66
  217. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.stories.tsx +0 -69
  218. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.test.tsx +0 -101
  219. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.tsx +0 -75
  220. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.stories.tsx +0 -137
  221. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.test.tsx +0 -554
  222. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.tsx +0 -400
  223. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.stories.tsx +0 -30
  224. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.test.tsx +0 -111
  225. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.tsx +0 -91
  226. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.stories.tsx +0 -27
  227. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.test.tsx +0 -24
  228. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.tsx +0 -28
  229. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.stories.tsx +0 -14
  230. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.test.tsx +0 -21
  231. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.tsx +0 -26
  232. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.stories.tsx +0 -14
  233. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.test.tsx +0 -40
  234. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.tsx +0 -37
  235. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleErrorToast.stories.tsx +0 -33
  236. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.stories.tsx +0 -20
  237. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.test.tsx +0 -48
  238. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.tsx +0 -42
  239. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.stories.tsx +0 -115
  240. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.test.tsx +0 -262
  241. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.tsx +0 -123
  242. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +0 -65
  243. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +0 -159
  244. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +0 -55
  245. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.stories.tsx +0 -20
  246. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.test.tsx +0 -93
  247. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.tsx +0 -45
  248. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.stories.tsx +0 -17
  249. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.test.tsx +0 -49
  250. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.tsx +0 -66
  251. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.stories.tsx +0 -47
  252. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.test.tsx +0 -95
  253. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.tsx +0 -62
  254. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.stories.tsx +0 -32
  255. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.test.tsx +0 -101
  256. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.tsx +0 -80
  257. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.test.ts +0 -304
  258. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.ts +0 -167
  259. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.test.ts +0 -498
  260. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.ts +0 -277
  261. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.test.ts +0 -99
  262. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.ts +0 -90
  263. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.test.ts +0 -110
  264. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.ts +0 -83
  265. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.test.ts +0 -51
  266. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.ts +0 -39
  267. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.test.ts +0 -229
  268. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.ts +0 -194
  269. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +0 -151
  270. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.ts +0 -128
  271. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.test.ts +0 -629
  272. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.ts +0 -417
  273. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.test.ts +0 -40
  274. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.ts +0 -71
  275. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.test.ts +0 -24
  276. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.ts +0 -17
  277. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.test.ts +0 -97
  278. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.ts +0 -44
  279. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.test.ts +0 -59
  280. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.ts +0 -26
  281. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.test.ts +0 -48
  282. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.ts +0 -39
  283. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.test.ts +0 -41
  284. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.ts +0 -57
  285. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.test.ts +0 -115
  286. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.ts +0 -115
  287. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +0 -546
  288. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.ts +0 -278
  289. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.test.ts +0 -110
  290. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.ts +0 -70
  291. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.test.ts +0 -387
  292. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.ts +0 -407
  293. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.test.ts +0 -446
  294. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.ts +0 -533
  295. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.test.ts +0 -78
  296. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.ts +0 -34
  297. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.test.ts +0 -252
  298. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.ts +0 -207
  299. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.test.ts +0 -27
  300. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.ts +0 -71
  301. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.test.ts +0 -88
  302. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.ts +0 -34
  303. package/src/adapter/entry-points/console/ui/src/features/console/lib/navigation.ts +0 -7
  304. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.test.ts +0 -104
  305. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.ts +0 -79
  306. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +0 -200
  307. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.ts +0 -122
  308. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.test.ts +0 -90
  309. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.ts +0 -37
  310. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.test.ts +0 -34
  311. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.ts +0 -85
  312. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.test.ts +0 -81
  313. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.ts +0 -61
  314. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.test.ts +0 -35
  315. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.ts +0 -21
  316. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.test.ts +0 -96
  317. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.ts +0 -93
  318. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +0 -229
  319. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.ts +0 -106
  320. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.test.ts +0 -18
  321. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.ts +0 -16
  322. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.test.ts +0 -97
  323. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.ts +0 -95
  324. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.test.ts +0 -53
  325. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.ts +0 -33
  326. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.test.ts +0 -72
  327. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.ts +0 -61
  328. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +0 -325
  329. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.ts +0 -94
  330. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.test.ts +0 -44
  331. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.ts +0 -17
  332. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.test.ts +0 -103
  333. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.ts +0 -64
  334. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.test.ts +0 -74
  335. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.ts +0 -53
  336. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.test.ts +0 -34
  337. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.ts +0 -28
  338. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +0 -89
  339. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.ts +0 -30
  340. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.test.ts +0 -61
  341. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.ts +0 -77
  342. package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +0 -173
  343. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +0 -629
  344. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +0 -351
  345. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.test.tsx +0 -1469
  346. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +0 -736
  347. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleReferenceLinkContainer.tsx +0 -25
  348. package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +0 -418
  349. package/src/adapter/entry-points/console/ui/src/index.css +0 -1592
  350. package/src/adapter/entry-points/console/ui/src/lib/utils.ts +0 -4
  351. package/src/adapter/entry-points/console/ui/src/main.tsx +0 -21
  352. package/src/adapter/entry-points/console/ui/src/vite-env.d.ts +0 -1
  353. package/src/adapter/entry-points/console/ui/tsconfig.json +0 -26
  354. package/src/adapter/entry-points/console/ui/vite.config.ts +0 -24
  355. package/src/adapter/entry-points/console/ui-dist/assets/index-BYDbK1Fj.js +0 -88
  356. package/src/adapter/entry-points/console/ui-dist/assets/index-KyQISRuQ.css +0 -2
  357. package/src/adapter/entry-points/console/ui-dist/index.html +0 -13
  358. package/src/adapter/entry-points/console/ui-dist/sw.js +0 -60
  359. package/src/adapter/entry-points/console/webServer.test.ts +0 -2945
  360. package/src/adapter/entry-points/console/webServer.ts +0 -940
  361. package/src/adapter/entry-points/function/getStoryObjectMap.ts +0 -3
  362. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.test.ts +0 -218
  363. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.ts +0 -113
  364. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.test.ts +0 -110
  365. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.ts +0 -116
  366. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +0 -859
  367. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +0 -984
  368. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.test.ts +0 -126
  369. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.ts +0 -80
  370. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.test.ts +0 -491
  371. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts +0 -137
  372. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.test.ts +0 -508
  373. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts +0 -156
  374. package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +0 -332
  375. package/src/adapter/entry-points/handlers/consoleListsWriter.ts +0 -60
  376. package/src/adapter/entry-points/handlers/dashboardRowWriter.test.ts +0 -112
  377. package/src/adapter/entry-points/handlers/dashboardRowWriter.ts +0 -51
  378. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.test.ts +0 -285
  379. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts +0 -109
  380. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.test.ts +0 -170
  381. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.ts +0 -40
  382. package/src/adapter/entry-points/handlers/machineStatusWriter.test.ts +0 -191
  383. package/src/adapter/entry-points/handlers/machineStatusWriter.ts +0 -110
  384. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +0 -548
  385. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +0 -192
  386. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.test.ts +0 -111
  387. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.ts +0 -25
  388. package/src/adapter/entry-points/handlers/ownerCallFileStore.test.ts +0 -286
  389. package/src/adapter/entry-points/handlers/ownerCallFileStore.ts +0 -145
  390. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.test.ts +0 -55
  391. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.ts +0 -36
  392. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.test.ts +0 -72
  393. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.ts +0 -74
  394. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.test.ts +0 -181
  395. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.ts +0 -18
  396. package/src/adapter/entry-points/handlers/situationFileWriter.test.ts +0 -489
  397. package/src/adapter/entry-points/handlers/situationFileWriter.ts +0 -176
  398. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.test.ts +0 -169
  399. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.ts +0 -32
  400. package/src/adapter/entry-points/handlers/subscriptionDisabledTokenHandler.ts +0 -41
  401. package/src/adapter/entry-points/handlers/tokenExhaustionHandover.ts +0 -81
  402. package/src/adapter/entry-points/handlers/tokenStatusWriter.test.ts +0 -266
  403. package/src/adapter/entry-points/handlers/tokenStatusWriter.ts +0 -262
  404. package/src/adapter/proxy/ClaudeMessageResponseParser.test.ts +0 -211
  405. package/src/adapter/proxy/ClaudeMessageResponseParser.ts +0 -181
  406. package/src/adapter/proxy/RateLimitCache.test.ts +0 -1077
  407. package/src/adapter/proxy/RateLimitCache.ts +0 -385
  408. package/src/adapter/proxy/TokenListLoader.test.ts +0 -183
  409. package/src/adapter/proxy/TokenListLoader.ts +0 -75
  410. package/src/adapter/proxy/ensureProxyRunning.test.ts +0 -85
  411. package/src/adapter/proxy/ensureProxyRunning.ts +0 -41
  412. package/src/adapter/proxy/proxyEntry.test.ts +0 -552
  413. package/src/adapter/proxy/proxyEntry.ts +0 -214
  414. package/src/adapter/repositories/BaseGitHubRepository.test.ts +0 -26
  415. package/src/adapter/repositories/BaseGitHubRepository.ts +0 -26
  416. package/src/adapter/repositories/BrowserGitHubProjectRepository.test.ts +0 -108
  417. package/src/adapter/repositories/BrowserGitHubProjectRepository.ts +0 -118
  418. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.test.ts +0 -71
  419. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.ts +0 -21
  420. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.test.ts +0 -324
  421. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts +0 -148
  422. package/src/adapter/repositories/FetchWebhookRepository.ts +0 -8
  423. package/src/adapter/repositories/FileHandoverStateRepository.test.ts +0 -114
  424. package/src/adapter/repositories/FileHandoverStateRepository.ts +0 -73
  425. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.test.ts +0 -514
  426. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.ts +0 -109
  427. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.test.ts +0 -284
  428. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.ts +0 -128
  429. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.test.ts +0 -138
  430. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.ts +0 -113
  431. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.test.ts +0 -121
  432. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.ts +0 -103
  433. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +0 -360
  434. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +0 -77
  435. package/src/adapter/repositories/FileSystemSessionRecordReader.test.ts +0 -59
  436. package/src/adapter/repositories/FileSystemSessionRecordReader.ts +0 -31
  437. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.test.ts +0 -287
  438. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.ts +0 -125
  439. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.test.ts +0 -285
  440. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.ts +0 -119
  441. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.test.ts +0 -237
  442. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.ts +0 -57
  443. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.test.ts +0 -56
  444. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.ts +0 -32
  445. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.test.ts +0 -68
  446. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.ts +0 -23
  447. package/src/adapter/repositories/GitHubIssueCheckpointRepository.test.ts +0 -51
  448. package/src/adapter/repositories/GitHubIssueCheckpointRepository.ts +0 -47
  449. package/src/adapter/repositories/GitHubIssueCommentRepository.test.ts +0 -278
  450. package/src/adapter/repositories/GitHubIssueCommentRepository.ts +0 -109
  451. package/src/adapter/repositories/GoogleSpreadsheetRepository.integration.test.ts +0 -265
  452. package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +0 -431
  453. package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +0 -268
  454. package/src/adapter/repositories/GraphqlProjectRepository.diskCache.test.ts +0 -272
  455. package/src/adapter/repositories/GraphqlProjectRepository.errorHandling.test.ts +0 -111
  456. package/src/adapter/repositories/GraphqlProjectRepository.fetchProjectId.test.ts +0 -254
  457. package/src/adapter/repositories/GraphqlProjectRepository.test.ts +0 -209
  458. package/src/adapter/repositories/GraphqlProjectRepository.ts +0 -707
  459. package/src/adapter/repositories/GraphqlProjectRepositoryProjectLocation.test.ts +0 -297
  460. package/src/adapter/repositories/KyHttpRepository.ts +0 -8
  461. package/src/adapter/repositories/KySlackRepository.test.ts +0 -172
  462. package/src/adapter/repositories/KySlackRepository.ts +0 -298
  463. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.test.ts +0 -193
  464. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.ts +0 -106
  465. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.test.ts +0 -190
  466. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.ts +0 -102
  467. package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +0 -265
  468. package/src/adapter/repositories/LocalStorageCacheRepository.ts +0 -79
  469. package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +0 -142
  470. package/src/adapter/repositories/LocalStorageRepository.test.ts +0 -173
  471. package/src/adapter/repositories/LocalStorageRepository.ts +0 -30
  472. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +0 -15
  473. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +0 -9
  474. package/src/adapter/repositories/NodeLocalCommandRunner.largeOutput.test.ts +0 -16
  475. package/src/adapter/repositories/NodeLocalCommandRunner.test.ts +0 -118
  476. package/src/adapter/repositories/NodeLocalCommandRunner.ts +0 -66
  477. package/src/adapter/repositories/NodeProcessSignalRepository.test.ts +0 -82
  478. package/src/adapter/repositories/NodeProcessSignalRepository.ts +0 -47
  479. package/src/adapter/repositories/NodeSubAgentProcessLister.test.ts +0 -44
  480. package/src/adapter/repositories/NodeSubAgentProcessLister.ts +0 -40
  481. package/src/adapter/repositories/NodeTmuxSessionRepository.test.ts +0 -546
  482. package/src/adapter/repositories/NodeTmuxSessionRepository.ts +0 -245
  483. package/src/adapter/repositories/OauthAPIClaudeRepository.ts +0 -279
  484. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.test.ts +0 -166
  485. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.ts +0 -32
  486. package/src/adapter/repositories/OauthProxyClaudeRepository.test.ts +0 -428
  487. package/src/adapter/repositories/OauthProxyClaudeRepository.ts +0 -124
  488. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.test.ts +0 -242
  489. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.ts +0 -261
  490. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.test.ts +0 -184
  491. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.ts +0 -138
  492. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.test.ts +0 -208
  493. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.ts +0 -130
  494. package/src/adapter/repositories/ProcFsProcessEnvironReader.test.ts +0 -60
  495. package/src/adapter/repositories/ProcFsProcessEnvironReader.ts +0 -38
  496. package/src/adapter/repositories/ProcHostMetricsRepository.test.ts +0 -207
  497. package/src/adapter/repositories/ProcHostMetricsRepository.ts +0 -181
  498. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.test.ts +0 -231
  499. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.ts +0 -134
  500. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.test.ts +0 -121
  501. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.ts +0 -58
  502. package/src/adapter/repositories/ProjectIssuesCacheRepository.test.ts +0 -218
  503. package/src/adapter/repositories/ProjectIssuesCacheRepository.ts +0 -141
  504. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +0 -1195
  505. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +0 -185
  506. package/src/adapter/repositories/ProxyRateLimitCacheRepository.test.ts +0 -116
  507. package/src/adapter/repositories/ProxyRateLimitCacheRepository.ts +0 -67
  508. package/src/adapter/repositories/RateLimitSnapshotRepository.ts +0 -50
  509. package/src/adapter/repositories/RealSleeper.test.ts +0 -19
  510. package/src/adapter/repositories/RealSleeper.ts +0 -12
  511. package/src/adapter/repositories/RestProjectRepository.test.ts +0 -277
  512. package/src/adapter/repositories/RestProjectRepository.ts +0 -129
  513. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.test.ts +0 -313
  514. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.ts +0 -164
  515. package/src/adapter/repositories/SystemDateRepository.test.ts +0 -60
  516. package/src/adapter/repositories/SystemDateRepository.ts +0 -34
  517. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.test.ts +0 -253
  518. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.ts +0 -158
  519. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.queuedReply.test.ts +0 -171
  520. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.singleScan.test.ts +0 -86
  521. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +0 -996
  522. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +0 -396
  523. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.test.ts +0 -208
  524. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.ts +0 -80
  525. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +0 -1674
  526. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +0 -459
  527. package/src/adapter/repositories/clSessionScopeUnitName.test.ts +0 -76
  528. package/src/adapter/repositories/clSessionScopeUnitName.ts +0 -5
  529. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.test.ts +0 -34
  530. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.ts +0 -8
  531. package/src/adapter/repositories/githubGraphqlClient.test.ts +0 -479
  532. package/src/adapter/repositories/githubGraphqlClient.ts +0 -243
  533. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +0 -5182
  534. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +0 -3303
  535. package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +0 -46
  536. package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +0 -88
  537. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +0 -1776
  538. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +0 -1552
  539. package/src/adapter/repositories/issue/RestIssueRepository.test.ts +0 -393
  540. package/src/adapter/repositories/issue/RestIssueRepository.ts +0 -252
  541. package/src/adapter/repositories/issue/gitHubRawUrl.test.ts +0 -29
  542. package/src/adapter/repositories/issue/gitHubRawUrl.ts +0 -30
  543. package/src/adapter/repositories/issue/githubRateLimitRetry.test.ts +0 -167
  544. package/src/adapter/repositories/issue/githubRateLimitRetry.ts +0 -109
  545. package/src/adapter/repositories/localStorageCacheDirectory.test.ts +0 -81
  546. package/src/adapter/repositories/localStorageCacheDirectory.ts +0 -13
  547. package/src/adapter/repositories/projectFieldDefinition.test.ts +0 -191
  548. package/src/adapter/repositories/projectFieldDefinition.ts +0 -144
  549. package/src/adapter/repositories/utils.test.ts +0 -55
  550. package/src/adapter/repositories/utils.ts +0 -45
  551. package/src/domain/entities/ClaudeHandoverSession.ts +0 -12
  552. package/src/domain/entities/ClaudeMessageResponse.ts +0 -31
  553. package/src/domain/entities/ClaudeTokenUsage.ts +0 -17
  554. package/src/domain/entities/ClaudeWindowUsage.ts +0 -5
  555. package/src/domain/entities/Comment.ts +0 -5
  556. package/src/domain/entities/InteractiveLiveSession.ts +0 -6
  557. package/src/domain/entities/Issue.ts +0 -31
  558. package/src/domain/entities/KevReportWatermark.ts +0 -4
  559. package/src/domain/entities/LiveSessionActivitySnapshot.ts +0 -14
  560. package/src/domain/entities/LiveSessionOutputActivity.ts +0 -4
  561. package/src/domain/entities/LiveSessionProcessSnapshot.ts +0 -18
  562. package/src/domain/entities/LiveTmuxSession.ts +0 -4
  563. package/src/domain/entities/Member.ts +0 -3
  564. package/src/domain/entities/OutputDegeneration.ts +0 -10
  565. package/src/domain/entities/Project.ts +0 -88
  566. package/src/domain/entities/ProjectField.ts +0 -3
  567. package/src/domain/entities/ProjectFieldName.ts +0 -2
  568. package/src/domain/entities/ProjectFieldSingleSelect.ts +0 -8
  569. package/src/domain/entities/ProjectFieldSingleSelectOption.ts +0 -8
  570. package/src/domain/entities/RequiredProjectField.ts +0 -68
  571. package/src/domain/entities/SearchedIssue.ts +0 -11
  572. package/src/domain/entities/StoryObjectMap.ts +0 -12
  573. package/src/domain/entities/TokenExhaustionHandoverState.ts +0 -8
  574. package/src/domain/entities/WorkflowStatus.ts +0 -66
  575. package/src/domain/usecases/ActionAnnouncementUseCase.test.ts +0 -91
  576. package/src/domain/usecases/ActionAnnouncementUseCase.ts +0 -78
  577. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.test.ts +0 -222
  578. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.ts +0 -76
  579. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.test.ts +0 -118
  580. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +0 -112
  581. package/src/domain/usecases/AnalyzeStoriesUseCase.test.ts +0 -82
  582. package/src/domain/usecases/AnalyzeStoriesUseCase.ts +0 -296
  583. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.test.ts +0 -578
  584. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.ts +0 -137
  585. package/src/domain/usecases/CONTRIBUTING_FOR_TEST.md +0 -259
  586. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.test.ts +0 -437
  587. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.ts +0 -80
  588. package/src/domain/usecases/ChangeTargetPullRequestApprover.test.ts +0 -248
  589. package/src/domain/usecases/ChangeTargetPullRequestApprover.ts +0 -69
  590. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +0 -411
  591. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +0 -142
  592. package/src/domain/usecases/ClearDependedIssueURLUseCase.test.ts +0 -1120
  593. package/src/domain/usecases/ClearDependedIssueURLUseCase.ts +0 -161
  594. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.test.ts +0 -345
  595. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.ts +0 -81
  596. package/src/domain/usecases/CliErrorReportUseCase.test.ts +0 -162
  597. package/src/domain/usecases/CliErrorReportUseCase.ts +0 -72
  598. package/src/domain/usecases/ConflictedIssueRevertUseCase.test.ts +0 -886
  599. package/src/domain/usecases/ConflictedIssueRevertUseCase.ts +0 -146
  600. package/src/domain/usecases/CreateEstimationIssueUseCase.test.ts +0 -227
  601. package/src/domain/usecases/CreateEstimationIssueUseCase.ts +0 -205
  602. package/src/domain/usecases/CreateNewStoryByLabelUseCase.test.ts +0 -1084
  603. package/src/domain/usecases/CreateNewStoryByLabelUseCase.ts +0 -146
  604. package/src/domain/usecases/DailySecurityScanUseCase.test.ts +0 -1709
  605. package/src/domain/usecases/DailySecurityScanUseCase.ts +0 -476
  606. package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +0 -533
  607. package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +0 -122
  608. package/src/domain/usecases/GetStoryObjectMapUseCase.test.ts +0 -330
  609. package/src/domain/usecases/GetStoryObjectMapUseCase.ts +0 -79
  610. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +0 -1913
  611. package/src/domain/usecases/HandleScheduledEventUseCase.ts +0 -846
  612. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.test.ts +0 -175
  613. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.ts +0 -63
  614. package/src/domain/usecases/IssueNoStatusUpdateUseCase.test.ts +0 -165
  615. package/src/domain/usecases/IssueNoStatusUpdateUseCase.ts +0 -44
  616. package/src/domain/usecases/IssueRejectionEvaluator.test.ts +0 -1137
  617. package/src/domain/usecases/IssueRejectionEvaluator.ts +0 -340
  618. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.test.ts +0 -679
  619. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.ts +0 -178
  620. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +0 -5441
  621. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +0 -891
  622. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +0 -2069
  623. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +0 -489
  624. package/src/domain/usecases/OauthTokenSelectUseCase.test.ts +0 -662
  625. package/src/domain/usecases/OauthTokenSelectUseCase.ts +0 -274
  626. package/src/domain/usecases/OutputDegenerationDetector.test.ts +0 -167
  627. package/src/domain/usecases/OutputDegenerationDetector.ts +0 -169
  628. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.test.ts +0 -711
  629. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.ts +0 -146
  630. package/src/domain/usecases/QualityCheckAdvanceUseCase.test.ts +0 -421
  631. package/src/domain/usecases/QualityCheckAdvanceUseCase.ts +0 -76
  632. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.test.ts +0 -188
  633. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.ts +0 -57
  634. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.test.ts +0 -303
  635. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.ts +0 -155
  636. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +0 -1838
  637. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +0 -221
  638. package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +0 -2392
  639. package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +0 -499
  640. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.test.ts +0 -224
  641. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.ts +0 -142
  642. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.test.ts +0 -360
  643. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.ts +0 -70
  644. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.test.ts +0 -400
  645. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.ts +0 -48
  646. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.test.ts +0 -696
  647. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +0 -201
  648. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.test.ts +0 -1363
  649. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.ts +0 -215
  650. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.test.ts +0 -170
  651. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.ts +0 -38
  652. package/src/domain/usecases/StaleTmuxSessionKillUseCase.test.ts +0 -283
  653. package/src/domain/usecases/StaleTmuxSessionKillUseCase.ts +0 -98
  654. package/src/domain/usecases/StartPreparationUseCase.test.ts +0 -7822
  655. package/src/domain/usecases/StartPreparationUseCase.ts +0 -876
  656. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.test.ts +0 -200
  657. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.ts +0 -74
  658. package/src/domain/usecases/TokenExhaustionHandoverUseCase.test.ts +0 -838
  659. package/src/domain/usecases/TokenExhaustionHandoverUseCase.ts +0 -439
  660. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.test.ts +0 -306
  661. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.ts +0 -64
  662. package/src/domain/usecases/UpdateRateLimitCacheUseCase.test.ts +0 -178
  663. package/src/domain/usecases/UpdateRateLimitCacheUseCase.ts +0 -22
  664. package/src/domain/usecases/adapter-interfaces/ClaudeHandoverSessionRepository.ts +0 -5
  665. package/src/domain/usecases/adapter-interfaces/ClaudeInteractiveSessionRepository.ts +0 -9
  666. package/src/domain/usecases/adapter-interfaces/ClaudeLiveSessionRepository.ts +0 -8
  667. package/src/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.ts +0 -5
  668. package/src/domain/usecases/adapter-interfaces/ClaudeRepository.ts +0 -6
  669. package/src/domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository.ts +0 -8
  670. package/src/domain/usecases/adapter-interfaces/ConsoleTabsRepository.ts +0 -12
  671. package/src/domain/usecases/adapter-interfaces/CopilotRepository.ts +0 -3
  672. package/src/domain/usecases/adapter-interfaces/DateRepository.ts +0 -7
  673. package/src/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.ts +0 -3
  674. package/src/domain/usecases/adapter-interfaces/HttpRepository.ts +0 -3
  675. package/src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts +0 -7
  676. package/src/domain/usecases/adapter-interfaces/IssueAttachmentRepository.ts +0 -9
  677. package/src/domain/usecases/adapter-interfaces/IssueCheckpointRepository.ts +0 -3
  678. package/src/domain/usecases/adapter-interfaces/IssueCommentRepository.ts +0 -7
  679. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +0 -229
  680. package/src/domain/usecases/adapter-interfaces/KevReportWatermarkRepository.ts +0 -11
  681. package/src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts +0 -5
  682. package/src/domain/usecases/adapter-interfaces/LocalCommandRunner.ts +0 -16
  683. package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +0 -5
  684. package/src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts +0 -3
  685. package/src/domain/usecases/adapter-interfaces/ProcessSignalRepository.ts +0 -5
  686. package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +0 -29
  687. package/src/domain/usecases/adapter-interfaces/RateLimitCacheRepository.ts +0 -10
  688. package/src/domain/usecases/adapter-interfaces/RefusalTailStatusProvider.ts +0 -5
  689. package/src/domain/usecases/adapter-interfaces/SessionAssistantTurnsRepository.ts +0 -6
  690. package/src/domain/usecases/adapter-interfaces/SessionDegenerationCooldownStateRepository.ts +0 -4
  691. package/src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts +0 -7
  692. package/src/domain/usecases/adapter-interfaces/SessionRecordReader.ts +0 -3
  693. package/src/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.ts +0 -8
  694. package/src/domain/usecases/adapter-interfaces/SilentSessionCandidateStateRepository.ts +0 -10
  695. package/src/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.ts +0 -20
  696. package/src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts +0 -18
  697. package/src/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.ts +0 -6
  698. package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +0 -20
  699. package/src/domain/usecases/adapter-interfaces/Sleeper.ts +0 -3
  700. package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +0 -18
  701. package/src/domain/usecases/adapter-interfaces/StatusDefaultRepository.ts +0 -5
  702. package/src/domain/usecases/adapter-interfaces/SubAgentLivenessResolver.ts +0 -6
  703. package/src/domain/usecases/adapter-interfaces/SubAgentProcessLister.ts +0 -8
  704. package/src/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.ts +0 -3
  705. package/src/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.ts +0 -6
  706. package/src/domain/usecases/adapter-interfaces/TakeOwnershipSpawnRepository.ts +0 -9
  707. package/src/domain/usecases/adapter-interfaces/TmuxSessionRepository.ts +0 -20
  708. package/src/domain/usecases/adapter-interfaces/TokenExhaustionHandoverStateRepository.ts +0 -6
  709. package/src/domain/usecases/adapter-interfaces/TokenRateLimitSnapshotRepository.ts +0 -22
  710. package/src/domain/usecases/adapter-interfaces/WebhookRepository.ts +0 -3
  711. package/src/domain/usecases/agentReportPrefix.ts +0 -1
  712. package/src/domain/usecases/autoStatusCheckComments.ts +0 -1
  713. package/src/domain/usecases/console/.gitkeep +0 -0
  714. package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +0 -887
  715. package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +0 -368
  716. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.test.ts +0 -654
  717. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.ts +0 -318
  718. package/src/domain/usecases/dashboard/DashboardProjectCode.test.ts +0 -34
  719. package/src/domain/usecases/dashboard/DashboardProjectCode.ts +0 -27
  720. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.test.ts +0 -160
  721. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.ts +0 -69
  722. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.test.ts +0 -362
  723. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.ts +0 -234
  724. package/src/domain/usecases/ensureAgentOptionAndGetId.ts +0 -47
  725. package/src/domain/usecases/extractFencedJsonBlocks.test.ts +0 -40
  726. package/src/domain/usecases/extractFencedJsonBlocks.ts +0 -21
  727. package/src/domain/usecases/extractNextStepAgent.test.ts +0 -58
  728. package/src/domain/usecases/extractNextStepAgent.ts +0 -18
  729. package/src/domain/usecases/extractNextStepAgentFromComments.ts +0 -13
  730. package/src/domain/usecases/findLastAgentReport.test.ts +0 -121
  731. package/src/domain/usecases/findLastAgentReport.ts +0 -14
  732. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.test.ts +0 -339
  733. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts +0 -188
  734. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.test.ts +0 -389
  735. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.ts +0 -103
  736. package/src/domain/usecases/intmux/OwnerCallFile.test.ts +0 -184
  737. package/src/domain/usecases/intmux/OwnerCallFile.ts +0 -80
  738. package/src/domain/usecases/isAgentReportBody.test.ts +0 -108
  739. package/src/domain/usecases/isAgentReportBody.ts +0 -52
  740. package/src/domain/usecases/isAuthorAuthorizedForAutoStatusCheck.ts +0 -12
  741. package/src/domain/usecases/isHumanComment.test.ts +0 -77
  742. package/src/domain/usecases/isHumanComment.ts +0 -23
  743. package/src/domain/usecases/isRecord.ts +0 -2
  744. package/src/domain/usecases/issueReactivationTriggerIsPending.test.ts +0 -541
  745. package/src/domain/usecases/issueReactivationTriggerIsPending.ts +0 -25
  746. package/src/domain/usecases/nextStepAgentDispatchRepeatedMessage.ts +0 -2
  747. package/src/domain/usecases/normalizeReportBody.test.ts +0 -24
  748. package/src/domain/usecases/normalizeReportBody.ts +0 -2
  749. package/src/domain/usecases/resolveAllowedIssueAuthors.test.ts +0 -51
  750. package/src/domain/usecases/resolveAllowedIssueAuthors.ts +0 -6
  751. package/src/domain/usecases/resolveLabelsAsLlmAgentName.test.ts +0 -42
  752. package/src/domain/usecases/resolveLabelsAsLlmAgentName.ts +0 -6
  753. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.test.ts +0 -33
  754. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.ts +0 -7
  755. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.test.ts +0 -337
  756. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.ts +0 -133
  757. package/src/domain/usecases/silentSessionReminderSentinel.ts +0 -9
  758. package/src/domain/usecases/triagerAgentName.ts +0 -4
  759. package/src/domain/usecases/utils.test.ts +0 -35
  760. package/src/domain/usecases/utils.ts +0 -6
  761. package/src/index.test.ts +0 -8
  762. package/src/index.ts +0 -10
  763. package/src/releaseConfig.test.ts +0 -40
  764. package/tsconfig.build.json +0 -18
  765. package/tsconfig.json +0 -25
  766. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts +0 -13
  767. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts.map +0 -1
  768. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts +0 -16
  769. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts.map +0 -1
  770. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +0 -12
  771. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +0 -1
  772. package/types/domain/entities/UnansweredOwnerCall.d.ts +0 -5
  773. package/types/domain/entities/UnansweredOwnerCall.d.ts.map +0 -1
  774. package/types/domain/entities/WorkingTime.d.ts +0 -8
  775. package/types/domain/entities/WorkingTime.d.ts.map +0 -1
  776. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts +0 -17
  777. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts.map +0 -1
  778. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts +0 -23
  779. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts.map +0 -1
  780. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +0 -50
  781. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +0 -1
  782. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts +0 -15
  783. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts.map +0 -1
  784. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts +0 -11
  785. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts.map +0 -1
  786. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts +0 -3
  787. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts.map +0 -1
  788. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts +0 -5
  789. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts.map +0 -1
  790. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts +0 -5
  791. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts.map +0 -1
  792. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts +0 -2
  793. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts.map +0 -1
  794. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts +0 -3
  795. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts.map +0 -1
@@ -1,1469 +0,0 @@
1
- import {
2
- act,
3
- fireEvent,
4
- render,
5
- waitFor,
6
- within,
7
- } from '@testing-library/react';
8
- import { ConsolePage } from './ConsolePage';
9
-
10
- const tabBar = (): HTMLElement => {
11
- const nav = document.querySelector('nav.console-tabbar');
12
- if (nav === null) {
13
- throw new Error('console tab bar not found');
14
- }
15
- return nav as HTMLElement;
16
- };
17
-
18
- jest.mock('../lib/mermaidLoader', () => ({
19
- renderMermaidToSvg: jest.fn(async () => '<svg></svg>'),
20
- }));
21
-
22
- jest.mock('../lib/navigation', () => ({
23
- navigateReplace: jest.fn(),
24
- navigateAssign: jest.fn(),
25
- }));
26
-
27
- const listPayload = (tab: string) => ({
28
- pjcode: 'acme',
29
- generatedAt: '2026-06-19T00:00:00.000Z',
30
- statusOptions: [{ id: 's1', name: 'Awaiting Workspace', color: 'BLUE' }],
31
- storyOptions: [{ id: 'st1', name: 'TDPM Console port', color: 'BLUE' }],
32
- storyColors: { 'TDPM Console port': { color: 'BLUE' } },
33
- stories: [
34
- {
35
- storyName: 'TDPM Console port',
36
- storyOptionId: 'st1',
37
- color: 'BLUE',
38
- openItemCount: 1,
39
- storyViewUrl: null,
40
- },
41
- ],
42
- items:
43
- tab === 'prs'
44
- ? [
45
- {
46
- number: 851,
47
- title: 'Add serveConsole subcommand',
48
- url: 'https://github.com/o/r/pull/851',
49
- repo: 'o/r',
50
- nameWithOwner: 'o/r',
51
- projectItemId: 'PVTI_1',
52
- itemId: 'PVTI_1',
53
- isPr: true,
54
- relatedOpenPullRequestUrls: [],
55
- story: 'TDPM Console port',
56
- status: 'Awaiting Quality Check',
57
- nextActionDate: null,
58
- nextActionHour: null,
59
- dependedIssueUrls: [],
60
- labels: [],
61
- createdAt: '2026-06-17T00:00:00.000Z',
62
- },
63
- ]
64
- : tab === 'todo-by-human'
65
- ? [
66
- {
67
- number: 866,
68
- title: 'Notify finished issue preparation',
69
- url: 'https://github.com/o/r/issues/866',
70
- repo: 'o/r',
71
- nameWithOwner: 'o/r',
72
- projectItemId: 'PVTI_2',
73
- itemId: 'PVTI_2',
74
- isPr: false,
75
- relatedOpenPullRequestUrls: [],
76
- story: 'TDPM Console port',
77
- status: 'Todo by human',
78
- nextActionDate: null,
79
- nextActionHour: null,
80
- dependedIssueUrls: [],
81
- labels: [],
82
- createdAt: '2026-06-18T00:00:00.000Z',
83
- },
84
- ]
85
- : [],
86
- });
87
-
88
- const installFetch = (): void => {
89
- const fetchMock = jest.fn(async (url: string) => {
90
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
91
- if (listMatch !== null) {
92
- return {
93
- ok: true,
94
- status: 200,
95
- json: async () => listPayload(listMatch[1]),
96
- };
97
- }
98
- if (url === '/api/projects') {
99
- return {
100
- ok: true,
101
- status: 200,
102
- json: async () => ({ pjcodes: ['acme'] }),
103
- };
104
- }
105
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
106
- });
107
- global.fetch = fetchMock as unknown as typeof fetch;
108
- };
109
-
110
- describe('ConsolePage', () => {
111
- beforeEach(() => {
112
- localStorage.clear();
113
- window.history.replaceState({}, '', '/projects/acme/prs?k=token');
114
- installFetch();
115
- });
116
-
117
- it('renders the tab bar with the active tab and the story-grouped list', async () => {
118
- const { getByText } = render(<ConsolePage />);
119
- await waitFor(() => {
120
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
121
- });
122
- expect(
123
- within(tabBar()).getByText('Awaiting Quality Check'),
124
- ).toBeInTheDocument();
125
- expect(
126
- document.querySelector('.console-group-header')?.textContent,
127
- ).toContain('TDPM Console port');
128
- });
129
-
130
- it('keeps a stale overlay status out of the detail header and shows the snapshot status instead', async () => {
131
- localStorage.setItem(
132
- 'pv_overlay_acme',
133
- JSON.stringify({
134
- PVTI_1: {
135
- status: { name: 'In Tmux by human', color: 'RED' },
136
- ts: Date.parse('2026-06-18T00:00:00.000Z'),
137
- mode: 'prs',
138
- },
139
- }),
140
- );
141
- const { getByText, findByText, queryByText, container } = render(
142
- <ConsolePage />,
143
- );
144
- await waitFor(() => {
145
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
146
- });
147
- fireEvent.click(getByText('Add serveConsole subcommand'));
148
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
149
- expect(queryByText('In Tmux by human')).toBeNull();
150
- const chip = container.querySelector('.console-detail-status-chip');
151
- expect(chip?.textContent).toBe('Awaiting Quality Check');
152
- });
153
-
154
- it('shows a status the owner set after the snapshot was generated in the detail header', async () => {
155
- localStorage.setItem(
156
- 'pv_overlay_acme',
157
- JSON.stringify({
158
- PVTI_1: {
159
- status: { name: 'In Tmux by human', color: 'RED' },
160
- ts: Date.parse('2026-06-19T00:10:00.000Z'),
161
- mode: 'prs',
162
- },
163
- }),
164
- );
165
- const { getByText, findByText, container } = render(<ConsolePage />);
166
- await waitFor(() => {
167
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
168
- });
169
- fireEvent.click(getByText('Add serveConsole subcommand'));
170
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
171
- expect(
172
- container.querySelector('.console-detail-status-chip')?.textContent,
173
- ).toBe('In Tmux by human');
174
- });
175
-
176
- it('opens the detail view when an item is selected', async () => {
177
- const { getByText, findByText } = render(<ConsolePage />);
178
- await waitFor(() => {
179
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
180
- });
181
- fireEvent.click(getByText('Add serveConsole subcommand'));
182
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
183
- expect(window.location.hash).toBe('#item/PVTI_1');
184
- });
185
-
186
- it('renders the snapshot time without an item-count sub-heading', async () => {
187
- const { getByText, container } = render(<ConsolePage />);
188
- await waitFor(() => {
189
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
190
- });
191
- expect(container.querySelector('.console-tab-count-heading')).toBeNull();
192
- expect(getByText('snapshot: 2026-06-19T00:00:00.000Z')).toBeInTheDocument();
193
- });
194
-
195
- it('shows a cancellable toast and only drives the tab to zero after the five second window', async () => {
196
- jest.useFakeTimers();
197
- try {
198
- const { getByText, findByText } = render(<ConsolePage />);
199
- await waitFor(() => {
200
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
201
- });
202
- expect(
203
- within(tabBar())
204
- .getByText('Awaiting Quality Check')
205
- .closest('a')
206
- ?.querySelector('.console-tab-badge')?.textContent,
207
- ).toBe('1');
208
-
209
- fireEvent.click(getByText('Add serveConsole subcommand'));
210
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
211
- fireEvent.click(getByText('Approve & Merge'));
212
-
213
- expect(getByText('Approved & Merged — PR #851')).toBeInTheDocument();
214
- expect(getByText('Undo')).toBeInTheDocument();
215
- expect(
216
- within(tabBar())
217
- .getByText('Awaiting Quality Check')
218
- .closest('a')
219
- ?.querySelector('.console-tab-badge')?.textContent,
220
- ).toBe('1');
221
-
222
- act(() => {
223
- jest.advanceTimersByTime(5100);
224
- });
225
-
226
- await waitFor(() => {
227
- expect(
228
- within(tabBar()).queryByText('Awaiting Quality Check'),
229
- ).toBeNull();
230
- });
231
- } finally {
232
- jest.useRealTimers();
233
- }
234
- });
235
-
236
- it('cancels the command and keeps the item pending when Undo is clicked', async () => {
237
- jest.useFakeTimers();
238
- try {
239
- const fetchMock = jest.fn(
240
- async (_url: string, init?: { method?: string }) => {
241
- const listMatch = _url.match(
242
- /\/projects\/[^/]+\/([^/]+)\/list\.json/,
243
- );
244
- if (listMatch !== null) {
245
- return {
246
- ok: true,
247
- status: 200,
248
- json: async () => listPayload(listMatch[1]),
249
- };
250
- }
251
- void init;
252
- return {
253
- ok: true,
254
- status: 200,
255
- json: async () => ({ body: '# body' }),
256
- };
257
- },
258
- );
259
- global.fetch = fetchMock as unknown as typeof fetch;
260
-
261
- const { getByText, findByText } = render(<ConsolePage />);
262
- await waitFor(() => {
263
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
264
- });
265
- fireEvent.click(getByText('Add serveConsole subcommand'));
266
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
267
- fireEvent.click(getByText('Approve & Merge'));
268
-
269
- fireEvent.click(getByText('Undo'));
270
- act(() => {
271
- jest.advanceTimersByTime(6000);
272
- });
273
-
274
- const postCalls = fetchMock.mock.calls.filter(
275
- (call) => call[1]?.method === 'POST',
276
- );
277
- expect(postCalls.length).toBe(0);
278
- expect(
279
- within(tabBar())
280
- .getByText('Awaiting Quality Check')
281
- .closest('a')
282
- ?.querySelector('.console-tab-badge')?.textContent,
283
- ).toBe('1');
284
- } finally {
285
- jest.useRealTimers();
286
- }
287
- });
288
-
289
- it('does not revive a zeroed tab badge after switching tabs', async () => {
290
- const { getByText, queryByText } = render(<ConsolePage />);
291
- await waitFor(() => {
292
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
293
- });
294
-
295
- fireEvent.click(getByText('Todo by human'));
296
- await waitFor(() => {
297
- expect(
298
- getByText('Notify finished issue preparation'),
299
- ).toBeInTheDocument();
300
- });
301
-
302
- expect(queryByText('Triage')).toBeNull();
303
- });
304
-
305
- it('hides zero-count tabs but keeps non-zero tabs', async () => {
306
- const { getByText } = render(<ConsolePage />);
307
- await waitFor(() => {
308
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
309
- });
310
- const tabs = within(tabBar());
311
- expect(tabs.queryByText('Awaiting Quality Check')).not.toBeNull();
312
- expect(tabs.queryByText('Todo by human')).not.toBeNull();
313
- expect(tabs.queryByText('Triage')).toBeNull();
314
- expect(tabs.queryByText('Failed Preparation')).toBeNull();
315
- });
316
-
317
- it('does not render the project header bar above the tab bar', async () => {
318
- const { getByText, queryByText } = render(<ConsolePage />);
319
- await waitFor(() => {
320
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
321
- });
322
- expect(queryByText('TDPM Console')).toBeNull();
323
- expect(queryByText('project: acme')).toBeNull();
324
- });
325
-
326
- it('removes a processed workflow-blocker item from the list and decrements its tab badge, like every other tab', async () => {
327
- const blockerItems = [
328
- {
329
- number: 701,
330
- title: 'Blocked deployment task',
331
- url: 'https://github.com/o/r/issues/701',
332
- repo: 'o/r',
333
- nameWithOwner: 'o/r',
334
- projectItemId: 'PVTI_B1',
335
- itemId: 'PVTI_B1',
336
- isPr: false,
337
- relatedOpenPullRequestUrls: [],
338
- story: 'TDPM Console port',
339
- status: 'In Progress',
340
- nextActionDate: null,
341
- nextActionHour: null,
342
- dependedIssueUrls: [],
343
- labels: [],
344
- createdAt: '2026-06-17T00:00:00.000Z',
345
- },
346
- {
347
- number: 702,
348
- title: 'Blocked rollout task',
349
- url: 'https://github.com/o/r/issues/702',
350
- repo: 'o/r',
351
- nameWithOwner: 'o/r',
352
- projectItemId: 'PVTI_B2',
353
- itemId: 'PVTI_B2',
354
- isPr: false,
355
- relatedOpenPullRequestUrls: [],
356
- story: 'TDPM Console port',
357
- status: 'In Progress',
358
- nextActionDate: null,
359
- nextActionHour: null,
360
- dependedIssueUrls: [],
361
- labels: [],
362
- createdAt: '2026-06-17T01:00:00.000Z',
363
- },
364
- ];
365
- const fetchMock = jest.fn(async (url: string) => {
366
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
367
- if (listMatch !== null) {
368
- return {
369
- ok: true,
370
- status: 200,
371
- json: async () =>
372
- listMatch[1] === 'workflow-blocker'
373
- ? { ...listPayload('workflow-blocker'), items: blockerItems }
374
- : listPayload(listMatch[1]),
375
- };
376
- }
377
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
378
- });
379
- global.fetch = fetchMock as unknown as typeof fetch;
380
- localStorage.setItem(
381
- 'pv_overlay_acme',
382
- JSON.stringify({
383
- PVTI_B1: {
384
- ts: Date.parse('2026-06-19T00:05:00.000Z'),
385
- mode: 'workflow-blocker',
386
- done: true,
387
- },
388
- }),
389
- );
390
- window.history.replaceState(
391
- {},
392
- '',
393
- '/projects/acme/workflow-blocker?k=token',
394
- );
395
-
396
- const { getByText, queryByText } = render(<ConsolePage />);
397
- await waitFor(() => {
398
- expect(getByText('Blocked rollout task')).toBeInTheDocument();
399
- });
400
- expect(queryByText('Blocked deployment task')).toBeNull();
401
- const blockerTab = within(tabBar())
402
- .getByText('Workflow Blocker')
403
- .closest('a');
404
- expect(blockerTab).not.toBeNull();
405
- expect(blockerTab?.querySelector('.console-tab-badge')?.textContent).toBe(
406
- '1',
407
- );
408
- });
409
-
410
- it('lists an item again when the overlay marked it done before the served snapshot was generated', async () => {
411
- const blockerItems = [
412
- {
413
- number: 701,
414
- title: 'Blocked deployment task',
415
- url: 'https://github.com/o/r/issues/701',
416
- repo: 'o/r',
417
- nameWithOwner: 'o/r',
418
- projectItemId: 'PVTI_B1',
419
- itemId: 'PVTI_B1',
420
- isPr: false,
421
- relatedOpenPullRequestUrls: [],
422
- story: 'TDPM Console port',
423
- status: 'In Progress',
424
- nextActionDate: null,
425
- nextActionHour: null,
426
- dependedIssueUrls: [],
427
- labels: [],
428
- createdAt: '2026-06-17T00:00:00.000Z',
429
- },
430
- ];
431
- const fetchMock = jest.fn(async (url: string) => {
432
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
433
- if (listMatch !== null) {
434
- return {
435
- ok: true,
436
- status: 200,
437
- json: async () =>
438
- listMatch[1] === 'workflow-blocker'
439
- ? { ...listPayload('workflow-blocker'), items: blockerItems }
440
- : listPayload(listMatch[1]),
441
- };
442
- }
443
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
444
- });
445
- global.fetch = fetchMock as unknown as typeof fetch;
446
- localStorage.setItem(
447
- 'pv_overlay_acme',
448
- JSON.stringify({
449
- PVTI_B1: {
450
- ts: Date.parse('2026-06-18T23:00:00.000Z'),
451
- mode: 'workflow-blocker',
452
- done: true,
453
- },
454
- }),
455
- );
456
- window.history.replaceState(
457
- {},
458
- '',
459
- '/projects/acme/workflow-blocker?k=token',
460
- );
461
-
462
- const { getByText } = render(<ConsolePage />);
463
- await waitFor(() => {
464
- expect(getByText('Blocked deployment task')).toBeInTheDocument();
465
- });
466
- const blockerTab = within(tabBar())
467
- .getByText('Workflow Blocker')
468
- .closest('a');
469
- expect(blockerTab?.querySelector('.console-tab-badge')?.textContent).toBe(
470
- '1',
471
- );
472
- });
473
-
474
- it('renders the failure toast in English without any Japanese characters', async () => {
475
- const fetchMock = jest.fn(
476
- async (url: string, init?: { method?: string }) => {
477
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
478
- if (listMatch !== null) {
479
- return {
480
- ok: true,
481
- status: 200,
482
- json: async () => listPayload(listMatch[1]),
483
- };
484
- }
485
- if (init?.method === 'POST') {
486
- return {
487
- ok: false,
488
- status: 422,
489
- text: async () =>
490
- JSON.stringify({ error: 'HTTP 422 Review cannot be requested' }),
491
- };
492
- }
493
- return {
494
- ok: true,
495
- status: 200,
496
- json: async () => ({ body: '# body' }),
497
- };
498
- },
499
- );
500
- global.fetch = fetchMock as unknown as typeof fetch;
501
-
502
- jest.useFakeTimers();
503
- try {
504
- const { getByText, findByText } = render(<ConsolePage />);
505
- await waitFor(() => {
506
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
507
- });
508
- fireEvent.click(getByText('Add serveConsole subcommand'));
509
- fireEvent.click(await findByText('Approve & Merge'));
510
-
511
- await act(async () => {
512
- jest.advanceTimersByTime(5100);
513
- await Promise.resolve();
514
- await Promise.resolve();
515
- });
516
-
517
- const toast = getByText(/^Operation failed:/);
518
- expect(toast.textContent).toBe(
519
- 'Operation failed: HTTP 422 Review cannot be requested',
520
- );
521
- expect(toast.textContent).not.toMatch(
522
- /[\u{3040}-\u{309F}\u{30A0}-\u{30FF}\u{4E00}-\u{9FFF}]/u,
523
- );
524
- } finally {
525
- jest.useRealTimers();
526
- }
527
- });
528
-
529
- it('renders reorder buttons in the Stories tab', async () => {
530
- window.history.replaceState({}, '', '/projects/acme/stories?k=token');
531
- const { getAllByRole, getByText } = render(<ConsolePage />);
532
- await waitFor(() => {
533
- expect(
534
- getByText('snapshot: 2026-06-19T00:00:00.000Z'),
535
- ).toBeInTheDocument();
536
- });
537
- expect(getAllByRole('button', { name: 'Move up' }).length).toBeGreaterThan(
538
- 0,
539
- );
540
- });
541
-
542
- it('does not render reorder buttons in the Triage tab', async () => {
543
- window.history.replaceState({}, '', '/projects/acme/triage?k=token');
544
- const { queryAllByRole, getByText } = render(<ConsolePage />);
545
- await waitFor(() => {
546
- expect(
547
- getByText('snapshot: 2026-06-19T00:00:00.000Z'),
548
- ).toBeInTheDocument();
549
- });
550
- expect(queryAllByRole('button', { name: 'Move up' })).toHaveLength(0);
551
- });
552
- });
553
-
554
- const twoItemPrPayload = () => ({
555
- pjcode: 'acme',
556
- generatedAt: '2026-06-19T00:00:00.000Z',
557
- statusOptions: [{ id: 's1', name: 'Awaiting Workspace', color: 'BLUE' }],
558
- storyOptions: [{ id: 'st1', name: 'TDPM Console port', color: 'BLUE' }],
559
- storyColors: { 'TDPM Console port': { color: 'BLUE' } },
560
- items: [
561
- {
562
- number: 851,
563
- title: 'Add serveConsole subcommand',
564
- url: 'https://github.com/o/r/pull/851',
565
- repo: 'o/r',
566
- nameWithOwner: 'o/r',
567
- projectItemId: 'PVTI_1',
568
- itemId: 'PVTI_1',
569
- isPr: true,
570
- relatedOpenPullRequestUrls: [],
571
- story: 'TDPM Console port',
572
- status: 'Awaiting Quality Check',
573
- nextActionDate: null,
574
- nextActionHour: null,
575
- dependedIssueUrls: [],
576
- labels: [],
577
- createdAt: '2026-06-17T00:00:00.000Z',
578
- },
579
- {
580
- number: 852,
581
- title: 'Add server-side console API handlers',
582
- url: 'https://github.com/o/r/pull/852',
583
- repo: 'o/r',
584
- nameWithOwner: 'o/r',
585
- projectItemId: 'PVTI_2',
586
- itemId: 'PVTI_2',
587
- isPr: true,
588
- relatedOpenPullRequestUrls: [],
589
- story: 'TDPM Console port',
590
- status: 'Awaiting Quality Check',
591
- nextActionDate: null,
592
- nextActionHour: null,
593
- dependedIssueUrls: [],
594
- labels: [],
595
- createdAt: '2026-06-17T01:00:00.000Z',
596
- },
597
- ],
598
- });
599
-
600
- const touchEvent = (
601
- type: string,
602
- point: { clientX: number; clientY: number },
603
- property: 'touches' | 'changedTouches',
604
- ): TouchEvent => {
605
- const event = new Event(type, { bubbles: true }) as TouchEvent;
606
- Object.defineProperty(event, property, {
607
- value: [point],
608
- configurable: true,
609
- });
610
- return event;
611
- };
612
-
613
- const swipeDetailScreen = (
614
- element: HTMLElement,
615
- from: { clientX: number; clientY: number },
616
- to: { clientX: number; clientY: number },
617
- ): void => {
618
- element.dispatchEvent(touchEvent('touchstart', from, 'touches'));
619
- element.dispatchEvent(touchEvent('touchmove', to, 'touches'));
620
- element.dispatchEvent(touchEvent('touchend', to, 'changedTouches'));
621
- };
622
-
623
- describe('ConsolePage swipe navigation', () => {
624
- beforeEach(() => {
625
- localStorage.clear();
626
- window.history.replaceState({}, '', '/projects/acme/prs?k=token');
627
- const fetchMock = jest.fn(async (url: string) => {
628
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
629
- if (listMatch !== null) {
630
- return {
631
- ok: true,
632
- status: 200,
633
- json: async () =>
634
- listMatch[1] === 'prs'
635
- ? twoItemPrPayload()
636
- : { ...twoItemPrPayload(), items: [] },
637
- };
638
- }
639
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
640
- });
641
- global.fetch = fetchMock as unknown as typeof fetch;
642
- });
643
-
644
- it('navigates to the next item on a left swipe of the opened detail screen', async () => {
645
- const { container, getByText, findByText } = render(<ConsolePage />);
646
- await waitFor(() => {
647
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
648
- });
649
- fireEvent.click(getByText('Add serveConsole subcommand'));
650
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
651
- expect(window.location.hash).toBe('#item/PVTI_1');
652
-
653
- const detailScreen = container.querySelector('.console-detail-screen');
654
- expect(detailScreen).not.toBeNull();
655
- swipeDetailScreen(
656
- detailScreen as HTMLElement,
657
- { clientX: 240, clientY: 100 },
658
- { clientX: 40, clientY: 110 },
659
- );
660
-
661
- await waitFor(() => {
662
- expect(window.location.hash).toBe('#item/PVTI_2');
663
- });
664
- });
665
-
666
- it('navigates to the previous item on a right swipe of the opened detail screen', async () => {
667
- const { container, getByText, findByText } = render(<ConsolePage />);
668
- await waitFor(() => {
669
- expect(
670
- getByText('Add server-side console API handlers'),
671
- ).toBeInTheDocument();
672
- });
673
- fireEvent.click(getByText('Add server-side console API handlers'));
674
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
675
- expect(window.location.hash).toBe('#item/PVTI_2');
676
-
677
- const detailScreen = container.querySelector('.console-detail-screen');
678
- expect(detailScreen).not.toBeNull();
679
- swipeDetailScreen(
680
- detailScreen as HTMLElement,
681
- { clientX: 40, clientY: 100 },
682
- { clientX: 240, clientY: 110 },
683
- );
684
-
685
- await waitFor(() => {
686
- expect(window.location.hash).toBe('#item/PVTI_1');
687
- });
688
- });
689
- });
690
-
691
- describe('ConsolePage auto-advance', () => {
692
- beforeEach(() => {
693
- localStorage.clear();
694
- window.history.replaceState({}, '', '/projects/acme/prs?k=token');
695
- const fetchMock = jest.fn(async (url: string) => {
696
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
697
- if (listMatch !== null) {
698
- return {
699
- ok: true,
700
- status: 200,
701
- json: async () =>
702
- listMatch[1] === 'prs'
703
- ? twoItemPrPayload()
704
- : { ...twoItemPrPayload(), items: [] },
705
- };
706
- }
707
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
708
- });
709
- global.fetch = fetchMock as unknown as typeof fetch;
710
- });
711
-
712
- it('advances the detail view to the next pending item after an action', async () => {
713
- jest.useFakeTimers();
714
- try {
715
- const { getByText, findByText } = render(<ConsolePage />);
716
- await waitFor(() => {
717
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
718
- });
719
- fireEvent.click(getByText('Add serveConsole subcommand'));
720
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
721
- expect(window.location.hash).toBe('#item/PVTI_1');
722
-
723
- fireEvent.click(getByText('Approve & Merge'));
724
-
725
- await waitFor(() => {
726
- expect(window.location.hash).toBe('#item/PVTI_2');
727
- });
728
- } finally {
729
- jest.useRealTimers();
730
- }
731
- });
732
- });
733
-
734
- describe('ConsolePage scroll reset', () => {
735
- beforeEach(() => {
736
- localStorage.clear();
737
- window.history.replaceState({}, '', '/projects/acme/prs?k=token');
738
- const fetchMock = jest.fn(async (url: string) => {
739
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
740
- if (listMatch !== null) {
741
- return {
742
- ok: true,
743
- status: 200,
744
- json: async () =>
745
- listMatch[1] === 'prs'
746
- ? twoItemPrPayload()
747
- : { ...twoItemPrPayload(), items: [] },
748
- };
749
- }
750
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
751
- });
752
- global.fetch = fetchMock as unknown as typeof fetch;
753
- });
754
-
755
- it('resets the window scroll position to the top when an item is opened', async () => {
756
- const scrollTo = jest.fn();
757
- window.scrollTo = scrollTo as unknown as typeof window.scrollTo;
758
- const { getByText, findByText } = render(<ConsolePage />);
759
- await waitFor(() => {
760
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
761
- });
762
-
763
- fireEvent.click(getByText('Add serveConsole subcommand'));
764
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
765
-
766
- expect(scrollTo).toHaveBeenCalledWith({ top: 0 });
767
- });
768
-
769
- it('resets the window scroll position to the top on each item switch', async () => {
770
- const scrollTo = jest.fn();
771
- window.scrollTo = scrollTo as unknown as typeof window.scrollTo;
772
- const { container, getByText, findByText } = render(<ConsolePage />);
773
- await waitFor(() => {
774
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
775
- });
776
-
777
- fireEvent.click(getByText('Add serveConsole subcommand'));
778
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
779
- scrollTo.mockClear();
780
-
781
- const detailScreen = container.querySelector('.console-detail-screen');
782
- expect(detailScreen).not.toBeNull();
783
- swipeDetailScreen(
784
- detailScreen as HTMLElement,
785
- { clientX: 240, clientY: 100 },
786
- { clientX: 40, clientY: 110 },
787
- );
788
-
789
- await waitFor(() => {
790
- expect(window.location.hash).toBe('#item/PVTI_2');
791
- });
792
- expect(scrollTo).toHaveBeenCalledWith({ top: 0 });
793
- });
794
- });
795
-
796
- describe('ConsolePage comment composer isolation', () => {
797
- beforeEach(() => {
798
- localStorage.clear();
799
- window.history.replaceState({}, '', '/projects/acme/prs?k=token');
800
- const fetchMock = jest.fn(async (url: string, init?: RequestInit) => {
801
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
802
- if (listMatch !== null) {
803
- return {
804
- ok: true,
805
- status: 200,
806
- json: async () =>
807
- listMatch[1] === 'prs'
808
- ? twoItemPrPayload()
809
- : { ...twoItemPrPayload(), items: [] },
810
- };
811
- }
812
- if (url.includes('/api/comment')) {
813
- const requestBody =
814
- typeof init?.body === 'string'
815
- ? (JSON.parse(init.body) as { body: string })
816
- : { body: '' };
817
- return {
818
- ok: true,
819
- status: 200,
820
- json: async () => ({
821
- comment: {
822
- author: 'you',
823
- body: requestBody.body,
824
- createdAt: '2026-06-19T02:00:00.000Z',
825
- },
826
- }),
827
- };
828
- }
829
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
830
- });
831
- global.fetch = fetchMock as unknown as typeof fetch;
832
- });
833
-
834
- it('does not show a comment posted on one item under the next item', async () => {
835
- const {
836
- container,
837
- getByText,
838
- findByText,
839
- getByPlaceholderText,
840
- queryByText,
841
- } = render(<ConsolePage />);
842
- await waitFor(() => {
843
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
844
- });
845
-
846
- fireEvent.click(getByText('Add serveConsole subcommand'));
847
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
848
-
849
- fireEvent.change(getByPlaceholderText('Leave a comment…'), {
850
- target: { value: 'first item only comment' },
851
- });
852
- fireEvent.click(getByText('Comment'));
853
-
854
- await waitFor(() => {
855
- expect(getByText('first item only comment')).toBeInTheDocument();
856
- });
857
-
858
- const detailScreen = container.querySelector('.console-detail-screen');
859
- expect(detailScreen).not.toBeNull();
860
- swipeDetailScreen(
861
- detailScreen as HTMLElement,
862
- { clientX: 240, clientY: 100 },
863
- { clientX: 40, clientY: 110 },
864
- );
865
-
866
- await waitFor(() => {
867
- expect(window.location.hash).toBe('#item/PVTI_2');
868
- });
869
- expect(queryByText('first item only comment')).toBeNull();
870
- });
871
- });
872
-
873
- describe('ConsolePage draft preservation', () => {
874
- beforeEach(() => {
875
- localStorage.clear();
876
- window.history.replaceState({}, '', '/projects/acme/prs?k=token');
877
- const fetchMock = jest.fn(async (url: string, init?: RequestInit) => {
878
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
879
- if (listMatch !== null) {
880
- return {
881
- ok: true,
882
- status: 200,
883
- json: async () =>
884
- listMatch[1] === 'prs'
885
- ? twoItemPrPayload()
886
- : { ...twoItemPrPayload(), items: [] },
887
- };
888
- }
889
- void init;
890
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
891
- });
892
- global.fetch = fetchMock as unknown as typeof fetch;
893
- });
894
-
895
- it('restores the typed text when returning to a task after navigating away', async () => {
896
- const { container, getByText, findByText, getByPlaceholderText } = render(
897
- <ConsolePage />,
898
- );
899
- await waitFor(() => {
900
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
901
- });
902
-
903
- fireEvent.click(getByText('Add serveConsole subcommand'));
904
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
905
-
906
- fireEvent.change(getByPlaceholderText('Leave a comment…'), {
907
- target: { value: 'work in progress' },
908
- });
909
-
910
- const detailScreen = container.querySelector('.console-detail-screen');
911
- expect(detailScreen).not.toBeNull();
912
-
913
- swipeDetailScreen(
914
- detailScreen as HTMLElement,
915
- { clientX: 240, clientY: 100 },
916
- { clientX: 40, clientY: 110 },
917
- );
918
- await waitFor(() => {
919
- expect(window.location.hash).toBe('#item/PVTI_2');
920
- });
921
-
922
- swipeDetailScreen(
923
- detailScreen as HTMLElement,
924
- { clientX: 40, clientY: 100 },
925
- { clientX: 240, clientY: 110 },
926
- );
927
- await waitFor(() => {
928
- expect(getByPlaceholderText('Leave a comment…')).toHaveValue(
929
- 'work in progress',
930
- );
931
- });
932
- });
933
- });
934
-
935
- describe('ConsolePage auto-advance tab', () => {
936
- beforeEach(() => {
937
- localStorage.clear();
938
- window.history.replaceState({}, '', '/projects/acme/prs?k=token');
939
- installFetch();
940
- });
941
-
942
- it('auto-advances to the next non-empty tab on the right after the active tab is driven to zero', async () => {
943
- jest.useFakeTimers();
944
- try {
945
- const { getByText, findByText } = render(<ConsolePage />);
946
- await waitFor(() => {
947
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
948
- });
949
-
950
- fireEvent.click(getByText('Add serveConsole subcommand'));
951
- fireEvent.click(await findByText('Approve & Merge'));
952
-
953
- act(() => {
954
- jest.advanceTimersByTime(5100);
955
- });
956
-
957
- await waitFor(() => {
958
- expect(
959
- getByText('Notify finished issue preparation'),
960
- ).toBeInTheDocument();
961
- });
962
- expect(
963
- within(tabBar())
964
- .getByText('Todo by human')
965
- .closest('a')
966
- ?.getAttribute('aria-current'),
967
- ).toBe('page');
968
- } finally {
969
- jest.useRealTimers();
970
- }
971
- });
972
-
973
- it('renders the gear button in the tab bar', async () => {
974
- const { getByText, getByRole } = render(<ConsolePage />);
975
- await waitFor(() => {
976
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
977
- });
978
- const gearBtn = getByRole('button', { name: 'Console Settings' });
979
- expect(gearBtn).toBeInTheDocument();
980
- expect(gearBtn.closest('nav.console-tabbar')).not.toBeNull();
981
- });
982
-
983
- it('opens the settings dialog when the gear button is clicked', async () => {
984
- const { getByText, getByRole, queryByRole } = render(<ConsolePage />);
985
- await waitFor(() => {
986
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
987
- });
988
- expect(queryByRole('dialog')).toBeNull();
989
- fireEvent.click(getByRole('button', { name: 'Console Settings' }));
990
- expect(getByRole('dialog')).toBeInTheDocument();
991
- expect(getByRole('dialog')).toHaveAttribute(
992
- 'aria-label',
993
- 'Console Settings',
994
- );
995
- });
996
-
997
- it('saves timer settings to localStorage and closes the dialog when Save and Close is clicked', async () => {
998
- const { getByText, getByRole, queryByRole, getByLabelText } = render(
999
- <ConsolePage />,
1000
- );
1001
- await waitFor(() => {
1002
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
1003
- });
1004
- fireEvent.click(getByRole('button', { name: 'Console Settings' }));
1005
- fireEvent.click(getByLabelText('Timer Mode'));
1006
- fireEvent.click(getByText('Save and Close'));
1007
- expect(queryByRole('dialog')).toBeNull();
1008
- const stored = localStorage.getItem('tdpm-timer-settings');
1009
- expect(stored).not.toBeNull();
1010
- const parsed: unknown = JSON.parse(stored as string);
1011
- expect(parsed).toMatchObject({ timerMode: true });
1012
- });
1013
-
1014
- it('redirects to the first project with minutes > 0 when timer mode is on and pjcode is null', async () => {
1015
- localStorage.setItem(
1016
- 'tdpm-timer-settings',
1017
- JSON.stringify({ timerMode: true, projectMinutes: { acme: 30 } }),
1018
- );
1019
- window.history.replaceState({}, '', '/');
1020
- const { navigateReplace } = jest.requireMock<{
1021
- navigateReplace: jest.Mock;
1022
- }>('../lib/navigation');
1023
- navigateReplace.mockClear();
1024
- render(<ConsolePage />);
1025
- await waitFor(() => {
1026
- expect(navigateReplace).toHaveBeenCalledWith('/projects/acme');
1027
- });
1028
- });
1029
-
1030
- it('shows the stories tab badge count as the number of non-GRAY stories', async () => {
1031
- global.fetch = jest.fn(async (url: string) => {
1032
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
1033
- if (listMatch !== null) {
1034
- const tab = listMatch[1];
1035
- if (tab === 'stories') {
1036
- return {
1037
- ok: true,
1038
- status: 200,
1039
- json: async () => ({
1040
- generatedAt: '2026-06-19T00:00:00.000Z',
1041
- stories: [
1042
- {
1043
- storyName: 'TDPM Console port',
1044
- storyOptionId: 'st1',
1045
- color: 'BLUE',
1046
- openItemCount: 3,
1047
- storyViewUrl: null,
1048
- },
1049
- {
1050
- storyName: 'regular / workflow improvement',
1051
- storyOptionId: 'st2',
1052
- color: 'GRAY',
1053
- openItemCount: 2,
1054
- storyViewUrl: null,
1055
- },
1056
- ],
1057
- defaultNameWithOwner: null,
1058
- storyOrder: [],
1059
- }),
1060
- };
1061
- }
1062
- return { ok: true, status: 200, json: async () => listPayload(tab) };
1063
- }
1064
- if (url === '/api/projects') {
1065
- return {
1066
- ok: true,
1067
- status: 200,
1068
- json: async () => ({ pjcodes: ['acme'] }),
1069
- };
1070
- }
1071
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
1072
- }) as unknown as typeof fetch;
1073
-
1074
- const { container } = render(<ConsolePage />);
1075
-
1076
- await waitFor(() => {
1077
- const tabs = [...container.querySelectorAll('.console-tab')];
1078
- const storiesTab = tabs.find((el) => el.textContent?.includes('Stories'));
1079
- expect(storiesTab).toBeTruthy();
1080
- expect(storiesTab?.querySelector('.console-tab-badge')?.textContent).toBe(
1081
- '1',
1082
- );
1083
- });
1084
- });
1085
-
1086
- it('shows the queued tab badge count when queued items are present', async () => {
1087
- const queuedItem = {
1088
- number: 900,
1089
- title: 'Queued task waiting',
1090
- url: 'https://github.com/o/r/issues/900',
1091
- repo: 'o/r',
1092
- nameWithOwner: 'o/r',
1093
- projectItemId: 'PVTI_900',
1094
- itemId: 'PVTI_900',
1095
- isPr: false,
1096
- relatedOpenPullRequestUrls: [],
1097
- story: 'TDPM Console port',
1098
- status: 'Awaiting Workspace',
1099
- nextActionDate: null,
1100
- nextActionHour: null,
1101
- dependedIssueUrls: [],
1102
- labels: [],
1103
- createdAt: '2026-06-17T00:00:00.000Z',
1104
- };
1105
- global.fetch = jest.fn(async (url: string) => {
1106
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
1107
- if (listMatch !== null) {
1108
- const tab = listMatch[1];
1109
- if (tab === 'queued') {
1110
- return {
1111
- ok: true,
1112
- status: 200,
1113
- json: async () => ({
1114
- ...listPayload(''),
1115
- agentOptions: [],
1116
- items: [queuedItem],
1117
- }),
1118
- };
1119
- }
1120
- return { ok: true, status: 200, json: async () => listPayload(tab) };
1121
- }
1122
- if (url === '/api/projects') {
1123
- return {
1124
- ok: true,
1125
- status: 200,
1126
- json: async () => ({ pjcodes: ['acme'] }),
1127
- };
1128
- }
1129
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
1130
- }) as unknown as typeof fetch;
1131
-
1132
- const { container } = render(<ConsolePage />);
1133
-
1134
- await waitFor(() => {
1135
- const tabs = [...container.querySelectorAll('.console-tab')];
1136
- const queuedTab = tabs.find((el) => el.textContent?.includes('Queued'));
1137
- expect(queuedTab).toBeTruthy();
1138
- expect(queuedTab?.querySelector('.console-tab-badge')?.textContent).toBe(
1139
- '1',
1140
- );
1141
- });
1142
- });
1143
-
1144
- it('reads console-story-show-gray from localStorage and shows gray stories when true', async () => {
1145
- localStorage.setItem('console-story-show-gray', 'true');
1146
- window.history.replaceState({}, '', '/projects/acme/stories?k=token');
1147
- global.fetch = jest.fn(async (url: string) => {
1148
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
1149
- if (listMatch !== null) {
1150
- const tab = listMatch[1];
1151
- if (tab === 'stories') {
1152
- return {
1153
- ok: true,
1154
- status: 200,
1155
- json: async () => ({
1156
- generatedAt: '2026-06-19T00:00:00.000Z',
1157
- stories: [
1158
- {
1159
- storyName: 'TDPM Console port',
1160
- storyOptionId: 'st1',
1161
- color: 'BLUE',
1162
- openItemCount: 3,
1163
- storyViewUrl: null,
1164
- },
1165
- {
1166
- storyName: 'regular / workflow improvement',
1167
- storyOptionId: 'st2',
1168
- color: 'GRAY',
1169
- openItemCount: 2,
1170
- storyViewUrl: null,
1171
- },
1172
- ],
1173
- defaultNameWithOwner: null,
1174
- storyOrder: [],
1175
- }),
1176
- };
1177
- }
1178
- return { ok: true, status: 200, json: async () => listPayload(tab) };
1179
- }
1180
- if (url === '/api/projects') {
1181
- return {
1182
- ok: true,
1183
- status: 200,
1184
- json: async () => ({ pjcodes: ['acme'] }),
1185
- };
1186
- }
1187
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
1188
- }) as unknown as typeof fetch;
1189
-
1190
- const { findByText } = render(<ConsolePage />);
1191
- expect(
1192
- await findByText('regular / workflow improvement'),
1193
- ).toBeInTheDocument();
1194
- });
1195
-
1196
- it('writes true to console-story-show-gray in localStorage when the toggle button is clicked', async () => {
1197
- window.history.replaceState({}, '', '/projects/acme/stories?k=token');
1198
- global.fetch = jest.fn(async (url: string) => {
1199
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
1200
- if (listMatch !== null) {
1201
- const tab = listMatch[1];
1202
- if (tab === 'stories') {
1203
- return {
1204
- ok: true,
1205
- status: 200,
1206
- json: async () => ({
1207
- generatedAt: '2026-06-19T00:00:00.000Z',
1208
- stories: [
1209
- {
1210
- storyName: 'TDPM Console port',
1211
- storyOptionId: 'st1',
1212
- color: 'BLUE',
1213
- openItemCount: 3,
1214
- storyViewUrl: null,
1215
- },
1216
- {
1217
- storyName: 'regular / workflow improvement',
1218
- storyOptionId: 'st2',
1219
- color: 'GRAY',
1220
- openItemCount: 2,
1221
- storyViewUrl: null,
1222
- },
1223
- ],
1224
- defaultNameWithOwner: null,
1225
- storyOrder: [],
1226
- }),
1227
- };
1228
- }
1229
- return { ok: true, status: 200, json: async () => listPayload(tab) };
1230
- }
1231
- if (url === '/api/projects') {
1232
- return {
1233
- ok: true,
1234
- status: 200,
1235
- json: async () => ({ pjcodes: ['acme'] }),
1236
- };
1237
- }
1238
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
1239
- }) as unknown as typeof fetch;
1240
-
1241
- const { findByRole } = render(<ConsolePage />);
1242
- const toggleBtn = await findByRole('button', { name: 'Show archived' });
1243
- fireEvent.click(toggleBtn);
1244
- expect(localStorage.getItem('console-story-show-gray')).toBe('true');
1245
- });
1246
-
1247
- it('navigates to the next project when a completing action fires after the project timer elapses', async () => {
1248
- localStorage.setItem(
1249
- 'tdpm-timer-settings',
1250
- JSON.stringify({ timerMode: true, projectMinutes: { acme: 1, beta: 5 } }),
1251
- );
1252
- global.fetch = jest.fn(async (url: string) => {
1253
- const listMatch = url.match(/\/projects\/[^/]+\/([^/]+)\/list\.json/);
1254
- if (listMatch !== null) {
1255
- return {
1256
- ok: true,
1257
- status: 200,
1258
- json: async () => listPayload(listMatch[1]),
1259
- };
1260
- }
1261
- if (url === '/api/projects') {
1262
- return {
1263
- ok: true,
1264
- status: 200,
1265
- json: async () => ({ pjcodes: ['acme', 'beta'] }),
1266
- };
1267
- }
1268
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
1269
- }) as unknown as typeof fetch;
1270
- jest.useFakeTimers({ now: 0 });
1271
- try {
1272
- const { getByText, findByText } = render(<ConsolePage />);
1273
- await waitFor(() => {
1274
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
1275
- });
1276
- jest.setSystemTime(61 * 1000);
1277
- fireEvent.click(getByText('Add serveConsole subcommand'));
1278
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
1279
- fireEvent.click(getByText('Approve & Merge'));
1280
- act(() => {
1281
- jest.advanceTimersByTime(5100);
1282
- });
1283
- const { navigateAssign } = jest.requireMock<{
1284
- navigateAssign: jest.Mock;
1285
- }>('../lib/navigation');
1286
- await waitFor(() => {
1287
- expect(navigateAssign).toHaveBeenCalledWith('/projects/beta');
1288
- });
1289
- } finally {
1290
- jest.useRealTimers();
1291
- }
1292
- });
1293
- });
1294
-
1295
- describe('ConsolePage airplane mode write guard', () => {
1296
- const prItem = {
1297
- number: 851,
1298
- title: 'Add serveConsole subcommand',
1299
- url: 'https://github.com/o/r/pull/851',
1300
- repo: 'o/r',
1301
- nameWithOwner: 'o/r',
1302
- projectItemId: 'PVTI_1',
1303
- itemId: 'PVTI_1',
1304
- isPr: true,
1305
- relatedOpenPullRequestUrls: [],
1306
- story: 'TDPM Console port',
1307
- status: 'Awaiting Quality Check',
1308
- nextActionDate: null,
1309
- nextActionHour: null,
1310
- dependedIssueUrls: [],
1311
- labels: [],
1312
- createdAt: '2026-06-17T00:00:00.000Z',
1313
- agent: null,
1314
- };
1315
-
1316
- const airplaneSnapshot = {
1317
- capturedAt: '2026-06-19T00:00:00.000Z',
1318
- tabs: {
1319
- acme: {
1320
- prs: {
1321
- items: [prItem],
1322
- generatedAt: '2026-06-19T00:00:00.000Z',
1323
- statusOptions: [
1324
- { id: 's1', name: 'Awaiting Workspace', color: 'BLUE' },
1325
- ],
1326
- storyOptions: [
1327
- { id: 'st1', name: 'TDPM Console port', color: 'BLUE' },
1328
- ],
1329
- storyColors: { 'TDPM Console port': { color: 'BLUE' } },
1330
- stories: [],
1331
- defaultNameWithOwner: 'o/r',
1332
- fromCache: false,
1333
- storyOrder: [],
1334
- },
1335
- 'workflow-blocker': {
1336
- items: [],
1337
- generatedAt: '',
1338
- statusOptions: [],
1339
- storyOptions: [],
1340
- storyColors: {},
1341
- stories: [],
1342
- defaultNameWithOwner: null,
1343
- fromCache: false,
1344
- storyOrder: [],
1345
- },
1346
- 'failed-preparation': {
1347
- items: [],
1348
- generatedAt: '',
1349
- statusOptions: [],
1350
- storyOptions: [],
1351
- storyColors: {},
1352
- stories: [],
1353
- defaultNameWithOwner: null,
1354
- fromCache: false,
1355
- storyOrder: [],
1356
- },
1357
- 'todo-by-human': {
1358
- items: [],
1359
- generatedAt: '',
1360
- statusOptions: [],
1361
- storyOptions: [],
1362
- storyColors: {},
1363
- stories: [],
1364
- defaultNameWithOwner: null,
1365
- fromCache: false,
1366
- storyOrder: [],
1367
- },
1368
- 'todo-by-agent': {
1369
- items: [],
1370
- generatedAt: '',
1371
- statusOptions: [],
1372
- storyOptions: [],
1373
- storyColors: {},
1374
- stories: [],
1375
- defaultNameWithOwner: null,
1376
- fromCache: false,
1377
- storyOrder: [],
1378
- },
1379
- stories: {
1380
- items: [],
1381
- generatedAt: '',
1382
- statusOptions: [],
1383
- storyOptions: [],
1384
- storyColors: {},
1385
- stories: [],
1386
- defaultNameWithOwner: null,
1387
- fromCache: false,
1388
- storyOrder: [],
1389
- },
1390
- },
1391
- },
1392
- items: {},
1393
- failures: [],
1394
- };
1395
-
1396
- beforeEach(() => {
1397
- localStorage.clear();
1398
- window.history.replaceState({}, '', '/projects/acme/prs?k=token');
1399
-
1400
- localStorage.setItem('tdpm_airplane_mode_on', '1');
1401
-
1402
- const snapshotJson = JSON.stringify(airplaneSnapshot);
1403
- const mockCache = {
1404
- put: jest.fn(),
1405
- match: jest.fn().mockResolvedValue(
1406
- new Response(snapshotJson, {
1407
- headers: { 'Content-Type': 'application/json' },
1408
- }),
1409
- ),
1410
- delete: jest.fn(),
1411
- };
1412
- Object.defineProperty(global, 'caches', {
1413
- writable: true,
1414
- configurable: true,
1415
- value: {
1416
- open: jest.fn().mockResolvedValue(mockCache),
1417
- delete: jest.fn().mockResolvedValue(true),
1418
- },
1419
- });
1420
-
1421
- global.fetch = jest.fn(async (url: string) => {
1422
- if (url === '/api/features') {
1423
- return {
1424
- ok: true,
1425
- status: 200,
1426
- json: async () => ({ airplaneMode: true }),
1427
- };
1428
- }
1429
- if (url === '/api/projects') {
1430
- return {
1431
- ok: true,
1432
- status: 200,
1433
- json: async () => ({ pjcodes: ['acme'] }),
1434
- };
1435
- }
1436
- return { ok: true, status: 200, json: async () => ({ body: '# body' }) };
1437
- }) as unknown as typeof fetch;
1438
- });
1439
-
1440
- afterEach(() => {
1441
- Object.defineProperty(global, 'caches', {
1442
- writable: true,
1443
- configurable: true,
1444
- value: undefined,
1445
- });
1446
- });
1447
-
1448
- it('shows an airplane mode error toast instead of enqueuing when airplane mode is on', async () => {
1449
- const { getByText, findByText } = render(<ConsolePage />);
1450
-
1451
- await waitFor(() => {
1452
- expect(getByText('Add serveConsole subcommand')).toBeInTheDocument();
1453
- });
1454
-
1455
- await waitFor(() => {
1456
- expect(getByText('Turn off')).toBeInTheDocument();
1457
- });
1458
-
1459
- fireEvent.click(getByText('Add serveConsole subcommand'));
1460
- expect(await findByText('Approve & Merge')).toBeInTheDocument();
1461
- fireEvent.click(getByText('Approve & Merge'));
1462
-
1463
- await waitFor(() => {
1464
- expect(getByText('Airplane mode')).toBeInTheDocument();
1465
- });
1466
- expect(getByText(/network connection/i)).toBeInTheDocument();
1467
- expect(document.querySelector('.console-undo-toast')).toBeNull();
1468
- });
1469
- });