@akiojin/gwt 4.10.0 → 4.12.0
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.ja.md +4 -4
- package/README.md +4 -4
- package/bin/gwt.js +1 -1
- package/dist/claude.d.ts +2 -0
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +97 -68
- package/dist/claude.js.map +1 -1
- package/dist/cli/ui/App.solid.d.ts +29 -0
- package/dist/cli/ui/App.solid.d.ts.map +1 -0
- package/dist/cli/ui/App.solid.js +1395 -0
- package/dist/cli/ui/App.solid.js.map +1 -0
- package/dist/cli/ui/components/solid/Footer.d.ts +10 -0
- package/dist/cli/ui/components/solid/Footer.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/Footer.js +10 -0
- package/dist/cli/ui/components/solid/Footer.js.map +1 -0
- package/dist/cli/ui/components/{parts → solid}/Header.d.ts +1 -6
- package/dist/cli/ui/components/solid/Header.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/Header.js +13 -0
- package/dist/cli/ui/components/solid/Header.js.map +1 -0
- package/dist/cli/ui/components/solid/HelpOverlay.d.ts +8 -0
- package/dist/cli/ui/components/solid/HelpOverlay.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/HelpOverlay.js +118 -0
- package/dist/cli/ui/components/solid/HelpOverlay.js.map +1 -0
- package/dist/cli/ui/components/solid/QuickStartStep.d.ts +17 -0
- package/dist/cli/ui/components/solid/QuickStartStep.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/QuickStartStep.js +152 -0
- package/dist/cli/ui/components/solid/QuickStartStep.js.map +1 -0
- package/dist/cli/ui/components/solid/SelectInput.d.ts +22 -0
- package/dist/cli/ui/components/solid/SelectInput.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/SelectInput.js +45 -0
- package/dist/cli/ui/components/solid/SelectInput.js.map +1 -0
- package/dist/cli/ui/components/solid/TextInput.d.ts +12 -0
- package/dist/cli/ui/components/solid/TextInput.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/TextInput.js +9 -0
- package/dist/cli/ui/components/solid/TextInput.js.map +1 -0
- package/dist/cli/ui/components/solid/WizardController.d.ts +34 -0
- package/dist/cli/ui/components/solid/WizardController.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/WizardController.js +223 -0
- package/dist/cli/ui/components/solid/WizardController.js.map +1 -0
- package/dist/cli/ui/components/solid/WizardPopup.d.ts +26 -0
- package/dist/cli/ui/components/solid/WizardPopup.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/WizardPopup.js +68 -0
- package/dist/cli/ui/components/solid/WizardPopup.js.map +1 -0
- package/dist/cli/ui/components/solid/WizardSteps.d.ts +52 -0
- package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/WizardSteps.js +419 -0
- package/dist/cli/ui/components/solid/WizardSteps.js.map +1 -0
- package/dist/cli/ui/core/index.d.ts +12 -0
- package/dist/cli/ui/core/index.d.ts.map +1 -0
- package/dist/cli/ui/core/index.js +15 -0
- package/dist/cli/ui/core/index.js.map +1 -0
- package/dist/cli/ui/core/keybindings.d.ts +106 -0
- package/dist/cli/ui/core/keybindings.d.ts.map +1 -0
- package/dist/cli/ui/core/keybindings.js +270 -0
- package/dist/cli/ui/core/keybindings.js.map +1 -0
- package/dist/cli/ui/core/theme.d.ts +123 -0
- package/dist/cli/ui/core/theme.d.ts.map +1 -0
- package/dist/cli/ui/core/theme.js +191 -0
- package/dist/cli/ui/core/theme.js.map +1 -0
- package/dist/cli/ui/core/types.d.ts +156 -0
- package/dist/cli/ui/core/types.d.ts.map +1 -0
- package/dist/cli/ui/core/types.js +10 -0
- package/dist/cli/ui/core/types.js.map +1 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.d.ts +26 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.d.ts.map +1 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.js +89 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.js.map +1 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts +10 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts.map +1 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.js +16 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.js.map +1 -0
- package/dist/cli/ui/index.solid.d.ts +5 -0
- package/dist/cli/ui/index.solid.d.ts.map +1 -0
- package/dist/cli/ui/index.solid.js +21 -0
- package/dist/cli/ui/index.solid.js.map +1 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.d.ts +53 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.js +829 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts +11 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.js +45 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts +14 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.js +90 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.d.ts +8 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.js +18 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/InputScreen.d.ts +13 -0
- package/dist/cli/ui/screens/solid/InputScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/InputScreen.js +17 -0
- package/dist/cli/ui/screens/solid/InputScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts +9 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.js +43 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.js.map +1 -0
- package/dist/cli/ui/{components/screens → screens/solid}/LogDetailScreen.d.ts +2 -2
- package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/LogDetailScreen.js +34 -0
- package/dist/cli/ui/screens/solid/LogDetailScreen.js.map +1 -0
- package/dist/cli/ui/{components/screens/LogListScreen.d.ts → screens/solid/LogScreen.d.ts} +10 -4
- package/dist/cli/ui/screens/solid/LogScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/LogScreen.js +333 -0
- package/dist/cli/ui/screens/solid/LogScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts +17 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.js +115 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.d.ts +17 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.js +50 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.d.ts +20 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.js +98 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts +13 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js +59 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js.map +1 -0
- package/dist/cli/ui/stores/appStore.d.ts +143 -0
- package/dist/cli/ui/stores/appStore.d.ts.map +1 -0
- package/dist/cli/ui/stores/appStore.js +158 -0
- package/dist/cli/ui/stores/appStore.js.map +1 -0
- package/dist/cli/ui/stores/branchStore.d.ts +159 -0
- package/dist/cli/ui/stores/branchStore.d.ts.map +1 -0
- package/dist/cli/ui/stores/branchStore.js +275 -0
- package/dist/cli/ui/stores/branchStore.js.map +1 -0
- package/dist/cli/ui/stores/index.d.ts +11 -0
- package/dist/cli/ui/stores/index.d.ts.map +1 -0
- package/dist/cli/ui/stores/index.js +14 -0
- package/dist/cli/ui/stores/index.js.map +1 -0
- package/dist/cli/ui/stores/uiStore.d.ts +146 -0
- package/dist/cli/ui/stores/uiStore.d.ts.map +1 -0
- package/dist/cli/ui/stores/uiStore.js +166 -0
- package/dist/cli/ui/stores/uiStore.js.map +1 -0
- package/dist/cli/ui/types.d.ts +17 -1
- package/dist/cli/ui/types.d.ts.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.d.ts +1 -0
- package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.js +36 -217
- package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
- package/dist/cli/ui/utils/continueSession.d.ts +18 -0
- package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
- package/dist/cli/ui/utils/continueSession.js +90 -2
- package/dist/cli/ui/utils/continueSession.js.map +1 -1
- package/dist/cli/ui/utils/versionCache.d.ts +37 -0
- package/dist/cli/ui/utils/versionCache.d.ts.map +1 -0
- package/dist/cli/ui/utils/versionCache.js +70 -0
- package/dist/cli/ui/utils/versionCache.js.map +1 -0
- package/dist/cli/ui/utils/versionFetcher.d.ts +41 -0
- package/dist/cli/ui/utils/versionFetcher.d.ts.map +1 -0
- package/dist/cli/ui/utils/versionFetcher.js +89 -0
- package/dist/cli/ui/utils/versionFetcher.js.map +1 -0
- package/dist/client/assets/{index-ChHC-Puh.css → index-BbfV7Wuj.css} +1 -1
- package/dist/client/assets/index-CoAyq5x1.js +78 -0
- package/dist/client/index.html +2 -2
- package/dist/codex.d.ts +2 -0
- package/dist/codex.d.ts.map +1 -1
- package/dist/codex.js +109 -39
- package/dist/codex.js.map +1 -1
- package/dist/config/builtin-coding-agents.js +4 -4
- package/dist/config/builtin-coding-agents.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +11 -0
- package/dist/config/index.js.map +1 -1
- package/dist/gemini.d.ts +2 -0
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +77 -39
- package/dist/gemini.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +153 -103
- package/dist/index.js.map +1 -1
- package/dist/launcher.d.ts.map +1 -1
- package/dist/launcher.js +56 -6
- package/dist/launcher.js.map +1 -1
- package/dist/logging/agentOutput.d.ts +21 -0
- package/dist/logging/agentOutput.d.ts.map +1 -0
- package/dist/logging/agentOutput.js +164 -0
- package/dist/logging/agentOutput.js.map +1 -0
- package/dist/logging/formatter.d.ts.map +1 -1
- package/dist/logging/formatter.js +18 -4
- package/dist/logging/formatter.js.map +1 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +28 -9
- package/dist/logging/logger.js.map +1 -1
- package/dist/logging/reader.d.ts +21 -0
- package/dist/logging/reader.d.ts.map +1 -1
- package/dist/logging/reader.js +79 -0
- package/dist/logging/reader.js.map +1 -1
- package/dist/opentui/highlights-eq9cgrbb.scm +604 -0
- package/dist/opentui/highlights-ghv9g403.scm +205 -0
- package/dist/opentui/highlights-hk7bwhj4.scm +284 -0
- package/dist/opentui/highlights-r812a2qc.scm +150 -0
- package/dist/opentui/highlights-x6tmsnaa.scm +115 -0
- package/dist/opentui/index.solid.d.ts +2 -0
- package/dist/opentui/index.solid.d.ts.map +1 -0
- package/dist/opentui/index.solid.js +53687 -0
- package/dist/opentui/index.solid.js.map +1 -0
- package/dist/opentui/injections-73j83es3.scm +27 -0
- package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
- package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
- package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
- package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
- package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
- package/dist/repositories/worktree.repository.d.ts +1 -0
- package/dist/repositories/worktree.repository.d.ts.map +1 -1
- package/dist/repositories/worktree.repository.js +7 -0
- package/dist/repositories/worktree.repository.js.map +1 -1
- package/dist/services/codingAgentResolver.d.ts +2 -0
- package/dist/services/codingAgentResolver.d.ts.map +1 -1
- package/dist/services/codingAgentResolver.js +30 -4
- package/dist/services/codingAgentResolver.js.map +1 -1
- package/dist/services/dependency-installer.d.ts.map +1 -1
- package/dist/services/dependency-installer.js +2 -7
- package/dist/services/dependency-installer.js.map +1 -1
- package/dist/types/api.d.ts +3 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/coding-agent.d.ts +62 -0
- package/dist/types/coding-agent.d.ts.map +1 -0
- package/dist/types/coding-agent.js +29 -0
- package/dist/types/coding-agent.js.map +1 -0
- package/dist/types/tools.d.ts +17 -0
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/coding-agent-colors.d.ts +88 -0
- package/dist/utils/coding-agent-colors.d.ts.map +1 -0
- package/dist/utils/coding-agent-colors.js +137 -0
- package/dist/utils/coding-agent-colors.js.map +1 -0
- package/dist/utils/command.d.ts +1 -1
- package/dist/utils/command.js +1 -1
- package/dist/utils/error-utils.d.ts +27 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +98 -0
- package/dist/utils/error-utils.js.map +1 -0
- package/dist/utils/npmRegistry.d.ts +61 -0
- package/dist/utils/npmRegistry.d.ts.map +1 -0
- package/dist/utils/npmRegistry.js +180 -0
- package/dist/utils/npmRegistry.js.map +1 -0
- package/dist/utils/prompt.d.ts +1 -1
- package/dist/utils/prompt.js +1 -1
- package/dist/utils/session/common.d.ts +8 -0
- package/dist/utils/session/common.d.ts.map +1 -1
- package/dist/utils/session/common.js +22 -0
- package/dist/utils/session/common.js.map +1 -1
- package/dist/utils/session/parsers/claude.d.ts +10 -4
- package/dist/utils/session/parsers/claude.d.ts.map +1 -1
- package/dist/utils/session/parsers/claude.js +64 -18
- package/dist/utils/session/parsers/claude.js.map +1 -1
- package/dist/utils/session/parsers/codex.d.ts.map +1 -1
- package/dist/utils/session/parsers/codex.js +47 -20
- package/dist/utils/session/parsers/codex.js.map +1 -1
- package/dist/utils/session/parsers/gemini.d.ts.map +1 -1
- package/dist/utils/session/parsers/gemini.js +43 -6
- package/dist/utils/session/parsers/gemini.js.map +1 -1
- package/dist/utils/session/parsers/opencode.d.ts.map +1 -1
- package/dist/utils/session/parsers/opencode.js +43 -6
- package/dist/utils/session/parsers/opencode.js.map +1 -1
- package/dist/utils/session/types.d.ts +7 -0
- package/dist/utils/session/types.d.ts.map +1 -1
- package/dist/utils/terminal.d.ts +1 -0
- package/dist/utils/terminal.d.ts.map +1 -1
- package/dist/utils/terminal.js +20 -0
- package/dist/utils/terminal.js.map +1 -1
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +33 -2
- package/dist/utils.js.map +1 -1
- package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +1 -1
- package/dist/web/client/src/components/CodingAgentLaunchModal.js +7 -16
- package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +7 -2
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +2 -1
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +2 -2
- package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/ToolLauncher.js +5 -5
- package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -1
- package/dist/web/client/src/components/ui/alert.d.ts +1 -1
- package/dist/web/client/src/lib/coding-agent-colors.d.ts +86 -0
- package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +1 -0
- package/dist/web/client/src/lib/coding-agent-colors.js +135 -0
- package/dist/web/client/src/lib/coding-agent-colors.js.map +1 -0
- package/dist/web/client/src/pages/BranchDetailPage.js +10 -10
- package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
- package/dist/web/server/pty/manager.d.ts +2 -0
- package/dist/web/server/pty/manager.d.ts.map +1 -1
- package/dist/web/server/pty/manager.js +104 -0
- package/dist/web/server/pty/manager.js.map +1 -1
- package/dist/web/server/routes/sessions.d.ts.map +1 -1
- package/dist/web/server/routes/sessions.js +5 -1
- package/dist/web/server/routes/sessions.js.map +1 -1
- package/dist/web/server/services/branches.d.ts.map +1 -1
- package/dist/web/server/services/branches.js +10 -8
- package/dist/web/server/services/branches.js.map +1 -1
- package/dist/web/server/services/worktrees.js +2 -2
- package/dist/web/server/services/worktrees.js.map +1 -1
- package/dist/worktree.d.ts +50 -1
- package/dist/worktree.d.ts.map +1 -1
- package/dist/worktree.js +292 -100
- package/dist/worktree.js.map +1 -1
- package/package.json +13 -14
- package/src/claude.ts +129 -95
- package/src/cli/ui/App.solid.tsx +2096 -0
- package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +1084 -0
- package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +343 -0
- package/src/cli/ui/__tests__/solid/ConfirmScreen.test.tsx +77 -0
- package/src/cli/ui/__tests__/solid/LogScreen.test.tsx +351 -0
- package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +308 -0
- package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +231 -0
- package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +241 -0
- package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +79 -334
- package/src/cli/ui/__tests__/utils/clipboard.test.ts +3 -3
- package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +1 -1
- package/src/cli/ui/components/solid/Footer.tsx +36 -0
- package/src/cli/ui/components/{parts → solid}/Header.tsx +17 -28
- package/src/cli/ui/components/solid/HelpOverlay.tsx +194 -0
- package/src/cli/ui/components/solid/QuickStartStep.tsx +209 -0
- package/src/cli/ui/components/{parts → solid}/ScrollableList.tsx +7 -8
- package/src/cli/ui/components/solid/SearchInput.tsx +42 -0
- package/src/cli/ui/components/solid/SelectInput.tsx +88 -0
- package/src/cli/ui/components/solid/Stats.tsx +92 -0
- package/src/cli/ui/components/solid/TextInput.tsx +49 -0
- package/src/cli/ui/components/solid/WizardController.tsx +393 -0
- package/src/cli/ui/components/solid/WizardPopup.tsx +135 -0
- package/src/cli/ui/components/solid/WizardSteps.tsx +736 -0
- package/src/cli/ui/core/index.ts +17 -0
- package/src/cli/ui/core/keybindings.ts +367 -0
- package/src/cli/ui/core/theme.ts +266 -0
- package/src/cli/ui/core/types.ts +235 -0
- package/src/cli/ui/hooks/solid/useAsyncOperation.ts +78 -0
- package/src/cli/ui/hooks/solid/useFilter.ts +86 -0
- package/src/cli/ui/hooks/solid/useGitOperations.ts +81 -0
- package/src/cli/ui/hooks/solid/useKeyHandler.ts +103 -0
- package/src/cli/ui/hooks/solid/useScrollableList.ts +149 -0
- package/src/cli/ui/hooks/solid/useSelection.ts +77 -0
- package/src/cli/ui/hooks/solid/useTerminalSize.ts +22 -0
- package/src/cli/ui/index.solid.ts +28 -0
- package/src/cli/ui/screens/solid/BranchListScreen.tsx +1153 -0
- package/src/cli/ui/screens/solid/ConfirmScreen.tsx +86 -0
- package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +161 -0
- package/src/cli/ui/screens/solid/ErrorScreen.tsx +42 -0
- package/src/cli/ui/screens/solid/InputScreen.tsx +55 -0
- package/src/cli/ui/screens/solid/LoadingIndicator.tsx +77 -0
- package/src/cli/ui/screens/solid/LogDetailScreen.tsx +75 -0
- package/src/cli/ui/screens/solid/LogScreen.tsx +504 -0
- package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +196 -0
- package/src/cli/ui/screens/solid/ProfileScreen.tsx +98 -0
- package/src/cli/ui/screens/solid/SelectorScreen.tsx +181 -0
- package/src/cli/ui/screens/solid/SettingsScreen.tsx +52 -0
- package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +136 -0
- package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +40 -0
- package/src/cli/ui/stores/appStore.ts +208 -0
- package/src/cli/ui/stores/branchStore.ts +357 -0
- package/src/cli/ui/stores/index.ts +31 -0
- package/src/cli/ui/stores/uiStore.ts +226 -0
- package/src/cli/ui/types.ts +21 -3
- package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +227 -0
- package/src/cli/ui/utils/branchFormatter.ts +43 -222
- package/src/cli/ui/utils/continueSession.ts +133 -2
- package/src/cli/ui/utils/modelOptions.test.ts +1 -1
- package/src/cli/ui/utils/versionCache.ts +93 -0
- package/src/cli/ui/utils/versionFetcher.ts +120 -0
- package/src/codex.ts +138 -39
- package/src/config/__tests__/saveSession.test.ts +143 -0
- package/src/config/builtin-coding-agents.ts +4 -4
- package/src/config/index.ts +14 -0
- package/src/gemini.ts +107 -46
- package/src/index.test.ts +25 -19
- package/src/index.ts +202 -143
- package/src/launcher.ts +66 -6
- package/src/logging/agentOutput.ts +216 -0
- package/src/logging/formatter.ts +23 -4
- package/src/logging/logger.ts +34 -10
- package/src/logging/reader.ts +117 -0
- package/src/opentui/index.solid.ts +1 -0
- package/src/repositories/worktree.repository.ts +8 -0
- package/src/services/__tests__/BatchMergeService.test.ts +83 -67
- package/src/services/__tests__/WorktreeOrchestrator.test.ts +8 -7
- package/src/services/codingAgentResolver.ts +30 -4
- package/src/services/dependency-installer.ts +2 -9
- package/src/types/api.ts +3 -0
- package/src/types/coding-agent.ts +85 -0
- package/src/types/tools.ts +19 -0
- package/src/utils/__tests__/npmRegistry.test.ts +250 -0
- package/src/utils/__tests__/prompt.test.ts +4 -5
- package/src/utils/coding-agent-colors.ts +165 -0
- package/src/utils/command.ts +1 -1
- package/src/utils/error-utils.ts +133 -0
- package/src/utils/npmRegistry.ts +249 -0
- package/src/utils/prompt.ts +1 -1
- package/src/utils/session/common.ts +28 -0
- package/src/utils/session/parsers/claude.ts +79 -29
- package/src/utils/session/parsers/codex.ts +50 -18
- package/src/utils/session/parsers/gemini.ts +46 -5
- package/src/utils/session/parsers/opencode.ts +46 -5
- package/src/utils/session/types.ts +4 -0
- package/src/utils/terminal.ts +24 -0
- package/src/utils.test.ts +1 -1
- package/src/utils.ts +37 -4
- package/src/web/client/src/components/CodingAgentLaunchModal.tsx +12 -21
- package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +16 -1
- package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +7 -1
- package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +11 -6
- package/src/web/client/src/lib/coding-agent-colors.ts +149 -0
- package/src/web/client/src/pages/BranchDetailPage.tsx +11 -11
- package/src/web/server/pty/manager.ts +139 -0
- package/src/web/server/routes/sessions.ts +6 -0
- package/src/web/server/services/branches.ts +11 -8
- package/src/web/server/services/worktrees.ts +2 -2
- package/src/worktree.ts +386 -114
- package/dist/cli/ui/components/App.d.ts +0 -25
- package/dist/cli/ui/components/App.d.ts.map +0 -1
- package/dist/cli/ui/components/App.js +0 -1006
- package/dist/cli/ui/components/App.js.map +0 -1
- package/dist/cli/ui/components/common/Confirm.d.ts +0 -13
- package/dist/cli/ui/components/common/Confirm.d.ts.map +0 -1
- package/dist/cli/ui/components/common/Confirm.js +0 -20
- package/dist/cli/ui/components/common/Confirm.js.map +0 -1
- package/dist/cli/ui/components/common/ErrorBoundary.d.ts +0 -23
- package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +0 -1
- package/dist/cli/ui/components/common/ErrorBoundary.js +0 -37
- package/dist/cli/ui/components/common/ErrorBoundary.js.map +0 -1
- package/dist/cli/ui/components/common/Input.d.ts +0 -19
- package/dist/cli/ui/components/common/Input.d.ts.map +0 -1
- package/dist/cli/ui/components/common/Input.js +0 -22
- package/dist/cli/ui/components/common/Input.js.map +0 -1
- package/dist/cli/ui/components/common/LoadingIndicator.d.ts +0 -19
- package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +0 -1
- package/dist/cli/ui/components/common/LoadingIndicator.js +0 -61
- package/dist/cli/ui/components/common/LoadingIndicator.js.map +0 -1
- package/dist/cli/ui/components/common/Select.d.ts +0 -38
- package/dist/cli/ui/components/common/Select.d.ts.map +0 -1
- package/dist/cli/ui/components/common/Select.js +0 -151
- package/dist/cli/ui/components/common/Select.js.map +0 -1
- package/dist/cli/ui/components/common/SpinnerIcon.d.ts +0 -20
- package/dist/cli/ui/components/common/SpinnerIcon.d.ts.map +0 -1
- package/dist/cli/ui/components/common/SpinnerIcon.js +0 -61
- package/dist/cli/ui/components/common/SpinnerIcon.js.map +0 -1
- package/dist/cli/ui/components/parts/Footer.d.ts +0 -15
- package/dist/cli/ui/components/parts/Footer.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/Footer.js +0 -20
- package/dist/cli/ui/components/parts/Footer.js.map +0 -1
- package/dist/cli/ui/components/parts/Header.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/Header.js +0 -24
- package/dist/cli/ui/components/parts/Header.js.map +0 -1
- package/dist/cli/ui/components/parts/MergeStatusList.d.ts +0 -13
- package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/MergeStatusList.js +0 -52
- package/dist/cli/ui/components/parts/MergeStatusList.js.map +0 -1
- package/dist/cli/ui/components/parts/ProgressBar.d.ts +0 -13
- package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/ProgressBar.js +0 -53
- package/dist/cli/ui/components/parts/ProgressBar.js.map +0 -1
- package/dist/cli/ui/components/parts/ScrollableList.d.ts +0 -12
- package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/ScrollableList.js +0 -11
- package/dist/cli/ui/components/parts/ScrollableList.js.map +0 -1
- package/dist/cli/ui/components/parts/Stats.d.ts +0 -10
- package/dist/cli/ui/components/parts/Stats.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/Stats.js +0 -55
- package/dist/cli/ui/components/parts/Stats.js.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +0 -17
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +0 -42
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +0 -17
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +0 -72
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +0 -18
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js +0 -151
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts +0 -60
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BranchListScreen.js +0 -476
- package/dist/cli/ui/components/screens/BranchListScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +0 -30
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +0 -148
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts +0 -27
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js +0 -93
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +0 -19
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +0 -577
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +0 -45
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +0 -95
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +0 -10
- package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/LogDatePickerScreen.js +0 -44
- package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/LogDetailScreen.js +0 -34
- package/dist/cli/ui/components/screens/LogDetailScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/LogListScreen.js +0 -107
- package/dist/cli/ui/components/screens/LogListScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +0 -24
- package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/ModelSelectorScreen.js +0 -197
- package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +0 -29
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/PRCleanupScreen.js +0 -92
- package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +0 -31
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js +0 -67
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +0 -1
- package/dist/cli/ui/hooks/useAppInput.d.ts +0 -21
- package/dist/cli/ui/hooks/useAppInput.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useAppInput.js +0 -138
- package/dist/cli/ui/hooks/useAppInput.js.map +0 -1
- package/dist/cli/ui/hooks/useBatchMerge.d.ts +0 -17
- package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useBatchMerge.js +0 -77
- package/dist/cli/ui/hooks/useBatchMerge.js.map +0 -1
- package/dist/cli/ui/hooks/useGitData.d.ts +0 -21
- package/dist/cli/ui/hooks/useGitData.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useGitData.js +0 -229
- package/dist/cli/ui/hooks/useGitData.js.map +0 -1
- package/dist/cli/ui/hooks/useProfiles.d.ts +0 -41
- package/dist/cli/ui/hooks/useProfiles.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useProfiles.js +0 -136
- package/dist/cli/ui/hooks/useProfiles.js.map +0 -1
- package/dist/cli/ui/hooks/useScreenState.d.ts +0 -12
- package/dist/cli/ui/hooks/useScreenState.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useScreenState.js +0 -30
- package/dist/cli/ui/hooks/useScreenState.js.map +0 -1
- package/dist/cli/ui/hooks/useTerminalSize.d.ts +0 -9
- package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useTerminalSize.js +0 -24
- package/dist/cli/ui/hooks/useTerminalSize.js.map +0 -1
- package/dist/cli/ui/hooks/useToolStatus.d.ts +0 -30
- package/dist/cli/ui/hooks/useToolStatus.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useToolStatus.js +0 -49
- package/dist/cli/ui/hooks/useToolStatus.js.map +0 -1
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +0 -24
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js +0 -65
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +0 -1
- package/dist/client/assets/index-LNPtOrn3.js +0 -78
- package/src/cli/ui/__tests__/SKIPPED_TESTS.md +0 -119
- package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +0 -239
- package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +0 -225
- package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +0 -219
- package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +0 -212
- package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +0 -440
- package/src/cli/ui/__tests__/components/App.test.tsx +0 -365
- package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +0 -91
- package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +0 -80
- package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +0 -104
- package/src/cli/ui/__tests__/components/common/Input.test.tsx +0 -100
- package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +0 -148
- package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +0 -255
- package/src/cli/ui/__tests__/components/common/Select.test.tsx +0 -335
- package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +0 -65
- package/src/cli/ui/__tests__/components/parts/Header.test.tsx +0 -55
- package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +0 -69
- package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +0 -148
- package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +0 -253
- package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +0 -1070
- package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +0 -142
- package/src/cli/ui/__tests__/components/screens/CodingAgentSelectorScreen.test.tsx +0 -174
- package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +0 -182
- package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +0 -57
- package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +0 -102
- package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +0 -216
- package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +0 -147
- package/src/cli/ui/__tests__/hooks/useGitData.nonblocking.test.tsx +0 -206
- package/src/cli/ui/__tests__/hooks/useGitData.test.ts +0 -197
- package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +0 -228
- package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +0 -147
- package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +0 -99
- package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +0 -253
- package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +0 -436
- package/src/cli/ui/__tests__/integration/navigation.test.tsx +0 -514
- package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +0 -509
- package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +0 -216
- package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +0 -193
- package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +0 -234
- package/src/cli/ui/components/App.tsx +0 -1478
- package/src/cli/ui/components/common/Confirm.tsx +0 -44
- package/src/cli/ui/components/common/ErrorBoundary.tsx +0 -60
- package/src/cli/ui/components/common/Input.tsx +0 -58
- package/src/cli/ui/components/common/LoadingIndicator.tsx +0 -98
- package/src/cli/ui/components/common/Select.tsx +0 -247
- package/src/cli/ui/components/common/SpinnerIcon.tsx +0 -86
- package/src/cli/ui/components/parts/Footer.tsx +0 -41
- package/src/cli/ui/components/parts/Header.test.tsx +0 -75
- package/src/cli/ui/components/parts/MergeStatusList.tsx +0 -75
- package/src/cli/ui/components/parts/ProgressBar.tsx +0 -73
- package/src/cli/ui/components/parts/Stats.tsx +0 -88
- package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +0 -74
- package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +0 -108
- package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +0 -242
- package/src/cli/ui/components/screens/BranchListScreen.tsx +0 -744
- package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +0 -244
- package/src/cli/ui/components/screens/CodingAgentSelectorScreen.tsx +0 -159
- package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +0 -928
- package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +0 -176
- package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +0 -83
- package/src/cli/ui/components/screens/LogDetailScreen.tsx +0 -67
- package/src/cli/ui/components/screens/LogListScreen.tsx +0 -192
- package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +0 -320
- package/src/cli/ui/components/screens/PRCleanupScreen.tsx +0 -171
- package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +0 -135
- package/src/cli/ui/hooks/useAppInput.ts +0 -172
- package/src/cli/ui/hooks/useBatchMerge.ts +0 -96
- package/src/cli/ui/hooks/useGitData.ts +0 -347
- package/src/cli/ui/hooks/useProfiles.ts +0 -211
- package/src/cli/ui/hooks/useScreenState.ts +0 -44
- package/src/cli/ui/hooks/useTerminalSize.ts +0 -33
- package/src/cli/ui/hooks/useToolStatus.ts +0 -68
- package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +0 -111
- package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +0 -264
package/src/index.ts
CHANGED
|
@@ -13,30 +13,28 @@ import {
|
|
|
13
13
|
hasUnpushedCommits,
|
|
14
14
|
getUncommittedChangesCount,
|
|
15
15
|
getUnpushedCommitsCount,
|
|
16
|
-
GitError,
|
|
17
16
|
} from "./git.js";
|
|
18
17
|
import { launchClaudeCode } from "./claude.js";
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
CodexError,
|
|
22
|
-
type CodexReasoningEffort,
|
|
23
|
-
} from "./codex.js";
|
|
24
|
-
import { launchGeminiCLI, GeminiError } from "./gemini.js";
|
|
18
|
+
import { launchCodexCLI, type CodexReasoningEffort } from "./codex.js";
|
|
19
|
+
import { launchGeminiCLI } from "./gemini.js";
|
|
25
20
|
import {
|
|
26
21
|
WorktreeOrchestrator,
|
|
27
22
|
type EnsureWorktreeOptions,
|
|
28
23
|
} from "./services/WorktreeOrchestrator.js";
|
|
29
24
|
import chalk from "chalk";
|
|
30
|
-
import type { SelectionResult } from "./cli/ui/
|
|
25
|
+
import type { SelectionResult } from "./cli/ui/App.solid.js";
|
|
31
26
|
import {
|
|
32
27
|
isProtectedBranchName,
|
|
33
28
|
switchToProtectedBranch,
|
|
34
|
-
WorktreeError,
|
|
35
29
|
resolveWorktreePathForBranch,
|
|
30
|
+
listAllWorktrees,
|
|
31
|
+
repairWorktreePath,
|
|
36
32
|
} from "./worktree.js";
|
|
37
33
|
import {
|
|
38
34
|
getTerminalStreams,
|
|
35
|
+
resetTerminalModes,
|
|
39
36
|
waitForUserAcknowledgement,
|
|
37
|
+
writeTerminalLine,
|
|
40
38
|
} from "./utils/terminal.js";
|
|
41
39
|
import { createLogger } from "./logging/logger.js";
|
|
42
40
|
import { getCodingAgentById, getSharedEnvironment } from "./config/tools.js";
|
|
@@ -47,7 +45,12 @@ import {
|
|
|
47
45
|
findLatestClaudeSession,
|
|
48
46
|
findLatestGeminiSession,
|
|
49
47
|
} from "./utils/session.js";
|
|
50
|
-
import {
|
|
48
|
+
import {
|
|
49
|
+
getPackageVersion,
|
|
50
|
+
setupExitHandlers,
|
|
51
|
+
registerExitCleanup,
|
|
52
|
+
clearExitCleanup,
|
|
53
|
+
} from "./utils.js";
|
|
51
54
|
import { findLatestClaudeSessionId } from "./utils/session.js";
|
|
52
55
|
import { resolveContinueSessionId } from "./cli/ui/utils/continueSession.js";
|
|
53
56
|
import { normalizeModelId } from "./cli/ui/utils/modelOptions.js";
|
|
@@ -56,12 +59,13 @@ import {
|
|
|
56
59
|
DependencyInstallError,
|
|
57
60
|
type DependencyInstallResult,
|
|
58
61
|
} from "./services/dependency-installer.js";
|
|
59
|
-
import {
|
|
62
|
+
import { isGitRelatedError, isRecoverableError } from "./utils/error-utils.js";
|
|
60
63
|
|
|
61
64
|
const ERROR_PROMPT = chalk.yellow(
|
|
62
65
|
"Review the error details, then press Enter to continue.",
|
|
63
66
|
);
|
|
64
|
-
const
|
|
67
|
+
const SUCCESS_PROMPT = chalk.green("Press Enter to return to main menu...");
|
|
68
|
+
const POST_SESSION_DELAY_MS = 500;
|
|
65
69
|
|
|
66
70
|
// Category: cli
|
|
67
71
|
const appLogger = createLogger({ category: "cli" });
|
|
@@ -74,87 +78,23 @@ async function waitForErrorAcknowledgement(): Promise<void> {
|
|
|
74
78
|
* Simple print functions (replacing legacy UI display functions)
|
|
75
79
|
*/
|
|
76
80
|
function printError(message: string): void {
|
|
77
|
-
|
|
81
|
+
writeTerminalLine(chalk.red(`❌ ${message}`), "stderr");
|
|
78
82
|
appLogger.error({ message });
|
|
79
83
|
}
|
|
80
84
|
|
|
81
85
|
function printInfo(message: string): void {
|
|
82
|
-
|
|
86
|
+
writeTerminalLine(chalk.blue(`ℹ️ ${message}`));
|
|
83
87
|
appLogger.info({ message });
|
|
84
88
|
}
|
|
85
89
|
|
|
86
90
|
function printWarning(message: string): void {
|
|
87
|
-
|
|
91
|
+
writeTerminalLine(chalk.yellow(`⚠️ ${message}`), "stderr");
|
|
88
92
|
appLogger.warn({ message });
|
|
89
93
|
}
|
|
90
94
|
|
|
91
95
|
type GitStepResult<T> = { ok: true; value: T } | { ok: false };
|
|
92
96
|
|
|
93
|
-
|
|
94
|
-
if (!error) {
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (error instanceof GitError || error instanceof WorktreeError) {
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (error instanceof Error) {
|
|
103
|
-
return error.name === "GitError" || error.name === "WorktreeError";
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (
|
|
107
|
-
typeof error === "object" &&
|
|
108
|
-
"name" in (error as Record<string, unknown>)
|
|
109
|
-
) {
|
|
110
|
-
const name = (error as { name?: string }).name;
|
|
111
|
-
return name === "GitError" || name === "WorktreeError";
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return false;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function isRecoverableError(error: unknown): boolean {
|
|
118
|
-
if (!error) {
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (
|
|
123
|
-
error instanceof GitError ||
|
|
124
|
-
error instanceof WorktreeError ||
|
|
125
|
-
error instanceof CodexError ||
|
|
126
|
-
error instanceof GeminiError ||
|
|
127
|
-
error instanceof DependencyInstallError
|
|
128
|
-
) {
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (error instanceof Error) {
|
|
133
|
-
return (
|
|
134
|
-
error.name === "GitError" ||
|
|
135
|
-
error.name === "WorktreeError" ||
|
|
136
|
-
error.name === "CodexError" ||
|
|
137
|
-
error.name === "GeminiError" ||
|
|
138
|
-
error.name === "DependencyInstallError"
|
|
139
|
-
);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (
|
|
143
|
-
typeof error === "object" &&
|
|
144
|
-
"name" in (error as Record<string, unknown>)
|
|
145
|
-
) {
|
|
146
|
-
const name = (error as { name?: string }).name;
|
|
147
|
-
return (
|
|
148
|
-
name === "GitError" ||
|
|
149
|
-
name === "WorktreeError" ||
|
|
150
|
-
name === "CodexError" ||
|
|
151
|
-
name === "GeminiError" ||
|
|
152
|
-
name === "DependencyInstallError"
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
97
|
+
// Note: isGitRelatedError and isRecoverableError are now imported from ./utils/error-utils.js
|
|
158
98
|
|
|
159
99
|
async function runGitStep<T>(
|
|
160
100
|
description: string,
|
|
@@ -240,49 +180,76 @@ async function showVersion(): Promise<void> {
|
|
|
240
180
|
}
|
|
241
181
|
|
|
242
182
|
/**
|
|
243
|
-
*
|
|
183
|
+
* Performs terminal cleanup when exiting.
|
|
184
|
+
*/
|
|
185
|
+
function performTerminalCleanup(): void {
|
|
186
|
+
const terminal = getTerminalStreams();
|
|
187
|
+
terminal.exitRawMode();
|
|
188
|
+
resetTerminalModes(terminal.stdout);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Main function for OpenTUI UI
|
|
244
193
|
* Returns SelectionResult if user made selections, undefined if user quit
|
|
245
194
|
*/
|
|
246
|
-
async function
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
195
|
+
async function mainSolidUI(): Promise<SelectionResult | undefined> {
|
|
196
|
+
if (!("Bun" in globalThis)) {
|
|
197
|
+
throw new Error(
|
|
198
|
+
"OpenTUI requires the Bun runtime. Run with Bun (e.g. bunx @akiojin/gwt@latest).",
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
const { renderSolidApp } = await import("./opentui/index.solid.js");
|
|
250
202
|
const terminal = getTerminalStreams();
|
|
251
203
|
|
|
204
|
+
// Register cleanup for signal handlers
|
|
205
|
+
registerExitCleanup(performTerminalCleanup);
|
|
252
206
|
let selectionResult: SelectionResult | undefined;
|
|
207
|
+
// マウスキャプチャを有効にしてSelection APIで選択終了時にクリップボードへコピー
|
|
208
|
+
const useMouse = true;
|
|
209
|
+
const enableMouseMovement = false;
|
|
210
|
+
const altScreenPreference =
|
|
211
|
+
process.env.GWT_UI_ALT_SCREEN?.trim().toLowerCase();
|
|
212
|
+
// Ink.js版ではalternate screenを使用していなかったため、デフォルトをfalseに
|
|
213
|
+
// alternate screenを使用するとコーディングエージェント起動/終了ログが見えなくなる
|
|
214
|
+
const useAlternateScreen =
|
|
215
|
+
altScreenPreference === "true" || altScreenPreference === "1";
|
|
253
216
|
|
|
254
|
-
// Resume stdin to ensure it's ready for Ink.js
|
|
255
217
|
if (typeof terminal.stdin.resume === "function") {
|
|
256
218
|
terminal.stdin.resume();
|
|
257
219
|
}
|
|
220
|
+
if (typeof terminal.stdin.setRawMode === "function") {
|
|
221
|
+
try {
|
|
222
|
+
terminal.stdin.setRawMode(true);
|
|
223
|
+
} catch {
|
|
224
|
+
// Ignore raw mode errors and let OpenTUI handle setup.
|
|
225
|
+
}
|
|
226
|
+
}
|
|
258
227
|
|
|
259
|
-
const { unmount, waitUntilExit } = render(
|
|
260
|
-
React.createElement(App, {
|
|
261
|
-
onExit: (result?: SelectionResult) => {
|
|
262
|
-
selectionResult = result;
|
|
263
|
-
},
|
|
264
|
-
}),
|
|
265
|
-
{
|
|
266
|
-
stdin: terminal.stdin,
|
|
267
|
-
stdout: terminal.stdout,
|
|
268
|
-
stderr: terminal.stderr,
|
|
269
|
-
patchConsole: false,
|
|
270
|
-
},
|
|
271
|
-
);
|
|
272
|
-
|
|
273
|
-
// Wait for user to exit
|
|
274
228
|
try {
|
|
275
|
-
await
|
|
229
|
+
await renderSolidApp(
|
|
230
|
+
{
|
|
231
|
+
onExit: (result?: SelectionResult) => {
|
|
232
|
+
selectionResult = result;
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
stdin: terminal.stdin,
|
|
237
|
+
stdout: terminal.stdout,
|
|
238
|
+
exitOnCtrlC: true,
|
|
239
|
+
useAlternateScreen,
|
|
240
|
+
useMouse,
|
|
241
|
+
enableMouseMovement,
|
|
242
|
+
},
|
|
243
|
+
);
|
|
276
244
|
} finally {
|
|
277
|
-
|
|
245
|
+
performTerminalCleanup();
|
|
278
246
|
if (typeof terminal.stdin.pause === "function") {
|
|
279
247
|
terminal.stdin.pause();
|
|
280
248
|
}
|
|
281
|
-
// Inkが残した data リスナーが子プロセス入力を奪わないようクリーンアップ
|
|
282
249
|
terminal.stdin.removeAllListeners?.("data");
|
|
283
250
|
terminal.stdin.removeAllListeners?.("keypress");
|
|
284
251
|
terminal.stdin.removeAllListeners?.("readable");
|
|
285
|
-
|
|
252
|
+
clearExitCleanup();
|
|
286
253
|
}
|
|
287
254
|
|
|
288
255
|
return selectionResult;
|
|
@@ -299,12 +266,15 @@ export async function handleAIToolWorkflow(
|
|
|
299
266
|
displayName,
|
|
300
267
|
branchType,
|
|
301
268
|
remoteBranch,
|
|
269
|
+
baseBranch,
|
|
270
|
+
isNewBranch,
|
|
302
271
|
tool,
|
|
303
272
|
mode,
|
|
304
273
|
skipPermissions,
|
|
305
274
|
model,
|
|
306
275
|
inferenceLevel,
|
|
307
276
|
sessionId: selectedSessionId,
|
|
277
|
+
toolVersion,
|
|
308
278
|
} = selectionResult;
|
|
309
279
|
|
|
310
280
|
const branchLabel = displayName ?? branch;
|
|
@@ -330,7 +300,14 @@ export async function handleAIToolWorkflow(
|
|
|
330
300
|
// Determine ensure options (local vs remote branch)
|
|
331
301
|
const ensureOptions: EnsureWorktreeOptions = {};
|
|
332
302
|
|
|
333
|
-
if (
|
|
303
|
+
if (isNewBranch) {
|
|
304
|
+
ensureOptions.isNewBranch = true;
|
|
305
|
+
if (baseBranch) {
|
|
306
|
+
ensureOptions.baseBranch = baseBranch;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (branchType === "remote" && !isNewBranch) {
|
|
334
311
|
const remoteRef = remoteBranch ?? branch;
|
|
335
312
|
const localExists = await branchExists(branch);
|
|
336
313
|
|
|
@@ -338,15 +315,37 @@ export async function handleAIToolWorkflow(
|
|
|
338
315
|
ensureOptions.isNewBranch = !localExists;
|
|
339
316
|
}
|
|
340
317
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
318
|
+
let existingWorktreeResolution = await resolveWorktreePathForBranch(branch);
|
|
319
|
+
let existingWorktree = existingWorktreeResolution.path;
|
|
320
|
+
|
|
321
|
+
// mismatch検出時に自動修復を試みる (FR-009〜FR-013)
|
|
344
322
|
if (!existingWorktree && existingWorktreeResolution.mismatch) {
|
|
345
323
|
const actualBranch =
|
|
346
324
|
existingWorktreeResolution.mismatch.actualBranch ?? "unknown";
|
|
347
325
|
printWarning(
|
|
348
|
-
`Worktree mismatch detected: ${existingWorktreeResolution.mismatch.path} is checked out to '${actualBranch}'.
|
|
326
|
+
`Worktree mismatch detected: ${existingWorktreeResolution.mismatch.path} is checked out to '${actualBranch}'. Attempting to repair...`,
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
// 共通修復関数を使用してパス修復を試みる
|
|
330
|
+
const repairResult = await repairWorktreePath(
|
|
331
|
+
branch,
|
|
332
|
+
existingWorktreeResolution.mismatch.path,
|
|
333
|
+
repoRoot,
|
|
349
334
|
);
|
|
335
|
+
|
|
336
|
+
if (repairResult.repaired) {
|
|
337
|
+
// FR-012: 修復成功時のメッセージ
|
|
338
|
+
printInfo(`Worktree path repaired: ${repairResult.newPath}`);
|
|
339
|
+
|
|
340
|
+
// 修復後に再度解決を試みる
|
|
341
|
+
existingWorktreeResolution = await resolveWorktreePathForBranch(branch);
|
|
342
|
+
existingWorktree = existingWorktreeResolution.path;
|
|
343
|
+
} else if (repairResult.removed) {
|
|
344
|
+
// FR-013: メタデータ削除成功時のメッセージ
|
|
345
|
+
printInfo(`Stale worktree metadata removed. Creating new worktree...`);
|
|
346
|
+
} else {
|
|
347
|
+
printWarning(`Failed to repair worktree for '${branch}'.`);
|
|
348
|
+
}
|
|
350
349
|
}
|
|
351
350
|
|
|
352
351
|
const isProtectedBranch =
|
|
@@ -496,16 +495,21 @@ export async function handleAIToolWorkflow(
|
|
|
496
495
|
divergenceBranches.add(sanitizedRemoteBranch);
|
|
497
496
|
}
|
|
498
497
|
|
|
499
|
-
|
|
500
|
-
getBranchDivergenceStatuses
|
|
498
|
+
let divergenceStatuses: Awaited<
|
|
499
|
+
ReturnType<typeof getBranchDivergenceStatuses>
|
|
500
|
+
> = [];
|
|
501
|
+
try {
|
|
502
|
+
divergenceStatuses = await getBranchDivergenceStatuses({
|
|
501
503
|
cwd: repoRoot,
|
|
502
504
|
branches: Array.from(divergenceBranches),
|
|
503
|
-
})
|
|
504
|
-
)
|
|
505
|
-
|
|
506
|
-
|
|
505
|
+
});
|
|
506
|
+
} catch (error) {
|
|
507
|
+
const details = error instanceof Error ? error.message : String(error);
|
|
508
|
+
printWarning(
|
|
509
|
+
`Failed to check branch divergence. Error: ${details}. Continuing without blocking.`,
|
|
510
|
+
);
|
|
511
|
+
divergenceStatuses = [];
|
|
507
512
|
}
|
|
508
|
-
const divergenceStatuses = divergenceResult.value;
|
|
509
513
|
const divergedBranches = divergenceStatuses.filter(
|
|
510
514
|
(status) => status.remoteAhead > 0 && status.localAhead > 0,
|
|
511
515
|
);
|
|
@@ -519,24 +523,18 @@ export async function handleAIToolWorkflow(
|
|
|
519
523
|
({ branch: divergedBranch, remoteAhead, localAhead }) => {
|
|
520
524
|
const highlight =
|
|
521
525
|
divergedBranch === branch ? " (selected branch)" : "";
|
|
522
|
-
|
|
526
|
+
writeTerminalLine(
|
|
523
527
|
chalk.yellow(
|
|
524
528
|
` • ${divergedBranch}${highlight} remote:+${remoteAhead} local:+${localAhead}`,
|
|
525
529
|
),
|
|
530
|
+
"stderr",
|
|
526
531
|
);
|
|
527
532
|
},
|
|
528
533
|
);
|
|
529
534
|
|
|
530
535
|
printWarning(
|
|
531
|
-
"Resolve these divergences (e.g., rebase or merge)
|
|
532
|
-
);
|
|
533
|
-
await waitForEnter(
|
|
534
|
-
"Press Enter to return to the main menu and resolve these issues manually.",
|
|
535
|
-
);
|
|
536
|
-
printWarning(
|
|
537
|
-
"AI tool launch has been cancelled until divergences are resolved.",
|
|
536
|
+
"Resolve these divergences (e.g., rebase or merge) to avoid conflicts. Continuing without blocking.",
|
|
538
537
|
);
|
|
539
|
-
return;
|
|
540
538
|
} else if (fastForwardError) {
|
|
541
539
|
printWarning(
|
|
542
540
|
`Fast-forward pull could not complete (${fastForwardError.message}). Continuing without blocking.`,
|
|
@@ -565,6 +563,7 @@ export async function handleAIToolWorkflow(
|
|
|
565
563
|
model: normalizedModel ?? null,
|
|
566
564
|
reasoningLevel: inferenceLevel ?? null,
|
|
567
565
|
skipPermissions: skipPermissions ?? null,
|
|
566
|
+
toolVersion: toolVersion ?? null,
|
|
568
567
|
timestamp: Date.now(),
|
|
569
568
|
repositoryRoot: repoRoot,
|
|
570
569
|
});
|
|
@@ -612,6 +611,7 @@ export async function handleAIToolWorkflow(
|
|
|
612
611
|
model: normalizedModel ?? null,
|
|
613
612
|
reasoningLevel: inferenceLevel ?? null,
|
|
614
613
|
skipPermissions: skipPermissions ?? null,
|
|
614
|
+
toolVersion: toolVersion ?? null,
|
|
615
615
|
timestamp: Date.now(),
|
|
616
616
|
repositoryRoot: repoRoot,
|
|
617
617
|
},
|
|
@@ -635,6 +635,8 @@ export async function handleAIToolWorkflow(
|
|
|
635
635
|
model?: string;
|
|
636
636
|
sessionId?: string | null;
|
|
637
637
|
chrome?: boolean;
|
|
638
|
+
branch?: string | null;
|
|
639
|
+
version?: string | null;
|
|
638
640
|
} = {
|
|
639
641
|
mode:
|
|
640
642
|
mode === "resume"
|
|
@@ -646,6 +648,8 @@ export async function handleAIToolWorkflow(
|
|
|
646
648
|
envOverrides: sharedEnv,
|
|
647
649
|
sessionId: resumeSessionId,
|
|
648
650
|
chrome: true,
|
|
651
|
+
branch,
|
|
652
|
+
version: toolVersion ?? null,
|
|
649
653
|
};
|
|
650
654
|
if (normalizedModel) {
|
|
651
655
|
launchOptions.model = normalizedModel;
|
|
@@ -659,6 +663,8 @@ export async function handleAIToolWorkflow(
|
|
|
659
663
|
model?: string;
|
|
660
664
|
reasoningEffort?: CodexReasoningEffort;
|
|
661
665
|
sessionId?: string | null;
|
|
666
|
+
branch?: string | null;
|
|
667
|
+
version?: string | null;
|
|
662
668
|
} = {
|
|
663
669
|
mode:
|
|
664
670
|
mode === "resume"
|
|
@@ -669,6 +675,8 @@ export async function handleAIToolWorkflow(
|
|
|
669
675
|
bypassApprovals: skipPermissions,
|
|
670
676
|
envOverrides: sharedEnv,
|
|
671
677
|
sessionId: resumeSessionId,
|
|
678
|
+
branch,
|
|
679
|
+
version: toolVersion ?? null,
|
|
672
680
|
};
|
|
673
681
|
if (normalizedModel) {
|
|
674
682
|
launchOptions.model = normalizedModel;
|
|
@@ -685,6 +693,8 @@ export async function handleAIToolWorkflow(
|
|
|
685
693
|
envOverrides?: Record<string, string>;
|
|
686
694
|
model?: string;
|
|
687
695
|
sessionId?: string | null;
|
|
696
|
+
branch?: string | null;
|
|
697
|
+
version?: string | null;
|
|
688
698
|
} = {
|
|
689
699
|
mode:
|
|
690
700
|
mode === "resume"
|
|
@@ -695,25 +705,35 @@ export async function handleAIToolWorkflow(
|
|
|
695
705
|
skipPermissions,
|
|
696
706
|
envOverrides: sharedEnv,
|
|
697
707
|
sessionId: resumeSessionId,
|
|
708
|
+
branch,
|
|
709
|
+
version: toolVersion ?? null,
|
|
698
710
|
};
|
|
699
711
|
if (normalizedModel) {
|
|
700
712
|
launchOptions.model = normalizedModel;
|
|
701
713
|
}
|
|
702
714
|
launchResult = await launchGeminiCLI(worktreePath, launchOptions);
|
|
703
715
|
} else {
|
|
704
|
-
// Custom coding agent
|
|
716
|
+
// Custom coding agent (including OpenCode)
|
|
705
717
|
printInfo(`Launching custom agent: ${agentConfig.displayName}`);
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
mode
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
718
|
+
const customLaunchOptions: import("./types/tools.js").CodingAgentLaunchOptions =
|
|
719
|
+
{
|
|
720
|
+
mode:
|
|
721
|
+
mode === "resume"
|
|
722
|
+
? "resume"
|
|
723
|
+
: mode === "continue"
|
|
724
|
+
? "continue"
|
|
725
|
+
: "normal",
|
|
726
|
+
skipPermissions,
|
|
727
|
+
cwd: worktreePath,
|
|
728
|
+
sharedEnv,
|
|
729
|
+
};
|
|
730
|
+
if (toolVersion) {
|
|
731
|
+
customLaunchOptions.version = toolVersion;
|
|
732
|
+
}
|
|
733
|
+
launchResult = await launchCodingAgent(
|
|
734
|
+
agentConfig,
|
|
735
|
+
customLaunchOptions,
|
|
736
|
+
);
|
|
717
737
|
}
|
|
718
738
|
} finally {
|
|
719
739
|
// FR-043: Clear the periodic timestamp update timer
|
|
@@ -726,10 +746,29 @@ export async function handleAIToolWorkflow(
|
|
|
726
746
|
resumeSessionId ??
|
|
727
747
|
null;
|
|
728
748
|
|
|
749
|
+
let resolvedWorktrees: { path: string; branch: string }[] | null = null;
|
|
750
|
+
if (branch) {
|
|
751
|
+
try {
|
|
752
|
+
const allWorktrees = await listAllWorktrees();
|
|
753
|
+
resolvedWorktrees = allWorktrees
|
|
754
|
+
.filter((entry) => entry?.path && entry?.branch)
|
|
755
|
+
.map((entry) => ({ path: entry.path, branch: entry.branch }));
|
|
756
|
+
} catch {
|
|
757
|
+
resolvedWorktrees = null;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
const worktreeLookupOptions =
|
|
761
|
+
resolvedWorktrees && resolvedWorktrees.length > 0
|
|
762
|
+
? { worktrees: resolvedWorktrees }
|
|
763
|
+
: {};
|
|
764
|
+
|
|
729
765
|
if (!finalSessionId && tool === "claude-code") {
|
|
730
766
|
try {
|
|
731
767
|
finalSessionId =
|
|
732
|
-
(await findLatestClaudeSessionId(worktreePath
|
|
768
|
+
(await findLatestClaudeSessionId(worktreePath, {
|
|
769
|
+
branch,
|
|
770
|
+
...worktreeLookupOptions,
|
|
771
|
+
})) ?? null;
|
|
733
772
|
} catch {
|
|
734
773
|
finalSessionId = null;
|
|
735
774
|
}
|
|
@@ -744,6 +783,8 @@ export async function handleAIToolWorkflow(
|
|
|
744
783
|
preferClosestTo: finishedAt,
|
|
745
784
|
windowMs: 60 * 60 * 1000,
|
|
746
785
|
cwd: worktreePath,
|
|
786
|
+
branch,
|
|
787
|
+
...worktreeLookupOptions,
|
|
747
788
|
});
|
|
748
789
|
if (latest) {
|
|
749
790
|
finalSessionId = latest.id;
|
|
@@ -758,6 +799,8 @@ export async function handleAIToolWorkflow(
|
|
|
758
799
|
until: finishedAt + 60_000,
|
|
759
800
|
preferClosestTo: finishedAt,
|
|
760
801
|
windowMs: 60 * 60 * 1000,
|
|
802
|
+
branch,
|
|
803
|
+
...worktreeLookupOptions,
|
|
761
804
|
});
|
|
762
805
|
if (latestClaude) {
|
|
763
806
|
finalSessionId = latestClaude.id;
|
|
@@ -773,6 +816,8 @@ export async function handleAIToolWorkflow(
|
|
|
773
816
|
preferClosestTo: finishedAt,
|
|
774
817
|
windowMs: 60 * 60 * 1000,
|
|
775
818
|
cwd: worktreePath,
|
|
819
|
+
branch,
|
|
820
|
+
...worktreeLookupOptions,
|
|
776
821
|
});
|
|
777
822
|
if (latestGemini) {
|
|
778
823
|
finalSessionId = latestGemini.id;
|
|
@@ -791,6 +836,7 @@ export async function handleAIToolWorkflow(
|
|
|
791
836
|
model: normalizedModel ?? null,
|
|
792
837
|
reasoningLevel: inferenceLevel ?? null,
|
|
793
838
|
skipPermissions: skipPermissions ?? null,
|
|
839
|
+
toolVersion: toolVersion ?? null,
|
|
794
840
|
timestamp: Date.now(),
|
|
795
841
|
repositoryRoot: repoRoot,
|
|
796
842
|
lastSessionId: finalSessionId,
|
|
@@ -833,7 +879,8 @@ export async function handleAIToolWorkflow(
|
|
|
833
879
|
|
|
834
880
|
// Small buffer before returning to branch list to avoid abrupt screen swap
|
|
835
881
|
await new Promise((resolve) => setTimeout(resolve, POST_SESSION_DELAY_MS));
|
|
836
|
-
printInfo("Session completed successfully.
|
|
882
|
+
printInfo("Session completed successfully.");
|
|
883
|
+
await waitForUserAcknowledgement(SUCCESS_PROMPT);
|
|
837
884
|
return;
|
|
838
885
|
} catch (error) {
|
|
839
886
|
// Handle recoverable errors (Git, Worktree, Codex errors)
|
|
@@ -851,6 +898,10 @@ export async function handleAIToolWorkflow(
|
|
|
851
898
|
type UIHandler = () => Promise<SelectionResult | undefined>;
|
|
852
899
|
type WorkflowHandler = (selection: SelectionResult) => Promise<void>;
|
|
853
900
|
|
|
901
|
+
function resolveUIHandler(): UIHandler {
|
|
902
|
+
return mainSolidUI;
|
|
903
|
+
}
|
|
904
|
+
|
|
854
905
|
function logLoopError(error: unknown, context: "ui" | "workflow"): void {
|
|
855
906
|
const label = context === "ui" ? "UI" : "workflow";
|
|
856
907
|
if (error instanceof Error) {
|
|
@@ -861,10 +912,10 @@ function logLoopError(error: unknown, context: "ui" | "workflow"): void {
|
|
|
861
912
|
}
|
|
862
913
|
|
|
863
914
|
export async function runInteractiveLoop(
|
|
864
|
-
uiHandler: UIHandler =
|
|
915
|
+
uiHandler: UIHandler = resolveUIHandler(),
|
|
865
916
|
workflowHandler: WorkflowHandler = handleAIToolWorkflow,
|
|
866
917
|
): Promise<void> {
|
|
867
|
-
// Main loop: UI →
|
|
918
|
+
// Main loop: UI → Coding Agent → back to UI
|
|
868
919
|
while (true) {
|
|
869
920
|
let selectionResult: SelectionResult | undefined;
|
|
870
921
|
|
|
@@ -895,6 +946,9 @@ export async function runInteractiveLoop(
|
|
|
895
946
|
* Main entry point
|
|
896
947
|
*/
|
|
897
948
|
export async function main(): Promise<void> {
|
|
949
|
+
// Setup global signal handlers for clean exit
|
|
950
|
+
setupExitHandlers();
|
|
951
|
+
|
|
898
952
|
// Parse command line arguments
|
|
899
953
|
const args = process.argv.slice(2);
|
|
900
954
|
const showVersionFlag = args.includes("-v") || args.includes("--version");
|
|
@@ -939,6 +993,9 @@ export async function main(): Promise<void> {
|
|
|
939
993
|
}
|
|
940
994
|
|
|
941
995
|
await runInteractiveLoop();
|
|
996
|
+
|
|
997
|
+
// Ensure clean exit with code 0
|
|
998
|
+
process.exit(0);
|
|
942
999
|
}
|
|
943
1000
|
|
|
944
1001
|
export function isEntryPoint(metaUrl: string, argv1?: string): boolean {
|
|
@@ -955,7 +1012,9 @@ export function isEntryPoint(metaUrl: string, argv1?: string): boolean {
|
|
|
955
1012
|
// Run the application if this module is executed directly
|
|
956
1013
|
if (isEntryPoint(import.meta.url, process.argv[1])) {
|
|
957
1014
|
main().catch(async (error) => {
|
|
958
|
-
|
|
1015
|
+
const details =
|
|
1016
|
+
error instanceof Error ? (error.stack ?? error.message) : String(error);
|
|
1017
|
+
writeTerminalLine(`Fatal error: ${details}`, "stderr");
|
|
959
1018
|
await waitForErrorAcknowledgement();
|
|
960
1019
|
process.exit(1);
|
|
961
1020
|
});
|