github-issue-tower-defence-management 2.19.0 → 2.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/adapter/entry-points/cli/index.js +0 -0
- package/bin/domain/usecases/OauthTokenSelectUseCase.js +1 -1
- package/package.json +5 -1
- package/types/domain/usecases/OauthTokenSelectUseCase.d.ts +1 -1
- package/.env.example +0 -7
- package/.gitattributes +0 -2
- package/.github/CODEOWNERS +0 -6
- package/.github/copilot-instructions.md +0 -6
- package/.github/dependabot.yml +0 -19
- package/.github/instructions/code-review.instructions.md +0 -50
- package/.github/workflows/api-created_issue_pr.yml +0 -97
- package/.github/workflows/ci-failure-issue-creator.yml +0 -48
- package/.github/workflows/close-manual-prs.yml +0 -80
- package/.github/workflows/codeql.yml +0 -107
- package/.github/workflows/commit-lint.yml +0 -85
- package/.github/workflows/configs/commitlint.config.cjs +0 -32
- package/.github/workflows/configs/commitlint.config.js +0 -32
- package/.github/workflows/console-ui.yml +0 -68
- package/.github/workflows/create-pr.yml +0 -116
- package/.github/workflows/empty-format-test-job.yml +0 -34
- package/.github/workflows/format.yml +0 -28
- package/.github/workflows/publish.yml +0 -111
- package/.github/workflows/secret-scan.yml +0 -51
- package/.github/workflows/test.yml +0 -58
- package/.github/workflows/umino-project.yml +0 -207
- package/.gitleaks.toml +0 -22
- package/.prettierignore +0 -31
- package/.prettierrc +0 -5
- package/CHANGELOG.md +0 -4155
- package/CONTRIBUTING.md +0 -60
- package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js +0 -12
- package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js.map +0 -1
- package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js +0 -125
- package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js.map +0 -1
- package/bin/adapter/repositories/issue/issueTimelineUtils.js +0 -38
- package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +0 -1
- package/bin/domain/entities/UnansweredOwnerCall.js +0 -3
- package/bin/domain/entities/UnansweredOwnerCall.js.map +0 -1
- package/bin/domain/entities/WorkingTime.js +0 -3
- package/bin/domain/entities/WorkingTime.js.map +0 -1
- package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js +0 -37
- package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js.map +0 -1
- package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js +0 -118
- package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js.map +0 -1
- package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +0 -180
- package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +0 -1
- package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js +0 -160
- package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js.map +0 -1
- package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js +0 -3
- package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js.map +0 -1
- package/bin/domain/usecases/awaitingOwnerApprovalMessage.js +0 -7
- package/bin/domain/usecases/awaitingOwnerApprovalMessage.js.map +0 -1
- package/bin/domain/usecases/findLastAgentDeclaringReport.js +0 -12
- package/bin/domain/usecases/findLastAgentDeclaringReport.js.map +0 -1
- package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js +0 -25
- package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js.map +0 -1
- package/bin/domain/usecases/isWaitingForOwnerApproval.js +0 -16
- package/bin/domain/usecases/isWaitingForOwnerApproval.js.map +0 -1
- package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js +0 -7
- package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js.map +0 -1
- package/commitlint.config.js +0 -6
- package/eslint.config.mjs +0 -76
- package/jest.config.js +0 -84
- package/jest.setup.js +0 -1
- package/lib/buffer-equal-constant-time-compat/index.js +0 -17
- package/lib/buffer-equal-constant-time-compat/index.test.js +0 -54
- package/lib/buffer-equal-constant-time-compat/package.json +0 -5
- package/lib/typescript-compat/bin/tsc +0 -2
- package/lib/typescript-compat/bin/tsserver +0 -2
- package/lib/typescript-compat/lib/typescript.js +0 -1
- package/lib/typescript-compat/package.json +0 -13
- package/renovate.json +0 -46
- package/scripts/copyConsoleUiDist.mjs +0 -35
- package/scripts/defaultBranchTipVerify.sh +0 -23
- package/scripts/testWorkflowRunVerify.sh +0 -47
- package/scripts/verifyConsoleUiDist.mjs +0 -96
- package/src/adapter/ci/consoleUiWorkflowTimeout.test.ts +0 -61
- package/src/adapter/ci/publishTestWorkflowGate.test.ts +0 -653
- package/src/adapter/ci/workflowRunCancellation.test.ts +0 -72
- package/src/adapter/entry-points/cli/fleetConfig.test.ts +0 -553
- package/src/adapter/entry-points/cli/fleetConfig.ts +0 -266
- package/src/adapter/entry-points/cli/index.test.ts +0 -2837
- package/src/adapter/entry-points/cli/index.ts +0 -1488
- package/src/adapter/entry-points/cli/projectConfig.test.ts +0 -342
- package/src/adapter/entry-points/cli/projectConfig.ts +0 -500
- package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.test.ts +0 -658
- package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.ts +0 -482
- package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +0 -222
- package/src/adapter/entry-points/console/consoleDataDelivery.ts +0 -134
- package/src/adapter/entry-points/console/consoleDoneStore.test.ts +0 -169
- package/src/adapter/entry-points/console/consoleDoneStore.ts +0 -139
- package/src/adapter/entry-points/console/consoleGithubTokenResolver.test.ts +0 -275
- package/src/adapter/entry-points/console/consoleGithubTokenResolver.ts +0 -113
- package/src/adapter/entry-points/console/consoleImageProxy.test.ts +0 -140
- package/src/adapter/entry-points/console/consoleImageProxy.ts +0 -111
- package/src/adapter/entry-points/console/consoleItemUrlLookup.test.ts +0 -63
- package/src/adapter/entry-points/console/consoleItemUrlLookup.ts +0 -66
- package/src/adapter/entry-points/console/consoleOperationApi.test.ts +0 -2523
- package/src/adapter/entry-points/console/consoleOperationApi.ts +0 -936
- package/src/adapter/entry-points/console/consoleProjectResolver.test.ts +0 -246
- package/src/adapter/entry-points/console/consoleProjectResolver.ts +0 -111
- package/src/adapter/entry-points/console/consoleReadApi.test.ts +0 -714
- package/src/adapter/entry-points/console/consoleReadApi.ts +0 -361
- package/src/adapter/entry-points/console/consoleTabNames.test.ts +0 -52
- package/src/adapter/entry-points/console/consoleTabNames.ts +0 -37
- package/src/adapter/entry-points/console/consoleUiDistSync.test.ts +0 -66
- package/src/adapter/entry-points/console/dashboardComposeService.test.ts +0 -595
- package/src/adapter/entry-points/console/dashboardComposeService.ts +0 -256
- package/src/adapter/entry-points/console/dashboardEmitterComposerKey.test.ts +0 -180
- package/src/adapter/entry-points/console/ensureConsoleRunning.test.ts +0 -115
- package/src/adapter/entry-points/console/ensureConsoleRunning.ts +0 -64
- package/src/adapter/entry-points/console/ui/.storybook/main.ts +0 -12
- package/src/adapter/entry-points/console/ui/.storybook/preview.ts +0 -15
- package/src/adapter/entry-points/console/ui/biome.json +0 -53
- package/src/adapter/entry-points/console/ui/components.json +0 -20
- package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +0 -725
- package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +0 -831
- package/src/adapter/entry-points/console/ui/e2e/playwright.config.ts +0 -30
- package/src/adapter/entry-points/console/ui/e2e/tsconfig.json +0 -18
- package/src/adapter/entry-points/console/ui/index.html +0 -12
- package/src/adapter/entry-points/console/ui/jest-globals.cjs +0 -26
- package/src/adapter/entry-points/console/ui/jest.setup.ts +0 -1
- package/src/adapter/entry-points/console/ui/jest.styleMock.js +0 -1
- package/src/adapter/entry-points/console/ui/public/sw.js +0 -60
- package/src/adapter/entry-points/console/ui/src/components/ui/badge.stories.tsx +0 -35
- package/src/adapter/entry-points/console/ui/src/components/ui/badge.tsx +0 -28
- package/src/adapter/entry-points/console/ui/src/components/ui/button.stories.tsx +0 -34
- package/src/adapter/entry-points/console/ui/src/components/ui/button.tsx +0 -50
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.stories.tsx +0 -28
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.test.tsx +0 -65
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.tsx +0 -19
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.stories.tsx +0 -61
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.test.tsx +0 -199
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.tsx +0 -166
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.stories.tsx +0 -22
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.test.tsx +0 -74
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.tsx +0 -84
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.stories.tsx +0 -27
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.test.tsx +0 -85
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.tsx +0 -97
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.stories.tsx +0 -76
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.test.tsx +0 -56
- package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.tsx +0 -39
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.stories.tsx +0 -32
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.test.tsx +0 -105
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.tsx +0 -157
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.stories.tsx +0 -68
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.test.tsx +0 -612
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.tsx +0 -276
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.stories.tsx +0 -33
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.test.tsx +0 -57
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.tsx +0 -76
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.stories.tsx +0 -25
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.test.tsx +0 -55
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.tsx +0 -49
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.stories.tsx +0 -24
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.test.tsx +0 -63
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.tsx +0 -19
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.stories.tsx +0 -33
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.test.tsx +0 -62
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.tsx +0 -59
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.stories.tsx +0 -38
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.test.tsx +0 -151
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.tsx +0 -245
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.stories.tsx +0 -514
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.test.tsx +0 -727
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.tsx +0 -387
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.stories.tsx +0 -82
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.test.tsx +0 -52
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.tsx +0 -32
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.stories.tsx +0 -48
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.test.tsx +0 -235
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.tsx +0 -145
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.stories.tsx +0 -29
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.test.tsx +0 -30
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.tsx +0 -50
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.stories.tsx +0 -38
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.test.tsx +0 -54
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.tsx +0 -60
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.stories.tsx +0 -56
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.test.tsx +0 -111
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.tsx +0 -92
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.stories.tsx +0 -51
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.test.tsx +0 -59
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.tsx +0 -39
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +0 -207
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +0 -332
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.tsx +0 -211
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.stories.tsx +0 -49
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.test.tsx +0 -157
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.tsx +0 -118
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.stories.tsx +0 -23
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.test.tsx +0 -40
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.tsx +0 -17
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.stories.tsx +0 -101
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.test.tsx +0 -102
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.tsx +0 -75
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.stories.tsx +0 -40
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.test.tsx +0 -213
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.tsx +0 -115
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.stories.tsx +0 -50
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.test.tsx +0 -98
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.tsx +0 -66
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.stories.tsx +0 -69
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.test.tsx +0 -101
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.tsx +0 -75
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.stories.tsx +0 -137
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.test.tsx +0 -554
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.tsx +0 -400
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.stories.tsx +0 -30
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.test.tsx +0 -111
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.tsx +0 -91
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.stories.tsx +0 -27
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.test.tsx +0 -24
- package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.tsx +0 -28
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.stories.tsx +0 -14
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.test.tsx +0 -21
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.tsx +0 -26
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.stories.tsx +0 -14
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.test.tsx +0 -40
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.tsx +0 -37
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleErrorToast.stories.tsx +0 -33
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.stories.tsx +0 -20
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.test.tsx +0 -48
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.tsx +0 -42
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.stories.tsx +0 -115
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.test.tsx +0 -262
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.tsx +0 -123
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +0 -65
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +0 -159
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +0 -55
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.stories.tsx +0 -20
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.test.tsx +0 -93
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.tsx +0 -45
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.stories.tsx +0 -17
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.test.tsx +0 -49
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.tsx +0 -66
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.stories.tsx +0 -47
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.test.tsx +0 -95
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.tsx +0 -62
- package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.stories.tsx +0 -32
- package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.test.tsx +0 -101
- package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.tsx +0 -80
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.test.ts +0 -304
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.ts +0 -167
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.test.ts +0 -498
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.ts +0 -277
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.test.ts +0 -99
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.ts +0 -90
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.test.ts +0 -110
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.ts +0 -83
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.test.ts +0 -51
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.ts +0 -39
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.test.ts +0 -229
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.ts +0 -194
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +0 -151
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.ts +0 -128
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.test.ts +0 -629
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.ts +0 -417
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.test.ts +0 -40
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.ts +0 -71
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.test.ts +0 -24
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.ts +0 -17
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.test.ts +0 -97
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.ts +0 -44
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.test.ts +0 -59
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.ts +0 -26
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.test.ts +0 -48
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.ts +0 -39
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.test.ts +0 -41
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.ts +0 -57
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.test.ts +0 -115
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.ts +0 -115
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +0 -546
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.ts +0 -278
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.test.ts +0 -110
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.ts +0 -70
- package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.test.ts +0 -387
- package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.ts +0 -407
- package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.test.ts +0 -446
- package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.ts +0 -533
- package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.test.ts +0 -78
- package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.ts +0 -34
- package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.test.ts +0 -252
- package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.ts +0 -207
- package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.test.ts +0 -27
- package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.ts +0 -71
- package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.test.ts +0 -88
- package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.ts +0 -34
- package/src/adapter/entry-points/console/ui/src/features/console/lib/navigation.ts +0 -7
- package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.test.ts +0 -104
- package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.ts +0 -79
- package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +0 -200
- package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.ts +0 -122
- package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.test.ts +0 -90
- package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.ts +0 -37
- package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.test.ts +0 -34
- package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.ts +0 -85
- package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.test.ts +0 -81
- package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.ts +0 -61
- package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.test.ts +0 -35
- package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.ts +0 -21
- package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.test.ts +0 -96
- package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.ts +0 -93
- package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +0 -229
- package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.ts +0 -106
- package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.test.ts +0 -18
- package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.ts +0 -16
- package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.test.ts +0 -97
- package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.ts +0 -95
- package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.test.ts +0 -53
- package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.ts +0 -33
- package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.test.ts +0 -72
- package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.ts +0 -61
- package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +0 -325
- package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.ts +0 -94
- package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.test.ts +0 -44
- package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.ts +0 -17
- package/src/adapter/entry-points/console/ui/src/features/console/logic/references.test.ts +0 -103
- package/src/adapter/entry-points/console/ui/src/features/console/logic/references.ts +0 -64
- package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.test.ts +0 -74
- package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.ts +0 -53
- package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.test.ts +0 -34
- package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.ts +0 -28
- package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +0 -89
- package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.ts +0 -30
- package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.test.ts +0 -61
- package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.ts +0 -77
- package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +0 -173
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +0 -629
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +0 -351
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.test.tsx +0 -1469
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +0 -736
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleReferenceLinkContainer.tsx +0 -25
- package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +0 -418
- package/src/adapter/entry-points/console/ui/src/index.css +0 -1592
- package/src/adapter/entry-points/console/ui/src/lib/utils.ts +0 -4
- package/src/adapter/entry-points/console/ui/src/main.tsx +0 -21
- package/src/adapter/entry-points/console/ui/src/vite-env.d.ts +0 -1
- package/src/adapter/entry-points/console/ui/tsconfig.json +0 -26
- package/src/adapter/entry-points/console/ui/vite.config.ts +0 -24
- package/src/adapter/entry-points/console/ui-dist/assets/index-BYDbK1Fj.js +0 -88
- package/src/adapter/entry-points/console/ui-dist/assets/index-KyQISRuQ.css +0 -2
- package/src/adapter/entry-points/console/ui-dist/index.html +0 -13
- package/src/adapter/entry-points/console/ui-dist/sw.js +0 -60
- package/src/adapter/entry-points/console/webServer.test.ts +0 -2945
- package/src/adapter/entry-points/console/webServer.ts +0 -940
- package/src/adapter/entry-points/function/getStoryObjectMap.ts +0 -3
- package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.test.ts +0 -218
- package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.ts +0 -113
- package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.test.ts +0 -110
- package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.ts +0 -116
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +0 -859
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +0 -984
- package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.test.ts +0 -126
- package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.ts +0 -80
- package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.test.ts +0 -491
- package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts +0 -137
- package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.test.ts +0 -508
- package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts +0 -156
- package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +0 -332
- package/src/adapter/entry-points/handlers/consoleListsWriter.ts +0 -60
- package/src/adapter/entry-points/handlers/dashboardRowWriter.test.ts +0 -112
- package/src/adapter/entry-points/handlers/dashboardRowWriter.ts +0 -51
- package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.test.ts +0 -285
- package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts +0 -109
- package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.test.ts +0 -170
- package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.ts +0 -40
- package/src/adapter/entry-points/handlers/machineStatusWriter.test.ts +0 -191
- package/src/adapter/entry-points/handlers/machineStatusWriter.ts +0 -110
- package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +0 -548
- package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +0 -192
- package/src/adapter/entry-points/handlers/ownerCallFileCleaner.test.ts +0 -111
- package/src/adapter/entry-points/handlers/ownerCallFileCleaner.ts +0 -25
- package/src/adapter/entry-points/handlers/ownerCallFileStore.test.ts +0 -286
- package/src/adapter/entry-points/handlers/ownerCallFileStore.ts +0 -145
- package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.test.ts +0 -55
- package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.ts +0 -36
- package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.test.ts +0 -72
- package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.ts +0 -74
- package/src/adapter/entry-points/handlers/rotationOrderFileWriter.test.ts +0 -181
- package/src/adapter/entry-points/handlers/rotationOrderFileWriter.ts +0 -18
- package/src/adapter/entry-points/handlers/situationFileWriter.test.ts +0 -489
- package/src/adapter/entry-points/handlers/situationFileWriter.ts +0 -176
- package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.test.ts +0 -169
- package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.ts +0 -32
- package/src/adapter/entry-points/handlers/subscriptionDisabledTokenHandler.ts +0 -41
- package/src/adapter/entry-points/handlers/tokenExhaustionHandover.ts +0 -81
- package/src/adapter/entry-points/handlers/tokenStatusWriter.test.ts +0 -266
- package/src/adapter/entry-points/handlers/tokenStatusWriter.ts +0 -262
- package/src/adapter/proxy/ClaudeMessageResponseParser.test.ts +0 -211
- package/src/adapter/proxy/ClaudeMessageResponseParser.ts +0 -181
- package/src/adapter/proxy/RateLimitCache.test.ts +0 -1077
- package/src/adapter/proxy/RateLimitCache.ts +0 -385
- package/src/adapter/proxy/TokenListLoader.test.ts +0 -183
- package/src/adapter/proxy/TokenListLoader.ts +0 -75
- package/src/adapter/proxy/ensureProxyRunning.test.ts +0 -85
- package/src/adapter/proxy/ensureProxyRunning.ts +0 -41
- package/src/adapter/proxy/proxyEntry.test.ts +0 -552
- package/src/adapter/proxy/proxyEntry.ts +0 -214
- package/src/adapter/repositories/BaseGitHubRepository.test.ts +0 -26
- package/src/adapter/repositories/BaseGitHubRepository.ts +0 -26
- package/src/adapter/repositories/BrowserGitHubProjectRepository.test.ts +0 -108
- package/src/adapter/repositories/BrowserGitHubProjectRepository.ts +0 -118
- package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.test.ts +0 -71
- package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.ts +0 -21
- package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.test.ts +0 -324
- package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts +0 -148
- package/src/adapter/repositories/FetchWebhookRepository.ts +0 -8
- package/src/adapter/repositories/FileHandoverStateRepository.test.ts +0 -114
- package/src/adapter/repositories/FileHandoverStateRepository.ts +0 -73
- package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.test.ts +0 -514
- package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.ts +0 -109
- package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.test.ts +0 -284
- package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.ts +0 -128
- package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.test.ts +0 -138
- package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.ts +0 -113
- package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.test.ts +0 -121
- package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.ts +0 -103
- package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +0 -360
- package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +0 -77
- package/src/adapter/repositories/FileSystemSessionRecordReader.test.ts +0 -59
- package/src/adapter/repositories/FileSystemSessionRecordReader.ts +0 -31
- package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.test.ts +0 -287
- package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.ts +0 -125
- package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.test.ts +0 -285
- package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.ts +0 -119
- package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.test.ts +0 -237
- package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.ts +0 -57
- package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.test.ts +0 -56
- package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.ts +0 -32
- package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.test.ts +0 -68
- package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.ts +0 -23
- package/src/adapter/repositories/GitHubIssueCheckpointRepository.test.ts +0 -51
- package/src/adapter/repositories/GitHubIssueCheckpointRepository.ts +0 -47
- package/src/adapter/repositories/GitHubIssueCommentRepository.test.ts +0 -278
- package/src/adapter/repositories/GitHubIssueCommentRepository.ts +0 -109
- package/src/adapter/repositories/GoogleSpreadsheetRepository.integration.test.ts +0 -265
- package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +0 -431
- package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +0 -268
- package/src/adapter/repositories/GraphqlProjectRepository.diskCache.test.ts +0 -272
- package/src/adapter/repositories/GraphqlProjectRepository.errorHandling.test.ts +0 -111
- package/src/adapter/repositories/GraphqlProjectRepository.fetchProjectId.test.ts +0 -254
- package/src/adapter/repositories/GraphqlProjectRepository.test.ts +0 -209
- package/src/adapter/repositories/GraphqlProjectRepository.ts +0 -707
- package/src/adapter/repositories/GraphqlProjectRepositoryProjectLocation.test.ts +0 -297
- package/src/adapter/repositories/KyHttpRepository.ts +0 -8
- package/src/adapter/repositories/KySlackRepository.test.ts +0 -172
- package/src/adapter/repositories/KySlackRepository.ts +0 -298
- package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.test.ts +0 -193
- package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.ts +0 -106
- package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.test.ts +0 -190
- package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.ts +0 -102
- package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +0 -265
- package/src/adapter/repositories/LocalStorageCacheRepository.ts +0 -79
- package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +0 -142
- package/src/adapter/repositories/LocalStorageRepository.test.ts +0 -173
- package/src/adapter/repositories/LocalStorageRepository.ts +0 -30
- package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +0 -15
- package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +0 -9
- package/src/adapter/repositories/NodeLocalCommandRunner.largeOutput.test.ts +0 -16
- package/src/adapter/repositories/NodeLocalCommandRunner.test.ts +0 -118
- package/src/adapter/repositories/NodeLocalCommandRunner.ts +0 -66
- package/src/adapter/repositories/NodeProcessSignalRepository.test.ts +0 -82
- package/src/adapter/repositories/NodeProcessSignalRepository.ts +0 -47
- package/src/adapter/repositories/NodeSubAgentProcessLister.test.ts +0 -44
- package/src/adapter/repositories/NodeSubAgentProcessLister.ts +0 -40
- package/src/adapter/repositories/NodeTmuxSessionRepository.test.ts +0 -546
- package/src/adapter/repositories/NodeTmuxSessionRepository.ts +0 -245
- package/src/adapter/repositories/OauthAPIClaudeRepository.ts +0 -279
- package/src/adapter/repositories/OauthAPIProxyClaudeRepository.test.ts +0 -166
- package/src/adapter/repositories/OauthAPIProxyClaudeRepository.ts +0 -32
- package/src/adapter/repositories/OauthProxyClaudeRepository.test.ts +0 -428
- package/src/adapter/repositories/OauthProxyClaudeRepository.ts +0 -124
- package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.test.ts +0 -242
- package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.ts +0 -261
- package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.test.ts +0 -184
- package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.ts +0 -138
- package/src/adapter/repositories/ProcClaudeLiveSessionRepository.test.ts +0 -208
- package/src/adapter/repositories/ProcClaudeLiveSessionRepository.ts +0 -130
- package/src/adapter/repositories/ProcFsProcessEnvironReader.test.ts +0 -60
- package/src/adapter/repositories/ProcFsProcessEnvironReader.ts +0 -38
- package/src/adapter/repositories/ProcHostMetricsRepository.test.ts +0 -207
- package/src/adapter/repositories/ProcHostMetricsRepository.ts +0 -181
- package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.test.ts +0 -231
- package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.ts +0 -134
- package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.test.ts +0 -121
- package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.ts +0 -58
- package/src/adapter/repositories/ProjectIssuesCacheRepository.test.ts +0 -218
- package/src/adapter/repositories/ProjectIssuesCacheRepository.ts +0 -141
- package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +0 -1195
- package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +0 -185
- package/src/adapter/repositories/ProxyRateLimitCacheRepository.test.ts +0 -116
- package/src/adapter/repositories/ProxyRateLimitCacheRepository.ts +0 -67
- package/src/adapter/repositories/RateLimitSnapshotRepository.ts +0 -50
- package/src/adapter/repositories/RealSleeper.test.ts +0 -19
- package/src/adapter/repositories/RealSleeper.ts +0 -12
- package/src/adapter/repositories/RestProjectRepository.test.ts +0 -277
- package/src/adapter/repositories/RestProjectRepository.ts +0 -129
- package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.test.ts +0 -313
- package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.ts +0 -164
- package/src/adapter/repositories/SystemDateRepository.test.ts +0 -60
- package/src/adapter/repositories/SystemDateRepository.ts +0 -34
- package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.test.ts +0 -253
- package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.ts +0 -158
- package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.queuedReply.test.ts +0 -171
- package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.singleScan.test.ts +0 -86
- package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +0 -996
- package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +0 -396
- package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.test.ts +0 -208
- package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.ts +0 -80
- package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +0 -1674
- package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +0 -459
- package/src/adapter/repositories/clSessionScopeUnitName.test.ts +0 -76
- package/src/adapter/repositories/clSessionScopeUnitName.ts +0 -5
- package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.test.ts +0 -34
- package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.ts +0 -8
- package/src/adapter/repositories/githubGraphqlClient.test.ts +0 -479
- package/src/adapter/repositories/githubGraphqlClient.ts +0 -243
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +0 -5182
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +0 -3303
- package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +0 -46
- package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +0 -88
- package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +0 -1776
- package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +0 -1552
- package/src/adapter/repositories/issue/RestIssueRepository.test.ts +0 -393
- package/src/adapter/repositories/issue/RestIssueRepository.ts +0 -252
- package/src/adapter/repositories/issue/gitHubRawUrl.test.ts +0 -29
- package/src/adapter/repositories/issue/gitHubRawUrl.ts +0 -30
- package/src/adapter/repositories/issue/githubRateLimitRetry.test.ts +0 -167
- package/src/adapter/repositories/issue/githubRateLimitRetry.ts +0 -109
- package/src/adapter/repositories/localStorageCacheDirectory.test.ts +0 -81
- package/src/adapter/repositories/localStorageCacheDirectory.ts +0 -13
- package/src/adapter/repositories/projectFieldDefinition.test.ts +0 -191
- package/src/adapter/repositories/projectFieldDefinition.ts +0 -144
- package/src/adapter/repositories/utils.test.ts +0 -55
- package/src/adapter/repositories/utils.ts +0 -45
- package/src/domain/entities/ClaudeHandoverSession.ts +0 -12
- package/src/domain/entities/ClaudeMessageResponse.ts +0 -31
- package/src/domain/entities/ClaudeTokenUsage.ts +0 -17
- package/src/domain/entities/ClaudeWindowUsage.ts +0 -5
- package/src/domain/entities/Comment.ts +0 -5
- package/src/domain/entities/InteractiveLiveSession.ts +0 -6
- package/src/domain/entities/Issue.ts +0 -31
- package/src/domain/entities/KevReportWatermark.ts +0 -4
- package/src/domain/entities/LiveSessionActivitySnapshot.ts +0 -14
- package/src/domain/entities/LiveSessionOutputActivity.ts +0 -4
- package/src/domain/entities/LiveSessionProcessSnapshot.ts +0 -18
- package/src/domain/entities/LiveTmuxSession.ts +0 -4
- package/src/domain/entities/Member.ts +0 -3
- package/src/domain/entities/OutputDegeneration.ts +0 -10
- package/src/domain/entities/Project.ts +0 -88
- package/src/domain/entities/ProjectField.ts +0 -3
- package/src/domain/entities/ProjectFieldName.ts +0 -2
- package/src/domain/entities/ProjectFieldSingleSelect.ts +0 -8
- package/src/domain/entities/ProjectFieldSingleSelectOption.ts +0 -8
- package/src/domain/entities/RequiredProjectField.ts +0 -68
- package/src/domain/entities/SearchedIssue.ts +0 -11
- package/src/domain/entities/StoryObjectMap.ts +0 -12
- package/src/domain/entities/TokenExhaustionHandoverState.ts +0 -8
- package/src/domain/entities/WorkflowStatus.ts +0 -66
- package/src/domain/usecases/ActionAnnouncementUseCase.test.ts +0 -91
- package/src/domain/usecases/ActionAnnouncementUseCase.ts +0 -78
- package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.test.ts +0 -222
- package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.ts +0 -76
- package/src/domain/usecases/AnalyzeProblemByIssueUseCase.test.ts +0 -118
- package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +0 -112
- package/src/domain/usecases/AnalyzeStoriesUseCase.test.ts +0 -82
- package/src/domain/usecases/AnalyzeStoriesUseCase.ts +0 -296
- package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.test.ts +0 -578
- package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.ts +0 -137
- package/src/domain/usecases/CONTRIBUTING_FOR_TEST.md +0 -259
- package/src/domain/usecases/ChangeStatusByStoryColorUseCase.test.ts +0 -437
- package/src/domain/usecases/ChangeStatusByStoryColorUseCase.ts +0 -80
- package/src/domain/usecases/ChangeTargetPullRequestApprover.test.ts +0 -248
- package/src/domain/usecases/ChangeTargetPullRequestApprover.ts +0 -69
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +0 -411
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +0 -142
- package/src/domain/usecases/ClearDependedIssueURLUseCase.test.ts +0 -1120
- package/src/domain/usecases/ClearDependedIssueURLUseCase.ts +0 -161
- package/src/domain/usecases/ClearPastNextActionDateHourUseCase.test.ts +0 -345
- package/src/domain/usecases/ClearPastNextActionDateHourUseCase.ts +0 -81
- package/src/domain/usecases/CliErrorReportUseCase.test.ts +0 -162
- package/src/domain/usecases/CliErrorReportUseCase.ts +0 -72
- package/src/domain/usecases/ConflictedIssueRevertUseCase.test.ts +0 -886
- package/src/domain/usecases/ConflictedIssueRevertUseCase.ts +0 -146
- package/src/domain/usecases/CreateEstimationIssueUseCase.test.ts +0 -227
- package/src/domain/usecases/CreateEstimationIssueUseCase.ts +0 -205
- package/src/domain/usecases/CreateNewStoryByLabelUseCase.test.ts +0 -1084
- package/src/domain/usecases/CreateNewStoryByLabelUseCase.ts +0 -146
- package/src/domain/usecases/DailySecurityScanUseCase.test.ts +0 -1709
- package/src/domain/usecases/DailySecurityScanUseCase.ts +0 -476
- package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +0 -533
- package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +0 -122
- package/src/domain/usecases/GetStoryObjectMapUseCase.test.ts +0 -330
- package/src/domain/usecases/GetStoryObjectMapUseCase.ts +0 -79
- package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +0 -1913
- package/src/domain/usecases/HandleScheduledEventUseCase.ts +0 -846
- package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.test.ts +0 -175
- package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.ts +0 -63
- package/src/domain/usecases/IssueNoStatusUpdateUseCase.test.ts +0 -165
- package/src/domain/usecases/IssueNoStatusUpdateUseCase.ts +0 -44
- package/src/domain/usecases/IssueRejectionEvaluator.test.ts +0 -1137
- package/src/domain/usecases/IssueRejectionEvaluator.ts +0 -340
- package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.test.ts +0 -679
- package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.ts +0 -178
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +0 -5441
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +0 -891
- package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +0 -2069
- package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +0 -489
- package/src/domain/usecases/OauthTokenSelectUseCase.test.ts +0 -651
- package/src/domain/usecases/OauthTokenSelectUseCase.ts +0 -274
- package/src/domain/usecases/OutputDegenerationDetector.test.ts +0 -167
- package/src/domain/usecases/OutputDegenerationDetector.ts +0 -169
- package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.test.ts +0 -711
- package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.ts +0 -146
- package/src/domain/usecases/QualityCheckAdvanceUseCase.test.ts +0 -421
- package/src/domain/usecases/QualityCheckAdvanceUseCase.ts +0 -76
- package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.test.ts +0 -188
- package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.ts +0 -57
- package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.test.ts +0 -303
- package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.ts +0 -155
- package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +0 -1838
- package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +0 -221
- package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +0 -2392
- package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +0 -499
- package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.test.ts +0 -224
- package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.ts +0 -142
- package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.test.ts +0 -360
- package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.ts +0 -70
- package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.test.ts +0 -400
- package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.ts +0 -48
- package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.test.ts +0 -696
- package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +0 -201
- package/src/domain/usecases/SetupTowerDefenceProjectUseCase.test.ts +0 -1363
- package/src/domain/usecases/SetupTowerDefenceProjectUseCase.ts +0 -215
- package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.test.ts +0 -170
- package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.ts +0 -38
- package/src/domain/usecases/StaleTmuxSessionKillUseCase.test.ts +0 -283
- package/src/domain/usecases/StaleTmuxSessionKillUseCase.ts +0 -98
- package/src/domain/usecases/StartPreparationUseCase.test.ts +0 -7822
- package/src/domain/usecases/StartPreparationUseCase.ts +0 -876
- package/src/domain/usecases/SubscriptionDisabledIssueUseCase.test.ts +0 -200
- package/src/domain/usecases/SubscriptionDisabledIssueUseCase.ts +0 -74
- package/src/domain/usecases/TokenExhaustionHandoverUseCase.test.ts +0 -838
- package/src/domain/usecases/TokenExhaustionHandoverUseCase.ts +0 -439
- package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.test.ts +0 -306
- package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.ts +0 -64
- package/src/domain/usecases/UpdateRateLimitCacheUseCase.test.ts +0 -178
- package/src/domain/usecases/UpdateRateLimitCacheUseCase.ts +0 -22
- package/src/domain/usecases/adapter-interfaces/ClaudeHandoverSessionRepository.ts +0 -5
- package/src/domain/usecases/adapter-interfaces/ClaudeInteractiveSessionRepository.ts +0 -9
- package/src/domain/usecases/adapter-interfaces/ClaudeLiveSessionRepository.ts +0 -8
- package/src/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.ts +0 -5
- package/src/domain/usecases/adapter-interfaces/ClaudeRepository.ts +0 -6
- package/src/domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository.ts +0 -8
- package/src/domain/usecases/adapter-interfaces/ConsoleTabsRepository.ts +0 -12
- package/src/domain/usecases/adapter-interfaces/CopilotRepository.ts +0 -3
- package/src/domain/usecases/adapter-interfaces/DateRepository.ts +0 -7
- package/src/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.ts +0 -3
- package/src/domain/usecases/adapter-interfaces/HttpRepository.ts +0 -3
- package/src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts +0 -7
- package/src/domain/usecases/adapter-interfaces/IssueAttachmentRepository.ts +0 -9
- package/src/domain/usecases/adapter-interfaces/IssueCheckpointRepository.ts +0 -3
- package/src/domain/usecases/adapter-interfaces/IssueCommentRepository.ts +0 -7
- package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +0 -229
- package/src/domain/usecases/adapter-interfaces/KevReportWatermarkRepository.ts +0 -11
- package/src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts +0 -5
- package/src/domain/usecases/adapter-interfaces/LocalCommandRunner.ts +0 -16
- package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +0 -5
- package/src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts +0 -3
- package/src/domain/usecases/adapter-interfaces/ProcessSignalRepository.ts +0 -5
- package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +0 -29
- package/src/domain/usecases/adapter-interfaces/RateLimitCacheRepository.ts +0 -10
- package/src/domain/usecases/adapter-interfaces/RefusalTailStatusProvider.ts +0 -5
- package/src/domain/usecases/adapter-interfaces/SessionAssistantTurnsRepository.ts +0 -6
- package/src/domain/usecases/adapter-interfaces/SessionDegenerationCooldownStateRepository.ts +0 -4
- package/src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts +0 -7
- package/src/domain/usecases/adapter-interfaces/SessionRecordReader.ts +0 -3
- package/src/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.ts +0 -8
- package/src/domain/usecases/adapter-interfaces/SilentSessionCandidateStateRepository.ts +0 -10
- package/src/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.ts +0 -20
- package/src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts +0 -18
- package/src/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.ts +0 -6
- package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +0 -20
- package/src/domain/usecases/adapter-interfaces/Sleeper.ts +0 -3
- package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +0 -18
- package/src/domain/usecases/adapter-interfaces/StatusDefaultRepository.ts +0 -5
- package/src/domain/usecases/adapter-interfaces/SubAgentLivenessResolver.ts +0 -6
- package/src/domain/usecases/adapter-interfaces/SubAgentProcessLister.ts +0 -8
- package/src/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.ts +0 -3
- package/src/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.ts +0 -6
- package/src/domain/usecases/adapter-interfaces/TakeOwnershipSpawnRepository.ts +0 -9
- package/src/domain/usecases/adapter-interfaces/TmuxSessionRepository.ts +0 -20
- package/src/domain/usecases/adapter-interfaces/TokenExhaustionHandoverStateRepository.ts +0 -6
- package/src/domain/usecases/adapter-interfaces/TokenRateLimitSnapshotRepository.ts +0 -22
- package/src/domain/usecases/adapter-interfaces/WebhookRepository.ts +0 -3
- package/src/domain/usecases/agentReportPrefix.ts +0 -1
- package/src/domain/usecases/autoStatusCheckComments.ts +0 -1
- package/src/domain/usecases/console/.gitkeep +0 -0
- package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +0 -887
- package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +0 -368
- package/src/domain/usecases/dashboard/ComposeDashboardUseCase.test.ts +0 -654
- package/src/domain/usecases/dashboard/ComposeDashboardUseCase.ts +0 -318
- package/src/domain/usecases/dashboard/DashboardProjectCode.test.ts +0 -34
- package/src/domain/usecases/dashboard/DashboardProjectCode.ts +0 -27
- package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.test.ts +0 -160
- package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.ts +0 -69
- package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.test.ts +0 -362
- package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.ts +0 -234
- package/src/domain/usecases/ensureAgentOptionAndGetId.ts +0 -47
- package/src/domain/usecases/extractFencedJsonBlocks.test.ts +0 -40
- package/src/domain/usecases/extractFencedJsonBlocks.ts +0 -21
- package/src/domain/usecases/extractNextStepAgent.test.ts +0 -58
- package/src/domain/usecases/extractNextStepAgent.ts +0 -18
- package/src/domain/usecases/extractNextStepAgentFromComments.ts +0 -13
- package/src/domain/usecases/findLastAgentReport.test.ts +0 -121
- package/src/domain/usecases/findLastAgentReport.ts +0 -14
- package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.test.ts +0 -339
- package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts +0 -188
- package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.test.ts +0 -389
- package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.ts +0 -103
- package/src/domain/usecases/intmux/OwnerCallFile.test.ts +0 -184
- package/src/domain/usecases/intmux/OwnerCallFile.ts +0 -80
- package/src/domain/usecases/isAgentReportBody.test.ts +0 -108
- package/src/domain/usecases/isAgentReportBody.ts +0 -52
- package/src/domain/usecases/isAuthorAuthorizedForAutoStatusCheck.ts +0 -12
- package/src/domain/usecases/isHumanComment.test.ts +0 -77
- package/src/domain/usecases/isHumanComment.ts +0 -23
- package/src/domain/usecases/isRecord.ts +0 -2
- package/src/domain/usecases/issueReactivationTriggerIsPending.test.ts +0 -541
- package/src/domain/usecases/issueReactivationTriggerIsPending.ts +0 -25
- package/src/domain/usecases/nextStepAgentDispatchRepeatedMessage.ts +0 -2
- package/src/domain/usecases/normalizeReportBody.test.ts +0 -24
- package/src/domain/usecases/normalizeReportBody.ts +0 -2
- package/src/domain/usecases/resolveAllowedIssueAuthors.test.ts +0 -51
- package/src/domain/usecases/resolveAllowedIssueAuthors.ts +0 -6
- package/src/domain/usecases/resolveLabelsAsLlmAgentName.test.ts +0 -42
- package/src/domain/usecases/resolveLabelsAsLlmAgentName.ts +0 -6
- package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.test.ts +0 -33
- package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.ts +0 -7
- package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.test.ts +0 -337
- package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.ts +0 -133
- package/src/domain/usecases/silentSessionReminderSentinel.ts +0 -9
- package/src/domain/usecases/triagerAgentName.ts +0 -4
- package/src/domain/usecases/utils.test.ts +0 -35
- package/src/domain/usecases/utils.ts +0 -6
- package/src/index.test.ts +0 -8
- package/src/index.ts +0 -10
- package/src/releaseConfig.test.ts +0 -40
- package/tsconfig.build.json +0 -18
- package/tsconfig.json +0 -25
- package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts +0 -13
- package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts.map +0 -1
- package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts +0 -16
- package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts.map +0 -1
- package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +0 -12
- package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +0 -1
- package/types/domain/entities/UnansweredOwnerCall.d.ts +0 -5
- package/types/domain/entities/UnansweredOwnerCall.d.ts.map +0 -1
- package/types/domain/entities/WorkingTime.d.ts +0 -8
- package/types/domain/entities/WorkingTime.d.ts.map +0 -1
- package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts +0 -17
- package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts.map +0 -1
- package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts +0 -23
- package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts.map +0 -1
- package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +0 -50
- package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +0 -1
- package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts +0 -15
- package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts.map +0 -1
- package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts +0 -11
- package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts.map +0 -1
- package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts +0 -3
- package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts.map +0 -1
- package/types/domain/usecases/findLastAgentDeclaringReport.d.ts +0 -5
- package/types/domain/usecases/findLastAgentDeclaringReport.d.ts.map +0 -1
- package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts +0 -5
- package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts.map +0 -1
- package/types/domain/usecases/isWaitingForOwnerApproval.d.ts +0 -2
- package/types/domain/usecases/isWaitingForOwnerApproval.d.ts.map +0 -1
- package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts +0 -3
- package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts.map +0 -1
|
@@ -1,1488 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { Command } from 'commander';
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
ConfigFile,
|
|
7
|
-
fetchProjectReadme,
|
|
8
|
-
loadConfigFile,
|
|
9
|
-
mergeConfigs,
|
|
10
|
-
parseProjectReadmeConfig,
|
|
11
|
-
} from './projectConfig';
|
|
12
|
-
|
|
13
|
-
import * as path from 'path';
|
|
14
|
-
import type { IssueRepository } from '../../../domain/usecases/adapter-interfaces/IssueRepository';
|
|
15
|
-
import { CheckIssueReviewReadinessUseCase } from '../../../domain/usecases/CheckIssueReviewReadinessUseCase';
|
|
16
|
-
import { CliErrorReportUseCase } from '../../../domain/usecases/CliErrorReportUseCase';
|
|
17
|
-
import { assertDashboardDisplayLabelsUnique } from '../../../domain/usecases/dashboard/DashboardProjectCode';
|
|
18
|
-
import { isOwnerCallCalledAtValid } from '../../../domain/usecases/intmux/OwnerCallFile';
|
|
19
|
-
import { NotifyFinishedIssuePreparationUseCase } from '../../../domain/usecases/NotifyFinishedIssuePreparationUseCase';
|
|
20
|
-
import { RevertOrphanedPreparationUseCase } from '../../../domain/usecases/RevertOrphanedPreparationUseCase';
|
|
21
|
-
import { StartPreparationUseCase } from '../../../domain/usecases/StartPreparationUseCase';
|
|
22
|
-
import type { BaseGitHubRepository } from '../../repositories/BaseGitHubRepository';
|
|
23
|
-
import { FetchWebhookRepository } from '../../repositories/FetchWebhookRepository';
|
|
24
|
-
import { GitHubIssueCommentRepository } from '../../repositories/GitHubIssueCommentRepository';
|
|
25
|
-
import { GraphqlProjectRepository } from '../../repositories/GraphqlProjectRepository';
|
|
26
|
-
import { ApiV3CheerioRestIssueRepository } from '../../repositories/issue/ApiV3CheerioRestIssueRepository';
|
|
27
|
-
import { ApiV3IssueRepository } from '../../repositories/issue/ApiV3IssueRepository';
|
|
28
|
-
import { GraphqlProjectItemRepository } from '../../repositories/issue/GraphqlProjectItemRepository';
|
|
29
|
-
import { RestIssueRepository } from '../../repositories/issue/RestIssueRepository';
|
|
30
|
-
import { LocalCommandIssueAttachmentRepository } from '../../repositories/LocalCommandIssueAttachmentRepository';
|
|
31
|
-
import { LocalStorageCacheRepository } from '../../repositories/LocalStorageCacheRepository';
|
|
32
|
-
import { LocalStorageRepository } from '../../repositories/LocalStorageRepository';
|
|
33
|
-
import { projectCacheDirectory } from '../../repositories/localStorageCacheDirectory';
|
|
34
|
-
import { NodeLocalCommandRunner } from '../../repositories/NodeLocalCommandRunner';
|
|
35
|
-
import { NodeTmuxSessionRepository } from '../../repositories/NodeTmuxSessionRepository';
|
|
36
|
-
import { ProcTakeOwnershipSpawnRepository } from '../../repositories/ProcTakeOwnershipSpawnRepository';
|
|
37
|
-
import { CliGitHubGraphqlRateLimitRepository } from '../../repositories/CliGitHubGraphqlRateLimitRepository';
|
|
38
|
-
import { DEFAULT_THRESHOLD_FOR_DISPATCH_LOOP } from '../../../domain/usecases/resolveNextStepAgentDispatchRepetition';
|
|
39
|
-
import { ProxyClaudeTokenUsageRepository } from '../../repositories/ProxyClaudeTokenUsageRepository';
|
|
40
|
-
import { SystemDateRepository } from '../../repositories/SystemDateRepository';
|
|
41
|
-
import * as os from 'os';
|
|
42
|
-
import {
|
|
43
|
-
createConsoleGithubTokenResolver,
|
|
44
|
-
createConsoleGithubTokenResolverByItemUrl,
|
|
45
|
-
createConsoleIssueRepositoryResolver,
|
|
46
|
-
createConsoleProjectRepositoryResolver,
|
|
47
|
-
} from '../console/consoleGithubTokenResolver';
|
|
48
|
-
import {
|
|
49
|
-
buildPjcodeToProjectUrl,
|
|
50
|
-
createConsoleProjectLoader,
|
|
51
|
-
createConsoleProjectResolver,
|
|
52
|
-
createPjcodeConfigChecker,
|
|
53
|
-
} from '../console/consoleProjectResolver';
|
|
54
|
-
import {
|
|
55
|
-
IssueTitleStateCache,
|
|
56
|
-
PullRequestStatusCache,
|
|
57
|
-
} from '../console/consoleReadApi';
|
|
58
|
-
import { ensureConsoleRunning } from '../console/ensureConsoleRunning';
|
|
59
|
-
import { DEFAULT_WEB_PORT, startWebServer } from '../console/webServer';
|
|
60
|
-
import { FileSystemConsoleTabsRepository } from '../handlers/FileSystemConsoleTabsRepository';
|
|
61
|
-
import { InTmuxByHumanSessionTokenCountHandler } from '../handlers/InTmuxByHumanSessionTokenCountHandler';
|
|
62
|
-
import { LiveSessionOauthTokenSelectHandler } from '../handlers/LiveSessionOauthTokenSelectHandler';
|
|
63
|
-
import { OauthTokenSelectHandler } from '../handlers/OauthTokenSelectHandler';
|
|
64
|
-
import {
|
|
65
|
-
ownerCallFileAppend,
|
|
66
|
-
ownerCallFileDeleteInEveryProject,
|
|
67
|
-
ownerCallProjectCodeInInTmuxByHumanData,
|
|
68
|
-
} from '../handlers/ownerCallFileStore';
|
|
69
|
-
import { writeRotationOrderFile } from '../handlers/rotationOrderFileWriter';
|
|
70
|
-
import {
|
|
71
|
-
loadLiveSessionOauthTokenSelectionSettings,
|
|
72
|
-
loadPreparationWorkerSettings,
|
|
73
|
-
loadWorkflowImprovementIssueUrl,
|
|
74
|
-
resolveFleetConfigFilePath,
|
|
75
|
-
} from './fleetConfig';
|
|
76
|
-
import {
|
|
77
|
-
type ConfigFile,
|
|
78
|
-
fetchProjectReadme,
|
|
79
|
-
loadConfigFile,
|
|
80
|
-
mergeConfigs,
|
|
81
|
-
parseProjectReadmeConfig,
|
|
82
|
-
} from './projectConfig';
|
|
83
|
-
|
|
84
|
-
type StartDaemonOptions = {
|
|
85
|
-
projectUrl?: string;
|
|
86
|
-
manager?: string;
|
|
87
|
-
defaultAgentName?: string;
|
|
88
|
-
defaultLlmModelName?: string;
|
|
89
|
-
fallbackLlmModelName?: string;
|
|
90
|
-
defaultLlmAgentName?: string;
|
|
91
|
-
maximumPreparingIssuesCount?: string;
|
|
92
|
-
utilizationPercentageThreshold?: string;
|
|
93
|
-
allowedIssueAuthors?: string;
|
|
94
|
-
preparationProcessCheckCommand?: string;
|
|
95
|
-
configFilePath: string;
|
|
96
|
-
fleetConfigFilePath?: string;
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
const resolvePositiveIntegerOption = (
|
|
100
|
-
rawValue: number | string | undefined,
|
|
101
|
-
optionName: string,
|
|
102
|
-
fallback: number,
|
|
103
|
-
): number => {
|
|
104
|
-
if (rawValue === undefined) {
|
|
105
|
-
return fallback;
|
|
106
|
-
}
|
|
107
|
-
const parsed = Number(rawValue);
|
|
108
|
-
if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
|
|
109
|
-
console.error(
|
|
110
|
-
`Invalid value for --${optionName}. It must be a positive integer.`,
|
|
111
|
-
);
|
|
112
|
-
process.exit(1);
|
|
113
|
-
}
|
|
114
|
-
return parsed;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
type NotifyFinishedOptions = {
|
|
118
|
-
issueUrl: string;
|
|
119
|
-
projectUrl?: string;
|
|
120
|
-
thresholdForAutoReject?: string;
|
|
121
|
-
thresholdForDispatchLoop?: string;
|
|
122
|
-
workflowBlockerResolvedWebhookUrl?: string;
|
|
123
|
-
configFilePath: string;
|
|
124
|
-
missingAgentName?: string;
|
|
125
|
-
sessionErrorLine?: string;
|
|
126
|
-
deferPreparation?: boolean;
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
type CheckIssueReviewReadinessOptions = {
|
|
130
|
-
issueUrl: string;
|
|
131
|
-
projectUrl?: string;
|
|
132
|
-
configFilePath: string;
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
type ServeWebOptions = {
|
|
136
|
-
configFilePath: string;
|
|
137
|
-
port?: string;
|
|
138
|
-
consoleDataOutputDir?: string;
|
|
139
|
-
inTmuxDataDir?: string;
|
|
140
|
-
dashboardDir?: string;
|
|
141
|
-
dashboardDataDir?: string;
|
|
142
|
-
dashboardProjectNames?: string;
|
|
143
|
-
enableAirplaneMode?: boolean;
|
|
144
|
-
fleetConfigFilePath?: string;
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
type OwnerCallFileAppendOptions = {
|
|
148
|
-
session: string;
|
|
149
|
-
calledAt: string;
|
|
150
|
-
bodyFile: string;
|
|
151
|
-
inTmuxDataDir?: string;
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
type OwnerCallFileDeleteOptions = {
|
|
155
|
-
session: string;
|
|
156
|
-
inTmuxDataDir?: string;
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
const DEFAULT_IN_TMUX_DATA_DIR =
|
|
160
|
-
'/home/hiromi/0_workspaces/workspace1/jsonpub/in-tmux-by-human';
|
|
161
|
-
|
|
162
|
-
const DEFAULT_DASHBOARD_DIR = '/home/hiromi/0_workspaces/workspace1/jsonpub';
|
|
163
|
-
|
|
164
|
-
const DEFAULT_DASHBOARD_DATA_DIR: string | null = null;
|
|
165
|
-
|
|
166
|
-
const parseDashboardProjectNames = (raw: string | undefined): string[] => {
|
|
167
|
-
const names = (raw ?? '')
|
|
168
|
-
.split(',')
|
|
169
|
-
.map((name) => name.trim())
|
|
170
|
-
.filter((name) => name.length > 0);
|
|
171
|
-
if (names.length === 0) {
|
|
172
|
-
console.error(
|
|
173
|
-
'--dashboardProjectNames must list at least one project name',
|
|
174
|
-
);
|
|
175
|
-
return process.exit(1);
|
|
176
|
-
}
|
|
177
|
-
try {
|
|
178
|
-
assertDashboardDisplayLabelsUnique(names);
|
|
179
|
-
} catch (error) {
|
|
180
|
-
console.error(error instanceof Error ? error.message : String(error));
|
|
181
|
-
return process.exit(1);
|
|
182
|
-
}
|
|
183
|
-
return names;
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
type SelectOauthTokenOptions = {
|
|
187
|
-
tokenListJsonPath?: string;
|
|
188
|
-
cacheDir?: string;
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
type SelectLiveSessionOauthTokenOptions = {
|
|
192
|
-
tokenListJsonPath?: string;
|
|
193
|
-
cacheDir?: string;
|
|
194
|
-
fleetConfigFilePath?: string;
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
type CountInTmuxByHumanSessionsPerTokenOptions = {
|
|
198
|
-
configFilePath: string;
|
|
199
|
-
projectUrl?: string;
|
|
200
|
-
tokenListJsonPath?: string;
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
type KillTmuxSessionOptions = {
|
|
204
|
-
session?: string;
|
|
205
|
-
self?: boolean;
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
type AttachOrCreateOptions = {
|
|
209
|
-
issueUrl: string;
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
const resolveScopeLibPath = (): string | null => {
|
|
213
|
-
const explicitPath = process.env.CL_SCOPE_LIB_PATH;
|
|
214
|
-
if (explicitPath !== undefined && fs.existsSync(explicitPath)) {
|
|
215
|
-
return explicitPath;
|
|
216
|
-
}
|
|
217
|
-
const defaultPath = path.join(
|
|
218
|
-
os.homedir(),
|
|
219
|
-
'git',
|
|
220
|
-
'secretary',
|
|
221
|
-
'machine',
|
|
222
|
-
'sk',
|
|
223
|
-
'sh',
|
|
224
|
-
'cl-scope-lib.sh',
|
|
225
|
-
);
|
|
226
|
-
return fs.existsSync(defaultPath) ? defaultPath : null;
|
|
227
|
-
};
|
|
228
|
-
|
|
229
|
-
const buildGithubRepositoryParams = (
|
|
230
|
-
localStorageRepository: LocalStorageRepository,
|
|
231
|
-
token: string,
|
|
232
|
-
): ConstructorParameters<typeof BaseGitHubRepository> => [
|
|
233
|
-
localStorageRepository,
|
|
234
|
-
token,
|
|
235
|
-
];
|
|
236
|
-
|
|
237
|
-
const parseInTmuxProjectOrder = (raw: string | undefined): string[] | null => {
|
|
238
|
-
if (raw === undefined) {
|
|
239
|
-
return null;
|
|
240
|
-
}
|
|
241
|
-
return raw
|
|
242
|
-
.split(',')
|
|
243
|
-
.map((name) => name.trim())
|
|
244
|
-
.filter((name) => name.length > 0);
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
interface ScheduleOptions {
|
|
248
|
-
trigger: 'issue' | 'schedule';
|
|
249
|
-
config: string;
|
|
250
|
-
issue?: string;
|
|
251
|
-
verbose: boolean;
|
|
252
|
-
inTmuxProjectOrder?: string;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
export const program = new Command();
|
|
256
|
-
|
|
257
|
-
program
|
|
258
|
-
.name('github-issue-tower-defence-management')
|
|
259
|
-
.description('CLI tool for GitHub Issue Tower Defence Management');
|
|
260
|
-
|
|
261
|
-
program
|
|
262
|
-
.command('schedule', { isDefault: true })
|
|
263
|
-
.description('Handle scheduled events (trigger: issue or schedule)')
|
|
264
|
-
.requiredOption(
|
|
265
|
-
'-t, --trigger <type>',
|
|
266
|
-
'Trigger type: issue or schedule',
|
|
267
|
-
/^(issue|schedule)$/i,
|
|
268
|
-
)
|
|
269
|
-
.requiredOption('-c, --config <path>', 'Path to config YAML file')
|
|
270
|
-
.option('-v, --verbose', 'Verbose output')
|
|
271
|
-
.option('-i, --issue <url>', 'GitHub Issue URL')
|
|
272
|
-
.option(
|
|
273
|
-
'--inTmuxProjectOrder <names>',
|
|
274
|
-
'Comma-separated project names, in display order, for the in-tmux-by-human session list. When omitted, falls back to the inTmuxProjectOrder value in the config file.',
|
|
275
|
-
)
|
|
276
|
-
.action(async (options: ScheduleOptions) => {
|
|
277
|
-
if (options.trigger === 'issue' && !options.issue) {
|
|
278
|
-
console.error('Issue URL is required when trigger type is "issue"');
|
|
279
|
-
process.exit(1);
|
|
280
|
-
}
|
|
281
|
-
if (options.trigger === 'schedule') {
|
|
282
|
-
const { HandleScheduledEventUseCaseHandler } =
|
|
283
|
-
await import('../handlers/HandleScheduledEventUseCaseHandler');
|
|
284
|
-
const handler = new HandleScheduledEventUseCaseHandler();
|
|
285
|
-
await handler.handle(
|
|
286
|
-
options.config,
|
|
287
|
-
options.verbose,
|
|
288
|
-
parseInTmuxProjectOrder(options.inTmuxProjectOrder),
|
|
289
|
-
);
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
program
|
|
294
|
-
.command('startDaemon')
|
|
295
|
-
.description('Start daemon to prepare GitHub issues')
|
|
296
|
-
.requiredOption(
|
|
297
|
-
'--configFilePath <path>',
|
|
298
|
-
'Path to config file for tower defence management',
|
|
299
|
-
)
|
|
300
|
-
.option('--projectUrl <url>', 'GitHub project URL')
|
|
301
|
-
.option(
|
|
302
|
-
'--manager <login>',
|
|
303
|
-
'GitHub login of the manager; only Awaiting Workspace issues assigned to this login are picked up',
|
|
304
|
-
)
|
|
305
|
-
.option('--defaultAgentName <name>', 'Default agent name')
|
|
306
|
-
.option('--defaultLlmModelName <name>', 'Default LLM model name')
|
|
307
|
-
.option(
|
|
308
|
-
'--fallbackLlmModelName <name>',
|
|
309
|
-
'LLM model to fall back to when the default Sonnet model is selected but its 7-day weekly limit is exhausted across all tokens (default: claude-opus-4-8)',
|
|
310
|
-
)
|
|
311
|
-
.option('--defaultLlmAgentName <name>', 'Default LLM agent name')
|
|
312
|
-
.option(
|
|
313
|
-
'--maximumPreparingIssuesCount <count>',
|
|
314
|
-
'Maximum number of issues in preparation status (default: 6 per available Claude OAuth token, otherwise 6)',
|
|
315
|
-
)
|
|
316
|
-
.option(
|
|
317
|
-
'--utilizationPercentageThreshold <percent>',
|
|
318
|
-
'Per-token Claude 5h utilization % threshold; tokens at or above it are excluded from rotation. Per-token concurrency also tapers from 6 slots down to 1 as either the 5h or 7d utilization rises from 80% toward 100%, taking the more restrictive of the two (default: 90)',
|
|
319
|
-
)
|
|
320
|
-
.option(
|
|
321
|
-
'--allowedIssueAuthors <authors>',
|
|
322
|
-
'Comma-separated list of allowed issue authors',
|
|
323
|
-
)
|
|
324
|
-
.option(
|
|
325
|
-
'--preparationProcessCheckCommand <template>',
|
|
326
|
-
'Shell command template with {URL} placeholder to check if a preparation process is alive',
|
|
327
|
-
)
|
|
328
|
-
.option(
|
|
329
|
-
'--fleetConfigFilePath <path>',
|
|
330
|
-
'Path to the fleet-wide YAML config file holding the preparationWorker mapping (normalConcurrentLimit, maxConcurrentWorkers, graphqlRateLimitFloor); falls back to the TDPM_FLEET_CONFIG environment variable, and to the built-in values when neither is set',
|
|
331
|
-
)
|
|
332
|
-
.action(async (options: StartDaemonOptions) => {
|
|
333
|
-
const token = process.env.GH_TOKEN;
|
|
334
|
-
if (!token) {
|
|
335
|
-
console.error('GH_TOKEN environment variable is required');
|
|
336
|
-
process.exit(1);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
const configFileValues = loadConfigFile(options.configFilePath);
|
|
340
|
-
|
|
341
|
-
const cliOverrides: ConfigFile = {
|
|
342
|
-
projectUrl: options.projectUrl,
|
|
343
|
-
manager: options.manager,
|
|
344
|
-
defaultAgentName: options.defaultAgentName,
|
|
345
|
-
defaultLlmModelName: options.defaultLlmModelName,
|
|
346
|
-
fallbackLlmModelName: options.fallbackLlmModelName,
|
|
347
|
-
defaultLlmAgentName: options.defaultLlmAgentName,
|
|
348
|
-
maximumPreparingIssuesCount: options.maximumPreparingIssuesCount
|
|
349
|
-
? Number(options.maximumPreparingIssuesCount)
|
|
350
|
-
: undefined,
|
|
351
|
-
utilizationPercentageThreshold: options.utilizationPercentageThreshold
|
|
352
|
-
? Number(options.utilizationPercentageThreshold)
|
|
353
|
-
: undefined,
|
|
354
|
-
allowedIssueAuthors: options.allowedIssueAuthors,
|
|
355
|
-
preparationProcessCheckCommand: options.preparationProcessCheckCommand,
|
|
356
|
-
};
|
|
357
|
-
|
|
358
|
-
const tempProjectUrl =
|
|
359
|
-
cliOverrides.projectUrl ?? configFileValues.projectUrl;
|
|
360
|
-
|
|
361
|
-
let readmeOverrides: ConfigFile = {};
|
|
362
|
-
if (tempProjectUrl) {
|
|
363
|
-
const readme = await fetchProjectReadme(tempProjectUrl, token);
|
|
364
|
-
if (readme) {
|
|
365
|
-
readmeOverrides = parseProjectReadmeConfig(readme, tempProjectUrl);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
const config = mergeConfigs(
|
|
370
|
-
configFileValues,
|
|
371
|
-
cliOverrides,
|
|
372
|
-
readmeOverrides,
|
|
373
|
-
);
|
|
374
|
-
|
|
375
|
-
if (config.errorReportingRepository) {
|
|
376
|
-
process.env.TDPM_ERROR_REPORT_REPOSITORY =
|
|
377
|
-
config.errorReportingRepository;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
const projectUrl = config.projectUrl;
|
|
381
|
-
const defaultAgentName = config.defaultAgentName;
|
|
382
|
-
const manager = config.manager;
|
|
383
|
-
|
|
384
|
-
if (!projectUrl) {
|
|
385
|
-
console.error(
|
|
386
|
-
'projectUrl is required. Provide via --projectUrl, config file, or project README.',
|
|
387
|
-
);
|
|
388
|
-
process.exit(1);
|
|
389
|
-
}
|
|
390
|
-
if (!defaultAgentName) {
|
|
391
|
-
console.error(
|
|
392
|
-
'defaultAgentName is required. Provide via --defaultAgentName, config file, or project README.',
|
|
393
|
-
);
|
|
394
|
-
process.exit(1);
|
|
395
|
-
}
|
|
396
|
-
if (!manager) {
|
|
397
|
-
console.error(
|
|
398
|
-
'manager is required. Provide via the config file so that only issues assigned to the manager are picked up.',
|
|
399
|
-
);
|
|
400
|
-
process.exit(1);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
let maximumPreparingIssuesCount: number | null = null;
|
|
404
|
-
const rawMaxCount = config.maximumPreparingIssuesCount;
|
|
405
|
-
if (rawMaxCount !== undefined) {
|
|
406
|
-
const parsedCount = Number(rawMaxCount);
|
|
407
|
-
if (
|
|
408
|
-
!Number.isFinite(parsedCount) ||
|
|
409
|
-
!Number.isInteger(parsedCount) ||
|
|
410
|
-
parsedCount <= 0
|
|
411
|
-
) {
|
|
412
|
-
console.error(
|
|
413
|
-
'Invalid value for --maximumPreparingIssuesCount. It must be a positive integer.',
|
|
414
|
-
);
|
|
415
|
-
process.exit(1);
|
|
416
|
-
}
|
|
417
|
-
maximumPreparingIssuesCount = parsedCount;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
console.log(
|
|
421
|
-
`maximumPreparingIssuesCount: ${maximumPreparingIssuesCount ?? 'null (default: 6 per available Claude OAuth token, otherwise 6)'}`,
|
|
422
|
-
);
|
|
423
|
-
|
|
424
|
-
const fleetConfigFilePath = resolveFleetConfigFilePath(
|
|
425
|
-
options.fleetConfigFilePath ?? null,
|
|
426
|
-
);
|
|
427
|
-
const preparationWorkerSettings =
|
|
428
|
-
loadPreparationWorkerSettings(fleetConfigFilePath);
|
|
429
|
-
const fleetConfigSource =
|
|
430
|
-
fleetConfigFilePath !== null
|
|
431
|
-
? ' (source: fleetConfig)'
|
|
432
|
-
: ' (source: built-in default)';
|
|
433
|
-
console.log(
|
|
434
|
-
`Effective normalConcurrentLimit: ${preparationWorkerSettings.normalConcurrentLimit}${fleetConfigSource}`,
|
|
435
|
-
);
|
|
436
|
-
console.log(
|
|
437
|
-
`Effective maxConcurrentWorkers: ${preparationWorkerSettings.maxConcurrentWorkers}${fleetConfigSource}`,
|
|
438
|
-
);
|
|
439
|
-
console.log(
|
|
440
|
-
`Effective graphqlRateLimitFloor: ${preparationWorkerSettings.graphqlRateLimitFloor}${fleetConfigSource}`,
|
|
441
|
-
);
|
|
442
|
-
|
|
443
|
-
const projectName = config.projectName ?? 'default';
|
|
444
|
-
const localStorageRepository = new LocalStorageRepository();
|
|
445
|
-
const cachePath = projectCacheDirectory(projectName);
|
|
446
|
-
const localStorageCacheRepository = new LocalStorageCacheRepository(
|
|
447
|
-
localStorageRepository,
|
|
448
|
-
cachePath,
|
|
449
|
-
);
|
|
450
|
-
const githubRepositoryParams = buildGithubRepositoryParams(
|
|
451
|
-
localStorageRepository,
|
|
452
|
-
token,
|
|
453
|
-
);
|
|
454
|
-
const projectRepository = new GraphqlProjectRepository(
|
|
455
|
-
...githubRepositoryParams,
|
|
456
|
-
localStorageCacheRepository,
|
|
457
|
-
);
|
|
458
|
-
const apiV3IssueRepository = new ApiV3IssueRepository(
|
|
459
|
-
...githubRepositoryParams,
|
|
460
|
-
);
|
|
461
|
-
const restIssueRepository = new RestIssueRepository(
|
|
462
|
-
...githubRepositoryParams,
|
|
463
|
-
);
|
|
464
|
-
const graphqlProjectItemRepository = new GraphqlProjectItemRepository(
|
|
465
|
-
...githubRepositoryParams,
|
|
466
|
-
);
|
|
467
|
-
const issueRepository = new ApiV3CheerioRestIssueRepository(
|
|
468
|
-
apiV3IssueRepository,
|
|
469
|
-
restIssueRepository,
|
|
470
|
-
graphqlProjectItemRepository,
|
|
471
|
-
localStorageCacheRepository,
|
|
472
|
-
projectRepository,
|
|
473
|
-
new SystemDateRepository(),
|
|
474
|
-
...githubRepositoryParams,
|
|
475
|
-
);
|
|
476
|
-
const localCommandRunner = new NodeLocalCommandRunner();
|
|
477
|
-
|
|
478
|
-
const preparationProcessCheckCommand =
|
|
479
|
-
config.preparationProcessCheckCommand;
|
|
480
|
-
if (preparationProcessCheckCommand) {
|
|
481
|
-
const revertIssueCommentRepository = new GitHubIssueCommentRepository(
|
|
482
|
-
token,
|
|
483
|
-
);
|
|
484
|
-
const revertUseCase = new RevertOrphanedPreparationUseCase(
|
|
485
|
-
projectRepository,
|
|
486
|
-
issueRepository,
|
|
487
|
-
revertIssueCommentRepository,
|
|
488
|
-
localCommandRunner,
|
|
489
|
-
);
|
|
490
|
-
await revertUseCase.run({
|
|
491
|
-
projectUrl,
|
|
492
|
-
preparationProcessCheckCommand,
|
|
493
|
-
thresholdForAutoReject: config.thresholdForAutoReject ?? 3,
|
|
494
|
-
thresholdForDispatchLoop: config.thresholdForDispatchLoop,
|
|
495
|
-
awLogDirectoryPath: config.awLogDirectoryPath,
|
|
496
|
-
awLogStaleThresholdMinutes: config.awLogStaleThresholdMinutes,
|
|
497
|
-
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
498
|
-
labelsNotRequiringPullRequest:
|
|
499
|
-
config.labelsNotRequiringPullRequest ?? null,
|
|
500
|
-
});
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
const claudeTokenUsageRepository = new ProxyClaudeTokenUsageRepository(
|
|
504
|
-
config.claudeCodeOauthTokenListJsonPath ?? null,
|
|
505
|
-
);
|
|
506
|
-
const useCase = new StartPreparationUseCase(
|
|
507
|
-
projectRepository,
|
|
508
|
-
issueRepository,
|
|
509
|
-
localCommandRunner,
|
|
510
|
-
claudeTokenUsageRepository,
|
|
511
|
-
new ProcTakeOwnershipSpawnRepository(),
|
|
512
|
-
new CliGitHubGraphqlRateLimitRepository(localCommandRunner),
|
|
513
|
-
);
|
|
514
|
-
|
|
515
|
-
const rawAllowedIssueAuthors = config.allowedIssueAuthors;
|
|
516
|
-
const allowedIssueAuthors = rawAllowedIssueAuthors
|
|
517
|
-
? rawAllowedIssueAuthors
|
|
518
|
-
.split(',')
|
|
519
|
-
.map((s) => s.trim())
|
|
520
|
-
.filter(Boolean)
|
|
521
|
-
: null;
|
|
522
|
-
|
|
523
|
-
const codexHomeCandidates =
|
|
524
|
-
config.codexHomeCandidates && config.codexHomeCandidates.length > 0
|
|
525
|
-
? config.codexHomeCandidates
|
|
526
|
-
: null;
|
|
527
|
-
|
|
528
|
-
if (config.consoleAccessToken) {
|
|
529
|
-
const consoleProcess = await ensureConsoleRunning(
|
|
530
|
-
options.configFilePath,
|
|
531
|
-
DEFAULT_WEB_PORT,
|
|
532
|
-
Object.keys(config.consoleProjects ?? {}),
|
|
533
|
-
);
|
|
534
|
-
if (consoleProcess !== null) {
|
|
535
|
-
process.once('SIGTERM', () => {
|
|
536
|
-
consoleProcess.kill();
|
|
537
|
-
process.exit(0);
|
|
538
|
-
});
|
|
539
|
-
process.once('SIGINT', () => {
|
|
540
|
-
consoleProcess.kill();
|
|
541
|
-
process.exit(0);
|
|
542
|
-
});
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
const preparationResult = await useCase.run({
|
|
547
|
-
projectUrl,
|
|
548
|
-
defaultAgentName,
|
|
549
|
-
defaultLlmModelName: config.defaultLlmModelName ?? null,
|
|
550
|
-
fallbackLlmModelName: config.fallbackLlmModelName ?? null,
|
|
551
|
-
defaultLlmAgentName: config.defaultLlmAgentName ?? null,
|
|
552
|
-
configFilePath: options.configFilePath,
|
|
553
|
-
maximumPreparingIssuesCount,
|
|
554
|
-
utilizationPercentageThreshold:
|
|
555
|
-
config.utilizationPercentageThreshold ?? 90,
|
|
556
|
-
allowedIssueAuthors,
|
|
557
|
-
manager,
|
|
558
|
-
codexHomeCandidates,
|
|
559
|
-
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
560
|
-
agents: config.agents ?? null,
|
|
561
|
-
normalConcurrentLimit: preparationWorkerSettings.normalConcurrentLimit,
|
|
562
|
-
maxConcurrentWorkers: preparationWorkerSettings.maxConcurrentWorkers,
|
|
563
|
-
graphqlRateLimitFloor: preparationWorkerSettings.graphqlRateLimitFloor,
|
|
564
|
-
});
|
|
565
|
-
if (preparationResult.rotationOrder !== null) {
|
|
566
|
-
writeRotationOrderFile(preparationResult.rotationOrder);
|
|
567
|
-
}
|
|
568
|
-
});
|
|
569
|
-
|
|
570
|
-
program
|
|
571
|
-
.command('notifyFinishedIssuePreparation')
|
|
572
|
-
.description('Notify that issue preparation is finished')
|
|
573
|
-
.requiredOption(
|
|
574
|
-
'--configFilePath <path>',
|
|
575
|
-
'Path to config file for tower defence management',
|
|
576
|
-
)
|
|
577
|
-
.requiredOption('--issueUrl <url>', 'GitHub issue URL')
|
|
578
|
-
.option('--projectUrl <url>', 'GitHub project URL')
|
|
579
|
-
.option(
|
|
580
|
-
'--thresholdForAutoReject <count>',
|
|
581
|
-
'Threshold for auto-escalation after consecutive rejections (default: 3)',
|
|
582
|
-
)
|
|
583
|
-
.option(
|
|
584
|
-
'--thresholdForDispatchLoop <count>',
|
|
585
|
-
'Threshold for auto-escalation after one agent is dispatched this many times since the last human comment, whether it names itself or two agents name each other in turn (default: 6)',
|
|
586
|
-
)
|
|
587
|
-
.option(
|
|
588
|
-
'--workflowBlockerResolvedWebhookUrl <url>',
|
|
589
|
-
'Webhook URL to notify when a workflow blocker issue status changes to awaiting quality check. Supports {URL} and {MESSAGE} placeholders.',
|
|
590
|
-
)
|
|
591
|
-
.option(
|
|
592
|
-
'--missingAgentName <name>',
|
|
593
|
-
'Agent definition name that was not found, triggering the missing-agent task creation path',
|
|
594
|
-
)
|
|
595
|
-
.option(
|
|
596
|
-
'--sessionErrorLine <line>',
|
|
597
|
-
'Exact error line from the session log to include in the task issue body',
|
|
598
|
-
)
|
|
599
|
-
.option(
|
|
600
|
-
'--deferPreparation',
|
|
601
|
-
'Defer the item via the Reactivation Trigger fields (sets nextActionDate to tomorrow) without creating any issue; use for transient upstream failures',
|
|
602
|
-
)
|
|
603
|
-
.action(async (options: NotifyFinishedOptions) => {
|
|
604
|
-
const token = process.env.GH_TOKEN;
|
|
605
|
-
if (!token) {
|
|
606
|
-
console.error('GH_TOKEN environment variable is required');
|
|
607
|
-
process.exit(1);
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
const configFileValues = loadConfigFile(options.configFilePath);
|
|
611
|
-
|
|
612
|
-
const cliOverrides: ConfigFile = {
|
|
613
|
-
projectUrl: options.projectUrl,
|
|
614
|
-
thresholdForAutoReject: options.thresholdForAutoReject
|
|
615
|
-
? Number(options.thresholdForAutoReject)
|
|
616
|
-
: undefined,
|
|
617
|
-
thresholdForDispatchLoop: options.thresholdForDispatchLoop
|
|
618
|
-
? Number(options.thresholdForDispatchLoop)
|
|
619
|
-
: undefined,
|
|
620
|
-
workflowBlockerResolvedWebhookUrl:
|
|
621
|
-
options.workflowBlockerResolvedWebhookUrl,
|
|
622
|
-
};
|
|
623
|
-
|
|
624
|
-
const tempProjectUrl =
|
|
625
|
-
cliOverrides.projectUrl ?? configFileValues.projectUrl;
|
|
626
|
-
|
|
627
|
-
let readmeOverrides: ConfigFile = {};
|
|
628
|
-
if (tempProjectUrl) {
|
|
629
|
-
const readme = await fetchProjectReadme(tempProjectUrl, token);
|
|
630
|
-
if (readme) {
|
|
631
|
-
readmeOverrides = parseProjectReadmeConfig(readme, tempProjectUrl);
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
const config = mergeConfigs(
|
|
636
|
-
configFileValues,
|
|
637
|
-
cliOverrides,
|
|
638
|
-
readmeOverrides,
|
|
639
|
-
);
|
|
640
|
-
|
|
641
|
-
if (config.errorReportingRepository) {
|
|
642
|
-
process.env.TDPM_ERROR_REPORT_REPOSITORY =
|
|
643
|
-
config.errorReportingRepository;
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
const projectUrl = config.projectUrl;
|
|
647
|
-
|
|
648
|
-
if (!projectUrl) {
|
|
649
|
-
console.error(
|
|
650
|
-
'projectUrl is required. Provide via --projectUrl, config file, or project README.',
|
|
651
|
-
);
|
|
652
|
-
process.exit(1);
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
const thresholdForAutoReject = resolvePositiveIntegerOption(
|
|
656
|
-
config.thresholdForAutoReject,
|
|
657
|
-
'thresholdForAutoReject',
|
|
658
|
-
3,
|
|
659
|
-
);
|
|
660
|
-
const thresholdForDispatchLoop = resolvePositiveIntegerOption(
|
|
661
|
-
config.thresholdForDispatchLoop,
|
|
662
|
-
'thresholdForDispatchLoop',
|
|
663
|
-
DEFAULT_THRESHOLD_FOR_DISPATCH_LOOP,
|
|
664
|
-
);
|
|
665
|
-
|
|
666
|
-
const workflowBlockerResolvedWebhookUrl: string | null =
|
|
667
|
-
config.workflowBlockerResolvedWebhookUrl ?? null;
|
|
668
|
-
|
|
669
|
-
const projectName = config.projectName ?? 'default';
|
|
670
|
-
const localStorageRepository = new LocalStorageRepository();
|
|
671
|
-
const cachePath = projectCacheDirectory(projectName);
|
|
672
|
-
const localStorageCacheRepository = new LocalStorageCacheRepository(
|
|
673
|
-
localStorageRepository,
|
|
674
|
-
cachePath,
|
|
675
|
-
);
|
|
676
|
-
const githubRepositoryParams = buildGithubRepositoryParams(
|
|
677
|
-
localStorageRepository,
|
|
678
|
-
token,
|
|
679
|
-
);
|
|
680
|
-
const projectRepository = new GraphqlProjectRepository(
|
|
681
|
-
...githubRepositoryParams,
|
|
682
|
-
localStorageCacheRepository,
|
|
683
|
-
);
|
|
684
|
-
const apiV3IssueRepository = new ApiV3IssueRepository(
|
|
685
|
-
...githubRepositoryParams,
|
|
686
|
-
);
|
|
687
|
-
const restIssueRepository = new RestIssueRepository(
|
|
688
|
-
...githubRepositoryParams,
|
|
689
|
-
);
|
|
690
|
-
const graphqlProjectItemRepository = new GraphqlProjectItemRepository(
|
|
691
|
-
...githubRepositoryParams,
|
|
692
|
-
);
|
|
693
|
-
const issueRepository = new ApiV3CheerioRestIssueRepository(
|
|
694
|
-
apiV3IssueRepository,
|
|
695
|
-
restIssueRepository,
|
|
696
|
-
graphqlProjectItemRepository,
|
|
697
|
-
localStorageCacheRepository,
|
|
698
|
-
projectRepository,
|
|
699
|
-
new SystemDateRepository(),
|
|
700
|
-
...githubRepositoryParams,
|
|
701
|
-
);
|
|
702
|
-
const issueCommentRepository = new GitHubIssueCommentRepository(token);
|
|
703
|
-
const webhookRepository = new FetchWebhookRepository();
|
|
704
|
-
|
|
705
|
-
const consoleDataOutputDir = config.consoleDataOutputDir ?? null;
|
|
706
|
-
const consoleTabsRepository =
|
|
707
|
-
consoleDataOutputDir !== null
|
|
708
|
-
? new FileSystemConsoleTabsRepository(consoleDataOutputDir, projectName)
|
|
709
|
-
: null;
|
|
710
|
-
|
|
711
|
-
const useCase = new NotifyFinishedIssuePreparationUseCase(
|
|
712
|
-
projectRepository,
|
|
713
|
-
issueRepository,
|
|
714
|
-
issueCommentRepository,
|
|
715
|
-
webhookRepository,
|
|
716
|
-
consoleTabsRepository,
|
|
717
|
-
);
|
|
718
|
-
|
|
719
|
-
const rawAllowedIssueAuthors = config.allowedIssueAuthors;
|
|
720
|
-
const allowedIssueAuthors = rawAllowedIssueAuthors
|
|
721
|
-
? rawAllowedIssueAuthors
|
|
722
|
-
.split(',')
|
|
723
|
-
.map((s) => s.trim())
|
|
724
|
-
.filter(Boolean)
|
|
725
|
-
: null;
|
|
726
|
-
|
|
727
|
-
await useCase.run({
|
|
728
|
-
projectUrl,
|
|
729
|
-
issueUrl: options.issueUrl,
|
|
730
|
-
thresholdForAutoReject,
|
|
731
|
-
thresholdForDispatchLoop,
|
|
732
|
-
workflowBlockerResolvedWebhookUrl,
|
|
733
|
-
allowedIssueAuthors,
|
|
734
|
-
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
735
|
-
labelsNotRequiringPullRequest:
|
|
736
|
-
config.labelsNotRequiringPullRequest ?? null,
|
|
737
|
-
changeTargetPathAliases: config.changeTargetPathAliases ?? null,
|
|
738
|
-
agents: config.agents ?? null,
|
|
739
|
-
missingAgentName: options.missingAgentName ?? null,
|
|
740
|
-
sessionErrorLine: options.sessionErrorLine ?? null,
|
|
741
|
-
manager: config.manager ?? null,
|
|
742
|
-
developerAgentNames: config.developerAgentNames ?? null,
|
|
743
|
-
deferPreparation: options.deferPreparation ?? null,
|
|
744
|
-
});
|
|
745
|
-
});
|
|
746
|
-
|
|
747
|
-
program
|
|
748
|
-
.command('checkIssueReviewReadiness')
|
|
749
|
-
.description(
|
|
750
|
-
'Check whether an issue is in a review-ready state without mutating any field or posting any comment',
|
|
751
|
-
)
|
|
752
|
-
.requiredOption(
|
|
753
|
-
'--configFilePath <path>',
|
|
754
|
-
'Path to config file for tower defence management',
|
|
755
|
-
)
|
|
756
|
-
.requiredOption('--issueUrl <url>', 'GitHub issue URL')
|
|
757
|
-
.option('--projectUrl <url>', 'GitHub project URL (optional)')
|
|
758
|
-
.action(async (options: CheckIssueReviewReadinessOptions) => {
|
|
759
|
-
const token = process.env.GH_TOKEN;
|
|
760
|
-
if (!token) {
|
|
761
|
-
console.error('GH_TOKEN environment variable is required');
|
|
762
|
-
process.exit(1);
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
const configFileValues = loadConfigFile(options.configFilePath);
|
|
766
|
-
|
|
767
|
-
const cliOverrides: ConfigFile = {
|
|
768
|
-
projectUrl: options.projectUrl,
|
|
769
|
-
};
|
|
770
|
-
|
|
771
|
-
const tempProjectUrl =
|
|
772
|
-
cliOverrides.projectUrl ?? configFileValues.projectUrl;
|
|
773
|
-
|
|
774
|
-
let readmeOverrides: ConfigFile = {};
|
|
775
|
-
if (tempProjectUrl) {
|
|
776
|
-
const readme = await fetchProjectReadme(tempProjectUrl, token);
|
|
777
|
-
if (readme) {
|
|
778
|
-
readmeOverrides = parseProjectReadmeConfig(readme, tempProjectUrl);
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
const config = mergeConfigs(
|
|
783
|
-
configFileValues,
|
|
784
|
-
cliOverrides,
|
|
785
|
-
readmeOverrides,
|
|
786
|
-
);
|
|
787
|
-
|
|
788
|
-
if (config.errorReportingRepository) {
|
|
789
|
-
process.env.TDPM_ERROR_REPORT_REPOSITORY =
|
|
790
|
-
config.errorReportingRepository;
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
const projectName = config.projectName ?? 'default';
|
|
794
|
-
const localStorageRepository = new LocalStorageRepository();
|
|
795
|
-
const cachePath = projectCacheDirectory(projectName);
|
|
796
|
-
const localStorageCacheRepository = new LocalStorageCacheRepository(
|
|
797
|
-
localStorageRepository,
|
|
798
|
-
cachePath,
|
|
799
|
-
);
|
|
800
|
-
const githubRepositoryParams = buildGithubRepositoryParams(
|
|
801
|
-
localStorageRepository,
|
|
802
|
-
token,
|
|
803
|
-
);
|
|
804
|
-
const apiV3IssueRepository = new ApiV3IssueRepository(
|
|
805
|
-
...githubRepositoryParams,
|
|
806
|
-
);
|
|
807
|
-
const restIssueRepository = new RestIssueRepository(
|
|
808
|
-
...githubRepositoryParams,
|
|
809
|
-
);
|
|
810
|
-
const graphqlProjectItemRepository = new GraphqlProjectItemRepository(
|
|
811
|
-
...githubRepositoryParams,
|
|
812
|
-
);
|
|
813
|
-
const projectRepository = new GraphqlProjectRepository(
|
|
814
|
-
...githubRepositoryParams,
|
|
815
|
-
localStorageCacheRepository,
|
|
816
|
-
);
|
|
817
|
-
const issueRepository = new ApiV3CheerioRestIssueRepository(
|
|
818
|
-
apiV3IssueRepository,
|
|
819
|
-
restIssueRepository,
|
|
820
|
-
graphqlProjectItemRepository,
|
|
821
|
-
localStorageCacheRepository,
|
|
822
|
-
projectRepository,
|
|
823
|
-
new SystemDateRepository(),
|
|
824
|
-
...githubRepositoryParams,
|
|
825
|
-
);
|
|
826
|
-
const issueCommentRepository = new GitHubIssueCommentRepository(token);
|
|
827
|
-
|
|
828
|
-
const rawAllowedIssueAuthors = config.allowedIssueAuthors;
|
|
829
|
-
const allowedIssueAuthors = rawAllowedIssueAuthors
|
|
830
|
-
? rawAllowedIssueAuthors
|
|
831
|
-
.split(',')
|
|
832
|
-
.map((s) => s.trim())
|
|
833
|
-
.filter(Boolean)
|
|
834
|
-
: null;
|
|
835
|
-
|
|
836
|
-
const useCase = new CheckIssueReviewReadinessUseCase(
|
|
837
|
-
issueRepository,
|
|
838
|
-
issueCommentRepository,
|
|
839
|
-
);
|
|
840
|
-
|
|
841
|
-
const result = await useCase.run({
|
|
842
|
-
issueUrl: options.issueUrl,
|
|
843
|
-
allowedIssueAuthors,
|
|
844
|
-
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
845
|
-
labelsNotRequiringPullRequest:
|
|
846
|
-
config.labelsNotRequiringPullRequest ?? null,
|
|
847
|
-
developerAgentNames: config.developerAgentNames ?? null,
|
|
848
|
-
});
|
|
849
|
-
|
|
850
|
-
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
851
|
-
});
|
|
852
|
-
|
|
853
|
-
const runServeWeb = async (options: ServeWebOptions): Promise<void> => {
|
|
854
|
-
const config = loadConfigFile(options.configFilePath);
|
|
855
|
-
|
|
856
|
-
const accessToken = config.consoleAccessToken;
|
|
857
|
-
if (!accessToken) {
|
|
858
|
-
console.error(
|
|
859
|
-
'consoleAccessToken is required. Provide it via the config file.',
|
|
860
|
-
);
|
|
861
|
-
process.exit(1);
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
let port = DEFAULT_WEB_PORT;
|
|
865
|
-
if (options.port !== undefined) {
|
|
866
|
-
const parsedPort = Number(options.port);
|
|
867
|
-
if (
|
|
868
|
-
!Number.isFinite(parsedPort) ||
|
|
869
|
-
!Number.isInteger(parsedPort) ||
|
|
870
|
-
parsedPort <= 0 ||
|
|
871
|
-
parsedPort > 65535
|
|
872
|
-
) {
|
|
873
|
-
console.error(
|
|
874
|
-
'Invalid value for --port. It must be a positive integer between 1 and 65535.',
|
|
875
|
-
);
|
|
876
|
-
process.exit(1);
|
|
877
|
-
}
|
|
878
|
-
port = parsedPort;
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
const token = process.env.GH_TOKEN;
|
|
882
|
-
if (!token) {
|
|
883
|
-
console.error('GH_TOKEN environment variable is required');
|
|
884
|
-
process.exit(1);
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
const projectUrl = config.projectUrl;
|
|
888
|
-
if (!projectUrl) {
|
|
889
|
-
console.error(
|
|
890
|
-
'projectUrl is required. Provide it via the config file or project README.',
|
|
891
|
-
);
|
|
892
|
-
process.exit(1);
|
|
893
|
-
}
|
|
894
|
-
|
|
895
|
-
const dashboardProjectNames = parseDashboardProjectNames(
|
|
896
|
-
options.dashboardProjectNames,
|
|
897
|
-
);
|
|
898
|
-
|
|
899
|
-
const projectName = config.projectName ?? 'default';
|
|
900
|
-
const localStorageRepository = new LocalStorageRepository();
|
|
901
|
-
const cachePath = projectCacheDirectory(projectName);
|
|
902
|
-
const localStorageCacheRepository = new LocalStorageCacheRepository(
|
|
903
|
-
localStorageRepository,
|
|
904
|
-
cachePath,
|
|
905
|
-
);
|
|
906
|
-
const githubRepositoryParams = buildGithubRepositoryParams(
|
|
907
|
-
localStorageRepository,
|
|
908
|
-
token,
|
|
909
|
-
);
|
|
910
|
-
const projectRepository = new GraphqlProjectRepository(
|
|
911
|
-
...githubRepositoryParams,
|
|
912
|
-
localStorageCacheRepository,
|
|
913
|
-
);
|
|
914
|
-
const apiV3IssueRepository = new ApiV3IssueRepository(
|
|
915
|
-
...githubRepositoryParams,
|
|
916
|
-
);
|
|
917
|
-
const restIssueRepository = new RestIssueRepository(
|
|
918
|
-
...githubRepositoryParams,
|
|
919
|
-
);
|
|
920
|
-
const graphqlProjectItemRepository = new GraphqlProjectItemRepository(
|
|
921
|
-
...githubRepositoryParams,
|
|
922
|
-
);
|
|
923
|
-
const issueRepository = new ApiV3CheerioRestIssueRepository(
|
|
924
|
-
apiV3IssueRepository,
|
|
925
|
-
restIssueRepository,
|
|
926
|
-
graphqlProjectItemRepository,
|
|
927
|
-
localStorageCacheRepository,
|
|
928
|
-
projectRepository,
|
|
929
|
-
new SystemDateRepository(),
|
|
930
|
-
...githubRepositoryParams,
|
|
931
|
-
);
|
|
932
|
-
|
|
933
|
-
const resolveGithubToken = createConsoleGithubTokenResolver(
|
|
934
|
-
token,
|
|
935
|
-
config.consoleProjects ?? null,
|
|
936
|
-
config.consoleGithubTokenFileDir ?? null,
|
|
937
|
-
(filePath: string) => fs.readFileSync(filePath, 'utf8'),
|
|
938
|
-
);
|
|
939
|
-
const issueRepositoryByToken = new Map<string, IssueRepository>();
|
|
940
|
-
issueRepositoryByToken.set(token, issueRepository);
|
|
941
|
-
const buildIssueRepositoryForToken = (
|
|
942
|
-
repositoryToken: string,
|
|
943
|
-
): IssueRepository => {
|
|
944
|
-
const alreadyBuilt = issueRepositoryByToken.get(repositoryToken);
|
|
945
|
-
if (alreadyBuilt !== undefined) {
|
|
946
|
-
return alreadyBuilt;
|
|
947
|
-
}
|
|
948
|
-
const repositoryParams = buildGithubRepositoryParams(
|
|
949
|
-
localStorageRepository,
|
|
950
|
-
repositoryToken,
|
|
951
|
-
);
|
|
952
|
-
const built = new ApiV3CheerioRestIssueRepository(
|
|
953
|
-
new ApiV3IssueRepository(...repositoryParams),
|
|
954
|
-
new RestIssueRepository(...repositoryParams),
|
|
955
|
-
new GraphqlProjectItemRepository(...repositoryParams),
|
|
956
|
-
localStorageCacheRepository,
|
|
957
|
-
new GraphqlProjectRepository(
|
|
958
|
-
...repositoryParams,
|
|
959
|
-
localStorageCacheRepository,
|
|
960
|
-
),
|
|
961
|
-
new SystemDateRepository(),
|
|
962
|
-
...repositoryParams,
|
|
963
|
-
);
|
|
964
|
-
issueRepositoryByToken.set(repositoryToken, built);
|
|
965
|
-
return built;
|
|
966
|
-
};
|
|
967
|
-
const resolveIssueRepository =
|
|
968
|
-
createConsoleIssueRepositoryResolver<IssueRepository>(
|
|
969
|
-
resolveGithubToken,
|
|
970
|
-
buildIssueRepositoryForToken,
|
|
971
|
-
);
|
|
972
|
-
const resolveGithubTokenForItemUrl =
|
|
973
|
-
createConsoleGithubTokenResolverByItemUrl(resolveGithubToken);
|
|
974
|
-
const projectRepositoryByToken = new Map<string, GraphqlProjectRepository>();
|
|
975
|
-
projectRepositoryByToken.set(token, projectRepository);
|
|
976
|
-
const buildProjectRepositoryForToken = (
|
|
977
|
-
repositoryToken: string,
|
|
978
|
-
): GraphqlProjectRepository => {
|
|
979
|
-
const alreadyBuilt = projectRepositoryByToken.get(repositoryToken);
|
|
980
|
-
if (alreadyBuilt !== undefined) {
|
|
981
|
-
return alreadyBuilt;
|
|
982
|
-
}
|
|
983
|
-
const built = new GraphqlProjectRepository(
|
|
984
|
-
...buildGithubRepositoryParams(localStorageRepository, repositoryToken),
|
|
985
|
-
localStorageCacheRepository,
|
|
986
|
-
);
|
|
987
|
-
projectRepositoryByToken.set(repositoryToken, built);
|
|
988
|
-
return built;
|
|
989
|
-
};
|
|
990
|
-
const resolveProjectRepository =
|
|
991
|
-
createConsoleProjectRepositoryResolver<GraphqlProjectRepository>(
|
|
992
|
-
resolveGithubToken,
|
|
993
|
-
buildProjectRepositoryForToken,
|
|
994
|
-
);
|
|
995
|
-
|
|
996
|
-
const pjcodeToProjectUrl = buildPjcodeToProjectUrl(
|
|
997
|
-
projectName,
|
|
998
|
-
projectUrl,
|
|
999
|
-
config.consoleProjects ?? null,
|
|
1000
|
-
);
|
|
1001
|
-
const isPjcodeConfigured = createPjcodeConfigChecker(pjcodeToProjectUrl);
|
|
1002
|
-
const {
|
|
1003
|
-
resolve: resolveProject,
|
|
1004
|
-
invalidate: invalidateProject,
|
|
1005
|
-
updateEntry: updateProjectCacheEntry,
|
|
1006
|
-
} = createConsoleProjectResolver(
|
|
1007
|
-
pjcodeToProjectUrl,
|
|
1008
|
-
createConsoleProjectLoader(
|
|
1009
|
-
resolveProjectRepository,
|
|
1010
|
-
(targetProjectId: string) =>
|
|
1011
|
-
issueRepository.getCachedProject(targetProjectId),
|
|
1012
|
-
(message: string) => console.error(message),
|
|
1013
|
-
),
|
|
1014
|
-
);
|
|
1015
|
-
|
|
1016
|
-
const uiDistDir = path.join(__dirname, '..', 'console', 'ui-dist');
|
|
1017
|
-
const consoleDataOutputDir = options.consoleDataOutputDir ?? null;
|
|
1018
|
-
const inTmuxDataDir = options.inTmuxDataDir ?? DEFAULT_IN_TMUX_DATA_DIR;
|
|
1019
|
-
const dashboardDir = options.dashboardDir ?? DEFAULT_DASHBOARD_DIR;
|
|
1020
|
-
const dashboardDataDir =
|
|
1021
|
-
options.dashboardDataDir ?? DEFAULT_DASHBOARD_DATA_DIR;
|
|
1022
|
-
const fleetConfigFilePath = resolveFleetConfigFilePath(
|
|
1023
|
-
options.fleetConfigFilePath ?? null,
|
|
1024
|
-
);
|
|
1025
|
-
const workflowImprovementIssueUrl =
|
|
1026
|
-
loadWorkflowImprovementIssueUrl(fleetConfigFilePath);
|
|
1027
|
-
|
|
1028
|
-
await startWebServer({
|
|
1029
|
-
accessToken,
|
|
1030
|
-
uiDistDir,
|
|
1031
|
-
consoleDataOutputDir,
|
|
1032
|
-
inTmuxDataDir,
|
|
1033
|
-
dashboardDir,
|
|
1034
|
-
dashboardDataDir,
|
|
1035
|
-
dashboardProjectNames,
|
|
1036
|
-
workflowImprovementIssueUrl,
|
|
1037
|
-
resolveGithubToken,
|
|
1038
|
-
issueRepository,
|
|
1039
|
-
resolveIssueRepository,
|
|
1040
|
-
resolveProject,
|
|
1041
|
-
isPjcodeConfigured,
|
|
1042
|
-
resolveProjectRepository,
|
|
1043
|
-
invalidateProject,
|
|
1044
|
-
updateProjectCacheEntry,
|
|
1045
|
-
issueAttachmentRepository: new LocalCommandIssueAttachmentRepository(
|
|
1046
|
-
new NodeLocalCommandRunner(),
|
|
1047
|
-
resolveGithubTokenForItemUrl,
|
|
1048
|
-
),
|
|
1049
|
-
issueTitleStateCache: new IssueTitleStateCache(),
|
|
1050
|
-
pullRequestStatusCache: new PullRequestStatusCache(),
|
|
1051
|
-
port,
|
|
1052
|
-
enableAirplaneMode: options.enableAirplaneMode === true,
|
|
1053
|
-
});
|
|
1054
|
-
console.log(`TDPM web server listening on port ${port}`);
|
|
1055
|
-
};
|
|
1056
|
-
|
|
1057
|
-
const addServeWebOptions = (command: Command): Command =>
|
|
1058
|
-
command
|
|
1059
|
-
.requiredOption(
|
|
1060
|
-
'--configFilePath <path>',
|
|
1061
|
-
'Path to config file for tower defence management',
|
|
1062
|
-
)
|
|
1063
|
-
.option(
|
|
1064
|
-
'--port <number>',
|
|
1065
|
-
`Port for the web HTTP server (default: ${DEFAULT_WEB_PORT})`,
|
|
1066
|
-
)
|
|
1067
|
-
.option(
|
|
1068
|
-
'--consoleDataOutputDir <path>',
|
|
1069
|
-
'Directory where console data files are written and served from',
|
|
1070
|
-
)
|
|
1071
|
-
.option(
|
|
1072
|
-
'--inTmuxDataDir <path>',
|
|
1073
|
-
`Directory containing the flat in-tmux-by-human static JSON files served at /in-tmux-by-human/*.json (default: ${DEFAULT_IN_TMUX_DATA_DIR})`,
|
|
1074
|
-
)
|
|
1075
|
-
.option(
|
|
1076
|
-
'--dashboardDir <path>',
|
|
1077
|
-
`Directory containing the static dashboard HTML fragment tdpm.txt served at /tdpm.txt when compose mode is not active (default: ${DEFAULT_DASHBOARD_DIR})`,
|
|
1078
|
-
)
|
|
1079
|
-
.option(
|
|
1080
|
-
'--dashboardDataDir <path>',
|
|
1081
|
-
'Directory containing the dashboard data files (projects/<projectName>.json, machine-status.json, token-status.json); when set and every required file is present the server composes the /tdpm.txt fragment from them at request time, otherwise it falls back to serving the static tdpm.txt from --dashboardDir (unset when not configured)',
|
|
1082
|
-
)
|
|
1083
|
-
.option(
|
|
1084
|
-
'--dashboardProjectNames <names>',
|
|
1085
|
-
'Comma-separated project names, in display order, for the dashboard project grid; the display label of each project is its first 2 characters, which must be unique across the listed names',
|
|
1086
|
-
)
|
|
1087
|
-
.option('--enableAirplaneMode', 'Enable the airplane mode feature')
|
|
1088
|
-
.option(
|
|
1089
|
-
'--fleetConfigFilePath <path>',
|
|
1090
|
-
'Path to the fleet-wide YAML config file; falls back to the TDPM_FLEET_CONFIG environment variable. Reads workflowImprovementIssueUrl for the workflow improvement link shown in the console.',
|
|
1091
|
-
);
|
|
1092
|
-
|
|
1093
|
-
addServeWebOptions(program.command('serveWeb'))
|
|
1094
|
-
.description(
|
|
1095
|
-
'Start the local TDPM web server (console tabs, dashboard, and in-tmux session list)',
|
|
1096
|
-
)
|
|
1097
|
-
.action(async (options: ServeWebOptions) => {
|
|
1098
|
-
await runServeWeb(options);
|
|
1099
|
-
});
|
|
1100
|
-
|
|
1101
|
-
addServeWebOptions(program.command('serveConsole'))
|
|
1102
|
-
.description('Deprecated alias for serveWeb. Use serveWeb instead.')
|
|
1103
|
-
.action(async (options: ServeWebOptions) => {
|
|
1104
|
-
await runServeWeb(options);
|
|
1105
|
-
});
|
|
1106
|
-
|
|
1107
|
-
program
|
|
1108
|
-
.command('selectOauthToken')
|
|
1109
|
-
.description(
|
|
1110
|
-
'Print exactly one Claude Code OAuth token chosen by a rate-limit-aware filter. Among rate-limit-eligible tokens the choice is weighted-random, with each token weighted by its per-token selectionWeight (default 1) multiplied by how urgent its 7d window is (the free share of that window times 168 divided by the hours left before it resets, with those hours floored at 1), so a token holding unused allowance that resets soon is chosen more often. When every eligible weight is identical, the choice stays deterministic and no random draw is made. The token string is written to stdout (pipeable); the per-candidate decision trace is written to stderr. Exits non-zero when no token passes the filter.',
|
|
1111
|
-
)
|
|
1112
|
-
.option(
|
|
1113
|
-
'--tokenListJsonPath <path>',
|
|
1114
|
-
'Path to the JSON array of { name, token, selectionWeight? } records. selectionWeight is an optional positive number (default 1) that biases how often this token is chosen among rate-limit-eligible candidates; a smaller weight is chosen proportionally less often and never bypasses eligibility filtering or starves a sole eligible token. Falls back to the CLAUDE_CODE_OAUTH_TOKEN_LIST_JSON_PATH environment variable.',
|
|
1115
|
-
)
|
|
1116
|
-
.option(
|
|
1117
|
-
'--cacheDir <path>',
|
|
1118
|
-
'Directory holding per-token rate-limit cache files. Falls back to the TDPM_RATELIMIT_CACHE_DIR environment variable, then to ${XDG_CACHE_HOME:-~/.cache}/tdpm/ratelimit.',
|
|
1119
|
-
)
|
|
1120
|
-
.action((options: SelectOauthTokenOptions) => {
|
|
1121
|
-
const handler = new OauthTokenSelectHandler();
|
|
1122
|
-
const output = handler.handle({
|
|
1123
|
-
tokenListJsonPath: options.tokenListJsonPath ?? null,
|
|
1124
|
-
cacheDirectory: options.cacheDir ?? null,
|
|
1125
|
-
nowEpochSeconds: Date.now() / 1000,
|
|
1126
|
-
});
|
|
1127
|
-
|
|
1128
|
-
for (const line of output.diagnostics) {
|
|
1129
|
-
console.error(line);
|
|
1130
|
-
}
|
|
1131
|
-
|
|
1132
|
-
if (output.selectedToken === null) {
|
|
1133
|
-
process.exit(1);
|
|
1134
|
-
}
|
|
1135
|
-
|
|
1136
|
-
process.stdout.write(`${output.selectedToken}\n`);
|
|
1137
|
-
});
|
|
1138
|
-
|
|
1139
|
-
program
|
|
1140
|
-
.command('selectLiveSessionOauthToken')
|
|
1141
|
-
.description(
|
|
1142
|
-
'Print exactly one Claude Code OAuth token chosen for a new live interactive session. The choice is deterministic. Each rate-limit-eligible token gets a concurrent session limit of maxConcurrentSessionCount (default 10), scaled by its per-token selectionWeight (default 1). That limit is held at full value while the free share of the 5h window is at or above fullSpeedFiveHourFreeRatio (default 0.5) and is tapered in proportion below it, never dropping under 1; the 7d window never lowers the limit, so a weekly allowance that is about to expire is drained at full speed instead of being discarded unused. Among eligible tokens still under that limit the token whose 7d window resets soonest wins; ties go to the token carrying fewer live sessions (by distinct CLAUDE_CODE_SESSION_ID found in running Claude Code processes). When every eligible token is at its limit the soonest-resetting one is still returned. The token string is written to stdout (pipeable); the per-candidate decision trace is written to stderr. Exits non-zero when no token passes the filter.',
|
|
1143
|
-
)
|
|
1144
|
-
.option(
|
|
1145
|
-
'--tokenListJsonPath <path>',
|
|
1146
|
-
'Path to the JSON array of { name, token, selectionWeight? } records. selectionWeight is an optional positive number (default 1) that scales this token concurrent live session limit; a smaller weight allows fewer simultaneous sessions and never bypasses eligibility filtering or starves a sole eligible token. Falls back to the CLAUDE_CODE_OAUTH_TOKEN_LIST_JSON_PATH environment variable.',
|
|
1147
|
-
)
|
|
1148
|
-
.option(
|
|
1149
|
-
'--cacheDir <path>',
|
|
1150
|
-
'Directory holding per-token rate-limit cache files. Falls back to the TDPM_RATELIMIT_CACHE_DIR environment variable, then to ${XDG_CACHE_HOME:-~/.cache}/tdpm/ratelimit.',
|
|
1151
|
-
)
|
|
1152
|
-
.option(
|
|
1153
|
-
'--fleetConfigFilePath <path>',
|
|
1154
|
-
'Path to the fleet-wide YAML config file holding the liveSessionOauthTokenSelection mapping (maxConcurrentSessionCount, fullSpeedFiveHourFreeRatio). Falls back to the TDPM_FLEET_CONFIG environment variable; when neither is set the built-in values are used. A key the file omits keeps its built-in value, and an unreadable file or an out-of-range value is reported as an error instead of being ignored.',
|
|
1155
|
-
)
|
|
1156
|
-
.action((options: SelectLiveSessionOauthTokenOptions) => {
|
|
1157
|
-
const handler = new LiveSessionOauthTokenSelectHandler();
|
|
1158
|
-
const output = handler.handle({
|
|
1159
|
-
tokenListJsonPath: options.tokenListJsonPath ?? null,
|
|
1160
|
-
cacheDirectory: options.cacheDir ?? null,
|
|
1161
|
-
nowEpochSeconds: Date.now() / 1000,
|
|
1162
|
-
selectionSettings: loadLiveSessionOauthTokenSelectionSettings(
|
|
1163
|
-
resolveFleetConfigFilePath(options.fleetConfigFilePath ?? null),
|
|
1164
|
-
),
|
|
1165
|
-
});
|
|
1166
|
-
|
|
1167
|
-
for (const line of output.diagnostics) {
|
|
1168
|
-
console.error(line);
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
if (output.selectedToken === null) {
|
|
1172
|
-
process.exit(1);
|
|
1173
|
-
}
|
|
1174
|
-
|
|
1175
|
-
process.stdout.write(`${output.selectedToken}\n`);
|
|
1176
|
-
});
|
|
1177
|
-
|
|
1178
|
-
program
|
|
1179
|
-
.command('countInTmuxByHumanSessionsPerToken')
|
|
1180
|
-
.description(
|
|
1181
|
-
'Print, per Claude Code OAuth token, the count of live interactive sessions (cl-launched Claude processes carrying CLAUDE_CODE_OAUTH_TOKEN and CLAUDE_CODE_SESSION_ID with a --name <issue-url> argument, excluding Take ownership spawns) whose issue is currently in GitHub Project Status "In Tmux by human". One tab-separated line per token (<tokenName>\\t<count>) is written to stdout; the decision trace is written to stderr. Token values are never printed.',
|
|
1182
|
-
)
|
|
1183
|
-
.requiredOption(
|
|
1184
|
-
'--configFilePath <path>',
|
|
1185
|
-
'Path to config file for tower defence management',
|
|
1186
|
-
)
|
|
1187
|
-
.option('--projectUrl <url>', 'GitHub project URL (optional)')
|
|
1188
|
-
.option(
|
|
1189
|
-
'--tokenListJsonPath <path>',
|
|
1190
|
-
'Path to the JSON array of { name, token } records. Falls back to the claudeCodeOauthTokenListJsonPath config value, then to the CLAUDE_CODE_OAUTH_TOKEN_LIST_JSON_PATH environment variable.',
|
|
1191
|
-
)
|
|
1192
|
-
.action(async (options: CountInTmuxByHumanSessionsPerTokenOptions) => {
|
|
1193
|
-
const token = process.env.GH_TOKEN;
|
|
1194
|
-
if (!token) {
|
|
1195
|
-
console.error('GH_TOKEN environment variable is required');
|
|
1196
|
-
process.exit(1);
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
|
-
const configFileValues = loadConfigFile(options.configFilePath);
|
|
1200
|
-
|
|
1201
|
-
const cliOverrides: ConfigFile = {
|
|
1202
|
-
projectUrl: options.projectUrl,
|
|
1203
|
-
};
|
|
1204
|
-
|
|
1205
|
-
const tempProjectUrl =
|
|
1206
|
-
cliOverrides.projectUrl ?? configFileValues.projectUrl;
|
|
1207
|
-
|
|
1208
|
-
let readmeOverrides: ConfigFile = {};
|
|
1209
|
-
if (tempProjectUrl) {
|
|
1210
|
-
const readme = await fetchProjectReadme(tempProjectUrl, token);
|
|
1211
|
-
if (readme) {
|
|
1212
|
-
readmeOverrides = parseProjectReadmeConfig(readme, tempProjectUrl);
|
|
1213
|
-
}
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
const config = mergeConfigs(
|
|
1217
|
-
configFileValues,
|
|
1218
|
-
cliOverrides,
|
|
1219
|
-
readmeOverrides,
|
|
1220
|
-
);
|
|
1221
|
-
|
|
1222
|
-
const projectUrl = config.projectUrl;
|
|
1223
|
-
if (!projectUrl) {
|
|
1224
|
-
console.error(
|
|
1225
|
-
'projectUrl is required. Provide via --projectUrl, config file, or project README.',
|
|
1226
|
-
);
|
|
1227
|
-
process.exit(1);
|
|
1228
|
-
}
|
|
1229
|
-
|
|
1230
|
-
const projectName = config.projectName ?? 'default';
|
|
1231
|
-
const localStorageRepository = new LocalStorageRepository();
|
|
1232
|
-
const cachePath = projectCacheDirectory(projectName);
|
|
1233
|
-
const localStorageCacheRepository = new LocalStorageCacheRepository(
|
|
1234
|
-
localStorageRepository,
|
|
1235
|
-
cachePath,
|
|
1236
|
-
);
|
|
1237
|
-
const githubRepositoryParams = buildGithubRepositoryParams(
|
|
1238
|
-
localStorageRepository,
|
|
1239
|
-
token,
|
|
1240
|
-
);
|
|
1241
|
-
const projectRepository = new GraphqlProjectRepository(
|
|
1242
|
-
...githubRepositoryParams,
|
|
1243
|
-
localStorageCacheRepository,
|
|
1244
|
-
);
|
|
1245
|
-
const apiV3IssueRepository = new ApiV3IssueRepository(
|
|
1246
|
-
...githubRepositoryParams,
|
|
1247
|
-
);
|
|
1248
|
-
const restIssueRepository = new RestIssueRepository(
|
|
1249
|
-
...githubRepositoryParams,
|
|
1250
|
-
);
|
|
1251
|
-
const graphqlProjectItemRepository = new GraphqlProjectItemRepository(
|
|
1252
|
-
...githubRepositoryParams,
|
|
1253
|
-
);
|
|
1254
|
-
const issueRepository = new ApiV3CheerioRestIssueRepository(
|
|
1255
|
-
apiV3IssueRepository,
|
|
1256
|
-
restIssueRepository,
|
|
1257
|
-
graphqlProjectItemRepository,
|
|
1258
|
-
localStorageCacheRepository,
|
|
1259
|
-
projectRepository,
|
|
1260
|
-
new SystemDateRepository(),
|
|
1261
|
-
...githubRepositoryParams,
|
|
1262
|
-
);
|
|
1263
|
-
|
|
1264
|
-
const projectId = await projectRepository.findProjectIdByUrl(projectUrl);
|
|
1265
|
-
if (!projectId) {
|
|
1266
|
-
console.error(`No project found for projectUrl ${projectUrl}`);
|
|
1267
|
-
process.exit(1);
|
|
1268
|
-
}
|
|
1269
|
-
|
|
1270
|
-
const { issues } = await issueRepository.getAllIssues(projectId);
|
|
1271
|
-
|
|
1272
|
-
const handler = new InTmuxByHumanSessionTokenCountHandler();
|
|
1273
|
-
const output = handler.handle({
|
|
1274
|
-
tokenListJsonPath:
|
|
1275
|
-
options.tokenListJsonPath ??
|
|
1276
|
-
config.claudeCodeOauthTokenListJsonPath ??
|
|
1277
|
-
null,
|
|
1278
|
-
issues,
|
|
1279
|
-
});
|
|
1280
|
-
|
|
1281
|
-
for (const line of output.diagnostics) {
|
|
1282
|
-
console.error(line);
|
|
1283
|
-
}
|
|
1284
|
-
|
|
1285
|
-
for (const line of output.lines) {
|
|
1286
|
-
process.stdout.write(`${line}\n`);
|
|
1287
|
-
}
|
|
1288
|
-
});
|
|
1289
|
-
|
|
1290
|
-
program
|
|
1291
|
-
.command('killTmuxSession')
|
|
1292
|
-
.description(
|
|
1293
|
-
'Cleanly kill a tmux session by running tmux kill-session and stopping its cl-*.scope systemd --user unit. Use --session <name> to kill another named session, or --self to terminate the current session from inside it.',
|
|
1294
|
-
)
|
|
1295
|
-
.option('--session <name>', 'Name of the tmux session to kill')
|
|
1296
|
-
.option(
|
|
1297
|
-
'--self',
|
|
1298
|
-
'Terminate the current session by stopping its own cl-*.scope systemd user unit, derived from /proc/self/cgroup',
|
|
1299
|
-
)
|
|
1300
|
-
.action(async (options: KillTmuxSessionOptions) => {
|
|
1301
|
-
if (!options.session && !options.self) {
|
|
1302
|
-
console.error('Either --session <name> or --self is required');
|
|
1303
|
-
process.exit(1);
|
|
1304
|
-
}
|
|
1305
|
-
if (options.session && options.self) {
|
|
1306
|
-
console.error('--session and --self cannot be used together');
|
|
1307
|
-
process.exit(1);
|
|
1308
|
-
}
|
|
1309
|
-
|
|
1310
|
-
const localCommandRunner = new NodeLocalCommandRunner();
|
|
1311
|
-
const tmuxSessionRepository = new NodeTmuxSessionRepository(
|
|
1312
|
-
localCommandRunner,
|
|
1313
|
-
);
|
|
1314
|
-
|
|
1315
|
-
if (options.self) {
|
|
1316
|
-
await tmuxSessionRepository.killOwnSession();
|
|
1317
|
-
} else if (options.session) {
|
|
1318
|
-
await tmuxSessionRepository.killSession(options.session);
|
|
1319
|
-
}
|
|
1320
|
-
});
|
|
1321
|
-
|
|
1322
|
-
program
|
|
1323
|
-
.command('ownerCallFileAppend')
|
|
1324
|
-
.description(
|
|
1325
|
-
'Append one owner call as a YAML document to the per-session owner call file. The project the session belongs to is resolved from the in-tmux-by-human data in the data directory, and a session no project lists is written under NA. The file is created when it does not exist, and every later call is appended after the existing documents so the oldest call stays first. Nothing is written to stdout on success.',
|
|
1326
|
-
)
|
|
1327
|
-
.requiredOption('--session <name>', 'tmux session name that raised the call')
|
|
1328
|
-
.requiredOption(
|
|
1329
|
-
'--calledAt <timestamp>',
|
|
1330
|
-
'Time the call was raised, as UTC ISO-8601 with second precision and a trailing Z',
|
|
1331
|
-
)
|
|
1332
|
-
.requiredOption(
|
|
1333
|
-
'--body-file <path>',
|
|
1334
|
-
'Path to the file holding the call body; the body is read from a file because it is multi-line and can be long',
|
|
1335
|
-
)
|
|
1336
|
-
.option(
|
|
1337
|
-
'--inTmuxDataDir <path>',
|
|
1338
|
-
`Directory the owner call files are written under, the same directory serveWeb serves them from (default: ${DEFAULT_IN_TMUX_DATA_DIR})`,
|
|
1339
|
-
)
|
|
1340
|
-
.action((options: OwnerCallFileAppendOptions) => {
|
|
1341
|
-
if (!isOwnerCallCalledAtValid(options.calledAt)) {
|
|
1342
|
-
console.error(
|
|
1343
|
-
'--calledAt must be a UTC ISO-8601 timestamp with second precision and a trailing Z, for example 2026-08-14T04:22:28Z',
|
|
1344
|
-
);
|
|
1345
|
-
return process.exit(1);
|
|
1346
|
-
}
|
|
1347
|
-
const dataDir = options.inTmuxDataDir ?? DEFAULT_IN_TMUX_DATA_DIR;
|
|
1348
|
-
ownerCallFileAppend({
|
|
1349
|
-
dataDir,
|
|
1350
|
-
projectCode: ownerCallProjectCodeInInTmuxByHumanData(
|
|
1351
|
-
dataDir,
|
|
1352
|
-
options.session,
|
|
1353
|
-
),
|
|
1354
|
-
ownerCall: {
|
|
1355
|
-
sessionName: options.session,
|
|
1356
|
-
calledAt: options.calledAt,
|
|
1357
|
-
body: fs.readFileSync(options.bodyFile, 'utf-8'),
|
|
1358
|
-
},
|
|
1359
|
-
});
|
|
1360
|
-
});
|
|
1361
|
-
|
|
1362
|
-
program
|
|
1363
|
-
.command('ownerCallFileDelete')
|
|
1364
|
-
.description(
|
|
1365
|
-
'Delete the owner call file of one session, whichever project directory holds it, so a session that moved between projects after its call was appended leaves nothing behind. It succeeds when the file is already absent, so a reset that runs twice is not an error. Nothing is written to stdout on success.',
|
|
1366
|
-
)
|
|
1367
|
-
.requiredOption('--session <name>', 'tmux session name that raised the call')
|
|
1368
|
-
.option(
|
|
1369
|
-
'--inTmuxDataDir <path>',
|
|
1370
|
-
`Directory the owner call files are written under, the same directory serveWeb serves them from (default: ${DEFAULT_IN_TMUX_DATA_DIR})`,
|
|
1371
|
-
)
|
|
1372
|
-
.action((options: OwnerCallFileDeleteOptions) => {
|
|
1373
|
-
ownerCallFileDeleteInEveryProject({
|
|
1374
|
-
dataDir: options.inTmuxDataDir ?? DEFAULT_IN_TMUX_DATA_DIR,
|
|
1375
|
-
sessionName: options.session,
|
|
1376
|
-
});
|
|
1377
|
-
});
|
|
1378
|
-
|
|
1379
|
-
program
|
|
1380
|
-
.command('attachOrCreate')
|
|
1381
|
-
.description(
|
|
1382
|
-
'Attach to an existing tmux session registered for the given issue URL, or create a new one. Looks up the cl session registry via cl-scope-lib.sh to find a registered session name; if that session is still alive it attaches to it, otherwise creates a new interactive session running cl for the issue URL.',
|
|
1383
|
-
)
|
|
1384
|
-
.requiredOption(
|
|
1385
|
-
'--issueUrl <url>',
|
|
1386
|
-
'GitHub issue URL to attach to or create a session for',
|
|
1387
|
-
)
|
|
1388
|
-
.action(async (options: AttachOrCreateOptions) => {
|
|
1389
|
-
const localCommandRunner = new NodeLocalCommandRunner();
|
|
1390
|
-
const tmuxSessionRepository = new NodeTmuxSessionRepository(
|
|
1391
|
-
localCommandRunner,
|
|
1392
|
-
);
|
|
1393
|
-
const scopeLibPath = resolveScopeLibPath();
|
|
1394
|
-
await tmuxSessionRepository.attachOrCreateInteractiveSession(
|
|
1395
|
-
options.issueUrl,
|
|
1396
|
-
scopeLibPath,
|
|
1397
|
-
);
|
|
1398
|
-
});
|
|
1399
|
-
|
|
1400
|
-
export const reportFatalErrorAndExit = (error: unknown): void => {
|
|
1401
|
-
console.error(error);
|
|
1402
|
-
process.exit(1);
|
|
1403
|
-
};
|
|
1404
|
-
|
|
1405
|
-
const buildCliErrorReporter = (): {
|
|
1406
|
-
useCase: CliErrorReportUseCase;
|
|
1407
|
-
owner: string;
|
|
1408
|
-
repo: string;
|
|
1409
|
-
} | null => {
|
|
1410
|
-
const token = process.env.GH_TOKEN;
|
|
1411
|
-
const targetRepo = process.env.TDPM_ERROR_REPORT_REPOSITORY;
|
|
1412
|
-
if (!token || !targetRepo) {
|
|
1413
|
-
return null;
|
|
1414
|
-
}
|
|
1415
|
-
const slashIndex = targetRepo.indexOf('/');
|
|
1416
|
-
if (slashIndex <= 0 || slashIndex === targetRepo.length - 1) {
|
|
1417
|
-
return null;
|
|
1418
|
-
}
|
|
1419
|
-
const owner = targetRepo.slice(0, slashIndex);
|
|
1420
|
-
const repo = targetRepo.slice(slashIndex + 1);
|
|
1421
|
-
const localStorageRepository = new LocalStorageRepository();
|
|
1422
|
-
const githubRepositoryParams = buildGithubRepositoryParams(
|
|
1423
|
-
localStorageRepository,
|
|
1424
|
-
token,
|
|
1425
|
-
);
|
|
1426
|
-
const apiV3IssueRepository = new ApiV3IssueRepository(
|
|
1427
|
-
...githubRepositoryParams,
|
|
1428
|
-
);
|
|
1429
|
-
const restIssueRepository = new RestIssueRepository(
|
|
1430
|
-
...githubRepositoryParams,
|
|
1431
|
-
);
|
|
1432
|
-
const useCase = new CliErrorReportUseCase({
|
|
1433
|
-
searchIssue: apiV3IssueRepository.searchIssue.bind(apiV3IssueRepository),
|
|
1434
|
-
createNewIssue:
|
|
1435
|
-
restIssueRepository.createNewIssue.bind(restIssueRepository),
|
|
1436
|
-
createCommentByUrl: async (issueOrPrUrl: string, commentBody: string) => {
|
|
1437
|
-
await restIssueRepository.createComment(issueOrPrUrl, commentBody);
|
|
1438
|
-
},
|
|
1439
|
-
});
|
|
1440
|
-
return { useCase, owner, repo };
|
|
1441
|
-
};
|
|
1442
|
-
|
|
1443
|
-
export const runCliProgram = async (
|
|
1444
|
-
argv: string[],
|
|
1445
|
-
handleFatalError: (error: unknown) => void,
|
|
1446
|
-
): Promise<void> => {
|
|
1447
|
-
let reported = false;
|
|
1448
|
-
|
|
1449
|
-
const safeReport = async (error: unknown): Promise<void> => {
|
|
1450
|
-
if (reported) {
|
|
1451
|
-
return;
|
|
1452
|
-
}
|
|
1453
|
-
reported = true;
|
|
1454
|
-
const reporter = buildCliErrorReporter();
|
|
1455
|
-
if (!reporter) {
|
|
1456
|
-
return;
|
|
1457
|
-
}
|
|
1458
|
-
await reporter.useCase.run({
|
|
1459
|
-
error,
|
|
1460
|
-
owner: reporter.owner,
|
|
1461
|
-
repo: reporter.repo,
|
|
1462
|
-
commandLine: argv.join(' '),
|
|
1463
|
-
});
|
|
1464
|
-
};
|
|
1465
|
-
|
|
1466
|
-
process.on('uncaughtException', (error: Error) => {
|
|
1467
|
-
void safeReport(error).then(() => {
|
|
1468
|
-
reportFatalErrorAndExit(error);
|
|
1469
|
-
});
|
|
1470
|
-
});
|
|
1471
|
-
process.on('unhandledRejection', (reason: unknown) => {
|
|
1472
|
-
void safeReport(reason).then(() => {
|
|
1473
|
-
reportFatalErrorAndExit(reason);
|
|
1474
|
-
});
|
|
1475
|
-
});
|
|
1476
|
-
|
|
1477
|
-
try {
|
|
1478
|
-
await program.parseAsync(argv);
|
|
1479
|
-
} catch (error) {
|
|
1480
|
-
await safeReport(error);
|
|
1481
|
-
handleFatalError(error);
|
|
1482
|
-
}
|
|
1483
|
-
};
|
|
1484
|
-
|
|
1485
|
-
/* istanbul ignore next */
|
|
1486
|
-
if (process.argv && require.main === module) {
|
|
1487
|
-
void runCliProgram(process.argv, reportFatalErrorAndExit);
|
|
1488
|
-
}
|