@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
|
@@ -5,28 +5,11 @@ import { useCreateWorktree } from "../hooks/useWorktrees";
|
|
|
5
5
|
import { useStartSession, useSessions, useDeleteSession, } from "../hooks/useSessions";
|
|
6
6
|
import { useConfig } from "../hooks/useConfig";
|
|
7
7
|
import { ApiError } from "../lib/api";
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
modeArgs: {
|
|
14
|
-
normal: [],
|
|
15
|
-
continue: ["-c"],
|
|
16
|
-
resume: ["-r"],
|
|
17
|
-
},
|
|
18
|
-
permissionSkipArgs: ["--dangerously-skip-permissions"],
|
|
19
|
-
},
|
|
20
|
-
"codex-cli": {
|
|
21
|
-
command: "codex",
|
|
22
|
-
defaultArgs: ["--auto-approve", "--verbose"],
|
|
23
|
-
modeArgs: {
|
|
24
|
-
normal: [],
|
|
25
|
-
continue: ["resume", "--last"],
|
|
26
|
-
resume: ["resume"],
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
};
|
|
8
|
+
import { PageHeader } from "@/components/common/PageHeader";
|
|
9
|
+
import { Button } from "@/components/ui/button";
|
|
10
|
+
import { Badge } from "@/components/ui/badge";
|
|
11
|
+
import { Alert, AlertDescription } from "@/components/ui/alert";
|
|
12
|
+
import { SessionHistoryTable, ToolLauncher, BranchInfoCards, TerminalPanel, } from "@/components/branch-detail";
|
|
30
13
|
const BRANCH_TYPE_LABEL = {
|
|
31
14
|
local: "ローカル",
|
|
32
15
|
remote: "リモート",
|
|
@@ -36,11 +19,6 @@ const MERGE_STATUS_LABEL = {
|
|
|
36
19
|
unmerged: "未マージ",
|
|
37
20
|
unknown: "状態不明",
|
|
38
21
|
};
|
|
39
|
-
const MERGE_STATUS_TONE = {
|
|
40
|
-
merged: "success",
|
|
41
|
-
unmerged: "warning",
|
|
42
|
-
unknown: "muted",
|
|
43
|
-
};
|
|
44
22
|
export function BranchDetailPage() {
|
|
45
23
|
const { branchName } = useParams();
|
|
46
24
|
const decodedBranchName = branchName ? decodeURIComponent(branchName) : "";
|
|
@@ -61,36 +39,47 @@ export function BranchDetailPage() {
|
|
|
61
39
|
const [extraArgsText, setExtraArgsText] = useState("");
|
|
62
40
|
const [terminatingSessionId, setTerminatingSessionId] = useState(null);
|
|
63
41
|
const formattedCommitDate = useMemo(() => formatDate(branch?.commitDate), [branch?.commitDate]);
|
|
42
|
+
// Handle fullscreen body overflow
|
|
64
43
|
useEffect(() => {
|
|
65
|
-
if (!isTerminalFullscreen)
|
|
44
|
+
if (!isTerminalFullscreen)
|
|
66
45
|
return undefined;
|
|
67
|
-
}
|
|
68
46
|
const previousOverflow = document.body.style.overflow;
|
|
69
47
|
document.body.style.overflow = "hidden";
|
|
70
48
|
return () => {
|
|
71
49
|
document.body.style.overflow = previousOverflow;
|
|
72
50
|
};
|
|
73
51
|
}, [isTerminalFullscreen]);
|
|
52
|
+
// Loading state
|
|
74
53
|
if (isLoading) {
|
|
75
|
-
return (React.createElement("div", { className: "
|
|
76
|
-
React.createElement(
|
|
77
|
-
|
|
78
|
-
React.createElement("
|
|
54
|
+
return (React.createElement("div", { className: "min-h-screen bg-background" },
|
|
55
|
+
React.createElement(PageHeader, { eyebrow: "BRANCH DETAIL", title: "\u8AAD\u307F\u8FBC\u307F\u4E2D...", subtitle: "\u30D6\u30E9\u30F3\u30C1\u60C5\u5831\u3092\u53D6\u5F97\u3057\u3066\u3044\u307E\u3059" }),
|
|
56
|
+
React.createElement("main", { className: "mx-auto max-w-7xl px-6 py-8" },
|
|
57
|
+
React.createElement("div", { className: "flex items-center justify-center py-20" },
|
|
58
|
+
React.createElement("div", { className: "text-center" },
|
|
59
|
+
React.createElement("div", { className: "mb-4 text-4xl" }, "\u23F3"),
|
|
60
|
+
React.createElement("p", { className: "text-muted-foreground" }, "Loading branch..."))))));
|
|
79
61
|
}
|
|
62
|
+
// Error state
|
|
80
63
|
if (error) {
|
|
81
|
-
return (React.createElement("div", { className: "
|
|
82
|
-
React.createElement(
|
|
83
|
-
|
|
84
|
-
React.createElement(
|
|
85
|
-
|
|
64
|
+
return (React.createElement("div", { className: "min-h-screen bg-background" },
|
|
65
|
+
React.createElement(PageHeader, { eyebrow: "BRANCH DETAIL", title: "\u30A8\u30E9\u30FC" }),
|
|
66
|
+
React.createElement("main", { className: "mx-auto max-w-7xl px-6 py-8" },
|
|
67
|
+
React.createElement(Alert, { variant: "destructive" },
|
|
68
|
+
React.createElement(AlertDescription, null, error instanceof Error ? error.message : "未知のエラーです")),
|
|
69
|
+
React.createElement("div", { className: "mt-4" },
|
|
70
|
+
React.createElement(Button, { variant: "ghost", asChild: true },
|
|
71
|
+
React.createElement(Link, { to: "/" }, "\u2190 \u30D6\u30E9\u30F3\u30C1\u4E00\u89A7\u306B\u623B\u308B"))))));
|
|
86
72
|
}
|
|
73
|
+
// Not found state
|
|
87
74
|
if (!branch) {
|
|
88
|
-
return (React.createElement("div", { className: "
|
|
89
|
-
React.createElement(
|
|
90
|
-
|
|
91
|
-
React.createElement("p",
|
|
92
|
-
React.createElement(
|
|
75
|
+
return (React.createElement("div", { className: "min-h-screen bg-background" },
|
|
76
|
+
React.createElement(PageHeader, { eyebrow: "BRANCH DETAIL", title: "Branch not found" }),
|
|
77
|
+
React.createElement("main", { className: "mx-auto max-w-7xl px-6 py-8" },
|
|
78
|
+
React.createElement("p", { className: "mb-4 text-muted-foreground" }, "\u6307\u5B9A\u3055\u308C\u305F\u30D6\u30E9\u30F3\u30C1\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002"),
|
|
79
|
+
React.createElement(Button, { variant: "ghost", asChild: true },
|
|
80
|
+
React.createElement(Link, { to: "/" }, "\u2190 \u30D6\u30E9\u30F3\u30C1\u4E00\u89A7\u306B\u623B\u308B")))));
|
|
93
81
|
}
|
|
82
|
+
// Computed values
|
|
94
83
|
const canStartSession = Boolean(branch.worktreePath);
|
|
95
84
|
const divergenceInfo = branch.divergence ?? null;
|
|
96
85
|
const hasBlockingDivergence = Boolean(divergenceInfo && divergenceInfo.ahead > 0 && divergenceInfo.behind > 0);
|
|
@@ -100,6 +89,7 @@ export function BranchDetailPage() {
|
|
|
100
89
|
divergenceInfo.ahead === 0 &&
|
|
101
90
|
!hasBlockingDivergence);
|
|
102
91
|
const isSyncingBranch = syncBranch.isPending;
|
|
92
|
+
// Available tools
|
|
103
93
|
const customTools = config?.tools ?? [];
|
|
104
94
|
const availableTools = useMemo(() => [
|
|
105
95
|
{ id: "claude-code", label: "Claude Code", target: "claude" },
|
|
@@ -111,6 +101,7 @@ export function BranchDetailPage() {
|
|
|
111
101
|
definition: tool,
|
|
112
102
|
})),
|
|
113
103
|
], [customTools]);
|
|
104
|
+
// Ensure selected tool is valid
|
|
114
105
|
useEffect(() => {
|
|
115
106
|
if (!availableTools.length) {
|
|
116
107
|
setSelectedToolId("claude-code");
|
|
@@ -118,47 +109,44 @@ export function BranchDetailPage() {
|
|
|
118
109
|
}
|
|
119
110
|
if (!availableTools.find((tool) => tool.id === selectedToolId)) {
|
|
120
111
|
const first = availableTools[0];
|
|
121
|
-
if (first)
|
|
112
|
+
if (first)
|
|
122
113
|
setSelectedToolId(first.id);
|
|
123
|
-
}
|
|
124
114
|
}
|
|
125
115
|
}, [availableTools, selectedToolId]);
|
|
126
116
|
const selectedTool = availableTools.find((tool) => tool.id === selectedToolId);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
return BUILTIN_TOOL_SUMMARIES[selectedTool.id] ?? null;
|
|
140
|
-
}, [selectedTool]);
|
|
141
|
-
const argsPreview = useMemo(() => {
|
|
142
|
-
if (!selectedToolSummary) {
|
|
117
|
+
// Branch sessions
|
|
118
|
+
const branchSessions = useMemo(() => {
|
|
119
|
+
return (sessionsData ?? [])
|
|
120
|
+
.filter((session) => session.worktreePath === branch?.worktreePath)
|
|
121
|
+
.sort((a, b) => (b.startedAt ?? "").localeCompare(a.startedAt ?? ""));
|
|
122
|
+
}, [sessionsData, branch?.worktreePath]);
|
|
123
|
+
// Latest tool usage
|
|
124
|
+
const latestToolUsage = useMemo(() => {
|
|
125
|
+
if (branch?.lastToolUsage)
|
|
126
|
+
return branch.lastToolUsage;
|
|
127
|
+
const first = branchSessions[0];
|
|
128
|
+
if (!first)
|
|
143
129
|
return null;
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
130
|
+
return {
|
|
131
|
+
branch: branch.name,
|
|
132
|
+
worktreePath: branch.worktreePath ?? null,
|
|
133
|
+
toolId: first.toolType === "custom"
|
|
134
|
+
? (first.toolName ?? "custom")
|
|
135
|
+
: first.toolType,
|
|
136
|
+
toolLabel: first.toolType === "custom"
|
|
137
|
+
? (first.toolName ?? "Custom")
|
|
138
|
+
: toolLabel(first.toolType),
|
|
139
|
+
mode: first.mode ?? "normal",
|
|
140
|
+
model: null,
|
|
141
|
+
timestamp: first.startedAt ? Date.parse(first.startedAt) : Date.now(),
|
|
142
|
+
};
|
|
143
|
+
}, [
|
|
144
|
+
branch?.lastToolUsage,
|
|
145
|
+
branch?.name,
|
|
146
|
+
branch?.worktreePath,
|
|
147
|
+
branchSessions,
|
|
148
|
+
]);
|
|
149
|
+
// Handlers
|
|
162
150
|
const handleCreateWorktree = async () => {
|
|
163
151
|
try {
|
|
164
152
|
await createWorktree.mutateAsync({
|
|
@@ -195,19 +183,19 @@ export function BranchDetailPage() {
|
|
|
195
183
|
if (needsRemoteSync) {
|
|
196
184
|
setBanner({
|
|
197
185
|
type: "error",
|
|
198
|
-
message: "リモートの更新を取り込むまでAI
|
|
186
|
+
message: "リモートの更新を取り込むまでAIツールは起動できません。",
|
|
199
187
|
});
|
|
200
188
|
return;
|
|
201
189
|
}
|
|
202
190
|
if (hasBlockingDivergence) {
|
|
203
191
|
setBanner({
|
|
204
192
|
type: "error",
|
|
205
|
-
message: "
|
|
193
|
+
message: "差分を解消してから起動してください。",
|
|
206
194
|
});
|
|
207
195
|
return;
|
|
208
196
|
}
|
|
209
197
|
if (skipPermissions &&
|
|
210
|
-
!window.confirm("
|
|
198
|
+
!window.confirm("権限チェックをスキップして起動します。続行しますか?")) {
|
|
211
199
|
return;
|
|
212
200
|
}
|
|
213
201
|
setIsStartingSession(true);
|
|
@@ -217,7 +205,10 @@ export function BranchDetailPage() {
|
|
|
217
205
|
: selectedTool.target === "custom"
|
|
218
206
|
? "custom"
|
|
219
207
|
: "claude-code";
|
|
220
|
-
const extraArgs =
|
|
208
|
+
const extraArgs = extraArgsText
|
|
209
|
+
.split(/\s+/)
|
|
210
|
+
.map((c) => c.trim())
|
|
211
|
+
.filter(Boolean);
|
|
221
212
|
const sessionRequest = {
|
|
222
213
|
toolType,
|
|
223
214
|
toolName: selectedTool.target === "custom" ? selectedTool.id : null,
|
|
@@ -255,9 +246,8 @@ export function BranchDetailPage() {
|
|
|
255
246
|
try {
|
|
256
247
|
await deleteSession.mutateAsync(sessionId);
|
|
257
248
|
setBanner({ type: "success", message: "セッションを終了しました" });
|
|
258
|
-
if (activeSessionId === sessionId)
|
|
249
|
+
if (activeSessionId === sessionId)
|
|
259
250
|
setActiveSessionId(null);
|
|
260
|
-
}
|
|
261
251
|
}
|
|
262
252
|
catch (err) {
|
|
263
253
|
setBanner({
|
|
@@ -303,37 +293,6 @@ export function BranchDetailPage() {
|
|
|
303
293
|
});
|
|
304
294
|
}
|
|
305
295
|
};
|
|
306
|
-
const branchSessions = useMemo(() => {
|
|
307
|
-
return (sessionsData ?? [])
|
|
308
|
-
.filter((session) => session.worktreePath === branch?.worktreePath)
|
|
309
|
-
.sort((a, b) => (b.startedAt ?? "").localeCompare(a.startedAt ?? ""));
|
|
310
|
-
}, [sessionsData, branch?.worktreePath]);
|
|
311
|
-
const latestToolUsage = useMemo(() => {
|
|
312
|
-
if (branch?.lastToolUsage) {
|
|
313
|
-
return branch.lastToolUsage;
|
|
314
|
-
}
|
|
315
|
-
const first = branchSessions[0];
|
|
316
|
-
if (!first)
|
|
317
|
-
return null;
|
|
318
|
-
return {
|
|
319
|
-
branch: branch.name,
|
|
320
|
-
worktreePath: branch.worktreePath ?? null,
|
|
321
|
-
toolId: first.toolType === "custom"
|
|
322
|
-
? (first.toolName ?? "custom")
|
|
323
|
-
: first.toolType,
|
|
324
|
-
toolLabel: first.toolType === "custom"
|
|
325
|
-
? (first.toolName ?? "Custom")
|
|
326
|
-
: toolLabel(first.toolType),
|
|
327
|
-
mode: first.mode ?? "normal",
|
|
328
|
-
model: null,
|
|
329
|
-
timestamp: first.startedAt ? Date.parse(first.startedAt) : Date.now(),
|
|
330
|
-
};
|
|
331
|
-
}, [
|
|
332
|
-
branch?.lastToolUsage,
|
|
333
|
-
branch?.name,
|
|
334
|
-
branch?.worktreePath,
|
|
335
|
-
branchSessions,
|
|
336
|
-
]);
|
|
337
296
|
const handleSessionExit = (code) => {
|
|
338
297
|
setActiveSessionId(null);
|
|
339
298
|
setIsTerminalFullscreen(false);
|
|
@@ -342,211 +301,52 @@ export function BranchDetailPage() {
|
|
|
342
301
|
message: `セッションがコード ${code} で終了しました。`,
|
|
343
302
|
});
|
|
344
303
|
};
|
|
345
|
-
return (React.createElement("div", { className: "
|
|
346
|
-
React.createElement("
|
|
347
|
-
|
|
348
|
-
React.createElement("
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
React.createElement(
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
React.createElement("div", null,
|
|
377
|
-
React.createElement("h2", null, "AI\u30C4\u30FC\u30EB\u8D77\u52D5"),
|
|
378
|
-
React.createElement("p", { className: "section-card__body" }, "Web UI \u304B\u3089\u76F4\u63A5AI\u30C4\u30FC\u30EB\u3092\u8D77\u52D5\u3067\u304D\u307E\u3059\u3002\u8A2D\u5B9A\u3057\u305F\u30AB\u30B9\u30BF\u30E0\u30C4\u30FC\u30EB\u3082\u4E00\u89A7\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002")),
|
|
379
|
-
configError && (React.createElement("span", { className: "pill pill--warning" }, "\u8A2D\u5B9A\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F"))),
|
|
380
|
-
!canStartSession ? (React.createElement("p", { className: "section-card__body" }, "Worktree\u304C\u672A\u4F5C\u6210\u306E\u305F\u3081\u3001\u5148\u306BWorktree\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002")) : (React.createElement("div", { className: "tool-form" },
|
|
381
|
-
React.createElement("div", { className: "form-grid" },
|
|
382
|
-
React.createElement("label", { className: "form-field" },
|
|
383
|
-
React.createElement("span", null, "AI\u30C4\u30FC\u30EB"),
|
|
384
|
-
React.createElement("select", { value: selectedToolId, onChange: (event) => setSelectedToolId(event.target.value), disabled: isConfigLoading }, availableTools.map((tool) => (React.createElement("option", { key: tool.id, value: tool.id }, tool.label))))),
|
|
385
|
-
React.createElement("label", { className: "form-field" },
|
|
386
|
-
React.createElement("span", null, "\u8D77\u52D5\u30E2\u30FC\u30C9"),
|
|
387
|
-
React.createElement("select", { value: selectedMode, onChange: (event) => setSelectedMode(event.target.value) },
|
|
388
|
-
React.createElement("option", { value: "normal" }, "normal"),
|
|
389
|
-
React.createElement("option", { value: "continue" }, "continue"),
|
|
390
|
-
React.createElement("option", { value: "resume" }, "resume"))),
|
|
391
|
-
React.createElement("label", { className: "form-field" },
|
|
392
|
-
React.createElement("span", null, "\u8FFD\u52A0\u5F15\u6570 (\u30B9\u30DA\u30FC\u30B9\u533A\u5207\u308A)"),
|
|
393
|
-
React.createElement("input", { type: "text", value: extraArgsText, onChange: (event) => setExtraArgsText(event.target.value), placeholder: "--flag value" }))),
|
|
394
|
-
React.createElement("label", { className: "form-field" },
|
|
395
|
-
React.createElement("span", null,
|
|
396
|
-
React.createElement("input", { type: "checkbox", checked: skipPermissions, onChange: (event) => setSkipPermissions(event.target.checked) }),
|
|
397
|
-
React.createElement("span", { style: { marginLeft: "0.5rem" } }, "\u6A29\u9650\u30C1\u30A7\u30C3\u30AF\u3092\u30B9\u30AD\u30C3\u30D7 (\u81EA\u5DF1\u8CAC\u4EFB)"))),
|
|
398
|
-
skipPermissions && (React.createElement("div", { className: "inline-banner inline-banner--warning" },
|
|
399
|
-
React.createElement("p", null, "\u6A29\u9650\u30C1\u30A7\u30C3\u30AF\u3092\u30B9\u30AD\u30C3\u30D7\u3059\u308B\u3053\u3068\u3067\u3001CLI \u3067\u306E `--dangerously-skip-permissions` \u6307\u5B9A\u3068\u540C\u69D8\u306E\u30EA\u30B9\u30AF\u3092\u8CA0\u3044\u307E\u3059\u3002"))),
|
|
400
|
-
needsRemoteSync && (React.createElement("div", { className: "inline-banner inline-banner--info", "data-testid": "sync-required" },
|
|
401
|
-
React.createElement("p", null,
|
|
402
|
-
"\u30EA\u30E2\u30FC\u30C8\u306B\u672A\u53D6\u5F97\u306E\u66F4\u65B0 (",
|
|
403
|
-
branch.divergence?.behind ?? 0,
|
|
404
|
-
" ",
|
|
405
|
-
"commits) \u304C\u3042\u308B\u305F\u3081\u3001AI\u30C4\u30FC\u30EB\u3092\u8D77\u52D5\u3059\u308B\u524D\u306B\u540C\u671F\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),
|
|
406
|
-
React.createElement("p", { className: "section-card__body" }, "CLI \u306E `git fetch --all` \u3068 `git pull --ff-only` \u3068\u540C\u3058\u51E6\u7406\u3092 Web UI \u304B\u3089\u5B9F\u884C\u3067\u304D\u307E\u3059\u3002"))),
|
|
407
|
-
hasBlockingDivergence && (React.createElement("div", { className: "inline-banner inline-banner--warning", "data-testid": "divergence-warning" },
|
|
408
|
-
React.createElement("p", null, "\u30EA\u30E2\u30FC\u30C8\u3068\u30ED\u30FC\u30AB\u30EB\u306E\u4E21\u65B9\u306B\u672A\u89E3\u6C7A\u306E\u5DEE\u5206\u304C\u3042\u308B\u305F\u3081\u3001Web UI \u3067\u3082 CLI \u3068\u540C\u69D8\u306B\u8D77\u52D5\u3092\u30D6\u30ED\u30C3\u30AF\u3057\u3066\u3044\u307E\u3059\u3002"),
|
|
409
|
-
React.createElement("ul", { className: "list-muted" },
|
|
410
|
-
React.createElement("li", null,
|
|
411
|
-
"git fetch && git pull --ff-only origin ",
|
|
412
|
-
branch.name),
|
|
413
|
-
React.createElement("li", null,
|
|
414
|
-
"\u5FC5\u8981\u306B\u5FDC\u3058\u3066 git push origin ",
|
|
415
|
-
branch.name,
|
|
416
|
-
" ",
|
|
417
|
-
"\u3067\u30ED\u30FC\u30AB\u30EB\u9032\u6357\u3092\u5171\u6709")),
|
|
418
|
-
React.createElement("p", { className: "section-card__body" }, "rebase / merge \u306A\u3069\u3067\u5DEE\u5206\u3092\u89E3\u6D88\u3057\u305F\u5F8C\u306B\u30DA\u30FC\u30B8\u3092\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044\u3002"))),
|
|
419
|
-
React.createElement("div", { className: "tool-card__actions" },
|
|
420
|
-
React.createElement("button", { type: "button", className: "button button--primary", onClick: handleStartSession, disabled: isStartingSession ||
|
|
421
|
-
!selectedTool ||
|
|
422
|
-
hasBlockingDivergence ||
|
|
423
|
-
needsRemoteSync ||
|
|
424
|
-
isSyncingBranch }, isStartingSession ? "起動中..." : "セッションを起動"),
|
|
425
|
-
React.createElement("button", { type: "button", className: "button button--secondary", onClick: handleSyncBranch, disabled: !branch.worktreePath || isSyncingBranch }, isSyncingBranch ? "同期中..." : "最新の変更を同期"),
|
|
426
|
-
React.createElement(Link, { to: "/config", className: "button button--ghost" }, "\u8A2D\u5B9A\u3092\u7DE8\u96C6")),
|
|
427
|
-
selectedToolSummary && (React.createElement("dl", { className: "metadata-grid metadata-grid--compact" },
|
|
428
|
-
React.createElement("div", null,
|
|
429
|
-
React.createElement("dt", null, "\u30B3\u30DE\u30F3\u30C9"),
|
|
430
|
-
React.createElement("dd", { className: "tool-card__command" }, selectedToolSummary.command)),
|
|
431
|
-
React.createElement("div", null,
|
|
432
|
-
React.createElement("dt", null, "defaultArgs"),
|
|
433
|
-
React.createElement("dd", null, renderArgs(selectedToolSummary.defaultArgs))),
|
|
434
|
-
React.createElement("div", null,
|
|
435
|
-
React.createElement("dt", null, "permissionSkipArgs"),
|
|
436
|
-
React.createElement("dd", null, renderArgs(selectedToolSummary.permissionSkipArgs))),
|
|
437
|
-
argsPreview && (React.createElement("div", { className: "metadata-grid__full" },
|
|
438
|
-
React.createElement("dt", null, "\u6700\u7D42\u7684\u306B\u5B9F\u884C\u3055\u308C\u308B\u30B3\u30DE\u30F3\u30C9"),
|
|
439
|
-
React.createElement("dd", { className: "tool-card__command" },
|
|
440
|
-
argsPreview.command,
|
|
441
|
-
" ",
|
|
442
|
-
argsPreview.args.join(" "))))))))),
|
|
443
|
-
React.createElement("section", { className: "section-card" },
|
|
444
|
-
React.createElement("header", { className: "terminal-section__header" },
|
|
445
|
-
React.createElement("div", null,
|
|
446
|
-
React.createElement("h2", null, "\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74"),
|
|
447
|
-
React.createElement("p", { className: "section-card__body" }, "\u3053\u306E Worktree \u306B\u7D10\u3065\u3044\u305F\u6700\u65B0\u306E AI \u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002CLI \u304B\u3089\u306E\u8D77\u52D5\u5206\u3082\u5171\u6709\u3055\u308C\u307E\u3059\u3002")),
|
|
448
|
-
isSessionsLoading && (React.createElement("span", { className: "pill" }, "\u8AAD\u307F\u8FBC\u307F\u4E2D..."))),
|
|
449
|
-
branchSessions.length === 0 ? (React.createElement("p", { className: "section-card__body" }, "\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002")) : (React.createElement("div", { className: "session-table-wrapper" },
|
|
450
|
-
React.createElement("table", { className: "session-table" },
|
|
451
|
-
React.createElement("thead", null,
|
|
452
|
-
React.createElement("tr", null,
|
|
453
|
-
React.createElement("th", null, "\u72B6\u614B"),
|
|
454
|
-
React.createElement("th", null, "\u30C4\u30FC\u30EB"),
|
|
455
|
-
React.createElement("th", null, "\u30E2\u30FC\u30C9"),
|
|
456
|
-
React.createElement("th", null, "\u958B\u59CB\u6642\u523B"),
|
|
457
|
-
React.createElement("th", null, "\u7D42\u4E86\u6642\u523B"),
|
|
458
|
-
React.createElement("th", null, "\u64CD\u4F5C"))),
|
|
459
|
-
React.createElement("tbody", null, branchSessions.slice(0, 5).map((session) => (React.createElement("tr", { key: session.sessionId },
|
|
460
|
-
React.createElement("td", null,
|
|
461
|
-
React.createElement("span", { className: `status-pill status-pill--${session.status}` }, SESSION_STATUS_LABEL[session.status])),
|
|
462
|
-
React.createElement("td", null, session.toolType === "custom"
|
|
463
|
-
? (session.toolName ?? "custom")
|
|
464
|
-
: toolLabel(session.toolType)),
|
|
465
|
-
React.createElement("td", null, session.mode),
|
|
466
|
-
React.createElement("td", null, formatDate(session.startedAt)),
|
|
467
|
-
React.createElement("td", null, session.endedAt
|
|
468
|
-
? formatDate(session.endedAt)
|
|
469
|
-
: "--"),
|
|
470
|
-
React.createElement("td", null, session.status === "running" ? (React.createElement("button", { type: "button", className: "button button--ghost", onClick: () => handleTerminateSession(session.sessionId), disabled: terminatingSessionId === session.sessionId ||
|
|
471
|
-
deleteSession.isPending }, terminatingSessionId === session.sessionId
|
|
472
|
-
? "終了中..."
|
|
473
|
-
: "終了")) : (React.createElement("span", { className: "session-table__muted" }, "--"))))))))))),
|
|
474
|
-
React.createElement("section", { className: "section-card" },
|
|
475
|
-
React.createElement("header", null,
|
|
476
|
-
React.createElement("h2", null, "\u30D6\u30E9\u30F3\u30C1\u30A4\u30F3\u30B5\u30A4\u30C8")),
|
|
477
|
-
React.createElement("dl", { className: "metadata-grid" },
|
|
478
|
-
React.createElement("div", null,
|
|
479
|
-
React.createElement("dt", null, "\u30B3\u30DF\u30C3\u30C8"),
|
|
480
|
-
React.createElement("dd", null, branch.commitHash)),
|
|
481
|
-
React.createElement("div", null,
|
|
482
|
-
React.createElement("dt", null, "Author"),
|
|
483
|
-
React.createElement("dd", null, branch.author ?? "N/A")),
|
|
484
|
-
React.createElement("div", null,
|
|
485
|
-
React.createElement("dt", null, "\u66F4\u65B0\u65E5"),
|
|
486
|
-
React.createElement("dd", null, formattedCommitDate)),
|
|
487
|
-
React.createElement("div", null,
|
|
488
|
-
React.createElement("dt", null, "Worktree"),
|
|
489
|
-
React.createElement("dd", null, branch.worktreePath ?? "未作成")))),
|
|
490
|
-
React.createElement("section", { className: "section-card" },
|
|
491
|
-
React.createElement("header", null,
|
|
492
|
-
React.createElement("h2", null, "\u30B3\u30DF\u30C3\u30C8\u60C5\u5831")),
|
|
493
|
-
React.createElement("p", { className: "section-card__body" }, branch.commitMessage ?? "コミットメッセージがありません。")),
|
|
494
|
-
branch.divergence && (React.createElement("section", { className: "section-card" },
|
|
495
|
-
React.createElement("header", null,
|
|
496
|
-
React.createElement("h2", null, "\u5DEE\u5206\u72B6\u6CC1")),
|
|
497
|
-
React.createElement("div", { className: "pill-group" },
|
|
498
|
-
React.createElement("span", { className: "pill" },
|
|
499
|
-
"Ahead ",
|
|
500
|
-
branch.divergence.ahead),
|
|
501
|
-
React.createElement("span", { className: "pill" },
|
|
502
|
-
"Behind ",
|
|
503
|
-
branch.divergence.behind),
|
|
504
|
-
React.createElement("span", { className: `pill ${branch.divergence.upToDate
|
|
505
|
-
? "pill--success"
|
|
506
|
-
: "pill--warning"}` }, branch.divergence.upToDate ? "最新" : "更新あり")))),
|
|
507
|
-
React.createElement("section", { className: "section-card" },
|
|
508
|
-
React.createElement("header", null,
|
|
509
|
-
React.createElement("h2", null, "Worktree\u60C5\u5831")),
|
|
510
|
-
React.createElement("ul", { className: "list-muted" },
|
|
511
|
-
React.createElement("li", null,
|
|
512
|
-
"\u30D1\u30B9: ",
|
|
513
|
-
React.createElement("strong", null, branch.worktreePath ?? "未作成")),
|
|
514
|
-
React.createElement("li", null, "AI\u30C4\u30FC\u30EB\u306E\u8D77\u52D5\u306B\u306F\u30AF\u30EA\u30FC\u30F3\u306A\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3067\u3042\u308B\u3053\u3068\u3092\u63A8\u5968\u3057\u307E\u3059\u3002"),
|
|
515
|
-
React.createElement("li", null, "Worktree\u3092\u518D\u4F5C\u6210\u3059\u308B\u3068\u65E2\u5B58\u306E\u30ED\u30FC\u30AB\u30EB\u5909\u66F4\u304C\u5931\u308F\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002")))),
|
|
516
|
-
React.createElement("div", { className: "terminal-column" }, activeSessionId ? (React.createElement("section", { className: `section-card terminal-section ${isTerminalFullscreen ? "terminal-section--fullscreen" : ""}`, "data-testid": "active-terminal" },
|
|
517
|
-
React.createElement("div", { className: "terminal-section__header" },
|
|
518
|
-
React.createElement("div", null,
|
|
519
|
-
React.createElement("h2", null, "\u30BF\u30FC\u30DF\u30CA\u30EB\u30BB\u30C3\u30B7\u30E7\u30F3"),
|
|
520
|
-
React.createElement("p", { className: "section-card__body" }, "\u51FA\u529B\u306F\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u306B\u30B9\u30C8\u30EA\u30FC\u30E0\u3055\u308C\u307E\u3059\u3002\u7D42\u4E86\u3059\u308B\u3068\u3053\u306E\u30D1\u30CD\u30EB\u306F\u81EA\u52D5\u3067\u9589\u3058\u307E\u3059\u3002")),
|
|
521
|
-
React.createElement("div", { className: "terminal-section__controls" },
|
|
522
|
-
React.createElement("button", { type: "button", className: "button button--ghost", onClick: () => setIsTerminalFullscreen((prev) => !prev) }, isTerminalFullscreen
|
|
523
|
-
? "通常表示に戻す"
|
|
524
|
-
: "ターミナルを最大化"))),
|
|
525
|
-
React.createElement("div", { className: "terminal-surface" },
|
|
526
|
-
React.createElement(Terminal, { sessionId: activeSessionId, onExit: handleSessionExit, onError: (message) => setBanner({
|
|
527
|
-
type: "error",
|
|
528
|
-
message: message ?? "不明なエラー",
|
|
529
|
-
}) })),
|
|
530
|
-
isTerminalFullscreen && (React.createElement("button", { type: "button", className: "terminal-section__close", "aria-label": "\u30BF\u30FC\u30DF\u30CA\u30EB\u3092\u9589\u3058\u308B", onClick: () => setIsTerminalFullscreen(false) }, "\u00D7")))) : (React.createElement("section", { className: "section-card session-hint" },
|
|
531
|
-
React.createElement("header", null,
|
|
532
|
-
React.createElement("h2", null, "\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u672A\u8D77\u52D5")),
|
|
533
|
-
React.createElement("p", { className: "section-card__body" }, "\u4E0A\u90E8\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u304B\u3089AI\u30C4\u30FC\u30EB\u3092\u8D77\u52D5\u3059\u308B\u3068\u3001\u3053\u306E\u30A8\u30EA\u30A2\u306B\u30BF\u30FC\u30DF\u30CA\u30EB\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002"))))))));
|
|
304
|
+
return (React.createElement("div", { className: "min-h-screen bg-background" },
|
|
305
|
+
isTerminalFullscreen && (React.createElement("div", { className: "fixed inset-0 z-40 bg-black/80", "aria-hidden": "true", onClick: () => setIsTerminalFullscreen(false) })),
|
|
306
|
+
React.createElement(PageHeader, { eyebrow: "BRANCH DETAIL", title: branch.name, subtitle: `最新コミット ${branch.commitHash.slice(0, 7)} · ${formattedCommitDate}` },
|
|
307
|
+
React.createElement("div", { className: "mt-4 flex flex-wrap gap-2" },
|
|
308
|
+
React.createElement(Badge, { variant: branch.type === "local" ? "local" : "remote" }, BRANCH_TYPE_LABEL[branch.type]),
|
|
309
|
+
React.createElement(Badge, { variant: branch.mergeStatus === "merged"
|
|
310
|
+
? "success"
|
|
311
|
+
: branch.mergeStatus === "unmerged"
|
|
312
|
+
? "warning"
|
|
313
|
+
: "outline" }, MERGE_STATUS_LABEL[branch.mergeStatus]),
|
|
314
|
+
React.createElement(Badge, { variant: branch.worktreePath ? "success" : "outline" }, branch.worktreePath ? "Worktreeあり" : "Worktree未作成")),
|
|
315
|
+
React.createElement("div", { className: "mt-4 flex flex-wrap gap-2" },
|
|
316
|
+
React.createElement(Button, { variant: "ghost", size: "sm", asChild: true },
|
|
317
|
+
React.createElement(Link, { to: "/" }, "\u2190 \u30D6\u30E9\u30F3\u30C1\u4E00\u89A7")),
|
|
318
|
+
!canStartSession ? (React.createElement(Button, { onClick: handleCreateWorktree, disabled: createWorktree.isPending }, createWorktree.isPending ? "作成中..." : "Worktreeを作成")) : (React.createElement(Button, { variant: "secondary", asChild: true },
|
|
319
|
+
React.createElement(Link, { to: "/config" }, "\u30AB\u30B9\u30BF\u30E0\u30C4\u30FC\u30EB\u8A2D\u5B9A"))))),
|
|
320
|
+
banner && (React.createElement("div", { className: "mx-auto max-w-7xl px-6 pt-4" },
|
|
321
|
+
React.createElement(Alert, { variant: banner.type === "error"
|
|
322
|
+
? "destructive"
|
|
323
|
+
: banner.type === "success"
|
|
324
|
+
? "success"
|
|
325
|
+
: "info" },
|
|
326
|
+
React.createElement(AlertDescription, null, banner.message)))),
|
|
327
|
+
React.createElement("main", { className: "mx-auto max-w-7xl space-y-6 px-6 py-8" },
|
|
328
|
+
React.createElement("div", { className: "grid gap-6 lg:grid-cols-[1fr_400px]" },
|
|
329
|
+
React.createElement("div", { className: "space-y-6" },
|
|
330
|
+
React.createElement(ToolLauncher, { branch: branch, availableTools: availableTools, selectedToolId: selectedToolId, selectedMode: selectedMode, skipPermissions: skipPermissions, extraArgsText: extraArgsText, isConfigLoading: isConfigLoading, configError: configError ?? null, isStartingSession: isStartingSession, isSyncingBranch: isSyncingBranch, needsRemoteSync: needsRemoteSync, hasBlockingDivergence: hasBlockingDivergence, onToolChange: setSelectedToolId, onModeChange: setSelectedMode, onSkipPermissionsChange: setSkipPermissions, onExtraArgsChange: setExtraArgsText, onStartSession: handleStartSession, onSyncBranch: handleSyncBranch }),
|
|
331
|
+
React.createElement(SessionHistoryTable, { sessions: branchSessions, isLoading: isSessionsLoading, terminatingSessionId: terminatingSessionId, isDeleting: deleteSession.isPending, onTerminate: handleTerminateSession, onSelectSession: setActiveSessionId }),
|
|
332
|
+
React.createElement(BranchInfoCards, { branch: branch, formattedCommitDate: formattedCommitDate, latestToolUsage: latestToolUsage })),
|
|
333
|
+
React.createElement("div", { className: "lg:sticky lg:top-6 lg:self-start" },
|
|
334
|
+
React.createElement(TerminalPanel, { sessionId: activeSessionId, isFullscreen: isTerminalFullscreen, onToggleFullscreen: () => setIsTerminalFullscreen((prev) => !prev), onExit: handleSessionExit, onError: (message) => setBanner({ type: "error", message: message ?? "不明なエラー" }) }))))));
|
|
534
335
|
}
|
|
336
|
+
// Helper functions
|
|
535
337
|
function formatDate(value) {
|
|
536
|
-
if (!value)
|
|
338
|
+
if (!value)
|
|
537
339
|
return "日時不明";
|
|
538
|
-
}
|
|
539
340
|
try {
|
|
540
|
-
const date = new Date(value);
|
|
541
341
|
return new Intl.DateTimeFormat("ja-JP", {
|
|
542
342
|
year: "numeric",
|
|
543
343
|
month: "short",
|
|
544
344
|
day: "numeric",
|
|
545
345
|
hour: "2-digit",
|
|
546
346
|
minute: "2-digit",
|
|
547
|
-
}).format(
|
|
347
|
+
}).format(new Date(value));
|
|
548
348
|
}
|
|
549
|
-
catch
|
|
349
|
+
catch {
|
|
550
350
|
return value;
|
|
551
351
|
}
|
|
552
352
|
}
|
|
@@ -554,63 +354,15 @@ function formatError(error, fallback) {
|
|
|
554
354
|
if (error instanceof ApiError) {
|
|
555
355
|
return `${error.message}${error.details ? `\n${error.details}` : ""}`;
|
|
556
356
|
}
|
|
557
|
-
if (error instanceof Error)
|
|
357
|
+
if (error instanceof Error)
|
|
558
358
|
return error.message;
|
|
559
|
-
}
|
|
560
359
|
return fallback;
|
|
561
360
|
}
|
|
562
361
|
function toolLabel(tool, selectedTool) {
|
|
563
|
-
if (tool === "custom" && selectedTool?.target === "custom")
|
|
362
|
+
if (tool === "custom" && selectedTool?.target === "custom")
|
|
564
363
|
return selectedTool.label;
|
|
565
|
-
|
|
566
|
-
if (tool === "codex-cli") {
|
|
364
|
+
if (tool === "codex-cli")
|
|
567
365
|
return "Codex CLI";
|
|
568
|
-
}
|
|
569
366
|
return "Claude Code";
|
|
570
367
|
}
|
|
571
|
-
function renderArgs(args) {
|
|
572
|
-
if (!args || args.length === 0) {
|
|
573
|
-
return React.createElement("span", { className: "tool-card__muted" }, "\u672A\u8A2D\u5B9A");
|
|
574
|
-
}
|
|
575
|
-
return args.join(" ");
|
|
576
|
-
}
|
|
577
|
-
const SESSION_STATUS_LABEL = {
|
|
578
|
-
pending: "pending",
|
|
579
|
-
running: "running",
|
|
580
|
-
completed: "completed",
|
|
581
|
-
failed: "failed",
|
|
582
|
-
};
|
|
583
|
-
function renderToolUsage(usage) {
|
|
584
|
-
const modeLabel = usage.mode === "normal"
|
|
585
|
-
? "New"
|
|
586
|
-
: usage.mode === "continue"
|
|
587
|
-
? "Continue"
|
|
588
|
-
: usage.mode === "resume"
|
|
589
|
-
? "Resume"
|
|
590
|
-
: null;
|
|
591
|
-
const toolText = mapToolLabel(usage.toolId, usage.toolLabel);
|
|
592
|
-
return [toolText, modeLabel, usage.model].filter(Boolean).join(" | ");
|
|
593
|
-
}
|
|
594
|
-
function formatUsageTimestamp(value) {
|
|
595
|
-
return formatDate(new Date(value).toISOString());
|
|
596
|
-
}
|
|
597
|
-
function mapToolLabel(toolId, toolLabel) {
|
|
598
|
-
if (toolId === "claude-code")
|
|
599
|
-
return "Claude";
|
|
600
|
-
if (toolId === "codex-cli")
|
|
601
|
-
return "Codex";
|
|
602
|
-
if (toolId === "gemini-cli")
|
|
603
|
-
return "Gemini";
|
|
604
|
-
if (toolId === "qwen-cli")
|
|
605
|
-
return "Qwen";
|
|
606
|
-
if (toolLabel)
|
|
607
|
-
return toolLabel;
|
|
608
|
-
return "Custom";
|
|
609
|
-
}
|
|
610
|
-
function parseExtraArgs(value) {
|
|
611
|
-
return value
|
|
612
|
-
.split(/\s+/)
|
|
613
|
-
.map((chunk) => chunk.trim())
|
|
614
|
-
.filter(Boolean);
|
|
615
|
-
}
|
|
616
368
|
//# sourceMappingURL=BranchDetailPage.js.map
|