@akiojin/gwt 4.9.1 → 4.11.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +4 -4
- package/README.md +4 -4
- package/dist/claude.d.ts +1 -0
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +52 -49
- package/dist/claude.js.map +1 -1
- package/dist/cli/ui/App.solid.d.ts +29 -0
- package/dist/cli/ui/App.solid.d.ts.map +1 -0
- package/dist/cli/ui/App.solid.js +1197 -0
- package/dist/cli/ui/App.solid.js.map +1 -0
- package/dist/cli/ui/components/solid/Footer.d.ts +10 -0
- package/dist/cli/ui/components/solid/Footer.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/Footer.js +10 -0
- package/dist/cli/ui/components/solid/Footer.js.map +1 -0
- package/dist/cli/ui/components/{parts → solid}/Header.d.ts +1 -6
- package/dist/cli/ui/components/solid/Header.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/Header.js +13 -0
- package/dist/cli/ui/components/solid/Header.js.map +1 -0
- package/dist/cli/ui/components/solid/HelpOverlay.d.ts +8 -0
- package/dist/cli/ui/components/solid/HelpOverlay.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/HelpOverlay.js +118 -0
- package/dist/cli/ui/components/solid/HelpOverlay.js.map +1 -0
- package/dist/cli/ui/components/solid/QuickStartStep.d.ts +17 -0
- package/dist/cli/ui/components/solid/QuickStartStep.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/QuickStartStep.js +139 -0
- package/dist/cli/ui/components/solid/QuickStartStep.js.map +1 -0
- package/dist/cli/ui/components/solid/SelectInput.d.ts +22 -0
- package/dist/cli/ui/components/solid/SelectInput.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/SelectInput.js +44 -0
- package/dist/cli/ui/components/solid/SelectInput.js.map +1 -0
- package/dist/cli/ui/components/solid/TextInput.d.ts +12 -0
- package/dist/cli/ui/components/solid/TextInput.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/TextInput.js +9 -0
- package/dist/cli/ui/components/solid/TextInput.js.map +1 -0
- package/dist/cli/ui/components/solid/WizardController.d.ts +34 -0
- package/dist/cli/ui/components/solid/WizardController.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/WizardController.js +215 -0
- package/dist/cli/ui/components/solid/WizardController.js.map +1 -0
- package/dist/cli/ui/components/solid/WizardPopup.d.ts +26 -0
- package/dist/cli/ui/components/solid/WizardPopup.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/WizardPopup.js +68 -0
- package/dist/cli/ui/components/solid/WizardPopup.js.map +1 -0
- package/dist/cli/ui/components/solid/WizardSteps.d.ts +52 -0
- package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/WizardSteps.js +462 -0
- package/dist/cli/ui/components/solid/WizardSteps.js.map +1 -0
- package/dist/cli/ui/core/index.d.ts +12 -0
- package/dist/cli/ui/core/index.d.ts.map +1 -0
- package/dist/cli/ui/core/index.js +15 -0
- package/dist/cli/ui/core/index.js.map +1 -0
- package/dist/cli/ui/core/keybindings.d.ts +106 -0
- package/dist/cli/ui/core/keybindings.d.ts.map +1 -0
- package/dist/cli/ui/core/keybindings.js +270 -0
- package/dist/cli/ui/core/keybindings.js.map +1 -0
- package/dist/cli/ui/core/theme.d.ts +114 -0
- package/dist/cli/ui/core/theme.d.ts.map +1 -0
- package/dist/cli/ui/core/theme.js +170 -0
- package/dist/cli/ui/core/theme.js.map +1 -0
- package/dist/cli/ui/core/types.d.ts +156 -0
- package/dist/cli/ui/core/types.d.ts.map +1 -0
- package/dist/cli/ui/core/types.js +10 -0
- package/dist/cli/ui/core/types.js.map +1 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.d.ts +26 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.d.ts.map +1 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.js +89 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.js.map +1 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts +10 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts.map +1 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.js +16 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.js.map +1 -0
- package/dist/cli/ui/index.solid.d.ts +5 -0
- package/dist/cli/ui/index.solid.d.ts.map +1 -0
- package/dist/cli/ui/index.solid.js +21 -0
- package/dist/cli/ui/index.solid.js.map +1 -0
- package/dist/cli/ui/{components/screens → screens/solid}/BranchListScreen.d.ts +8 -22
- package/dist/cli/ui/screens/solid/BranchListScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.js +756 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts +10 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.js +37 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts +14 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.js +91 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.d.ts +8 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.js +18 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/InputScreen.d.ts +13 -0
- package/dist/cli/ui/screens/solid/InputScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/InputScreen.js +17 -0
- package/dist/cli/ui/screens/solid/InputScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts +9 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.js +43 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.js.map +1 -0
- package/dist/cli/ui/{components/screens → screens/solid}/LogDetailScreen.d.ts +2 -2
- package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/LogDetailScreen.js +34 -0
- package/dist/cli/ui/screens/solid/LogDetailScreen.js.map +1 -0
- package/dist/cli/ui/{components/screens/LogListScreen.d.ts → screens/solid/LogScreen.d.ts} +4 -4
- package/dist/cli/ui/screens/solid/LogScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/LogScreen.js +95 -0
- package/dist/cli/ui/screens/solid/LogScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts +17 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.js +112 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.d.ts +17 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.js +50 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.d.ts +20 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.js +90 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts +13 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js +59 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js.map +1 -0
- package/dist/cli/ui/stores/appStore.d.ts +143 -0
- package/dist/cli/ui/stores/appStore.d.ts.map +1 -0
- package/dist/cli/ui/stores/appStore.js +158 -0
- package/dist/cli/ui/stores/appStore.js.map +1 -0
- package/dist/cli/ui/stores/branchStore.d.ts +159 -0
- package/dist/cli/ui/stores/branchStore.d.ts.map +1 -0
- package/dist/cli/ui/stores/branchStore.js +275 -0
- package/dist/cli/ui/stores/branchStore.js.map +1 -0
- package/dist/cli/ui/stores/index.d.ts +11 -0
- package/dist/cli/ui/stores/index.d.ts.map +1 -0
- package/dist/cli/ui/stores/index.js +14 -0
- package/dist/cli/ui/stores/index.js.map +1 -0
- package/dist/cli/ui/stores/uiStore.d.ts +146 -0
- package/dist/cli/ui/stores/uiStore.d.ts.map +1 -0
- package/dist/cli/ui/stores/uiStore.js +166 -0
- package/dist/cli/ui/stores/uiStore.js.map +1 -0
- package/dist/cli/ui/types.d.ts +16 -1
- 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 -210
- package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
- package/dist/cli/ui/utils/continueSession.d.ts +4 -0
- package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
- package/dist/cli/ui/utils/continueSession.js +30 -0
- package/dist/cli/ui/utils/continueSession.js.map +1 -1
- package/dist/client/assets/{index-ChHC-Puh.css → index-BbfV7Wuj.css} +1 -1
- package/dist/client/assets/index-CoAyq5x1.js +78 -0
- package/dist/client/index.html +2 -2
- package/dist/codex.d.ts +1 -0
- package/dist/codex.d.ts.map +1 -1
- package/dist/codex.js +86 -45
- package/dist/codex.js.map +1 -1
- package/dist/config/builtin-coding-agents.d.ts +4 -0
- package/dist/config/builtin-coding-agents.d.ts.map +1 -1
- package/dist/config/builtin-coding-agents.js +18 -3
- package/dist/config/builtin-coding-agents.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/tools.d.ts.map +1 -1
- package/dist/config/tools.js +11 -0
- package/dist/config/tools.js.map +1 -1
- package/dist/gemini.d.ts +1 -0
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +42 -37
- package/dist/gemini.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +122 -102
- package/dist/index.js.map +1 -1
- package/dist/launcher.d.ts.map +1 -1
- package/dist/launcher.js +18 -3
- package/dist/launcher.js.map +1 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +26 -9
- package/dist/logging/logger.js.map +1 -1
- package/dist/opentui/highlights-eq9cgrbb.scm +604 -0
- package/dist/opentui/highlights-ghv9g403.scm +205 -0
- package/dist/opentui/highlights-hk7bwhj4.scm +284 -0
- package/dist/opentui/highlights-r812a2qc.scm +150 -0
- package/dist/opentui/highlights-x6tmsnaa.scm +115 -0
- package/dist/opentui/index.solid.d.ts +2 -0
- package/dist/opentui/index.solid.d.ts.map +1 -0
- package/dist/opentui/index.solid.js +52034 -0
- package/dist/opentui/index.solid.js.map +1 -0
- package/dist/opentui/injections-73j83es3.scm +27 -0
- package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
- package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
- package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
- package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
- package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
- package/dist/repositories/worktree.repository.d.ts +1 -0
- package/dist/repositories/worktree.repository.d.ts.map +1 -1
- package/dist/repositories/worktree.repository.js +7 -0
- package/dist/repositories/worktree.repository.js.map +1 -1
- package/dist/services/codingAgentResolver.d.ts +2 -0
- package/dist/services/codingAgentResolver.d.ts.map +1 -1
- package/dist/services/codingAgentResolver.js +30 -4
- package/dist/services/codingAgentResolver.js.map +1 -1
- package/dist/services/dependency-installer.d.ts.map +1 -1
- package/dist/services/dependency-installer.js +0 -5
- package/dist/services/dependency-installer.js.map +1 -1
- package/dist/types/api.d.ts +3 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/coding-agent.d.ts +62 -0
- package/dist/types/coding-agent.d.ts.map +1 -0
- package/dist/types/coding-agent.js +29 -0
- package/dist/types/coding-agent.js.map +1 -0
- package/dist/types/tools.d.ts +17 -0
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/coding-agent-colors.d.ts +88 -0
- package/dist/utils/coding-agent-colors.d.ts.map +1 -0
- package/dist/utils/coding-agent-colors.js +137 -0
- package/dist/utils/coding-agent-colors.js.map +1 -0
- package/dist/utils/command.d.ts +1 -1
- package/dist/utils/command.d.ts.map +1 -1
- package/dist/utils/command.js +10 -1
- package/dist/utils/command.js.map +1 -1
- package/dist/utils/error-utils.d.ts +27 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +98 -0
- package/dist/utils/error-utils.js.map +1 -0
- package/dist/utils/npmRegistry.d.ts +61 -0
- package/dist/utils/npmRegistry.d.ts.map +1 -0
- package/dist/utils/npmRegistry.js +180 -0
- package/dist/utils/npmRegistry.js.map +1 -0
- package/dist/utils/prompt.d.ts +1 -1
- package/dist/utils/prompt.js +1 -1
- package/dist/utils/session/index.d.ts +5 -3
- package/dist/utils/session/index.d.ts.map +1 -1
- package/dist/utils/session/index.js +5 -2
- package/dist/utils/session/index.js.map +1 -1
- package/dist/utils/session/parsers/codex.d.ts.map +1 -1
- package/dist/utils/session/parsers/codex.js +8 -1
- package/dist/utils/session/parsers/codex.js.map +1 -1
- package/dist/utils/session/parsers/index.d.ts +1 -0
- package/dist/utils/session/parsers/index.d.ts.map +1 -1
- package/dist/utils/session/parsers/index.js +2 -0
- package/dist/utils/session/parsers/index.js.map +1 -1
- package/dist/utils/session/parsers/opencode.d.ts +23 -0
- package/dist/utils/session/parsers/opencode.d.ts.map +1 -0
- package/dist/utils/session/parsers/opencode.js +89 -0
- package/dist/utils/session/parsers/opencode.js.map +1 -0
- package/dist/utils/session/types.d.ts +4 -0
- package/dist/utils/session/types.d.ts.map +1 -1
- package/dist/utils/terminal.d.ts +1 -0
- package/dist/utils/terminal.d.ts.map +1 -1
- package/dist/utils/terminal.js +20 -0
- package/dist/utils/terminal.js.map +1 -1
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +33 -2
- package/dist/utils.js.map +1 -1
- package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +1 -1
- package/dist/web/client/src/components/CodingAgentLaunchModal.js +7 -16
- package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +7 -2
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +2 -1
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +2 -2
- package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/ToolLauncher.js +5 -5
- package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -1
- package/dist/web/client/src/lib/coding-agent-colors.d.ts +86 -0
- package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +1 -0
- package/dist/web/client/src/lib/coding-agent-colors.js +135 -0
- package/dist/web/client/src/lib/coding-agent-colors.js.map +1 -0
- package/dist/web/client/src/pages/BranchDetailPage.js +10 -10
- package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
- package/dist/web/server/pty/manager.d.ts +2 -0
- package/dist/web/server/pty/manager.d.ts.map +1 -1
- package/dist/web/server/pty/manager.js +104 -0
- package/dist/web/server/pty/manager.js.map +1 -1
- package/dist/web/server/routes/sessions.d.ts.map +1 -1
- package/dist/web/server/routes/sessions.js +5 -1
- package/dist/web/server/routes/sessions.js.map +1 -1
- package/dist/web/server/services/branches.d.ts.map +1 -1
- package/dist/web/server/services/branches.js +10 -8
- package/dist/web/server/services/branches.js.map +1 -1
- package/dist/web/server/services/worktrees.js +2 -2
- package/dist/web/server/services/worktrees.js.map +1 -1
- package/dist/worktree.d.ts +47 -1
- package/dist/worktree.d.ts.map +1 -1
- package/dist/worktree.js +280 -94
- package/dist/worktree.js.map +1 -1
- package/package.json +12 -14
- package/src/claude.ts +68 -70
- package/src/cli/ui/App.solid.tsx +1823 -0
- package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +255 -0
- package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +243 -0
- package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +237 -0
- package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +231 -0
- package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +238 -0
- package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +7 -289
- package/src/cli/ui/__tests__/utils/clipboard.test.ts +3 -3
- package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +1 -1
- package/src/cli/ui/components/solid/Footer.tsx +36 -0
- package/src/cli/ui/components/{parts → solid}/Header.tsx +17 -28
- package/src/cli/ui/components/solid/HelpOverlay.tsx +194 -0
- package/src/cli/ui/components/solid/QuickStartStep.tsx +197 -0
- package/src/cli/ui/components/{parts → solid}/ScrollableList.tsx +7 -8
- package/src/cli/ui/components/solid/SearchInput.tsx +42 -0
- package/src/cli/ui/components/solid/SelectInput.tsx +84 -0
- package/src/cli/ui/components/solid/Stats.tsx +92 -0
- package/src/cli/ui/components/solid/TextInput.tsx +49 -0
- package/src/cli/ui/components/solid/WizardController.tsx +384 -0
- package/src/cli/ui/components/solid/WizardPopup.tsx +135 -0
- package/src/cli/ui/components/solid/WizardSteps.tsx +793 -0
- package/src/cli/ui/core/index.ts +17 -0
- package/src/cli/ui/core/keybindings.ts +367 -0
- package/src/cli/ui/core/theme.ts +234 -0
- package/src/cli/ui/core/types.ts +235 -0
- package/src/cli/ui/hooks/solid/useAsyncOperation.ts +76 -0
- package/src/cli/ui/hooks/solid/useFilter.ts +86 -0
- package/src/cli/ui/hooks/solid/useGitOperations.ts +80 -0
- package/src/cli/ui/hooks/solid/useKeyHandler.ts +103 -0
- package/src/cli/ui/hooks/solid/useScrollableList.ts +149 -0
- package/src/cli/ui/hooks/solid/useSelection.ts +77 -0
- package/src/cli/ui/hooks/solid/useTerminalSize.ts +22 -0
- package/src/cli/ui/index.solid.ts +28 -0
- package/src/cli/ui/screens/solid/BranchListScreen.tsx +1050 -0
- package/src/cli/ui/screens/solid/ConfirmScreen.tsx +74 -0
- package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +159 -0
- package/src/cli/ui/screens/solid/ErrorScreen.tsx +42 -0
- package/src/cli/ui/screens/solid/InputScreen.tsx +55 -0
- package/src/cli/ui/screens/solid/LoadingIndicator.tsx +77 -0
- package/src/cli/ui/screens/solid/LogDetailScreen.tsx +75 -0
- package/src/cli/ui/screens/solid/LogScreen.tsx +175 -0
- package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +192 -0
- package/src/cli/ui/screens/solid/ProfileScreen.tsx +98 -0
- package/src/cli/ui/screens/solid/SelectorScreen.tsx +170 -0
- package/src/cli/ui/screens/solid/SettingsScreen.tsx +50 -0
- package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +136 -0
- package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +40 -0
- package/src/cli/ui/stores/appStore.ts +208 -0
- package/src/cli/ui/stores/branchStore.ts +357 -0
- package/src/cli/ui/stores/index.ts +31 -0
- package/src/cli/ui/stores/uiStore.ts +226 -0
- package/src/cli/ui/types.ts +20 -3
- package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +180 -0
- package/src/cli/ui/utils/branchFormatter.ts +8 -215
- package/src/cli/ui/utils/continueSession.ts +44 -0
- package/src/cli/ui/utils/modelOptions.test.ts +1 -1
- package/src/codex.ts +100 -43
- package/src/config/__tests__/saveSession.test.ts +143 -0
- package/src/config/builtin-coding-agents.ts +19 -3
- package/src/config/index.ts +4 -0
- package/src/config/tools.ts +16 -0
- package/src/gemini.ts +58 -43
- package/src/index.test.ts +12 -12
- package/src/index.ts +164 -142
- package/src/launcher.ts +22 -3
- package/src/logging/logger.ts +32 -10
- package/src/opentui/index.solid.ts +1 -0
- package/src/repositories/worktree.repository.ts +8 -0
- package/src/services/__tests__/BatchMergeService.test.ts +62 -66
- package/src/services/__tests__/WorktreeOrchestrator.test.ts +8 -7
- package/src/services/codingAgentResolver.ts +30 -4
- package/src/services/dependency-installer.ts +0 -7
- package/src/types/api.ts +3 -0
- package/src/types/coding-agent.ts +85 -0
- package/src/types/tools.ts +19 -0
- package/src/utils/__tests__/npmRegistry.test.ts +250 -0
- package/src/utils/__tests__/prompt.test.ts +4 -5
- package/src/utils/coding-agent-colors.ts +165 -0
- package/src/utils/command.ts +10 -1
- package/src/utils/error-utils.ts +133 -0
- package/src/utils/npmRegistry.ts +249 -0
- package/src/utils/prompt.ts +1 -1
- package/src/utils/session/index.ts +10 -2
- package/src/utils/session/parsers/codex.ts +9 -1
- package/src/utils/session/parsers/index.ts +6 -0
- package/src/utils/session/parsers/opencode.ts +110 -0
- package/src/utils/session/types.ts +5 -0
- package/src/utils/terminal.ts +24 -0
- package/src/utils.test.ts +1 -1
- package/src/utils.ts +37 -4
- package/src/web/client/src/components/CodingAgentLaunchModal.tsx +12 -21
- package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +16 -1
- package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +7 -1
- package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +11 -6
- package/src/web/client/src/lib/coding-agent-colors.ts +149 -0
- package/src/web/client/src/pages/BranchDetailPage.tsx +11 -11
- package/src/web/server/pty/manager.ts +139 -0
- package/src/web/server/routes/sessions.ts +6 -0
- package/src/web/server/services/branches.ts +11 -8
- package/src/web/server/services/worktrees.ts +2 -2
- package/src/worktree.ts +366 -107
- package/dist/cli/ui/components/App.d.ts +0 -25
- package/dist/cli/ui/components/App.d.ts.map +0 -1
- package/dist/cli/ui/components/App.js +0 -988
- package/dist/cli/ui/components/App.js.map +0 -1
- package/dist/cli/ui/components/common/Confirm.d.ts +0 -13
- package/dist/cli/ui/components/common/Confirm.d.ts.map +0 -1
- package/dist/cli/ui/components/common/Confirm.js +0 -20
- package/dist/cli/ui/components/common/Confirm.js.map +0 -1
- package/dist/cli/ui/components/common/ErrorBoundary.d.ts +0 -23
- package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +0 -1
- package/dist/cli/ui/components/common/ErrorBoundary.js +0 -37
- package/dist/cli/ui/components/common/ErrorBoundary.js.map +0 -1
- package/dist/cli/ui/components/common/Input.d.ts +0 -19
- package/dist/cli/ui/components/common/Input.d.ts.map +0 -1
- package/dist/cli/ui/components/common/Input.js +0 -22
- package/dist/cli/ui/components/common/Input.js.map +0 -1
- package/dist/cli/ui/components/common/LoadingIndicator.d.ts +0 -19
- package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +0 -1
- package/dist/cli/ui/components/common/LoadingIndicator.js +0 -61
- package/dist/cli/ui/components/common/LoadingIndicator.js.map +0 -1
- package/dist/cli/ui/components/common/Select.d.ts +0 -38
- package/dist/cli/ui/components/common/Select.d.ts.map +0 -1
- package/dist/cli/ui/components/common/Select.js +0 -151
- package/dist/cli/ui/components/common/Select.js.map +0 -1
- package/dist/cli/ui/components/common/SpinnerIcon.d.ts +0 -20
- package/dist/cli/ui/components/common/SpinnerIcon.d.ts.map +0 -1
- package/dist/cli/ui/components/common/SpinnerIcon.js +0 -61
- package/dist/cli/ui/components/common/SpinnerIcon.js.map +0 -1
- package/dist/cli/ui/components/parts/Footer.d.ts +0 -15
- package/dist/cli/ui/components/parts/Footer.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/Footer.js +0 -20
- package/dist/cli/ui/components/parts/Footer.js.map +0 -1
- package/dist/cli/ui/components/parts/Header.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/Header.js +0 -24
- package/dist/cli/ui/components/parts/Header.js.map +0 -1
- package/dist/cli/ui/components/parts/MergeStatusList.d.ts +0 -13
- package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/MergeStatusList.js +0 -52
- package/dist/cli/ui/components/parts/MergeStatusList.js.map +0 -1
- package/dist/cli/ui/components/parts/ProgressBar.d.ts +0 -13
- package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/ProgressBar.js +0 -53
- package/dist/cli/ui/components/parts/ProgressBar.js.map +0 -1
- package/dist/cli/ui/components/parts/ScrollableList.d.ts +0 -12
- package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/ScrollableList.js +0 -11
- package/dist/cli/ui/components/parts/ScrollableList.js.map +0 -1
- package/dist/cli/ui/components/parts/Stats.d.ts +0 -10
- package/dist/cli/ui/components/parts/Stats.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/Stats.js +0 -55
- package/dist/cli/ui/components/parts/Stats.js.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +0 -17
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +0 -42
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +0 -17
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +0 -72
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +0 -18
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js +0 -151
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BranchListScreen.js +0 -476
- package/dist/cli/ui/components/screens/BranchListScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +0 -30
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +0 -145
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts +0 -27
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js +0 -93
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +0 -19
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +0 -577
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +0 -45
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +0 -95
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +0 -10
- package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/LogDatePickerScreen.js +0 -44
- package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/LogDetailScreen.js +0 -34
- package/dist/cli/ui/components/screens/LogDetailScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/LogListScreen.js +0 -107
- package/dist/cli/ui/components/screens/LogListScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +0 -24
- package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/ModelSelectorScreen.js +0 -197
- package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +0 -29
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/PRCleanupScreen.js +0 -92
- package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +0 -31
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js +0 -67
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +0 -1
- package/dist/cli/ui/hooks/useAppInput.d.ts +0 -21
- package/dist/cli/ui/hooks/useAppInput.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useAppInput.js +0 -138
- package/dist/cli/ui/hooks/useAppInput.js.map +0 -1
- package/dist/cli/ui/hooks/useBatchMerge.d.ts +0 -17
- package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useBatchMerge.js +0 -77
- package/dist/cli/ui/hooks/useBatchMerge.js.map +0 -1
- package/dist/cli/ui/hooks/useGitData.d.ts +0 -21
- package/dist/cli/ui/hooks/useGitData.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useGitData.js +0 -229
- package/dist/cli/ui/hooks/useGitData.js.map +0 -1
- package/dist/cli/ui/hooks/useProfiles.d.ts +0 -41
- package/dist/cli/ui/hooks/useProfiles.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useProfiles.js +0 -136
- package/dist/cli/ui/hooks/useProfiles.js.map +0 -1
- package/dist/cli/ui/hooks/useScreenState.d.ts +0 -12
- package/dist/cli/ui/hooks/useScreenState.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useScreenState.js +0 -30
- package/dist/cli/ui/hooks/useScreenState.js.map +0 -1
- package/dist/cli/ui/hooks/useTerminalSize.d.ts +0 -9
- package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useTerminalSize.js +0 -24
- package/dist/cli/ui/hooks/useTerminalSize.js.map +0 -1
- package/dist/cli/ui/hooks/useToolStatus.d.ts +0 -30
- package/dist/cli/ui/hooks/useToolStatus.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useToolStatus.js +0 -49
- package/dist/cli/ui/hooks/useToolStatus.js.map +0 -1
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +0 -24
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js +0 -65
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +0 -1
- package/dist/client/assets/index-LNPtOrn3.js +0 -78
- package/src/cli/ui/__tests__/SKIPPED_TESTS.md +0 -119
- package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +0 -239
- package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +0 -225
- package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +0 -219
- package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +0 -212
- package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +0 -440
- package/src/cli/ui/__tests__/components/App.test.tsx +0 -365
- package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +0 -91
- package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +0 -80
- package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +0 -104
- package/src/cli/ui/__tests__/components/common/Input.test.tsx +0 -100
- package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +0 -148
- package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +0 -255
- package/src/cli/ui/__tests__/components/common/Select.test.tsx +0 -335
- package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +0 -65
- package/src/cli/ui/__tests__/components/parts/Header.test.tsx +0 -55
- package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +0 -69
- package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +0 -148
- package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +0 -253
- package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +0 -1070
- package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +0 -142
- package/src/cli/ui/__tests__/components/screens/CodingAgentSelectorScreen.test.tsx +0 -174
- package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +0 -182
- package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +0 -57
- package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +0 -102
- package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +0 -216
- package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +0 -147
- package/src/cli/ui/__tests__/hooks/useGitData.nonblocking.test.tsx +0 -206
- package/src/cli/ui/__tests__/hooks/useGitData.test.ts +0 -197
- package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +0 -228
- package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +0 -147
- package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +0 -99
- package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +0 -253
- package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +0 -436
- package/src/cli/ui/__tests__/integration/navigation.test.tsx +0 -514
- package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +0 -509
- package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +0 -216
- package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +0 -193
- package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +0 -234
- package/src/cli/ui/components/App.tsx +0 -1456
- package/src/cli/ui/components/common/Confirm.tsx +0 -44
- package/src/cli/ui/components/common/ErrorBoundary.tsx +0 -60
- package/src/cli/ui/components/common/Input.tsx +0 -58
- package/src/cli/ui/components/common/LoadingIndicator.tsx +0 -98
- package/src/cli/ui/components/common/Select.tsx +0 -247
- package/src/cli/ui/components/common/SpinnerIcon.tsx +0 -86
- package/src/cli/ui/components/parts/Footer.tsx +0 -41
- package/src/cli/ui/components/parts/Header.test.tsx +0 -75
- package/src/cli/ui/components/parts/MergeStatusList.tsx +0 -75
- package/src/cli/ui/components/parts/ProgressBar.tsx +0 -73
- package/src/cli/ui/components/parts/Stats.tsx +0 -88
- package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +0 -74
- package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +0 -108
- package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +0 -242
- package/src/cli/ui/components/screens/BranchListScreen.tsx +0 -744
- package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +0 -241
- package/src/cli/ui/components/screens/CodingAgentSelectorScreen.tsx +0 -159
- package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +0 -928
- package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +0 -176
- package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +0 -83
- package/src/cli/ui/components/screens/LogDetailScreen.tsx +0 -67
- package/src/cli/ui/components/screens/LogListScreen.tsx +0 -192
- package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +0 -320
- package/src/cli/ui/components/screens/PRCleanupScreen.tsx +0 -171
- package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +0 -135
- package/src/cli/ui/hooks/useAppInput.ts +0 -172
- package/src/cli/ui/hooks/useBatchMerge.ts +0 -96
- package/src/cli/ui/hooks/useGitData.ts +0 -347
- package/src/cli/ui/hooks/useProfiles.ts +0 -211
- package/src/cli/ui/hooks/useScreenState.ts +0 -44
- package/src/cli/ui/hooks/useTerminalSize.ts +0 -33
- package/src/cli/ui/hooks/useToolStatus.ts +0 -68
- package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +0 -111
- package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +0 -264
package/src/worktree.ts
CHANGED
|
@@ -2,11 +2,15 @@ import { execa } from "execa";
|
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import chalk from "chalk";
|
|
5
|
+
import { createLogger } from "./logging/logger.js";
|
|
6
|
+
|
|
7
|
+
const logger = createLogger({ category: "worktree" });
|
|
5
8
|
import {
|
|
6
9
|
WorktreeConfig,
|
|
7
10
|
WorktreeWithPR,
|
|
8
11
|
CleanupTarget,
|
|
9
12
|
CleanupReason,
|
|
13
|
+
CleanupStatus,
|
|
10
14
|
} from "./cli/ui/types.js";
|
|
11
15
|
import { getPullRequestByBranch } from "./github.js";
|
|
12
16
|
import {
|
|
@@ -44,6 +48,65 @@ async function getUpstreamBranch(branch: string): Promise<string | null> {
|
|
|
44
48
|
}
|
|
45
49
|
}
|
|
46
50
|
|
|
51
|
+
const parseRemoteRef = (
|
|
52
|
+
ref: string,
|
|
53
|
+
): { remote: string; branch: string } | null => {
|
|
54
|
+
const segments = ref.split("/");
|
|
55
|
+
if (segments.length < 2) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const [remote, ...rest] = segments;
|
|
59
|
+
const branch = rest.join("/");
|
|
60
|
+
if (!remote || !branch) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return { remote, branch };
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
async function resolveUpstreamStatus(
|
|
67
|
+
branch: string,
|
|
68
|
+
repoRoot: string,
|
|
69
|
+
): Promise<{ upstream: string | null; hasUpstream: boolean }> {
|
|
70
|
+
const upstream = await getUpstreamBranch(branch);
|
|
71
|
+
if (!upstream) {
|
|
72
|
+
return { upstream: null, hasUpstream: false };
|
|
73
|
+
}
|
|
74
|
+
const parsed = parseRemoteRef(upstream);
|
|
75
|
+
if (!parsed) {
|
|
76
|
+
return { upstream, hasUpstream: false };
|
|
77
|
+
}
|
|
78
|
+
if (parsed.branch !== branch) {
|
|
79
|
+
return { upstream, hasUpstream: false };
|
|
80
|
+
}
|
|
81
|
+
const exists = await checkRemoteBranchExists(parsed.branch, parsed.remote, {
|
|
82
|
+
cwd: repoRoot,
|
|
83
|
+
});
|
|
84
|
+
return { upstream, hasUpstream: exists };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const buildCleanupReasons = ({
|
|
88
|
+
hasUniqueCommits,
|
|
89
|
+
hasUncommitted,
|
|
90
|
+
hasUnpushed,
|
|
91
|
+
hasUpstream,
|
|
92
|
+
}: {
|
|
93
|
+
hasUniqueCommits: boolean;
|
|
94
|
+
hasUncommitted: boolean;
|
|
95
|
+
hasUnpushed: boolean;
|
|
96
|
+
hasUpstream: boolean;
|
|
97
|
+
}): CleanupReason[] => {
|
|
98
|
+
if (!hasUpstream) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
if (!hasUniqueCommits && !hasUncommitted && !hasUnpushed) {
|
|
102
|
+
return ["no-diff-with-base"];
|
|
103
|
+
}
|
|
104
|
+
if (hasUniqueCommits && !hasUncommitted && !hasUnpushed) {
|
|
105
|
+
return ["remote-synced"];
|
|
106
|
+
}
|
|
107
|
+
return [];
|
|
108
|
+
};
|
|
109
|
+
|
|
47
110
|
// Re-export WorktreeConfig for external use
|
|
48
111
|
export type { WorktreeConfig };
|
|
49
112
|
|
|
@@ -109,9 +172,13 @@ export interface WorktreeInfo {
|
|
|
109
172
|
path: string;
|
|
110
173
|
branch: string;
|
|
111
174
|
head: string;
|
|
175
|
+
locked?: boolean;
|
|
176
|
+
prunable?: boolean;
|
|
112
177
|
isAccessible?: boolean;
|
|
113
178
|
invalidReason?: string;
|
|
114
179
|
hasUncommittedChanges?: boolean;
|
|
180
|
+
isLocked?: boolean;
|
|
181
|
+
isPrunable?: boolean;
|
|
115
182
|
}
|
|
116
183
|
|
|
117
184
|
async function listWorktrees(): Promise<WorktreeInfo[]> {
|
|
@@ -131,11 +198,37 @@ async function listWorktrees(): Promise<WorktreeInfo[]> {
|
|
|
131
198
|
if (currentWorktree.path) {
|
|
132
199
|
worktrees.push(currentWorktree as WorktreeInfo);
|
|
133
200
|
}
|
|
134
|
-
currentWorktree = {
|
|
201
|
+
currentWorktree = {
|
|
202
|
+
path: line.substring(9),
|
|
203
|
+
locked: false,
|
|
204
|
+
prunable: false,
|
|
205
|
+
isLocked: false,
|
|
206
|
+
isPrunable: false,
|
|
207
|
+
};
|
|
135
208
|
} else if (line.startsWith("HEAD ")) {
|
|
136
209
|
currentWorktree.head = line.substring(5);
|
|
137
210
|
} else if (line.startsWith("branch ")) {
|
|
138
211
|
currentWorktree.branch = line.substring(7).replace("refs/heads/", "");
|
|
212
|
+
} else if (line === "locked" || line.startsWith("locked ")) {
|
|
213
|
+
currentWorktree.locked = true;
|
|
214
|
+
currentWorktree.isLocked = true;
|
|
215
|
+
if (line.startsWith("locked ")) {
|
|
216
|
+
const reason = line.substring(7).trim();
|
|
217
|
+
if (reason) {
|
|
218
|
+
currentWorktree.invalidReason ??= reason;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
} else if (line === "prunable" || line.startsWith("prunable ")) {
|
|
222
|
+
currentWorktree.prunable = true;
|
|
223
|
+
currentWorktree.isPrunable = true;
|
|
224
|
+
if (line.startsWith("prunable ")) {
|
|
225
|
+
const reason = line.substring(9).trim();
|
|
226
|
+
if (reason) {
|
|
227
|
+
currentWorktree.invalidReason ??= reason;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
} else if (line.startsWith("reason ")) {
|
|
231
|
+
currentWorktree.invalidReason = line.substring(7);
|
|
139
232
|
} else if (line === "") {
|
|
140
233
|
if (currentWorktree.path) {
|
|
141
234
|
worktrees.push(currentWorktree as WorktreeInfo);
|
|
@@ -173,7 +266,8 @@ export async function listAdditionalWorktrees(): Promise<WorktreeInfo[]> {
|
|
|
173
266
|
.filter((worktree) => worktree.path !== repoRoot)
|
|
174
267
|
.map((worktree) => {
|
|
175
268
|
// パスの存在を確認
|
|
176
|
-
const
|
|
269
|
+
const exists = fs.existsSync(worktree.path);
|
|
270
|
+
const isAccessible = exists && !worktree.prunable;
|
|
177
271
|
|
|
178
272
|
const result: WorktreeInfo = {
|
|
179
273
|
...worktree,
|
|
@@ -181,7 +275,11 @@ export async function listAdditionalWorktrees(): Promise<WorktreeInfo[]> {
|
|
|
181
275
|
};
|
|
182
276
|
|
|
183
277
|
if (!isAccessible) {
|
|
184
|
-
|
|
278
|
+
if (!exists) {
|
|
279
|
+
result.invalidReason = "Path not accessible in current environment";
|
|
280
|
+
} else if (worktree.prunable && !result.invalidReason) {
|
|
281
|
+
result.invalidReason = "Worktree is marked prunable";
|
|
282
|
+
}
|
|
185
283
|
}
|
|
186
284
|
|
|
187
285
|
return result;
|
|
@@ -536,6 +634,174 @@ export async function removeWorktree(
|
|
|
536
634
|
}
|
|
537
635
|
}
|
|
538
636
|
|
|
637
|
+
export interface RepairResult {
|
|
638
|
+
repairedCount: number;
|
|
639
|
+
failedCount: number;
|
|
640
|
+
failures: Array<{ path: string; error: string }>;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* Worktreeパス修復の結果
|
|
645
|
+
*/
|
|
646
|
+
export interface RepairPathResult {
|
|
647
|
+
/** 修復成功 (git worktree repair) */
|
|
648
|
+
repaired: boolean;
|
|
649
|
+
/** 古いメタデータ削除成功 (git worktree remove --force) */
|
|
650
|
+
removed: boolean;
|
|
651
|
+
/** 修復後の新しいパス (repaired=trueの場合のみ) */
|
|
652
|
+
newPath?: string;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
/**
|
|
656
|
+
* 単一のworktreeパスを修復する共通関数
|
|
657
|
+
*
|
|
658
|
+
* パターンA: 期待されるパスにディレクトリが存在する
|
|
659
|
+
* → git worktree repair <expectedPath> で修復
|
|
660
|
+
*
|
|
661
|
+
* パターンB: ディレクトリが存在しない(リモート環境で作成されたメタデータのみ残っている)
|
|
662
|
+
* → git worktree remove --force <currentPath> でメタデータを削除
|
|
663
|
+
*
|
|
664
|
+
* @param branch ブランチ名
|
|
665
|
+
* @param currentPath 現在gitメタデータに記録されているパス
|
|
666
|
+
* @param repoRoot リポジトリルートパス
|
|
667
|
+
* @returns 修復結果
|
|
668
|
+
*/
|
|
669
|
+
export async function repairWorktreePath(
|
|
670
|
+
branch: string,
|
|
671
|
+
currentPath: string,
|
|
672
|
+
repoRoot: string,
|
|
673
|
+
): Promise<RepairPathResult> {
|
|
674
|
+
const expectedPath = await generateWorktreePath(repoRoot, branch);
|
|
675
|
+
const fsSync = await import("node:fs");
|
|
676
|
+
|
|
677
|
+
if (fsSync.existsSync(expectedPath)) {
|
|
678
|
+
// パターンA: ディレクトリが存在する → repair
|
|
679
|
+
logger.info(
|
|
680
|
+
{ branch, expectedPath, currentPath },
|
|
681
|
+
"repairWorktreePath: directory exists, attempting repair",
|
|
682
|
+
);
|
|
683
|
+
try {
|
|
684
|
+
await execa("git", ["worktree", "repair", expectedPath], {
|
|
685
|
+
cwd: repoRoot,
|
|
686
|
+
});
|
|
687
|
+
return { repaired: true, removed: false, newPath: expectedPath };
|
|
688
|
+
} catch (error) {
|
|
689
|
+
logger.warn(
|
|
690
|
+
{ branch, expectedPath, error },
|
|
691
|
+
"repairWorktreePath: repair failed",
|
|
692
|
+
);
|
|
693
|
+
return { repaired: false, removed: false };
|
|
694
|
+
}
|
|
695
|
+
} else {
|
|
696
|
+
// パターンB: ディレクトリが存在しない → 古いメタデータを削除
|
|
697
|
+
logger.info(
|
|
698
|
+
{ branch, currentPath, expectedPath },
|
|
699
|
+
"repairWorktreePath: directory not found, removing stale metadata",
|
|
700
|
+
);
|
|
701
|
+
try {
|
|
702
|
+
await execa("git", ["worktree", "remove", "--force", currentPath], {
|
|
703
|
+
cwd: repoRoot,
|
|
704
|
+
});
|
|
705
|
+
return { repaired: false, removed: true };
|
|
706
|
+
} catch (error) {
|
|
707
|
+
logger.warn(
|
|
708
|
+
{ branch, currentPath, error },
|
|
709
|
+
"repairWorktreePath: remove failed",
|
|
710
|
+
);
|
|
711
|
+
return { repaired: false, removed: false };
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
/**
|
|
717
|
+
* Worktreeのパス不整合を修復
|
|
718
|
+
* 共通関数repairWorktreePathを使用して各ブランチを修復
|
|
719
|
+
* @param targetBranches 修復対象のブランチ名配列
|
|
720
|
+
* @returns 修復結果(成功数、失敗数、失敗詳細)
|
|
721
|
+
*/
|
|
722
|
+
export async function repairWorktrees(
|
|
723
|
+
targetBranches: string[],
|
|
724
|
+
): Promise<RepairResult> {
|
|
725
|
+
const result: RepairResult = {
|
|
726
|
+
repairedCount: 0,
|
|
727
|
+
failedCount: 0,
|
|
728
|
+
failures: [],
|
|
729
|
+
};
|
|
730
|
+
|
|
731
|
+
if (targetBranches.length === 0) {
|
|
732
|
+
return result;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// 修復前のworktree一覧を取得(現在のパスを知るため)
|
|
736
|
+
const beforeWorktrees = await listAdditionalWorktrees();
|
|
737
|
+
const worktreePathMap = new Map(
|
|
738
|
+
beforeWorktrees.map((w) => [w.branch, w.path]),
|
|
739
|
+
);
|
|
740
|
+
|
|
741
|
+
// デバッグログ: worktreeリストのブランチ名を出力
|
|
742
|
+
logger.info(
|
|
743
|
+
{
|
|
744
|
+
targetBranches,
|
|
745
|
+
worktreeBranches: beforeWorktrees.map((w) => ({
|
|
746
|
+
branch: w.branch,
|
|
747
|
+
path: w.path,
|
|
748
|
+
isAccessible: w.isAccessible,
|
|
749
|
+
})),
|
|
750
|
+
},
|
|
751
|
+
"repairWorktrees: before state",
|
|
752
|
+
);
|
|
753
|
+
|
|
754
|
+
const repoRoot = await getRepositoryRoot();
|
|
755
|
+
|
|
756
|
+
// 対象ブランチごとに共通関数を使用して修復
|
|
757
|
+
for (const branch of targetBranches) {
|
|
758
|
+
const currentPath = worktreePathMap.get(branch);
|
|
759
|
+
if (!currentPath) {
|
|
760
|
+
logger.warn({ branch }, "repairWorktrees: branch not found in worktrees");
|
|
761
|
+
result.failedCount++;
|
|
762
|
+
result.failures.push({
|
|
763
|
+
path: branch,
|
|
764
|
+
error: "Branch not found in worktrees",
|
|
765
|
+
});
|
|
766
|
+
continue;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
const repairResult = await repairWorktreePath(
|
|
770
|
+
branch,
|
|
771
|
+
currentPath,
|
|
772
|
+
repoRoot,
|
|
773
|
+
);
|
|
774
|
+
|
|
775
|
+
if (repairResult.repaired) {
|
|
776
|
+
result.repairedCount++;
|
|
777
|
+
} else if (repairResult.removed) {
|
|
778
|
+
// メタデータ削除は「修復」としてカウント(新規作成が可能になるため)
|
|
779
|
+
result.repairedCount++;
|
|
780
|
+
} else {
|
|
781
|
+
result.failedCount++;
|
|
782
|
+
result.failures.push({
|
|
783
|
+
path: branch,
|
|
784
|
+
error: "Worktree repair failed",
|
|
785
|
+
});
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// 修復後のアクセス可能性を確認(デバッグログ用)
|
|
790
|
+
const afterWorktrees = await listAdditionalWorktrees();
|
|
791
|
+
logger.info(
|
|
792
|
+
{
|
|
793
|
+
afterWorktrees: afterWorktrees.map((w) => ({
|
|
794
|
+
branch: w.branch,
|
|
795
|
+
path: w.path,
|
|
796
|
+
isAccessible: w.isAccessible,
|
|
797
|
+
})),
|
|
798
|
+
},
|
|
799
|
+
"repairWorktrees: after state",
|
|
800
|
+
);
|
|
801
|
+
|
|
802
|
+
return result;
|
|
803
|
+
}
|
|
804
|
+
|
|
539
805
|
async function getWorktreesWithPRStatus(): Promise<WorktreeWithPR[]> {
|
|
540
806
|
const worktrees = await listAdditionalWorktrees();
|
|
541
807
|
const worktreesWithPR: WorktreeWithPR[] = [];
|
|
@@ -558,13 +824,13 @@ async function getWorktreesWithPRStatus(): Promise<WorktreeWithPR[]> {
|
|
|
558
824
|
* worktreeに存在しないローカルブランチのクリーンアップ候補を取得
|
|
559
825
|
* @returns {Promise<CleanupTarget[]>} クリーンアップ候補の配列
|
|
560
826
|
*/
|
|
561
|
-
async function
|
|
827
|
+
async function getOrphanedLocalBranchStatuses({
|
|
562
828
|
baseBranch,
|
|
563
829
|
repoRoot,
|
|
564
830
|
}: {
|
|
565
831
|
baseBranch: string;
|
|
566
832
|
repoRoot: string;
|
|
567
|
-
}): Promise<
|
|
833
|
+
}): Promise<CleanupStatus[]> {
|
|
568
834
|
try {
|
|
569
835
|
// 並列実行で高速化
|
|
570
836
|
const [localBranches, worktrees] = await Promise.all([
|
|
@@ -572,7 +838,7 @@ async function getOrphanedLocalBranches({
|
|
|
572
838
|
listAdditionalWorktrees(),
|
|
573
839
|
]);
|
|
574
840
|
|
|
575
|
-
const
|
|
841
|
+
const statuses: CleanupStatus[] = [];
|
|
576
842
|
const worktreeBranches = new Set(
|
|
577
843
|
worktrees.map((w) => w.branch).filter(Boolean),
|
|
578
844
|
);
|
|
@@ -616,10 +882,11 @@ async function getOrphanedLocalBranches({
|
|
|
616
882
|
hasUnpushed = true;
|
|
617
883
|
}
|
|
618
884
|
|
|
619
|
-
const
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
885
|
+
const { upstream, hasUpstream } = await resolveUpstreamStatus(
|
|
886
|
+
localBranch.name,
|
|
887
|
+
repoRoot,
|
|
888
|
+
);
|
|
889
|
+
const comparisonBase = upstream ?? baseBranch;
|
|
623
890
|
|
|
624
891
|
const hasUniqueCommits = await branchHasUniqueCommitsComparedToBase(
|
|
625
892
|
localBranch.name,
|
|
@@ -627,9 +894,12 @@ async function getOrphanedLocalBranches({
|
|
|
627
894
|
repoRoot,
|
|
628
895
|
);
|
|
629
896
|
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
897
|
+
const reasons = buildCleanupReasons({
|
|
898
|
+
hasUniqueCommits,
|
|
899
|
+
hasUncommitted: false,
|
|
900
|
+
hasUnpushed,
|
|
901
|
+
hasUpstream,
|
|
902
|
+
});
|
|
633
903
|
|
|
634
904
|
if (process.env.DEBUG_CLEANUP) {
|
|
635
905
|
console.log(
|
|
@@ -639,41 +909,28 @@ async function getOrphanedLocalBranches({
|
|
|
639
909
|
);
|
|
640
910
|
}
|
|
641
911
|
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
cleanupTargets.push({
|
|
655
|
-
worktreePath: null, // worktreeは存在しない
|
|
656
|
-
branch: localBranch.name,
|
|
657
|
-
pullRequest: null,
|
|
658
|
-
hasUncommittedChanges: false, // worktreeが存在しないため常にfalse
|
|
659
|
-
hasUnpushedCommits: hasUnpushed,
|
|
660
|
-
cleanupType: "branch-only",
|
|
661
|
-
hasRemoteBranch,
|
|
662
|
-
reasons,
|
|
663
|
-
});
|
|
664
|
-
}
|
|
912
|
+
statuses.push({
|
|
913
|
+
worktreePath: null, // worktreeは存在しない
|
|
914
|
+
branch: localBranch.name,
|
|
915
|
+
hasUncommittedChanges: false, // worktreeが存在しないため常にfalse
|
|
916
|
+
hasUnpushedCommits: hasUnpushed,
|
|
917
|
+
cleanupType: "branch-only",
|
|
918
|
+
hasRemoteBranch: hasUpstream,
|
|
919
|
+
hasUniqueCommits,
|
|
920
|
+
hasUpstream,
|
|
921
|
+
upstream,
|
|
922
|
+
reasons,
|
|
923
|
+
});
|
|
665
924
|
}
|
|
666
925
|
}
|
|
667
926
|
|
|
668
927
|
if (process.env.DEBUG_CLEANUP) {
|
|
669
928
|
console.log(
|
|
670
|
-
chalk.cyan(
|
|
671
|
-
`Debug: Found ${cleanupTargets.length} orphaned branch cleanup targets`,
|
|
672
|
-
),
|
|
929
|
+
chalk.cyan(`Debug: Found ${statuses.length} orphaned branch statuses`),
|
|
673
930
|
);
|
|
674
931
|
}
|
|
675
932
|
|
|
676
|
-
return
|
|
933
|
+
return statuses;
|
|
677
934
|
} catch (error) {
|
|
678
935
|
console.error(chalk.red("Error: Failed to get orphaned local branches"));
|
|
679
936
|
if (process.env.DEBUG_CLEANUP) {
|
|
@@ -683,11 +940,7 @@ async function getOrphanedLocalBranches({
|
|
|
683
940
|
}
|
|
684
941
|
}
|
|
685
942
|
|
|
686
|
-
|
|
687
|
-
* マージ済みPRに関連するworktreeおよびローカルブランチのクリーンアップ候補を取得
|
|
688
|
-
* @returns {Promise<CleanupTarget[]>} クリーンアップ候補の配列
|
|
689
|
-
*/
|
|
690
|
-
export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
|
|
943
|
+
export async function getCleanupStatus(): Promise<CleanupStatus[]> {
|
|
691
944
|
const [config, repoRoot, worktreesWithPR] = await Promise.all([
|
|
692
945
|
getConfig(),
|
|
693
946
|
getRepositoryRoot(),
|
|
@@ -695,11 +948,11 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
|
|
|
695
948
|
]);
|
|
696
949
|
const baseBranch = config.defaultBaseBranch || GIT_CONFIG.DEFAULT_BASE_BRANCH;
|
|
697
950
|
|
|
698
|
-
const
|
|
951
|
+
const orphanedStatuses = await getOrphanedLocalBranchStatuses({
|
|
699
952
|
baseBranch,
|
|
700
953
|
repoRoot,
|
|
701
954
|
});
|
|
702
|
-
const
|
|
955
|
+
const statuses: CleanupStatus[] = [];
|
|
703
956
|
|
|
704
957
|
if (process.env.DEBUG_CLEANUP) {
|
|
705
958
|
console.log(chalk.cyan("Debug: Available worktrees:"));
|
|
@@ -709,32 +962,19 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
|
|
|
709
962
|
}
|
|
710
963
|
|
|
711
964
|
for (const worktree of worktreesWithPR) {
|
|
712
|
-
// 保護対象ブランチはスキップ
|
|
713
|
-
if (isProtectedBranchName(worktree.branch)) {
|
|
714
|
-
if (process.env.DEBUG_CLEANUP) {
|
|
715
|
-
console.log(
|
|
716
|
-
chalk.yellow(`Debug: Skipping protected branch ${worktree.branch}`),
|
|
717
|
-
);
|
|
718
|
-
}
|
|
719
|
-
continue;
|
|
720
|
-
}
|
|
721
|
-
|
|
722
965
|
if (process.env.DEBUG_CLEANUP) {
|
|
723
966
|
console.log(chalk.gray(`Debug: Checking worktree ${worktree.branch}`));
|
|
724
967
|
}
|
|
725
968
|
|
|
726
|
-
const cleanupReasons: CleanupReason[] = [];
|
|
727
|
-
|
|
728
969
|
// worktreeパスの存在を確認
|
|
729
|
-
const
|
|
730
|
-
// Some test environments mock node:fs without existsSync on the module root.
|
|
970
|
+
const fsSync = await import("node:fs");
|
|
731
971
|
const existsSync =
|
|
732
|
-
typeof
|
|
733
|
-
?
|
|
734
|
-
: typeof (
|
|
972
|
+
typeof fsSync.existsSync === "function"
|
|
973
|
+
? fsSync.existsSync
|
|
974
|
+
: typeof (fsSync as { default?: { existsSync?: unknown } }).default
|
|
735
975
|
?.existsSync === "function"
|
|
736
|
-
? (
|
|
737
|
-
.existsSync
|
|
976
|
+
? (fsSync as { default: { existsSync: (p: string) => boolean } })
|
|
977
|
+
.default.existsSync
|
|
738
978
|
: null;
|
|
739
979
|
|
|
740
980
|
const isAccessible = existsSync ? existsSync(worktree.worktreePath) : false;
|
|
@@ -743,14 +983,12 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
|
|
|
743
983
|
let hasUnpushed = false;
|
|
744
984
|
|
|
745
985
|
if (isAccessible) {
|
|
746
|
-
// worktreeが存在する場合のみ状態をチェック
|
|
747
986
|
try {
|
|
748
987
|
[hasUncommitted, hasUnpushed] = await Promise.all([
|
|
749
988
|
hasUncommittedChanges(worktree.worktreePath),
|
|
750
989
|
hasUnpushedCommits(worktree.worktreePath, worktree.branch),
|
|
751
990
|
]);
|
|
752
991
|
} catch (error) {
|
|
753
|
-
// エラーが発生した場合はデフォルト値を使用
|
|
754
992
|
if (process.env.DEBUG_CLEANUP) {
|
|
755
993
|
console.log(
|
|
756
994
|
chalk.yellow(
|
|
@@ -761,15 +999,11 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
|
|
|
761
999
|
}
|
|
762
1000
|
}
|
|
763
1001
|
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
const upstreamBranch = await getUpstreamBranch(worktree.branch);
|
|
772
|
-
const comparisonBase = upstreamBranch ?? baseBranch;
|
|
1002
|
+
const { upstream, hasUpstream } = await resolveUpstreamStatus(
|
|
1003
|
+
worktree.branch,
|
|
1004
|
+
repoRoot,
|
|
1005
|
+
);
|
|
1006
|
+
const comparisonBase = upstream ?? baseBranch;
|
|
773
1007
|
|
|
774
1008
|
const hasUniqueCommits = await branchHasUniqueCommitsComparedToBase(
|
|
775
1009
|
worktree.branch,
|
|
@@ -777,61 +1011,86 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
|
|
|
777
1011
|
repoRoot,
|
|
778
1012
|
);
|
|
779
1013
|
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
}
|
|
1014
|
+
const reasons = buildCleanupReasons({
|
|
1015
|
+
hasUniqueCommits,
|
|
1016
|
+
hasUncommitted,
|
|
1017
|
+
hasUnpushed,
|
|
1018
|
+
hasUpstream,
|
|
1019
|
+
});
|
|
787
1020
|
|
|
788
1021
|
if (process.env.DEBUG_CLEANUP) {
|
|
789
1022
|
console.log(
|
|
790
1023
|
chalk.gray(
|
|
791
|
-
`Debug: Cleanup reasons for ${worktree.branch}: ${
|
|
1024
|
+
`Debug: Cleanup reasons for ${worktree.branch}: ${reasons.length > 0 ? reasons.join(", ") : "none"}`,
|
|
792
1025
|
),
|
|
793
1026
|
);
|
|
794
1027
|
}
|
|
795
1028
|
|
|
796
|
-
|
|
797
|
-
continue;
|
|
798
|
-
}
|
|
799
|
-
|
|
800
|
-
const target: CleanupTarget = {
|
|
1029
|
+
statuses.push({
|
|
801
1030
|
worktreePath: worktree.worktreePath,
|
|
802
1031
|
branch: worktree.branch,
|
|
803
|
-
pullRequest: null,
|
|
804
1032
|
hasUncommittedChanges: hasUncommitted,
|
|
805
1033
|
hasUnpushedCommits: hasUnpushed,
|
|
806
1034
|
cleanupType: "worktree-and-branch",
|
|
807
|
-
hasRemoteBranch,
|
|
1035
|
+
hasRemoteBranch: hasUpstream,
|
|
1036
|
+
hasUniqueCommits,
|
|
1037
|
+
hasUpstream,
|
|
1038
|
+
upstream,
|
|
808
1039
|
isAccessible,
|
|
809
|
-
reasons
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
}
|
|
815
|
-
|
|
816
|
-
cleanupTargets.push(target);
|
|
1040
|
+
reasons,
|
|
1041
|
+
...(isAccessible
|
|
1042
|
+
? {}
|
|
1043
|
+
: { invalidReason: "Path not accessible in current environment" }),
|
|
1044
|
+
});
|
|
817
1045
|
}
|
|
818
1046
|
|
|
819
|
-
|
|
820
|
-
cleanupTargets.push(...orphanedBranches);
|
|
1047
|
+
statuses.push(...orphanedStatuses);
|
|
821
1048
|
|
|
822
1049
|
if (process.env.DEBUG_CLEANUP) {
|
|
823
|
-
const worktreeTargets =
|
|
824
|
-
(t) => t.cleanupType === "worktree-and-branch",
|
|
1050
|
+
const worktreeTargets = statuses.filter(
|
|
1051
|
+
(t) => t.cleanupType === "worktree-and-branch" && t.reasons.length > 0,
|
|
825
1052
|
).length;
|
|
826
|
-
const branchOnlyTargets =
|
|
827
|
-
(t) => t.cleanupType === "branch-only",
|
|
1053
|
+
const branchOnlyTargets = statuses.filter(
|
|
1054
|
+
(t) => t.cleanupType === "branch-only" && t.reasons.length > 0,
|
|
828
1055
|
).length;
|
|
829
1056
|
console.log(
|
|
830
1057
|
chalk.cyan(
|
|
831
|
-
`Debug: Found ${
|
|
1058
|
+
`Debug: Found ${worktreeTargets + branchOnlyTargets} cleanup targets (${worktreeTargets} worktree+branch, ${branchOnlyTargets} branch-only)`,
|
|
832
1059
|
),
|
|
833
1060
|
);
|
|
834
1061
|
}
|
|
835
1062
|
|
|
1063
|
+
return statuses;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
/**
|
|
1067
|
+
* マージ済みPRに関連するworktreeおよびローカルブランチのクリーンアップ候補を取得
|
|
1068
|
+
* @returns {Promise<CleanupTarget[]>} クリーンアップ候補の配列
|
|
1069
|
+
*/
|
|
1070
|
+
export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
|
|
1071
|
+
const statuses = await getCleanupStatus();
|
|
1072
|
+
const cleanupTargets = statuses
|
|
1073
|
+
.filter((status) => status.reasons.length > 0)
|
|
1074
|
+
.filter((status) => !isProtectedBranchName(status.branch))
|
|
1075
|
+
.map((status) => {
|
|
1076
|
+
const target: CleanupTarget = {
|
|
1077
|
+
worktreePath: status.worktreePath,
|
|
1078
|
+
branch: status.branch,
|
|
1079
|
+
pullRequest: null,
|
|
1080
|
+
hasUncommittedChanges: status.hasUncommittedChanges,
|
|
1081
|
+
hasUnpushedCommits: status.hasUnpushedCommits,
|
|
1082
|
+
cleanupType: status.cleanupType,
|
|
1083
|
+
hasRemoteBranch: status.hasRemoteBranch,
|
|
1084
|
+
reasons: status.reasons,
|
|
1085
|
+
};
|
|
1086
|
+
if (status.isAccessible !== undefined) {
|
|
1087
|
+
target.isAccessible = status.isAccessible;
|
|
1088
|
+
}
|
|
1089
|
+
if (status.invalidReason) {
|
|
1090
|
+
target.invalidReason = status.invalidReason;
|
|
1091
|
+
}
|
|
1092
|
+
return target;
|
|
1093
|
+
});
|
|
1094
|
+
|
|
836
1095
|
return cleanupTargets;
|
|
837
1096
|
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { ExecutionMode } from "./screens/ExecutionModeSelectorScreen.js";
|
|
3
|
-
import type { CodingAgentId, InferenceLevel } from "../types.js";
|
|
4
|
-
export interface SelectionResult {
|
|
5
|
-
branch: string;
|
|
6
|
-
displayName: string;
|
|
7
|
-
branchType: "local" | "remote";
|
|
8
|
-
remoteBranch?: string;
|
|
9
|
-
tool: CodingAgentId;
|
|
10
|
-
mode: ExecutionMode;
|
|
11
|
-
skipPermissions: boolean;
|
|
12
|
-
model?: string | null;
|
|
13
|
-
inferenceLevel?: InferenceLevel;
|
|
14
|
-
sessionId?: string | null;
|
|
15
|
-
}
|
|
16
|
-
export interface AppProps {
|
|
17
|
-
onExit: (result?: SelectionResult) => void;
|
|
18
|
-
loadingIndicatorDelay?: number;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* App - Top-level component for Ink.js UI
|
|
22
|
-
* Integrates ErrorBoundary, data fetching, screen navigation, and all screens
|
|
23
|
-
*/
|
|
24
|
-
export declare function App({ onExit, loadingIndicatorDelay }: AppProps): React.JSX.Element;
|
|
25
|
-
//# sourceMappingURL=App.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../src/cli/ui/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAcf,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AA2B9E,OAAO,KAAK,EACV,aAAa,EAIb,cAAc,EAEf,MAAM,aAAa,CAAC;AAoCrB,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,aAAa,CAAC;IACpB,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,qBA+zCpE"}
|