@akiojin/gwt 2.12.1 → 2.14.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 +33 -0
- package/README.md +31 -0
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +17 -11
- package/dist/claude.js.map +1 -1
- package/dist/cli/ui/components/App.d.ts +0 -6
- package/dist/cli/ui/components/App.d.ts.map +1 -1
- package/dist/cli/ui/components/App.js +93 -85
- package/dist/cli/ui/components/App.js.map +1 -1
- package/dist/cli/ui/components/common/Select.js +2 -2
- package/dist/cli/ui/components/common/Select.js.map +1 -1
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts +3 -1
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/BranchListScreen.js +168 -34
- package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +1 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +3 -3
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +1 -1
- package/dist/cli/ui/hooks/useGitData.d.ts.map +1 -1
- package/dist/cli/ui/hooks/useGitData.js +17 -0
- package/dist/cli/ui/hooks/useGitData.js.map +1 -1
- package/dist/cli/ui/types.d.ts +2 -0
- package/dist/cli/ui/types.d.ts.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.js +7 -2
- package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
- package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
- package/dist/cli/ui/utils/continueSession.js +1 -1
- package/dist/cli/ui/utils/continueSession.js.map +1 -1
- package/dist/cli/ui/utils/modelOptions.d.ts.map +1 -1
- package/dist/cli/ui/utils/modelOptions.js +7 -0
- package/dist/cli/ui/utils/modelOptions.js.map +1 -1
- package/dist/client/assets/index-DPWWHorC.js +72 -0
- package/dist/client/assets/index-DsDNCy5f.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/codex.d.ts.map +1 -1
- package/dist/codex.js +21 -11
- package/dist/codex.js.map +1 -1
- package/dist/config/builtin-tools.d.ts.map +1 -1
- package/dist/config/builtin-tools.js +3 -2
- package/dist/config/builtin-tools.js.map +1 -1
- package/dist/config/shared-env.d.ts +41 -0
- package/dist/config/shared-env.d.ts.map +1 -0
- package/dist/config/shared-env.js +114 -0
- package/dist/config/shared-env.js.map +1 -0
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +20 -17
- package/dist/gemini.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -7
- package/dist/index.js.map +1 -1
- package/dist/logging/logger.d.ts +24 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +60 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/rotation.d.ts +6 -0
- package/dist/logging/rotation.d.ts.map +1 -0
- package/dist/logging/rotation.js +26 -0
- package/dist/logging/rotation.js.map +1 -0
- package/dist/qwen.d.ts.map +1 -1
- package/dist/qwen.js +15 -11
- package/dist/qwen.js.map +1 -1
- package/dist/services/aiToolResolver.d.ts +41 -0
- package/dist/services/aiToolResolver.d.ts.map +1 -0
- package/dist/services/aiToolResolver.js +194 -0
- package/dist/services/aiToolResolver.js.map +1 -0
- package/dist/services/customToolResolver.d.ts +10 -0
- package/dist/services/customToolResolver.d.ts.map +1 -0
- package/dist/services/customToolResolver.js +71 -0
- package/dist/services/customToolResolver.js.map +1 -0
- package/dist/shared/aiToolConstants.d.ts +9 -0
- package/dist/shared/aiToolConstants.d.ts.map +1 -0
- package/dist/shared/aiToolConstants.js +29 -0
- package/dist/shared/aiToolConstants.js.map +1 -0
- package/dist/types/tools.d.ts +12 -0
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/prompt.d.ts.map +1 -1
- package/dist/utils/prompt.js.map +1 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +15 -6
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/terminal.d.ts +12 -3
- package/dist/utils/terminal.d.ts.map +1 -1
- package/dist/utils/terminal.js +5 -34
- package/dist/utils/terminal.js.map +1 -1
- package/dist/utils/webui.d.ts +8 -0
- package/dist/utils/webui.d.ts.map +1 -0
- package/dist/utils/webui.js +35 -0
- package/dist/utils/webui.js.map +1 -0
- package/dist/web/client/src/components/AIToolLaunchModal.d.ts +9 -0
- package/dist/web/client/src/components/AIToolLaunchModal.d.ts.map +1 -0
- package/dist/web/client/src/components/AIToolLaunchModal.js +363 -0
- package/dist/web/client/src/components/AIToolLaunchModal.js.map +1 -0
- package/dist/web/client/src/components/BranchGraph.d.ts.map +1 -1
- package/dist/web/client/src/components/BranchGraph.js +46 -49
- package/dist/web/client/src/components/BranchGraph.js.map +1 -1
- package/dist/web/client/src/components/CustomToolForm.d.ts +23 -0
- package/dist/web/client/src/components/CustomToolForm.d.ts.map +1 -0
- package/dist/web/client/src/components/CustomToolForm.js +209 -0
- package/dist/web/client/src/components/CustomToolForm.js.map +1 -0
- package/dist/web/client/src/components/CustomToolList.d.ts +10 -0
- package/dist/web/client/src/components/CustomToolList.d.ts.map +1 -0
- package/dist/web/client/src/components/CustomToolList.js +57 -0
- package/dist/web/client/src/components/CustomToolList.js.map +1 -0
- package/dist/web/client/src/components/EnvEditor.d.ts.map +1 -1
- package/dist/web/client/src/components/EnvEditor.js +33 -26
- package/dist/web/client/src/components/EnvEditor.js.map +1 -1
- package/dist/web/client/src/components/EnvironmentEditor.d.ts +17 -0
- package/dist/web/client/src/components/EnvironmentEditor.d.ts.map +1 -0
- package/dist/web/client/src/components/EnvironmentEditor.js +22 -0
- package/dist/web/client/src/components/EnvironmentEditor.js.map +1 -0
- package/dist/web/client/src/components/Terminal.d.ts.map +1 -1
- package/dist/web/client/src/components/Terminal.js +10 -3
- package/dist/web/client/src/components/Terminal.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts +10 -0
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -0
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +104 -0
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -0
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts +22 -0
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -0
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +79 -0
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -0
- package/dist/web/client/src/components/branch-detail/TerminalPanel.d.ts +11 -0
- package/dist/web/client/src/components/branch-detail/TerminalPanel.d.ts.map +1 -0
- package/dist/web/client/src/components/branch-detail/TerminalPanel.js +32 -0
- package/dist/web/client/src/components/branch-detail/TerminalPanel.js.map +1 -0
- package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +40 -0
- package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -0
- package/dist/web/client/src/components/branch-detail/ToolLauncher.js +147 -0
- package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -0
- package/dist/web/client/src/components/branch-detail/index.d.ts +5 -0
- package/dist/web/client/src/components/branch-detail/index.d.ts.map +1 -0
- package/dist/web/client/src/components/branch-detail/index.js +5 -0
- package/dist/web/client/src/components/branch-detail/index.js.map +1 -0
- package/dist/web/client/src/components/common/BranchCard.d.ts +17 -0
- package/dist/web/client/src/components/common/BranchCard.d.ts.map +1 -0
- package/dist/web/client/src/components/common/BranchCard.js +36 -0
- package/dist/web/client/src/components/common/BranchCard.js.map +1 -0
- package/dist/web/client/src/components/common/MetricCard.d.ts +10 -0
- package/dist/web/client/src/components/common/MetricCard.d.ts.map +1 -0
- package/dist/web/client/src/components/common/MetricCard.js +10 -0
- package/dist/web/client/src/components/common/MetricCard.js.map +1 -0
- package/dist/web/client/src/components/common/PageHeader.d.ts +12 -0
- package/dist/web/client/src/components/common/PageHeader.d.ts.map +1 -0
- package/dist/web/client/src/components/common/PageHeader.js +14 -0
- package/dist/web/client/src/components/common/PageHeader.js.map +1 -0
- package/dist/web/client/src/components/common/SearchInput.d.ts +14 -0
- package/dist/web/client/src/components/common/SearchInput.d.ts.map +1 -0
- package/dist/web/client/src/components/common/SearchInput.js +15 -0
- package/dist/web/client/src/components/common/SearchInput.js.map +1 -0
- package/dist/web/client/src/components/common/StatusBadge.d.ts +10 -0
- package/dist/web/client/src/components/common/StatusBadge.d.ts.map +1 -0
- package/dist/web/client/src/components/common/StatusBadge.js +15 -0
- package/dist/web/client/src/components/common/StatusBadge.js.map +1 -0
- package/dist/web/client/src/components/common/index.d.ts +6 -0
- package/dist/web/client/src/components/common/index.d.ts.map +1 -0
- package/dist/web/client/src/components/common/index.js +6 -0
- package/dist/web/client/src/components/common/index.js.map +1 -0
- package/dist/web/client/src/components/ui/alert.d.ts +9 -0
- package/dist/web/client/src/components/ui/alert.d.ts.map +1 -0
- package/dist/web/client/src/components/ui/alert.js +25 -0
- package/dist/web/client/src/components/ui/alert.js.map +1 -0
- package/dist/web/client/src/components/ui/badge.d.ts +10 -0
- package/dist/web/client/src/components/ui/badge.d.ts.map +1 -0
- package/dist/web/client/src/components/ui/badge.js +25 -0
- package/dist/web/client/src/components/ui/badge.js.map +1 -0
- package/dist/web/client/src/components/ui/button.d.ts +12 -0
- package/dist/web/client/src/components/ui/button.d.ts.map +1 -0
- package/dist/web/client/src/components/ui/button.js +33 -0
- package/dist/web/client/src/components/ui/button.js.map +1 -0
- package/dist/web/client/src/components/ui/card.d.ts +9 -0
- package/dist/web/client/src/components/ui/card.d.ts.map +1 -0
- package/dist/web/client/src/components/ui/card.js +16 -0
- package/dist/web/client/src/components/ui/card.js.map +1 -0
- package/dist/web/client/src/components/ui/index.d.ts +8 -0
- package/dist/web/client/src/components/ui/index.d.ts.map +1 -0
- package/dist/web/client/src/components/ui/index.js +8 -0
- package/dist/web/client/src/components/ui/index.js.map +1 -0
- package/dist/web/client/src/components/ui/input.d.ts +4 -0
- package/dist/web/client/src/components/ui/input.d.ts.map +1 -0
- package/dist/web/client/src/components/ui/input.js +8 -0
- package/dist/web/client/src/components/ui/input.js.map +1 -0
- package/dist/web/client/src/components/ui/select.d.ts +14 -0
- package/dist/web/client/src/components/ui/select.d.ts.map +1 -0
- package/dist/web/client/src/components/ui/select.js +39 -0
- package/dist/web/client/src/components/ui/select.js.map +1 -0
- package/dist/web/client/src/components/ui/table.d.ts +11 -0
- package/dist/web/client/src/components/ui/table.d.ts.map +1 -0
- package/dist/web/client/src/components/ui/table.js +21 -0
- package/dist/web/client/src/components/ui/table.js.map +1 -0
- package/dist/web/client/src/hooks/useSessions.d.ts.map +1 -1
- package/dist/web/client/src/hooks/useSessions.js +6 -1
- package/dist/web/client/src/hooks/useSessions.js.map +1 -1
- package/dist/web/client/src/lib/utils.d.ts +7 -0
- package/dist/web/client/src/lib/utils.d.ts.map +1 -0
- package/dist/web/client/src/lib/utils.js +10 -0
- package/dist/web/client/src/lib/utils.js.map +1 -0
- package/dist/web/client/src/lib/websocket.d.ts +7 -0
- package/dist/web/client/src/lib/websocket.d.ts.map +1 -1
- package/dist/web/client/src/lib/websocket.js +44 -0
- package/dist/web/client/src/lib/websocket.js.map +1 -1
- package/dist/web/client/src/pages/BranchDetailPage.d.ts.map +1 -1
- package/dist/web/client/src/pages/BranchDetailPage.js +113 -361
- package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
- package/dist/web/client/src/pages/BranchListPage.d.ts.map +1 -1
- package/dist/web/client/src/pages/BranchListPage.js +89 -127
- package/dist/web/client/src/pages/BranchListPage.js.map +1 -1
- package/dist/web/client/src/pages/ConfigManagementPage.d.ts.map +1 -1
- package/dist/web/client/src/pages/ConfigManagementPage.js +46 -41
- package/dist/web/client/src/pages/ConfigManagementPage.js.map +1 -1
- package/dist/web/client/src/pages/ConfigPage.d.ts +3 -0
- package/dist/web/client/src/pages/ConfigPage.d.ts.map +1 -0
- package/dist/web/client/src/pages/ConfigPage.js +216 -0
- package/dist/web/client/src/pages/ConfigPage.js.map +1 -0
- package/dist/web/client/vite.config.d.ts.map +1 -1
- package/dist/web/client/vite.config.js +8 -1
- package/dist/web/client/vite.config.js.map +1 -1
- package/dist/web/server/index.d.ts +24 -2
- package/dist/web/server/index.d.ts.map +1 -1
- package/dist/web/server/index.js +49 -18
- package/dist/web/server/index.js.map +1 -1
- package/dist/web/server/pty/manager.d.ts +12 -10
- package/dist/web/server/pty/manager.d.ts.map +1 -1
- package/dist/web/server/pty/manager.js +76 -43
- package/dist/web/server/pty/manager.js.map +1 -1
- package/dist/web/server/routes/branches.d.ts +2 -2
- package/dist/web/server/routes/branches.d.ts.map +1 -1
- package/dist/web/server/routes/branches.js.map +1 -1
- package/dist/web/server/routes/config.d.ts +2 -2
- package/dist/web/server/routes/config.d.ts.map +1 -1
- package/dist/web/server/routes/config.js.map +1 -1
- package/dist/web/server/routes/index.d.ts +2 -2
- package/dist/web/server/routes/index.d.ts.map +1 -1
- package/dist/web/server/routes/index.js.map +1 -1
- package/dist/web/server/routes/sessions.d.ts +2 -2
- package/dist/web/server/routes/sessions.d.ts.map +1 -1
- package/dist/web/server/routes/sessions.js +35 -2
- package/dist/web/server/routes/sessions.js.map +1 -1
- package/dist/web/server/routes/worktrees.d.ts +2 -2
- package/dist/web/server/routes/worktrees.d.ts.map +1 -1
- package/dist/web/server/routes/worktrees.js +2 -2
- package/dist/web/server/routes/worktrees.js.map +1 -1
- package/dist/web/server/services/worktrees.d.ts.map +1 -1
- package/dist/web/server/services/worktrees.js +7 -1
- package/dist/web/server/services/worktrees.js.map +1 -1
- package/dist/web/server/tray.d.ts +24 -0
- package/dist/web/server/tray.d.ts.map +1 -0
- package/dist/web/server/tray.js +79 -0
- package/dist/web/server/tray.js.map +1 -0
- package/dist/web/server/types.d.ts +4 -0
- package/dist/web/server/types.d.ts.map +1 -0
- package/dist/web/server/types.js +2 -0
- package/dist/web/server/types.js.map +1 -0
- package/dist/web/server/websocket/handler.d.ts +18 -2
- package/dist/web/server/websocket/handler.d.ts.map +1 -1
- package/dist/web/server/websocket/handler.js +82 -9
- package/dist/web/server/websocket/handler.js.map +1 -1
- package/dist/worktree.d.ts +1 -0
- package/dist/worktree.d.ts.map +1 -1
- package/dist/worktree.js.map +1 -1
- package/package.json +17 -3
- package/src/claude.ts +26 -15
- package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +13 -13
- package/src/cli/ui/__tests__/components/common/Select.test.tsx +11 -0
- package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +97 -33
- package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +4 -4
- package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +7 -3
- package/src/cli/ui/components/App.tsx +111 -125
- package/src/cli/ui/components/common/Select.tsx +2 -2
- package/src/cli/ui/components/screens/BranchListScreen.tsx +220 -34
- package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +41 -46
- package/src/cli/ui/hooks/useGitData.ts +20 -0
- package/src/cli/ui/types.ts +3 -0
- package/src/cli/ui/utils/branchFormatter.ts +7 -2
- package/src/cli/ui/utils/continueSession.ts +1 -7
- package/src/cli/ui/utils/modelOptions.test.ts +14 -0
- package/src/cli/ui/utils/modelOptions.ts +7 -0
- package/src/codex.ts +31 -22
- package/src/config/builtin-tools.ts +6 -2
- package/src/config/shared-env.ts +139 -0
- package/src/gemini.ts +35 -22
- package/src/index.ts +61 -7
- package/src/logging/logger.ts +82 -0
- package/src/logging/rotation.ts +25 -0
- package/src/qwen.ts +28 -19
- package/src/services/aiToolResolver.ts +276 -0
- package/src/services/customToolResolver.ts +98 -0
- package/src/shared/aiToolConstants.ts +30 -0
- package/src/trayicon.d.ts +30 -0
- package/src/types/tools.ts +15 -0
- package/src/utils/prompt.ts +15 -9
- package/src/utils/session.ts +80 -26
- package/src/utils/terminal.ts +11 -41
- package/src/utils/webui.ts +43 -0
- package/src/web/client/components.json +21 -0
- package/src/web/client/src/components/AIToolLaunchModal.tsx +575 -0
- package/src/web/client/src/components/BranchGraph.tsx +95 -75
- package/src/web/client/src/components/CustomToolForm.tsx +386 -0
- package/src/web/client/src/components/CustomToolList.tsx +119 -0
- package/src/web/client/src/components/EnvEditor.tsx +91 -81
- package/src/web/client/src/components/EnvironmentEditor.tsx +97 -0
- package/src/web/client/src/components/Terminal.tsx +11 -3
- package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +179 -0
- package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +181 -0
- package/src/web/client/src/components/branch-detail/TerminalPanel.tsx +92 -0
- package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +327 -0
- package/src/web/client/src/components/branch-detail/index.ts +4 -0
- package/src/web/client/src/components/common/BranchCard.tsx +117 -0
- package/src/web/client/src/components/common/MetricCard.tsx +22 -0
- package/src/web/client/src/components/common/PageHeader.tsx +44 -0
- package/src/web/client/src/components/common/SearchInput.tsx +40 -0
- package/src/web/client/src/components/common/StatusBadge.tsx +37 -0
- package/src/web/client/src/components/common/index.ts +5 -0
- package/src/web/client/src/components/ui/alert.tsx +63 -0
- package/src/web/client/src/components/ui/badge.tsx +44 -0
- package/src/web/client/src/components/ui/button.tsx +57 -0
- package/src/web/client/src/components/ui/card.tsx +82 -0
- package/src/web/client/src/components/ui/index.ts +32 -0
- package/src/web/client/src/components/ui/input.tsx +21 -0
- package/src/web/client/src/components/ui/select.tsx +156 -0
- package/src/web/client/src/components/ui/table.tsx +119 -0
- package/src/web/client/src/hooks/useSessions.ts +10 -1
- package/src/web/client/src/index.css +46 -816
- package/src/web/client/src/lib/utils.ts +10 -0
- package/src/web/client/src/lib/websocket.ts +48 -1
- package/src/web/client/src/pages/BranchDetailPage.tsx +222 -694
- package/src/web/client/src/pages/BranchListPage.tsx +190 -236
- package/src/web/client/src/pages/ConfigManagementPage.tsx +94 -76
- package/src/web/client/src/pages/ConfigPage.tsx +362 -0
- package/src/web/client/vite.config.ts +8 -1
- package/src/web/server/index.ts +78 -19
- package/src/web/server/pty/manager.ts +128 -55
- package/src/web/server/routes/branches.ts +2 -2
- package/src/web/server/routes/config.ts +2 -2
- package/src/web/server/routes/index.ts +2 -2
- package/src/web/server/routes/sessions.ts +61 -9
- package/src/web/server/routes/worktrees.ts +5 -5
- package/src/web/server/services/worktrees.ts +12 -4
- package/src/web/server/tray.ts +93 -0
- package/src/web/server/types.ts +14 -0
- package/src/web/server/websocket/handler.ts +119 -13
- package/src/worktree.ts +1 -0
- package/dist/client/assets/index-DeNwPosA.css +0 -1
- package/dist/client/assets/index-Dl798X5w.js +0 -32
package/README.ja.md
CHANGED
|
@@ -73,6 +73,39 @@ gwt -v
|
|
|
73
73
|
3. **ワークツリー管理**: 既存ワークツリーの表示、オープン、削除
|
|
74
74
|
4. **ブランチクリーンアップ**: マージ済みPRやベースブランチと差分がないブランチ/ワークツリーをローカルから自動削除
|
|
75
75
|
|
|
76
|
+
## Web UI とカスタムAIツール
|
|
77
|
+
|
|
78
|
+
### Web UI の起動
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# CLI を起動すると Web UI もバックグラウンドで自動起動します
|
|
82
|
+
gwt
|
|
83
|
+
|
|
84
|
+
# Web UI だけ起動したい場合
|
|
85
|
+
gwt serve
|
|
86
|
+
# または
|
|
87
|
+
bunx @akiojin/gwt serve
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
- Web UI はデフォルトで <http://localhost:3000> で利用できます
|
|
91
|
+
- ブランチ一覧/検索/Worktree作成など、CLIと同じ体験をブラウザで提供
|
|
92
|
+
- ブランチ一覧カードの「AIツールを起動」ボタンでモーダルが開き、ツール/モード/引数/同期を選んで起動
|
|
93
|
+
- ブランチ詳細ページはセッションの状態確認専用(稼働中セッションのターミナルと履歴を表示)
|
|
94
|
+
|
|
95
|
+
### カスタムAIツールの管理
|
|
96
|
+
|
|
97
|
+
- ダッシュボード右上の **Config**(または `/config` URL)で `~/.gwt/tools.json` をGUI編集(旧 `~/.claude-worktree/tools.json` は初回起動時に自動移行)
|
|
98
|
+
- 実行タイプ(path/bunx/command)、defaultArgs、modeArgs、permissionSkipArgs、envをまとめて設定
|
|
99
|
+
- 変更内容はCLIと共有の `tools.json` に保存されるため、CLI/Webのどちらからでも同じツールを利用可能
|
|
100
|
+
- ブランチ一覧モーダルの起動フォームでは以下を指定できます:
|
|
101
|
+
- 起動するカスタムツール(ビルトインを含む)
|
|
102
|
+
- `normal / continue / resume` モード
|
|
103
|
+
- 追加引数(スペース区切り)
|
|
104
|
+
- CLIと同等の `--dangerously-skip-permissions`(確認ダイアログ付き)
|
|
105
|
+
- モーダルから直接 `git fetch --all` + `git pull --ff-only` を実行でき、CLIと同じ安全ガードで divergence を検出します。
|
|
106
|
+
|
|
107
|
+
> JSON編集なしでカスタムツールを試せるため、Web UIでパラメータを調整しながらCLIにも即反映できます。
|
|
108
|
+
|
|
76
109
|
## 高度なワークフロー
|
|
77
110
|
|
|
78
111
|
### ブランチ作成ワークフロー
|
package/README.md
CHANGED
|
@@ -75,6 +75,37 @@ The tool presents an interactive interface with the following options:
|
|
|
75
75
|
3. **Manage Worktrees**: View, open, or remove existing worktrees
|
|
76
76
|
4. **Cleanup Branches**: Remove merged PR branches or branches identical to their base directly from the CLI
|
|
77
77
|
|
|
78
|
+
## Web UI & Custom AI Tools
|
|
79
|
+
|
|
80
|
+
### Launching the Web UI
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Running the CLI also starts the Web UI in the background.
|
|
84
|
+
gwt
|
|
85
|
+
|
|
86
|
+
# (Optional) start only the Web UI server:
|
|
87
|
+
gwt serve
|
|
88
|
+
# or without global install
|
|
89
|
+
bunx @akiojin/gwt serve
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- The Web UI is available by default at <http://localhost:3000>
|
|
93
|
+
- The branch list mirrors the CLI view, including search and worktree creation
|
|
94
|
+
- Detailed branch pages let you start AI tool sessions directly from the browser
|
|
95
|
+
|
|
96
|
+
### Managing Custom AI Tools
|
|
97
|
+
|
|
98
|
+
- Navigate to **Config** (top-right button on the dashboard or `/config`) to view and edit `~/.gwt/tools.json` (legacy `~/.claude-worktree/tools.json` is auto-migrated on first run)
|
|
99
|
+
- Add/edit tools with execution type (`path` / `bunx` / `command`), default arguments, mode-specific arguments, permission skip arguments, and environment variables
|
|
100
|
+
- Changes are written to the same `tools.json` file that the CLI uses, so both channels stay in sync
|
|
101
|
+
- When launching from the branch detail page you can:
|
|
102
|
+
- Select any custom tool
|
|
103
|
+
- Choose `normal` / `continue` / `resume` mode
|
|
104
|
+
- Append extra arguments
|
|
105
|
+
- Opt into the same `--dangerously-skip-permissions` flow as the CLI (with confirmation)
|
|
106
|
+
|
|
107
|
+
> Tip: use the Web UI to quickly iterate on custom tool definitions, then run them from either the CLI or browser without editing JSON manually.
|
|
108
|
+
|
|
78
109
|
## Advanced Workflows
|
|
79
110
|
|
|
80
111
|
### Branch Strategy
|
package/dist/claude.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAOA,qBAAa,WAAY,SAAQ,KAAK;IAG3B,KAAK,CAAC,EAAE,OAAO;gBADtB,OAAO,EAAE,MAAM,EACR,KAAK,CAAC,EAAE,OAAO,YAAA;CAKzB;AAED,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GACL,OAAO,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAOA,qBAAa,WAAY,SAAQ,KAAK;IAG3B,KAAK,CAAC,EAAE,OAAO;gBADtB,OAAO,EAAE,MAAM,EACR,KAAK,CAAC,EAAE,OAAO,YAAA;CAKzB;AAED,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GACL,OAAO,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA+SxC;AAsBD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAgB9D"}
|
package/dist/claude.js
CHANGED
|
@@ -33,6 +33,8 @@ export async function launchClaudeCode(worktreePath, options = {}) {
|
|
|
33
33
|
const resumeSessionId = options.sessionId && options.sessionId.trim().length > 0
|
|
34
34
|
? options.sessionId.trim()
|
|
35
35
|
: null;
|
|
36
|
+
const usedExplicitSessionId = Boolean(resumeSessionId) &&
|
|
37
|
+
(options.mode === "continue" || options.mode === "resume");
|
|
36
38
|
// Handle execution mode
|
|
37
39
|
switch (options.mode) {
|
|
38
40
|
case "continue":
|
|
@@ -132,13 +134,11 @@ export async function launchClaudeCode(worktreePath, options = {}) {
|
|
|
132
134
|
}
|
|
133
135
|
console.log(chalk.gray(` 📋 Args: ${args.join(" ")}`));
|
|
134
136
|
terminal.exitRawMode();
|
|
135
|
-
const baseEnv = {
|
|
136
|
-
|
|
137
|
-
...(options.envOverrides ?? {}),
|
|
138
|
-
};
|
|
139
|
-
const launchEnv = options.skipPermissions && !baseEnv.IS_SANDBOX
|
|
137
|
+
const baseEnv = { ...process.env, ...(options.envOverrides ?? {}) };
|
|
138
|
+
const launchEnvSource = options.skipPermissions && !baseEnv.IS_SANDBOX
|
|
140
139
|
? { ...baseEnv, IS_SANDBOX: "1" }
|
|
141
140
|
: baseEnv;
|
|
141
|
+
const launchEnv = Object.fromEntries(Object.entries(launchEnvSource).filter((entry) => typeof entry[1] === "string"));
|
|
142
142
|
const childStdio = createChildStdio();
|
|
143
143
|
// Auto-detect locally installed claude command
|
|
144
144
|
const hasLocalClaude = await isClaudeCommandAvailable();
|
|
@@ -186,11 +186,14 @@ export async function launchClaudeCode(worktreePath, options = {}) {
|
|
|
186
186
|
preferClosestTo: finishedAt,
|
|
187
187
|
windowMs: 10 * 60 * 1000,
|
|
188
188
|
});
|
|
189
|
-
|
|
190
|
-
|
|
189
|
+
const detectedSessionId = latest?.id ?? null;
|
|
190
|
+
// When we explicitly resumed a specific session, keep that ID as the source of truth.
|
|
191
|
+
capturedSessionId = usedExplicitSessionId
|
|
192
|
+
? resumeSessionId
|
|
193
|
+
: detectedSessionId;
|
|
191
194
|
}
|
|
192
195
|
catch {
|
|
193
|
-
capturedSessionId = resumeSessionId
|
|
196
|
+
capturedSessionId = usedExplicitSessionId ? resumeSessionId : null;
|
|
194
197
|
}
|
|
195
198
|
if (capturedSessionId) {
|
|
196
199
|
console.log(chalk.cyan(`\n 🆔 Session ID: ${capturedSessionId}`));
|
|
@@ -204,7 +207,8 @@ export async function launchClaudeCode(worktreePath, options = {}) {
|
|
|
204
207
|
catch (error) {
|
|
205
208
|
const hasLocalClaude = await isClaudeCommandAvailable();
|
|
206
209
|
let errorMessage;
|
|
207
|
-
|
|
210
|
+
const err = error;
|
|
211
|
+
if (err.code === "ENOENT") {
|
|
208
212
|
if (hasLocalClaude) {
|
|
209
213
|
errorMessage =
|
|
210
214
|
"claude command not found. Please ensure Claude Code is properly installed.";
|
|
@@ -215,7 +219,8 @@ export async function launchClaudeCode(worktreePath, options = {}) {
|
|
|
215
219
|
}
|
|
216
220
|
}
|
|
217
221
|
else {
|
|
218
|
-
|
|
222
|
+
const details = error instanceof Error ? error.message : String(error);
|
|
223
|
+
errorMessage = `Failed to launch Claude Code: ${details || "Unknown error"}`;
|
|
219
224
|
}
|
|
220
225
|
if (process.platform === "win32") {
|
|
221
226
|
console.error(chalk.red("\n💡 Windows troubleshooting tips:"));
|
|
@@ -261,7 +266,8 @@ export async function isClaudeCodeAvailable() {
|
|
|
261
266
|
return true;
|
|
262
267
|
}
|
|
263
268
|
catch (error) {
|
|
264
|
-
|
|
269
|
+
const err = error;
|
|
270
|
+
if (err.code === "ENOENT") {
|
|
265
271
|
console.error(chalk.yellow("\n⚠️ bunx command not found"));
|
|
266
272
|
console.error(chalk.gray(" Install Bun and confirm that bunx is available before continuing"));
|
|
267
273
|
}
|
package/dist/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,kBAAkB,GAAG,kCAAkC,CAAC;AAC9D,MAAM,OAAO,WAAY,SAAQ,KAAK;IAG3B;IAFT,YACE,OAAe,EACR,KAAe;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,UAAK,GAAL,KAAK,CAAU;QAGtB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAAoB,EACpB,UAOI,EAAE;IAEN,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,oCAAoC;QACpC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC,CAAC;QAEjE,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,OAAO,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,eAAe,GACnB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YACtD,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE;YAC1B,CAAC,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,kBAAkB,GAAG,kCAAkC,CAAC;AAC9D,MAAM,OAAO,WAAY,SAAQ,KAAK;IAG3B;IAFT,YACE,OAAe,EACR,KAAe;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,UAAK,GAAL,KAAK,CAAU;QAGtB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAAoB,EACpB,UAOI,EAAE;IAEN,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,oCAAoC;QACpC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC,CAAC;QAEjE,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,OAAO,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,eAAe,GACnB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YACtD,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE;YAC1B,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,qBAAqB,GACzB,OAAO,CAAC,eAAe,CAAC;YACxB,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAE7D,wBAAwB;QACxB,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,UAAU;gBACb,IAAI,eAAe,EAAE,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;oBACvC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,sCAAsC,eAAe,EAAE,CAAC,CACpE,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,wEAAwE,CACzE,CACF,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,KAAK,QAAQ;gBACX,qDAAqD;gBACrD,6DAA6D;gBAC7D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,4EAA4E,CAC7E,CACF,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAC/D,CAAC;gBAEF,yCAAyC;gBACzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4CE;gBACF,0CAA0C;gBAC1C,IAAI,eAAe,EAAE,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;oBACvC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,kCAAkC,eAAe,EAAE,CAAC,CAChE,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM;YACR,KAAK,QAAQ,CAAC;YACd;gBACE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBACtD,MAAM;QACV,CAAC;QAED,mDAAmD;QACnD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;QAED,0BAA0B;QAC1B,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAE/D,wEAAwE;YACxE,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,6DAA6D,CAC9D,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,oDAAoD;QACpD,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzD,QAAQ,CAAC,WAAW,EAAE,CAAC;QAEvB,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,eAAe,GACnB,OAAO,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,UAAU;YAC5C,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE;YACjC,CAAC,CAAC,OAAO,CAAC;QACd,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAClC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,CACpC,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CACnE,CACF,CAAC;QAEF,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;QAEtC,+CAA+C;QAC/C,MAAM,cAAc,GAAG,MAAM,wBAAwB,EAAE,CAAC;QAExD,IAAI,CAAC;YACH,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAC3D,CAAC;gBACF,MAAM,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;oBAC1B,GAAG,EAAE,YAAY;oBACjB,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,GAAG,EAAE,SAAS;iBACf,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,6DAA6D,CAC9D,CACF,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,+EAA+E,CAChF,CACF,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CACnE,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,0DAA0D,CAC3D,CACF,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,wDAAwD,CACzD,CACF,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC1D,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,EAAE;oBACjD,GAAG,EAAE,YAAY;oBACjB,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,GAAG,EAAE,SAAS;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAED,wDAAwD;QACxD,0FAA0F;QAC1F,IAAI,iBAAiB,GAAkB,IAAI,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,YAAY,EAAE;gBACzD,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,UAAU,GAAG,MAAM;gBAC1B,eAAe,EAAE,UAAU;gBAC3B,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;aACzB,CAAC,CAAC;YACH,MAAM,iBAAiB,GAAG,MAAM,EAAE,EAAE,IAAI,IAAI,CAAC;YAC7C,sFAAsF;YACtF,iBAAiB,GAAG,qBAAqB;gBACvC,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,iBAAiB,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB,GAAG,qBAAqB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,CAAC;QAED,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,iBAAiB,EAAE,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,sCAAsC,iBAAiB,EAAE,CAAC,CACtE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,+DAA+D,CAChE,CACF,CAAC;QACJ,CAAC;QAED,OAAO,iBAAiB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,cAAc,GAAG,MAAM,wBAAwB,EAAE,CAAC;QACxD,IAAI,YAAoB,CAAC;QACzB,MAAM,GAAG,GAAG,KAA8B,CAAC;QAE3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,cAAc,EAAE,CAAC;gBACnB,YAAY;oBACV,4EAA4E,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,YAAY;oBACV,yFAAyF,CAAC;YAC9F,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,YAAY,GAAG,iCAAiC,OAAO,IAAI,eAAe,EAAE,CAAC;QAC/E,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC/D,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,iFAAiF,CAClF,CACF,CAAC;gBACF,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CACjE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,2DAA2D,CAC5D,CACF,CAAC;gBACF,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,oFAAoF,CACrF,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CACnE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,WAAW,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,wBAAwB;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACjE,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE;YAC/B,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,kBAAkB,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,IAAI,CACR,qEAAqE,CACtE,CACF,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -17,12 +17,6 @@ export interface AppProps {
|
|
|
17
17
|
onExit: (result?: SelectionResult) => void;
|
|
18
18
|
loadingIndicatorDelay?: number;
|
|
19
19
|
}
|
|
20
|
-
export interface SessionOption {
|
|
21
|
-
sessionId: string;
|
|
22
|
-
toolLabel: string;
|
|
23
|
-
branch: string;
|
|
24
|
-
timestamp: number;
|
|
25
|
-
}
|
|
26
20
|
/**
|
|
27
21
|
* App - Top-level component for Ink.js UI
|
|
28
22
|
* Integrates ErrorBoundary, data fetching, screen navigation, and all screens
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../src/cli/ui/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../src/cli/ui/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAQf,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAW9E,OAAO,KAAK,EACV,MAAM,EAGN,cAAc,EAEf,MAAM,aAAa,CAAC;AA6CrB,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,qBAA2B,EAAE,EAAE,QAAQ,qBAwqCpE"}
|
|
@@ -5,7 +5,6 @@ import { BranchListScreen } from "./screens/BranchListScreen.js";
|
|
|
5
5
|
import { BranchCreatorScreen } from "./screens/BranchCreatorScreen.js";
|
|
6
6
|
import { BranchActionSelectorScreen } from "../screens/BranchActionSelectorScreen.js";
|
|
7
7
|
import { AIToolSelectorScreen } from "./screens/AIToolSelectorScreen.js";
|
|
8
|
-
import { SessionSelectorScreen } from "./screens/SessionSelectorScreen.js";
|
|
9
8
|
import { ExecutionModeSelectorScreen } from "./screens/ExecutionModeSelectorScreen.js";
|
|
10
9
|
import { BranchQuickStartScreen } from "./screens/BranchQuickStartScreen.js";
|
|
11
10
|
import { ModelSelectorScreen, } from "./screens/ModelSelectorScreen.js";
|
|
@@ -46,10 +45,6 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
46
45
|
// Version state
|
|
47
46
|
const [version, setVersion] = useState(null);
|
|
48
47
|
const [repoRoot, setRepoRoot] = useState(null);
|
|
49
|
-
const [sessionOptions, setSessionOptions] = useState([]);
|
|
50
|
-
const [sessionLoading, setSessionLoading] = useState(false);
|
|
51
|
-
const [sessionError, setSessionError] = useState(null);
|
|
52
|
-
const [pendingExecution, setPendingExecution] = useState(null);
|
|
53
48
|
const [continueSessionId, setContinueSessionId] = useState(null);
|
|
54
49
|
const [branchQuickStart, setBranchQuickStart] = useState([]);
|
|
55
50
|
const [branchQuickStartLoading, setBranchQuickStartLoading] = useState(false);
|
|
@@ -66,6 +61,8 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
66
61
|
const [cleanupInputLocked, setCleanupInputLocked] = useState(false);
|
|
67
62
|
const [cleanupFooterMessage, setCleanupFooterMessage] = useState(null);
|
|
68
63
|
const [hiddenBranches, setHiddenBranches] = useState([]);
|
|
64
|
+
const [selectedBranches, setSelectedBranches] = useState([]);
|
|
65
|
+
const [safeBranches, setSafeBranches] = useState(new Set());
|
|
69
66
|
const spinnerFrameIndexRef = useRef(0);
|
|
70
67
|
const [spinnerFrameIndex, setSpinnerFrameIndex] = useState(0);
|
|
71
68
|
const completionTimerRef = useRef(null);
|
|
@@ -128,47 +125,34 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
128
125
|
setHiddenBranches(filtered);
|
|
129
126
|
}
|
|
130
127
|
}, [branches, hiddenBranches]);
|
|
131
|
-
//
|
|
128
|
+
// Remove selections that no longer exist (hidden or disappeared)
|
|
132
129
|
useEffect(() => {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
setSessionLoading(true);
|
|
141
|
-
setSessionError(null);
|
|
130
|
+
setSelectedBranches((prev) => prev.filter((name) => branches.some((b) => b.name === name) &&
|
|
131
|
+
!hiddenBranches.includes(name)));
|
|
132
|
+
}, [branches, hiddenBranches]);
|
|
133
|
+
// Precompute safe-to-clean branches using cleanup candidate logic
|
|
134
|
+
useEffect(() => {
|
|
135
|
+
let cancelled = false;
|
|
142
136
|
(async () => {
|
|
143
137
|
try {
|
|
144
|
-
const
|
|
145
|
-
if (
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
.filter((entry) => entry.sessionId &&
|
|
152
|
-
entry.toolId === selectedTool &&
|
|
153
|
-
entry.branch === selectedBranch.name)
|
|
154
|
-
.sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0))
|
|
155
|
-
.map((entry) => ({
|
|
156
|
-
sessionId: entry.sessionId,
|
|
157
|
-
toolLabel: entry.toolLabel,
|
|
158
|
-
branch: entry.branch,
|
|
159
|
-
timestamp: entry.timestamp,
|
|
160
|
-
}));
|
|
161
|
-
setSessionOptions(filtered);
|
|
162
|
-
}
|
|
163
|
-
catch (_err) {
|
|
164
|
-
setSessionOptions([]);
|
|
165
|
-
setSessionError("セッション一覧の取得に失敗しました");
|
|
138
|
+
const targets = await getMergedPRWorktrees();
|
|
139
|
+
if (cancelled)
|
|
140
|
+
return;
|
|
141
|
+
const safe = new Set(targets
|
|
142
|
+
.filter((t) => !t.hasUncommittedChanges && !t.hasUnpushedCommits)
|
|
143
|
+
.map((t) => t.branch));
|
|
144
|
+
setSafeBranches(safe);
|
|
166
145
|
}
|
|
167
|
-
|
|
168
|
-
|
|
146
|
+
catch {
|
|
147
|
+
if (cancelled)
|
|
148
|
+
return;
|
|
149
|
+
setSafeBranches(new Set());
|
|
169
150
|
}
|
|
170
151
|
})();
|
|
171
|
-
|
|
152
|
+
return () => {
|
|
153
|
+
cancelled = true;
|
|
154
|
+
};
|
|
155
|
+
}, [branches, worktrees]);
|
|
172
156
|
// Load quick start options for selected branch (latest per tool)
|
|
173
157
|
useEffect(() => {
|
|
174
158
|
if (!selectedBranch) {
|
|
@@ -211,53 +195,54 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
211
195
|
const latestPerTool = findLatestBranchSessionsByTool(combinedHistory, selectedBranch.name, selectedWorktreePath);
|
|
212
196
|
const mapped = await Promise.all(latestPerTool.map(async (entry) => {
|
|
213
197
|
let sessionId = entry.sessionId ?? null;
|
|
198
|
+
const worktree = selectedWorktreePath ?? workingDirectory;
|
|
214
199
|
// For Codex, prefer a newer filesystem session over stale history
|
|
215
|
-
if (entry.toolId === "codex-cli") {
|
|
200
|
+
if (!sessionId && entry.toolId === "codex-cli") {
|
|
216
201
|
try {
|
|
217
|
-
const
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
202
|
+
const historyTs = entry.timestamp ?? null;
|
|
203
|
+
const latestCodex = await findLatestCodexSession({
|
|
204
|
+
...(historyTs
|
|
205
|
+
? {
|
|
206
|
+
since: historyTs - 60_000,
|
|
207
|
+
preferClosestTo: historyTs,
|
|
208
|
+
windowMs: 60 * 60 * 1000,
|
|
209
|
+
}
|
|
210
|
+
: {}),
|
|
211
|
+
cwd: worktree,
|
|
212
|
+
});
|
|
213
|
+
sessionId =
|
|
214
|
+
latestCodex?.id ??
|
|
215
|
+
(await findLatestCodexSessionId({ cwd: worktree })) ??
|
|
216
|
+
null;
|
|
229
217
|
}
|
|
230
218
|
catch {
|
|
231
219
|
// ignore lookup failure
|
|
232
220
|
}
|
|
233
221
|
}
|
|
234
222
|
// For Claude Code, prefer the newest session file in the worktree even if history is stale.
|
|
235
|
-
if (entry.toolId === "claude-code") {
|
|
223
|
+
if (!sessionId && entry.toolId === "claude-code") {
|
|
236
224
|
try {
|
|
237
|
-
const worktree = selectedWorktreePath ??
|
|
238
|
-
selectedBranch?.displayName ??
|
|
239
|
-
workingDirectory;
|
|
240
225
|
// Always resolve freshest on-disk session for this worktree (no window restriction)
|
|
241
226
|
const latestAny = await findLatestClaudeSession(worktree);
|
|
242
|
-
sessionId = latestAny?.id ??
|
|
227
|
+
sessionId = latestAny?.id ?? null;
|
|
243
228
|
}
|
|
244
229
|
catch {
|
|
245
230
|
// ignore lookup failure
|
|
246
231
|
}
|
|
247
232
|
}
|
|
248
233
|
// For Gemini, prefer newest session file (Gemini keeps per-project chats)
|
|
249
|
-
if (entry.toolId === "gemini-cli") {
|
|
234
|
+
if (!sessionId && entry.toolId === "gemini-cli") {
|
|
250
235
|
try {
|
|
251
|
-
const gemSession = await findLatestGeminiSession(
|
|
252
|
-
selectedBranch?.displayName ??
|
|
253
|
-
workingDirectory, {
|
|
236
|
+
const gemSession = await findLatestGeminiSession(worktree, {
|
|
254
237
|
...(entry.timestamp !== null && entry.timestamp !== undefined
|
|
255
|
-
? {
|
|
238
|
+
? {
|
|
239
|
+
since: entry.timestamp - 60_000,
|
|
240
|
+
preferClosestTo: entry.timestamp,
|
|
241
|
+
}
|
|
256
242
|
: {}),
|
|
257
243
|
windowMs: 60 * 60 * 1000,
|
|
258
244
|
});
|
|
259
|
-
|
|
260
|
-
sessionId = gemSession.id;
|
|
245
|
+
sessionId = gemSession?.id ?? null;
|
|
261
246
|
}
|
|
262
247
|
catch {
|
|
263
248
|
// ignore
|
|
@@ -361,10 +346,18 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
361
346
|
locked: false,
|
|
362
347
|
prunable: wt.isAccessible === false,
|
|
363
348
|
isAccessible: wt.isAccessible ?? true,
|
|
349
|
+
...(wt.hasUncommittedChanges !== undefined
|
|
350
|
+
? { hasUncommittedChanges: wt.hasUncommittedChanges }
|
|
351
|
+
: {}),
|
|
364
352
|
});
|
|
365
353
|
}
|
|
366
|
-
|
|
367
|
-
|
|
354
|
+
const baseItems = formatBranchItems(visibleBranches, worktreeMap);
|
|
355
|
+
return baseItems.map((item) => ({
|
|
356
|
+
...item,
|
|
357
|
+
safeToCleanup: safeBranches.has(item.name),
|
|
358
|
+
}));
|
|
359
|
+
}, [branchHash, worktreeHash, visibleBranches, worktrees, safeBranches]);
|
|
360
|
+
const selectedBranchSet = useMemo(() => new Set(selectedBranches), [selectedBranches]);
|
|
368
361
|
// Calculate statistics (memoized for performance)
|
|
369
362
|
const stats = useMemo(() => calculateStatistics(visibleBranches), [visibleBranches]);
|
|
370
363
|
const resolveBaseBranch = useCallback(() => {
|
|
@@ -423,6 +416,18 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
423
416
|
branch.branchCategory === "main" ||
|
|
424
417
|
branch.branchCategory === "develop");
|
|
425
418
|
}, [isProtectedBranchName]);
|
|
419
|
+
const toggleBranchSelection = useCallback((branchName) => {
|
|
420
|
+
setSelectedBranches((prev) => {
|
|
421
|
+
const set = new Set(prev);
|
|
422
|
+
if (set.has(branchName)) {
|
|
423
|
+
set.delete(branchName);
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
set.add(branchName);
|
|
427
|
+
}
|
|
428
|
+
return Array.from(set);
|
|
429
|
+
});
|
|
430
|
+
}, []);
|
|
426
431
|
const protectedBranchInfo = useMemo(() => {
|
|
427
432
|
if (!selectedBranch) {
|
|
428
433
|
return null;
|
|
@@ -618,6 +623,7 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
618
623
|
succeededBranches.forEach((branch) => merged.add(branch));
|
|
619
624
|
return Array.from(merged);
|
|
620
625
|
});
|
|
626
|
+
setSelectedBranches((prev) => prev.filter((name) => !succeededBranches.includes(name)));
|
|
621
627
|
}
|
|
622
628
|
refresh();
|
|
623
629
|
completionTimerRef.current = null;
|
|
@@ -661,6 +667,23 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
661
667
|
}, COMPLETION_HOLD_DURATION_MS);
|
|
662
668
|
return;
|
|
663
669
|
}
|
|
670
|
+
// Manual selection: restrict targets when選択がある
|
|
671
|
+
if (selectedBranchSet.size > 0) {
|
|
672
|
+
targets = targets.filter((t) => selectedBranchSet.has(t.branch));
|
|
673
|
+
if (targets.length === 0) {
|
|
674
|
+
setCleanupIndicators({});
|
|
675
|
+
setCleanupFooterMessage({
|
|
676
|
+
text: "⚠️ No cleanup candidates among selected branches.",
|
|
677
|
+
color: "yellow",
|
|
678
|
+
});
|
|
679
|
+
setCleanupInputLocked(false);
|
|
680
|
+
completionTimerRef.current = setTimeout(() => {
|
|
681
|
+
setCleanupFooterMessage(null);
|
|
682
|
+
completionTimerRef.current = null;
|
|
683
|
+
}, COMPLETION_HOLD_DURATION_MS);
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
664
687
|
// Reset hidden branches that may already be gone
|
|
665
688
|
setHiddenBranches((prev) => prev.filter((name) => targets.find((t) => t.branch === name) === undefined));
|
|
666
689
|
const initialIndicators = targets.reduce((acc, target, index) => {
|
|
@@ -749,6 +772,7 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
749
772
|
getMergedPRWorktrees,
|
|
750
773
|
refresh,
|
|
751
774
|
removeWorktree,
|
|
775
|
+
selectedBranchSet,
|
|
752
776
|
]);
|
|
753
777
|
// Handle AI tool selection
|
|
754
778
|
const handleToolSelect = useCallback((tool) => {
|
|
@@ -798,14 +822,6 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
798
822
|
getDefaultModelOption,
|
|
799
823
|
getDefaultInferenceForModel,
|
|
800
824
|
]);
|
|
801
|
-
// Handle session selection
|
|
802
|
-
const handleSessionSelect = useCallback((session) => {
|
|
803
|
-
const execution = pendingExecution ?? {
|
|
804
|
-
mode: "resume",
|
|
805
|
-
skipPermissions: false,
|
|
806
|
-
};
|
|
807
|
-
completeSelection(execution.mode, execution.skipPermissions, session);
|
|
808
|
-
}, [pendingExecution, completeSelection]);
|
|
809
825
|
const handleQuickStartSelect = useCallback((action, toolId) => {
|
|
810
826
|
if (action === "manual" || !branchQuickStart.length) {
|
|
811
827
|
navigateTo("ai-tool-selector");
|
|
@@ -844,13 +860,8 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
844
860
|
]);
|
|
845
861
|
// Handle execution mode and skipPermissions selection
|
|
846
862
|
const handleModeSelect = useCallback((result) => {
|
|
847
|
-
if (result.mode === "resume") {
|
|
848
|
-
setPendingExecution(result);
|
|
849
|
-
navigateTo("session-selector");
|
|
850
|
-
return;
|
|
851
|
-
}
|
|
852
863
|
completeSelection(result.mode, result.skipPermissions, null);
|
|
853
|
-
}, [completeSelection
|
|
864
|
+
}, [completeSelection]);
|
|
854
865
|
// Render screen based on currentScreen
|
|
855
866
|
const renderScreen = () => {
|
|
856
867
|
switch (currentScreen) {
|
|
@@ -859,7 +870,7 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
859
870
|
indicators: cleanupIndicators,
|
|
860
871
|
footerMessage: cleanupFooterMessage,
|
|
861
872
|
inputLocked: cleanupInputLocked,
|
|
862
|
-
}, version: version, workingDirectory: workingDirectory }));
|
|
873
|
+
}, version: version, workingDirectory: workingDirectory, selectedBranches: selectedBranches, onToggleSelect: toggleBranchSelection }));
|
|
863
874
|
case "branch-creator":
|
|
864
875
|
return (React.createElement(BranchCreatorScreen, { onBack: goBack, onCreate: handleCreate, baseBranch: baseBranchLabel, version: version }));
|
|
865
876
|
case "branch-action-selector": {
|
|
@@ -893,9 +904,6 @@ export function App({ onExit, loadingIndicatorDelay = 300 }) {
|
|
|
893
904
|
return null;
|
|
894
905
|
}
|
|
895
906
|
return (React.createElement(ModelSelectorScreen, { tool: selectedTool, onBack: goBack, onSelect: handleModelSelect, version: version, initialSelection: selectedModel }));
|
|
896
|
-
case "session-selector":
|
|
897
|
-
// TODO: Implement session data fetching
|
|
898
|
-
return (React.createElement(SessionSelectorScreen, { sessions: sessionOptions, loading: sessionLoading, errorMessage: sessionError, onBack: goBack, onSelect: handleSessionSelect, version: version }));
|
|
899
907
|
case "execution-mode-selector":
|
|
900
908
|
return (React.createElement(ExecutionModeSelectorScreen, { onBack: goBack, onSelect: handleModeSelect, version: version, continueSessionId: continueSessionId }));
|
|
901
909
|
default:
|