@akiojin/gwt 4.10.0 → 4.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +4 -4
- package/README.md +4 -4
- package/bin/gwt.js +1 -1
- package/dist/claude.d.ts +2 -0
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +97 -68
- package/dist/claude.js.map +1 -1
- package/dist/cli/ui/App.solid.d.ts +29 -0
- package/dist/cli/ui/App.solid.d.ts.map +1 -0
- package/dist/cli/ui/App.solid.js +1395 -0
- package/dist/cli/ui/App.solid.js.map +1 -0
- package/dist/cli/ui/components/solid/Footer.d.ts +10 -0
- package/dist/cli/ui/components/solid/Footer.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/Footer.js +10 -0
- package/dist/cli/ui/components/solid/Footer.js.map +1 -0
- package/dist/cli/ui/components/{parts → solid}/Header.d.ts +1 -6
- package/dist/cli/ui/components/solid/Header.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/Header.js +13 -0
- package/dist/cli/ui/components/solid/Header.js.map +1 -0
- package/dist/cli/ui/components/solid/HelpOverlay.d.ts +8 -0
- package/dist/cli/ui/components/solid/HelpOverlay.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/HelpOverlay.js +118 -0
- package/dist/cli/ui/components/solid/HelpOverlay.js.map +1 -0
- package/dist/cli/ui/components/solid/QuickStartStep.d.ts +17 -0
- package/dist/cli/ui/components/solid/QuickStartStep.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/QuickStartStep.js +152 -0
- package/dist/cli/ui/components/solid/QuickStartStep.js.map +1 -0
- package/dist/cli/ui/components/solid/SelectInput.d.ts +22 -0
- package/dist/cli/ui/components/solid/SelectInput.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/SelectInput.js +45 -0
- package/dist/cli/ui/components/solid/SelectInput.js.map +1 -0
- package/dist/cli/ui/components/solid/TextInput.d.ts +12 -0
- package/dist/cli/ui/components/solid/TextInput.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/TextInput.js +9 -0
- package/dist/cli/ui/components/solid/TextInput.js.map +1 -0
- package/dist/cli/ui/components/solid/WizardController.d.ts +34 -0
- package/dist/cli/ui/components/solid/WizardController.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/WizardController.js +223 -0
- package/dist/cli/ui/components/solid/WizardController.js.map +1 -0
- package/dist/cli/ui/components/solid/WizardPopup.d.ts +26 -0
- package/dist/cli/ui/components/solid/WizardPopup.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/WizardPopup.js +68 -0
- package/dist/cli/ui/components/solid/WizardPopup.js.map +1 -0
- package/dist/cli/ui/components/solid/WizardSteps.d.ts +52 -0
- package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +1 -0
- package/dist/cli/ui/components/solid/WizardSteps.js +419 -0
- package/dist/cli/ui/components/solid/WizardSteps.js.map +1 -0
- package/dist/cli/ui/core/index.d.ts +12 -0
- package/dist/cli/ui/core/index.d.ts.map +1 -0
- package/dist/cli/ui/core/index.js +15 -0
- package/dist/cli/ui/core/index.js.map +1 -0
- package/dist/cli/ui/core/keybindings.d.ts +106 -0
- package/dist/cli/ui/core/keybindings.d.ts.map +1 -0
- package/dist/cli/ui/core/keybindings.js +270 -0
- package/dist/cli/ui/core/keybindings.js.map +1 -0
- package/dist/cli/ui/core/theme.d.ts +123 -0
- package/dist/cli/ui/core/theme.d.ts.map +1 -0
- package/dist/cli/ui/core/theme.js +191 -0
- package/dist/cli/ui/core/theme.js.map +1 -0
- package/dist/cli/ui/core/types.d.ts +156 -0
- package/dist/cli/ui/core/types.d.ts.map +1 -0
- package/dist/cli/ui/core/types.js +10 -0
- package/dist/cli/ui/core/types.js.map +1 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.d.ts +26 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.d.ts.map +1 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.js +89 -0
- package/dist/cli/ui/hooks/solid/useScrollableList.js.map +1 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts +10 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts.map +1 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.js +16 -0
- package/dist/cli/ui/hooks/solid/useTerminalSize.js.map +1 -0
- package/dist/cli/ui/index.solid.d.ts +5 -0
- package/dist/cli/ui/index.solid.d.ts.map +1 -0
- package/dist/cli/ui/index.solid.js +21 -0
- package/dist/cli/ui/index.solid.js.map +1 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.d.ts +53 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.js +829 -0
- package/dist/cli/ui/screens/solid/BranchListScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts +11 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.js +45 -0
- package/dist/cli/ui/screens/solid/ConfirmScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts +14 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.js +90 -0
- package/dist/cli/ui/screens/solid/EnvironmentScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.d.ts +8 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.js +18 -0
- package/dist/cli/ui/screens/solid/ErrorScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/InputScreen.d.ts +13 -0
- package/dist/cli/ui/screens/solid/InputScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/InputScreen.js +17 -0
- package/dist/cli/ui/screens/solid/InputScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts +9 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.js +43 -0
- package/dist/cli/ui/screens/solid/LoadingIndicator.js.map +1 -0
- package/dist/cli/ui/{components/screens → screens/solid}/LogDetailScreen.d.ts +2 -2
- package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/LogDetailScreen.js +34 -0
- package/dist/cli/ui/screens/solid/LogDetailScreen.js.map +1 -0
- package/dist/cli/ui/{components/screens/LogListScreen.d.ts → screens/solid/LogScreen.d.ts} +10 -4
- package/dist/cli/ui/screens/solid/LogScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/LogScreen.js +333 -0
- package/dist/cli/ui/screens/solid/LogScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts +17 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.js +115 -0
- package/dist/cli/ui/screens/solid/ProfileEnvScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.d.ts +17 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.js +50 -0
- package/dist/cli/ui/screens/solid/ProfileScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.d.ts +20 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.js +98 -0
- package/dist/cli/ui/screens/solid/SelectorScreen.js.map +1 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts +13 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts.map +1 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js +59 -0
- package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js.map +1 -0
- package/dist/cli/ui/stores/appStore.d.ts +143 -0
- package/dist/cli/ui/stores/appStore.d.ts.map +1 -0
- package/dist/cli/ui/stores/appStore.js +158 -0
- package/dist/cli/ui/stores/appStore.js.map +1 -0
- package/dist/cli/ui/stores/branchStore.d.ts +159 -0
- package/dist/cli/ui/stores/branchStore.d.ts.map +1 -0
- package/dist/cli/ui/stores/branchStore.js +275 -0
- package/dist/cli/ui/stores/branchStore.js.map +1 -0
- package/dist/cli/ui/stores/index.d.ts +11 -0
- package/dist/cli/ui/stores/index.d.ts.map +1 -0
- package/dist/cli/ui/stores/index.js +14 -0
- package/dist/cli/ui/stores/index.js.map +1 -0
- package/dist/cli/ui/stores/uiStore.d.ts +146 -0
- package/dist/cli/ui/stores/uiStore.d.ts.map +1 -0
- package/dist/cli/ui/stores/uiStore.js +166 -0
- package/dist/cli/ui/stores/uiStore.js.map +1 -0
- package/dist/cli/ui/types.d.ts +17 -1
- package/dist/cli/ui/types.d.ts.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.d.ts +1 -0
- package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
- package/dist/cli/ui/utils/branchFormatter.js +36 -217
- package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
- package/dist/cli/ui/utils/continueSession.d.ts +18 -0
- package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
- package/dist/cli/ui/utils/continueSession.js +90 -2
- package/dist/cli/ui/utils/continueSession.js.map +1 -1
- package/dist/cli/ui/utils/versionCache.d.ts +37 -0
- package/dist/cli/ui/utils/versionCache.d.ts.map +1 -0
- package/dist/cli/ui/utils/versionCache.js +70 -0
- package/dist/cli/ui/utils/versionCache.js.map +1 -0
- package/dist/cli/ui/utils/versionFetcher.d.ts +41 -0
- package/dist/cli/ui/utils/versionFetcher.d.ts.map +1 -0
- package/dist/cli/ui/utils/versionFetcher.js +89 -0
- package/dist/cli/ui/utils/versionFetcher.js.map +1 -0
- package/dist/client/assets/{index-ChHC-Puh.css → index-BbfV7Wuj.css} +1 -1
- package/dist/client/assets/index-CoAyq5x1.js +78 -0
- package/dist/client/index.html +2 -2
- package/dist/codex.d.ts +2 -0
- package/dist/codex.d.ts.map +1 -1
- package/dist/codex.js +109 -39
- package/dist/codex.js.map +1 -1
- package/dist/config/builtin-coding-agents.js +4 -4
- package/dist/config/builtin-coding-agents.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +11 -0
- package/dist/config/index.js.map +1 -1
- package/dist/gemini.d.ts +2 -0
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +77 -39
- package/dist/gemini.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +153 -103
- package/dist/index.js.map +1 -1
- package/dist/launcher.d.ts.map +1 -1
- package/dist/launcher.js +56 -6
- package/dist/launcher.js.map +1 -1
- package/dist/logging/agentOutput.d.ts +21 -0
- package/dist/logging/agentOutput.d.ts.map +1 -0
- package/dist/logging/agentOutput.js +164 -0
- package/dist/logging/agentOutput.js.map +1 -0
- package/dist/logging/formatter.d.ts.map +1 -1
- package/dist/logging/formatter.js +18 -4
- package/dist/logging/formatter.js.map +1 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +28 -9
- package/dist/logging/logger.js.map +1 -1
- package/dist/logging/reader.d.ts +21 -0
- package/dist/logging/reader.d.ts.map +1 -1
- package/dist/logging/reader.js +79 -0
- package/dist/logging/reader.js.map +1 -1
- package/dist/opentui/highlights-eq9cgrbb.scm +604 -0
- package/dist/opentui/highlights-ghv9g403.scm +205 -0
- package/dist/opentui/highlights-hk7bwhj4.scm +284 -0
- package/dist/opentui/highlights-r812a2qc.scm +150 -0
- package/dist/opentui/highlights-x6tmsnaa.scm +115 -0
- package/dist/opentui/index.solid.d.ts +2 -0
- package/dist/opentui/index.solid.d.ts.map +1 -0
- package/dist/opentui/index.solid.js +53687 -0
- package/dist/opentui/index.solid.js.map +1 -0
- package/dist/opentui/injections-73j83es3.scm +27 -0
- package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
- package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
- package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
- package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
- package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
- package/dist/repositories/worktree.repository.d.ts +1 -0
- package/dist/repositories/worktree.repository.d.ts.map +1 -1
- package/dist/repositories/worktree.repository.js +7 -0
- package/dist/repositories/worktree.repository.js.map +1 -1
- package/dist/services/codingAgentResolver.d.ts +2 -0
- package/dist/services/codingAgentResolver.d.ts.map +1 -1
- package/dist/services/codingAgentResolver.js +30 -4
- package/dist/services/codingAgentResolver.js.map +1 -1
- package/dist/services/dependency-installer.d.ts.map +1 -1
- package/dist/services/dependency-installer.js +2 -7
- package/dist/services/dependency-installer.js.map +1 -1
- package/dist/types/api.d.ts +3 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/coding-agent.d.ts +62 -0
- package/dist/types/coding-agent.d.ts.map +1 -0
- package/dist/types/coding-agent.js +29 -0
- package/dist/types/coding-agent.js.map +1 -0
- package/dist/types/tools.d.ts +17 -0
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/coding-agent-colors.d.ts +88 -0
- package/dist/utils/coding-agent-colors.d.ts.map +1 -0
- package/dist/utils/coding-agent-colors.js +137 -0
- package/dist/utils/coding-agent-colors.js.map +1 -0
- package/dist/utils/command.d.ts +1 -1
- package/dist/utils/command.js +1 -1
- package/dist/utils/error-utils.d.ts +27 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +98 -0
- package/dist/utils/error-utils.js.map +1 -0
- package/dist/utils/npmRegistry.d.ts +61 -0
- package/dist/utils/npmRegistry.d.ts.map +1 -0
- package/dist/utils/npmRegistry.js +180 -0
- package/dist/utils/npmRegistry.js.map +1 -0
- package/dist/utils/prompt.d.ts +1 -1
- package/dist/utils/prompt.js +1 -1
- package/dist/utils/session/common.d.ts +8 -0
- package/dist/utils/session/common.d.ts.map +1 -1
- package/dist/utils/session/common.js +22 -0
- package/dist/utils/session/common.js.map +1 -1
- package/dist/utils/session/parsers/claude.d.ts +10 -4
- package/dist/utils/session/parsers/claude.d.ts.map +1 -1
- package/dist/utils/session/parsers/claude.js +64 -18
- package/dist/utils/session/parsers/claude.js.map +1 -1
- package/dist/utils/session/parsers/codex.d.ts.map +1 -1
- package/dist/utils/session/parsers/codex.js +47 -20
- package/dist/utils/session/parsers/codex.js.map +1 -1
- package/dist/utils/session/parsers/gemini.d.ts.map +1 -1
- package/dist/utils/session/parsers/gemini.js +43 -6
- package/dist/utils/session/parsers/gemini.js.map +1 -1
- package/dist/utils/session/parsers/opencode.d.ts.map +1 -1
- package/dist/utils/session/parsers/opencode.js +43 -6
- package/dist/utils/session/parsers/opencode.js.map +1 -1
- package/dist/utils/session/types.d.ts +7 -0
- package/dist/utils/session/types.d.ts.map +1 -1
- package/dist/utils/terminal.d.ts +1 -0
- package/dist/utils/terminal.d.ts.map +1 -1
- package/dist/utils/terminal.js +20 -0
- package/dist/utils/terminal.js.map +1 -1
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +33 -2
- package/dist/utils.js.map +1 -1
- package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +1 -1
- package/dist/web/client/src/components/CodingAgentLaunchModal.js +7 -16
- package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +7 -2
- package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +2 -1
- package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -1
- package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +2 -2
- package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -1
- package/dist/web/client/src/components/branch-detail/ToolLauncher.js +5 -5
- package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -1
- package/dist/web/client/src/components/ui/alert.d.ts +1 -1
- package/dist/web/client/src/lib/coding-agent-colors.d.ts +86 -0
- package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +1 -0
- package/dist/web/client/src/lib/coding-agent-colors.js +135 -0
- package/dist/web/client/src/lib/coding-agent-colors.js.map +1 -0
- package/dist/web/client/src/pages/BranchDetailPage.js +10 -10
- package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
- package/dist/web/server/pty/manager.d.ts +2 -0
- package/dist/web/server/pty/manager.d.ts.map +1 -1
- package/dist/web/server/pty/manager.js +104 -0
- package/dist/web/server/pty/manager.js.map +1 -1
- package/dist/web/server/routes/sessions.d.ts.map +1 -1
- package/dist/web/server/routes/sessions.js +5 -1
- package/dist/web/server/routes/sessions.js.map +1 -1
- package/dist/web/server/services/branches.d.ts.map +1 -1
- package/dist/web/server/services/branches.js +10 -8
- package/dist/web/server/services/branches.js.map +1 -1
- package/dist/web/server/services/worktrees.js +2 -2
- package/dist/web/server/services/worktrees.js.map +1 -1
- package/dist/worktree.d.ts +50 -1
- package/dist/worktree.d.ts.map +1 -1
- package/dist/worktree.js +292 -100
- package/dist/worktree.js.map +1 -1
- package/package.json +13 -14
- package/src/claude.ts +129 -95
- package/src/cli/ui/App.solid.tsx +2096 -0
- package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +1084 -0
- package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +343 -0
- package/src/cli/ui/__tests__/solid/ConfirmScreen.test.tsx +77 -0
- package/src/cli/ui/__tests__/solid/LogScreen.test.tsx +351 -0
- package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +308 -0
- package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +231 -0
- package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +241 -0
- package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +79 -334
- package/src/cli/ui/__tests__/utils/clipboard.test.ts +3 -3
- package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +1 -1
- package/src/cli/ui/components/solid/Footer.tsx +36 -0
- package/src/cli/ui/components/{parts → solid}/Header.tsx +17 -28
- package/src/cli/ui/components/solid/HelpOverlay.tsx +194 -0
- package/src/cli/ui/components/solid/QuickStartStep.tsx +209 -0
- package/src/cli/ui/components/{parts → solid}/ScrollableList.tsx +7 -8
- package/src/cli/ui/components/solid/SearchInput.tsx +42 -0
- package/src/cli/ui/components/solid/SelectInput.tsx +88 -0
- package/src/cli/ui/components/solid/Stats.tsx +92 -0
- package/src/cli/ui/components/solid/TextInput.tsx +49 -0
- package/src/cli/ui/components/solid/WizardController.tsx +393 -0
- package/src/cli/ui/components/solid/WizardPopup.tsx +135 -0
- package/src/cli/ui/components/solid/WizardSteps.tsx +736 -0
- package/src/cli/ui/core/index.ts +17 -0
- package/src/cli/ui/core/keybindings.ts +367 -0
- package/src/cli/ui/core/theme.ts +266 -0
- package/src/cli/ui/core/types.ts +235 -0
- package/src/cli/ui/hooks/solid/useAsyncOperation.ts +78 -0
- package/src/cli/ui/hooks/solid/useFilter.ts +86 -0
- package/src/cli/ui/hooks/solid/useGitOperations.ts +81 -0
- package/src/cli/ui/hooks/solid/useKeyHandler.ts +103 -0
- package/src/cli/ui/hooks/solid/useScrollableList.ts +149 -0
- package/src/cli/ui/hooks/solid/useSelection.ts +77 -0
- package/src/cli/ui/hooks/solid/useTerminalSize.ts +22 -0
- package/src/cli/ui/index.solid.ts +28 -0
- package/src/cli/ui/screens/solid/BranchListScreen.tsx +1153 -0
- package/src/cli/ui/screens/solid/ConfirmScreen.tsx +86 -0
- package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +161 -0
- package/src/cli/ui/screens/solid/ErrorScreen.tsx +42 -0
- package/src/cli/ui/screens/solid/InputScreen.tsx +55 -0
- package/src/cli/ui/screens/solid/LoadingIndicator.tsx +77 -0
- package/src/cli/ui/screens/solid/LogDetailScreen.tsx +75 -0
- package/src/cli/ui/screens/solid/LogScreen.tsx +504 -0
- package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +196 -0
- package/src/cli/ui/screens/solid/ProfileScreen.tsx +98 -0
- package/src/cli/ui/screens/solid/SelectorScreen.tsx +181 -0
- package/src/cli/ui/screens/solid/SettingsScreen.tsx +52 -0
- package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +136 -0
- package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +40 -0
- package/src/cli/ui/stores/appStore.ts +208 -0
- package/src/cli/ui/stores/branchStore.ts +357 -0
- package/src/cli/ui/stores/index.ts +31 -0
- package/src/cli/ui/stores/uiStore.ts +226 -0
- package/src/cli/ui/types.ts +21 -3
- package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +227 -0
- package/src/cli/ui/utils/branchFormatter.ts +43 -222
- package/src/cli/ui/utils/continueSession.ts +133 -2
- package/src/cli/ui/utils/modelOptions.test.ts +1 -1
- package/src/cli/ui/utils/versionCache.ts +93 -0
- package/src/cli/ui/utils/versionFetcher.ts +120 -0
- package/src/codex.ts +138 -39
- package/src/config/__tests__/saveSession.test.ts +143 -0
- package/src/config/builtin-coding-agents.ts +4 -4
- package/src/config/index.ts +14 -0
- package/src/gemini.ts +107 -46
- package/src/index.test.ts +25 -19
- package/src/index.ts +202 -143
- package/src/launcher.ts +66 -6
- package/src/logging/agentOutput.ts +216 -0
- package/src/logging/formatter.ts +23 -4
- package/src/logging/logger.ts +34 -10
- package/src/logging/reader.ts +117 -0
- package/src/opentui/index.solid.ts +1 -0
- package/src/repositories/worktree.repository.ts +8 -0
- package/src/services/__tests__/BatchMergeService.test.ts +83 -67
- package/src/services/__tests__/WorktreeOrchestrator.test.ts +8 -7
- package/src/services/codingAgentResolver.ts +30 -4
- package/src/services/dependency-installer.ts +2 -9
- package/src/types/api.ts +3 -0
- package/src/types/coding-agent.ts +85 -0
- package/src/types/tools.ts +19 -0
- package/src/utils/__tests__/npmRegistry.test.ts +250 -0
- package/src/utils/__tests__/prompt.test.ts +4 -5
- package/src/utils/coding-agent-colors.ts +165 -0
- package/src/utils/command.ts +1 -1
- package/src/utils/error-utils.ts +133 -0
- package/src/utils/npmRegistry.ts +249 -0
- package/src/utils/prompt.ts +1 -1
- package/src/utils/session/common.ts +28 -0
- package/src/utils/session/parsers/claude.ts +79 -29
- package/src/utils/session/parsers/codex.ts +50 -18
- package/src/utils/session/parsers/gemini.ts +46 -5
- package/src/utils/session/parsers/opencode.ts +46 -5
- package/src/utils/session/types.ts +4 -0
- package/src/utils/terminal.ts +24 -0
- package/src/utils.test.ts +1 -1
- package/src/utils.ts +37 -4
- package/src/web/client/src/components/CodingAgentLaunchModal.tsx +12 -21
- package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +16 -1
- package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +7 -1
- package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +11 -6
- package/src/web/client/src/lib/coding-agent-colors.ts +149 -0
- package/src/web/client/src/pages/BranchDetailPage.tsx +11 -11
- package/src/web/server/pty/manager.ts +139 -0
- package/src/web/server/routes/sessions.ts +6 -0
- package/src/web/server/services/branches.ts +11 -8
- package/src/web/server/services/worktrees.ts +2 -2
- package/src/worktree.ts +386 -114
- package/dist/cli/ui/components/App.d.ts +0 -25
- package/dist/cli/ui/components/App.d.ts.map +0 -1
- package/dist/cli/ui/components/App.js +0 -1006
- package/dist/cli/ui/components/App.js.map +0 -1
- package/dist/cli/ui/components/common/Confirm.d.ts +0 -13
- package/dist/cli/ui/components/common/Confirm.d.ts.map +0 -1
- package/dist/cli/ui/components/common/Confirm.js +0 -20
- package/dist/cli/ui/components/common/Confirm.js.map +0 -1
- package/dist/cli/ui/components/common/ErrorBoundary.d.ts +0 -23
- package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +0 -1
- package/dist/cli/ui/components/common/ErrorBoundary.js +0 -37
- package/dist/cli/ui/components/common/ErrorBoundary.js.map +0 -1
- package/dist/cli/ui/components/common/Input.d.ts +0 -19
- package/dist/cli/ui/components/common/Input.d.ts.map +0 -1
- package/dist/cli/ui/components/common/Input.js +0 -22
- package/dist/cli/ui/components/common/Input.js.map +0 -1
- package/dist/cli/ui/components/common/LoadingIndicator.d.ts +0 -19
- package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +0 -1
- package/dist/cli/ui/components/common/LoadingIndicator.js +0 -61
- package/dist/cli/ui/components/common/LoadingIndicator.js.map +0 -1
- package/dist/cli/ui/components/common/Select.d.ts +0 -38
- package/dist/cli/ui/components/common/Select.d.ts.map +0 -1
- package/dist/cli/ui/components/common/Select.js +0 -151
- package/dist/cli/ui/components/common/Select.js.map +0 -1
- package/dist/cli/ui/components/common/SpinnerIcon.d.ts +0 -20
- package/dist/cli/ui/components/common/SpinnerIcon.d.ts.map +0 -1
- package/dist/cli/ui/components/common/SpinnerIcon.js +0 -61
- package/dist/cli/ui/components/common/SpinnerIcon.js.map +0 -1
- package/dist/cli/ui/components/parts/Footer.d.ts +0 -15
- package/dist/cli/ui/components/parts/Footer.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/Footer.js +0 -20
- package/dist/cli/ui/components/parts/Footer.js.map +0 -1
- package/dist/cli/ui/components/parts/Header.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/Header.js +0 -24
- package/dist/cli/ui/components/parts/Header.js.map +0 -1
- package/dist/cli/ui/components/parts/MergeStatusList.d.ts +0 -13
- package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/MergeStatusList.js +0 -52
- package/dist/cli/ui/components/parts/MergeStatusList.js.map +0 -1
- package/dist/cli/ui/components/parts/ProgressBar.d.ts +0 -13
- package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/ProgressBar.js +0 -53
- package/dist/cli/ui/components/parts/ProgressBar.js.map +0 -1
- package/dist/cli/ui/components/parts/ScrollableList.d.ts +0 -12
- package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/ScrollableList.js +0 -11
- package/dist/cli/ui/components/parts/ScrollableList.js.map +0 -1
- package/dist/cli/ui/components/parts/Stats.d.ts +0 -10
- package/dist/cli/ui/components/parts/Stats.d.ts.map +0 -1
- package/dist/cli/ui/components/parts/Stats.js +0 -55
- package/dist/cli/ui/components/parts/Stats.js.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +0 -17
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +0 -42
- package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +0 -17
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +0 -72
- package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +0 -18
- package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js +0 -151
- package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts +0 -60
- package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BranchListScreen.js +0 -476
- package/dist/cli/ui/components/screens/BranchListScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +0 -30
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +0 -148
- package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts +0 -27
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js +0 -93
- package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +0 -19
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +0 -577
- package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +0 -45
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +0 -95
- package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +0 -10
- package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/LogDatePickerScreen.js +0 -44
- package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/LogDetailScreen.js +0 -34
- package/dist/cli/ui/components/screens/LogDetailScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/LogListScreen.js +0 -107
- package/dist/cli/ui/components/screens/LogListScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +0 -24
- package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/ModelSelectorScreen.js +0 -197
- package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +0 -29
- package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/PRCleanupScreen.js +0 -92
- package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +0 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +0 -31
- package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js +0 -67
- package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +0 -1
- package/dist/cli/ui/hooks/useAppInput.d.ts +0 -21
- package/dist/cli/ui/hooks/useAppInput.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useAppInput.js +0 -138
- package/dist/cli/ui/hooks/useAppInput.js.map +0 -1
- package/dist/cli/ui/hooks/useBatchMerge.d.ts +0 -17
- package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useBatchMerge.js +0 -77
- package/dist/cli/ui/hooks/useBatchMerge.js.map +0 -1
- package/dist/cli/ui/hooks/useGitData.d.ts +0 -21
- package/dist/cli/ui/hooks/useGitData.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useGitData.js +0 -229
- package/dist/cli/ui/hooks/useGitData.js.map +0 -1
- package/dist/cli/ui/hooks/useProfiles.d.ts +0 -41
- package/dist/cli/ui/hooks/useProfiles.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useProfiles.js +0 -136
- package/dist/cli/ui/hooks/useProfiles.js.map +0 -1
- package/dist/cli/ui/hooks/useScreenState.d.ts +0 -12
- package/dist/cli/ui/hooks/useScreenState.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useScreenState.js +0 -30
- package/dist/cli/ui/hooks/useScreenState.js.map +0 -1
- package/dist/cli/ui/hooks/useTerminalSize.d.ts +0 -9
- package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useTerminalSize.js +0 -24
- package/dist/cli/ui/hooks/useTerminalSize.js.map +0 -1
- package/dist/cli/ui/hooks/useToolStatus.d.ts +0 -30
- package/dist/cli/ui/hooks/useToolStatus.d.ts.map +0 -1
- package/dist/cli/ui/hooks/useToolStatus.js +0 -49
- package/dist/cli/ui/hooks/useToolStatus.js.map +0 -1
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +0 -24
- package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +0 -1
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js +0 -65
- package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +0 -1
- package/dist/client/assets/index-LNPtOrn3.js +0 -78
- package/src/cli/ui/__tests__/SKIPPED_TESTS.md +0 -119
- package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +0 -239
- package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +0 -225
- package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +0 -219
- package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +0 -212
- package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +0 -440
- package/src/cli/ui/__tests__/components/App.test.tsx +0 -365
- package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +0 -91
- package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +0 -80
- package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +0 -104
- package/src/cli/ui/__tests__/components/common/Input.test.tsx +0 -100
- package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +0 -148
- package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +0 -255
- package/src/cli/ui/__tests__/components/common/Select.test.tsx +0 -335
- package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +0 -65
- package/src/cli/ui/__tests__/components/parts/Header.test.tsx +0 -55
- package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +0 -69
- package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +0 -148
- package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +0 -253
- package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +0 -1070
- package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +0 -142
- package/src/cli/ui/__tests__/components/screens/CodingAgentSelectorScreen.test.tsx +0 -174
- package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +0 -182
- package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +0 -57
- package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +0 -102
- package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +0 -216
- package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +0 -147
- package/src/cli/ui/__tests__/hooks/useGitData.nonblocking.test.tsx +0 -206
- package/src/cli/ui/__tests__/hooks/useGitData.test.ts +0 -197
- package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +0 -228
- package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +0 -147
- package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +0 -99
- package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +0 -253
- package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +0 -436
- package/src/cli/ui/__tests__/integration/navigation.test.tsx +0 -514
- package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +0 -509
- package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +0 -216
- package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +0 -193
- package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +0 -234
- package/src/cli/ui/components/App.tsx +0 -1478
- package/src/cli/ui/components/common/Confirm.tsx +0 -44
- package/src/cli/ui/components/common/ErrorBoundary.tsx +0 -60
- package/src/cli/ui/components/common/Input.tsx +0 -58
- package/src/cli/ui/components/common/LoadingIndicator.tsx +0 -98
- package/src/cli/ui/components/common/Select.tsx +0 -247
- package/src/cli/ui/components/common/SpinnerIcon.tsx +0 -86
- package/src/cli/ui/components/parts/Footer.tsx +0 -41
- package/src/cli/ui/components/parts/Header.test.tsx +0 -75
- package/src/cli/ui/components/parts/MergeStatusList.tsx +0 -75
- package/src/cli/ui/components/parts/ProgressBar.tsx +0 -73
- package/src/cli/ui/components/parts/Stats.tsx +0 -88
- package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +0 -74
- package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +0 -108
- package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +0 -242
- package/src/cli/ui/components/screens/BranchListScreen.tsx +0 -744
- package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +0 -244
- package/src/cli/ui/components/screens/CodingAgentSelectorScreen.tsx +0 -159
- package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +0 -928
- package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +0 -176
- package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +0 -83
- package/src/cli/ui/components/screens/LogDetailScreen.tsx +0 -67
- package/src/cli/ui/components/screens/LogListScreen.tsx +0 -192
- package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +0 -320
- package/src/cli/ui/components/screens/PRCleanupScreen.tsx +0 -171
- package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +0 -135
- package/src/cli/ui/hooks/useAppInput.ts +0 -172
- package/src/cli/ui/hooks/useBatchMerge.ts +0 -96
- package/src/cli/ui/hooks/useGitData.ts +0 -347
- package/src/cli/ui/hooks/useProfiles.ts +0 -211
- package/src/cli/ui/hooks/useScreenState.ts +0 -44
- package/src/cli/ui/hooks/useTerminalSize.ts +0 -33
- package/src/cli/ui/hooks/useToolStatus.ts +0 -68
- package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +0 -111
- package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +0 -264
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm Registry API utilities for fetching package versions
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export interface VersionInfo {
|
|
6
|
+
version: string;
|
|
7
|
+
isPrerelease: boolean;
|
|
8
|
+
publishedAt?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type VersionSelection = "installed" | "latest" | string;
|
|
12
|
+
|
|
13
|
+
interface NpmRegistryResponse {
|
|
14
|
+
"dist-tags"?: Record<string, string>;
|
|
15
|
+
time?: Record<string, string>;
|
|
16
|
+
versions?: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const DEFAULT_TIMEOUT_MS = 3000;
|
|
20
|
+
const DEFAULT_LIMIT = 10;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Check if a version string is a prerelease version
|
|
24
|
+
*/
|
|
25
|
+
function isPrerelease(version: string): boolean {
|
|
26
|
+
// Prerelease versions contain - followed by alpha, beta, rc, canary, next, etc.
|
|
27
|
+
return /-(alpha|beta|rc|canary|next|dev|pre)\b/i.test(version);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Fetch package versions from npm registry
|
|
32
|
+
* Returns the latest N versions sorted by publish date (newest first)
|
|
33
|
+
*/
|
|
34
|
+
export async function fetchPackageVersions(
|
|
35
|
+
packageName: string,
|
|
36
|
+
limit: number = DEFAULT_LIMIT,
|
|
37
|
+
timeoutMs: number = DEFAULT_TIMEOUT_MS,
|
|
38
|
+
): Promise<VersionInfo[]> {
|
|
39
|
+
try {
|
|
40
|
+
const controller = new AbortController();
|
|
41
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
42
|
+
|
|
43
|
+
const response = await fetch(
|
|
44
|
+
`https://registry.npmjs.org/${encodeURIComponent(packageName)}`,
|
|
45
|
+
{
|
|
46
|
+
signal: controller.signal,
|
|
47
|
+
headers: {
|
|
48
|
+
Accept: "application/json",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
clearTimeout(timeoutId);
|
|
54
|
+
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const data = (await response.json()) as NpmRegistryResponse;
|
|
60
|
+
|
|
61
|
+
if (!data.versions || !data.time) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Get all versions with their publish times
|
|
66
|
+
const versionsWithTime: Array<{
|
|
67
|
+
version: string;
|
|
68
|
+
publishedAt: string;
|
|
69
|
+
}> = [];
|
|
70
|
+
|
|
71
|
+
for (const version of Object.keys(data.versions)) {
|
|
72
|
+
const publishedAt = data.time[version];
|
|
73
|
+
if (publishedAt) {
|
|
74
|
+
versionsWithTime.push({ version, publishedAt });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Sort by publish date (newest first)
|
|
79
|
+
versionsWithTime.sort((a, b) => {
|
|
80
|
+
const dateA = new Date(a.publishedAt).getTime();
|
|
81
|
+
const dateB = new Date(b.publishedAt).getTime();
|
|
82
|
+
return dateB - dateA;
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Take the top N versions
|
|
86
|
+
const topVersions = versionsWithTime.slice(0, limit);
|
|
87
|
+
|
|
88
|
+
// Convert to VersionInfo
|
|
89
|
+
return topVersions.map((v) => ({
|
|
90
|
+
version: v.version,
|
|
91
|
+
isPrerelease: isPrerelease(v.version),
|
|
92
|
+
publishedAt: v.publishedAt,
|
|
93
|
+
}));
|
|
94
|
+
} catch {
|
|
95
|
+
// Return empty array on any error (network, timeout, parse error, etc.)
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Parse a package command to extract package name and version
|
|
102
|
+
* Examples:
|
|
103
|
+
* "@anthropic-ai/claude-code" -> { packageName: "@anthropic-ai/claude-code", version: null }
|
|
104
|
+
* "@anthropic-ai/claude-code@latest" -> { packageName: "@anthropic-ai/claude-code", version: "latest" }
|
|
105
|
+
* "@anthropic-ai/claude-code@1.0.3" -> { packageName: "@anthropic-ai/claude-code", version: "1.0.3" }
|
|
106
|
+
* "opencode-ai@latest" -> { packageName: "opencode-ai", version: "latest" }
|
|
107
|
+
*/
|
|
108
|
+
export function parsePackageCommand(command: string): {
|
|
109
|
+
packageName: string;
|
|
110
|
+
version: string | null;
|
|
111
|
+
} {
|
|
112
|
+
// Handle scoped packages (@scope/name@version)
|
|
113
|
+
if (command.startsWith("@")) {
|
|
114
|
+
// Find the second @ which separates version
|
|
115
|
+
const firstSlash = command.indexOf("/");
|
|
116
|
+
if (firstSlash === -1) {
|
|
117
|
+
// Invalid scoped package format
|
|
118
|
+
return { packageName: command, version: null };
|
|
119
|
+
}
|
|
120
|
+
const afterScope = command.substring(firstSlash + 1);
|
|
121
|
+
const atIndex = afterScope.indexOf("@");
|
|
122
|
+
if (atIndex === -1) {
|
|
123
|
+
return { packageName: command, version: null };
|
|
124
|
+
}
|
|
125
|
+
const packageName = command.substring(0, firstSlash + 1 + atIndex);
|
|
126
|
+
const version = afterScope.substring(atIndex + 1);
|
|
127
|
+
return { packageName, version };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Handle non-scoped packages (name@version)
|
|
131
|
+
const atIndex = command.indexOf("@");
|
|
132
|
+
if (atIndex === -1) {
|
|
133
|
+
return { packageName: command, version: null };
|
|
134
|
+
}
|
|
135
|
+
const packageName = command.substring(0, atIndex);
|
|
136
|
+
const version = command.substring(atIndex + 1);
|
|
137
|
+
return { packageName, version };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Resolve version selection to a bunx-compatible suffix
|
|
142
|
+
* Examples:
|
|
143
|
+
* "installed" -> "" (use bunx default/cached version)
|
|
144
|
+
* "latest" -> "@latest"
|
|
145
|
+
* "1.0.3" -> "@1.0.3"
|
|
146
|
+
* undefined -> "" (use bunx default/cached version)
|
|
147
|
+
*/
|
|
148
|
+
export function resolveVersionSuffix(version?: VersionSelection): string {
|
|
149
|
+
if (!version || version === "installed") {
|
|
150
|
+
return "";
|
|
151
|
+
}
|
|
152
|
+
return `@${version}`;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export interface GlobalPackageInfo {
|
|
156
|
+
name: string;
|
|
157
|
+
version: string;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export interface GlobalPackagesResult {
|
|
161
|
+
path: string | null;
|
|
162
|
+
packages: GlobalPackageInfo[];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Parse the output of `bun pm ls -g` command
|
|
167
|
+
* Example output:
|
|
168
|
+
* /root/.bun/install/global node_modules (17)
|
|
169
|
+
* ├── @anthropic-ai/claude-code@2.0.76
|
|
170
|
+
* └── @openai/codex@0.77.0
|
|
171
|
+
*/
|
|
172
|
+
export function parseGlobalPackagesOutput(
|
|
173
|
+
output: string,
|
|
174
|
+
): GlobalPackagesResult {
|
|
175
|
+
const lines = output.trim().split("\n");
|
|
176
|
+
if (lines.length === 0 || !lines[0]) {
|
|
177
|
+
return { path: null, packages: [] };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Parse the first line to get the path
|
|
181
|
+
// Format: "/path/to/global node_modules (N)"
|
|
182
|
+
const firstLine = lines[0];
|
|
183
|
+
const pathMatch = firstLine.match(/^(.+?)\s+node_modules\s+\(\d+\)$/);
|
|
184
|
+
const path = pathMatch?.[1] ?? null;
|
|
185
|
+
|
|
186
|
+
// Parse package lines
|
|
187
|
+
const packages: GlobalPackageInfo[] = [];
|
|
188
|
+
for (let i = 1; i < lines.length; i++) {
|
|
189
|
+
const line = lines[i];
|
|
190
|
+
if (!line) continue;
|
|
191
|
+
|
|
192
|
+
// Remove tree characters (├── └── │)
|
|
193
|
+
const cleaned = line.replace(/^[├└│─\s]+/, "").trim();
|
|
194
|
+
if (!cleaned) continue;
|
|
195
|
+
|
|
196
|
+
// Parse package@version format
|
|
197
|
+
// Handle scoped packages like @anthropic-ai/claude-code@2.0.76
|
|
198
|
+
const lastAtIndex = cleaned.lastIndexOf("@");
|
|
199
|
+
if (lastAtIndex <= 0) continue; // No version or invalid format
|
|
200
|
+
|
|
201
|
+
const name = cleaned.substring(0, lastAtIndex);
|
|
202
|
+
const version = cleaned.substring(lastAtIndex + 1);
|
|
203
|
+
|
|
204
|
+
if (name && version) {
|
|
205
|
+
packages.push({ name, version });
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return { path, packages };
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export interface InstalledPackageInfo {
|
|
213
|
+
version: string;
|
|
214
|
+
path: string;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Get information about a globally installed package
|
|
219
|
+
* Returns null if the package is not installed
|
|
220
|
+
*/
|
|
221
|
+
export async function getInstalledPackageInfo(
|
|
222
|
+
packageName: string,
|
|
223
|
+
): Promise<InstalledPackageInfo | null> {
|
|
224
|
+
try {
|
|
225
|
+
const { execa } = await import("execa");
|
|
226
|
+
const result = await execa("bun", ["pm", "ls", "-g"], {
|
|
227
|
+
timeout: 5000,
|
|
228
|
+
reject: false,
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
if (result.exitCode !== 0 || !result.stdout) {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const parsed = parseGlobalPackagesOutput(result.stdout);
|
|
236
|
+
const pkg = parsed.packages.find((p) => p.name === packageName);
|
|
237
|
+
|
|
238
|
+
if (!pkg || !parsed.path) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return {
|
|
243
|
+
version: pkg.version,
|
|
244
|
+
path: `${parsed.path}/node_modules/${packageName}`,
|
|
245
|
+
};
|
|
246
|
+
} catch {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
package/src/utils/prompt.ts
CHANGED
|
@@ -95,7 +95,7 @@ async function runReadlinePrompt<T>(
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
/**
|
|
98
|
-
* Wait for Enter using the same terminal streams as
|
|
98
|
+
* Wait for Enter using the same terminal streams as the CLI UI.
|
|
99
99
|
* Falls back to no-op on non-interactive stdin to avoid blocking pipelines.
|
|
100
100
|
*/
|
|
101
101
|
export async function waitForEnter(promptMessage: string): Promise<void> {
|
|
@@ -444,3 +444,31 @@ export function matchesCwd(
|
|
|
444
444
|
isPathPrefix(normalizedSession, normalizedTarget)
|
|
445
445
|
);
|
|
446
446
|
}
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* Resolves a branch name for a session cwd using worktree paths.
|
|
450
|
+
* Picks the worktree with the longest matching path prefix.
|
|
451
|
+
*/
|
|
452
|
+
export function resolveBranchFromCwd(
|
|
453
|
+
sessionCwd: string | null,
|
|
454
|
+
worktrees: { path: string; branch: string }[],
|
|
455
|
+
): string | null {
|
|
456
|
+
if (!sessionCwd) return null;
|
|
457
|
+
const normalizedSession = normalizePath(sessionCwd);
|
|
458
|
+
let bestMatch: { branch: string; path: string } | null = null;
|
|
459
|
+
|
|
460
|
+
for (const worktree of worktrees) {
|
|
461
|
+
if (!worktree?.path || !worktree.branch) continue;
|
|
462
|
+
const normalizedPath = normalizePath(worktree.path);
|
|
463
|
+
if (
|
|
464
|
+
normalizedSession === normalizedPath ||
|
|
465
|
+
isPathPrefix(normalizedPath, normalizedSession)
|
|
466
|
+
) {
|
|
467
|
+
if (!bestMatch || normalizedPath.length > bestMatch.path.length) {
|
|
468
|
+
bestMatch = { branch: worktree.branch, path: normalizedPath };
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
return bestMatch?.branch ?? null;
|
|
474
|
+
}
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
readFileContent,
|
|
17
17
|
checkFileStat,
|
|
18
18
|
} from "../common.js";
|
|
19
|
+
import { listAllWorktrees } from "../../../worktree.js";
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Encodes a project path for Claude's directory structure.
|
|
@@ -75,36 +76,72 @@ function getClaudeRootCandidates(): string[] {
|
|
|
75
76
|
* 3. ~/.claude/history.jsonl (global history fallback)
|
|
76
77
|
*
|
|
77
78
|
* @param cwd - The working directory to find sessions for
|
|
78
|
-
* @param options - Search options (since, until, preferClosestTo, windowMs)
|
|
79
|
+
* @param options - Search options (since, until, preferClosestTo, windowMs, branch/worktrees)
|
|
79
80
|
* @returns Session info with ID and modification time, or null if not found
|
|
80
81
|
*/
|
|
81
82
|
export async function findLatestClaudeSession(
|
|
82
83
|
cwd: string,
|
|
83
|
-
options:
|
|
84
|
+
options: SessionSearchOptions = {},
|
|
84
85
|
): Promise<ClaudeSessionInfo | null> {
|
|
85
86
|
const rootCandidates = getClaudeRootCandidates();
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const projectDir = path.join(claudeRoot, "projects", encoded);
|
|
91
|
-
const sessionsDir = path.join(projectDir, "sessions");
|
|
92
|
-
|
|
93
|
-
// 1) Look under sessions/ (official location)
|
|
94
|
-
const session = await findNewestSessionIdFromDir(
|
|
95
|
-
sessionsDir,
|
|
96
|
-
false,
|
|
97
|
-
options,
|
|
98
|
-
);
|
|
99
|
-
if (session) return session;
|
|
87
|
+
const branchFilter =
|
|
88
|
+
typeof options.branch === "string" && options.branch.trim().length > 0
|
|
89
|
+
? options.branch.trim()
|
|
90
|
+
: null;
|
|
100
91
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
92
|
+
let cwdCandidates: string[] = [];
|
|
93
|
+
if (branchFilter) {
|
|
94
|
+
let worktrees: { path: string; branch: string }[] = [];
|
|
95
|
+
if (Array.isArray(options.worktrees) && options.worktrees.length > 0) {
|
|
96
|
+
worktrees = options.worktrees
|
|
97
|
+
.filter((entry) => entry?.path && entry?.branch)
|
|
98
|
+
.map((entry) => ({ path: entry.path, branch: entry.branch }));
|
|
99
|
+
} else {
|
|
100
|
+
try {
|
|
101
|
+
const allWorktrees = await listAllWorktrees();
|
|
102
|
+
worktrees = allWorktrees
|
|
103
|
+
.filter((entry) => entry?.path && entry?.branch)
|
|
104
|
+
.map((entry) => ({ path: entry.path, branch: entry.branch }));
|
|
105
|
+
} catch {
|
|
106
|
+
worktrees = [];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const matches = worktrees
|
|
110
|
+
.filter((entry) => entry.branch === branchFilter)
|
|
111
|
+
.map((entry) => entry.path);
|
|
112
|
+
if (!matches.length) return null;
|
|
113
|
+
cwdCandidates = matches;
|
|
114
|
+
} else {
|
|
115
|
+
const baseCwd = options.cwd ?? cwd;
|
|
116
|
+
if (!baseCwd) return null;
|
|
117
|
+
cwdCandidates = [baseCwd];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const uniqueCwds = Array.from(new Set(cwdCandidates));
|
|
121
|
+
|
|
122
|
+
for (const candidateCwd of uniqueCwds) {
|
|
123
|
+
const encodedPaths = generateClaudeProjectPathCandidates(candidateCwd);
|
|
124
|
+
for (const claudeRoot of rootCandidates) {
|
|
125
|
+
for (const encoded of encodedPaths) {
|
|
126
|
+
const projectDir = path.join(claudeRoot, "projects", encoded);
|
|
127
|
+
const sessionsDir = path.join(projectDir, "sessions");
|
|
128
|
+
|
|
129
|
+
// 1) Look under sessions/ (official location)
|
|
130
|
+
const session = await findNewestSessionIdFromDir(
|
|
131
|
+
sessionsDir,
|
|
132
|
+
false,
|
|
133
|
+
options,
|
|
134
|
+
);
|
|
135
|
+
if (session) return session;
|
|
136
|
+
|
|
137
|
+
// 2) Look directly under project dir and subdirs
|
|
138
|
+
const rootSession = await findNewestSessionIdFromDir(
|
|
139
|
+
projectDir,
|
|
140
|
+
true,
|
|
141
|
+
options,
|
|
142
|
+
);
|
|
143
|
+
if (rootSession) return rootSession;
|
|
144
|
+
}
|
|
108
145
|
}
|
|
109
146
|
}
|
|
110
147
|
|
|
@@ -124,7 +161,10 @@ export async function findLatestClaudeSession(
|
|
|
124
161
|
typeof parsed.project === "string" ? parsed.project : null;
|
|
125
162
|
const sessionId =
|
|
126
163
|
typeof parsed.sessionId === "string" ? parsed.sessionId : null;
|
|
127
|
-
|
|
164
|
+
const matchesProject = uniqueCwds.some((candidate) =>
|
|
165
|
+
matchesCwd(project, candidate),
|
|
166
|
+
);
|
|
167
|
+
if (project && sessionId && matchesProject) {
|
|
128
168
|
return { id: sessionId, mtime: historyStat.mtimeMs };
|
|
129
169
|
}
|
|
130
170
|
} catch {
|
|
@@ -141,14 +181,14 @@ export async function findLatestClaudeSession(
|
|
|
141
181
|
/**
|
|
142
182
|
* Finds the latest Claude session ID for a given working directory.
|
|
143
183
|
* @param cwd - The working directory to find sessions for
|
|
144
|
-
* @param options - Search options (since, until, preferClosestTo, windowMs)
|
|
184
|
+
* @param options - Search options (since, until, preferClosestTo, windowMs, branch/worktrees)
|
|
145
185
|
* @returns Session ID string or null if not found
|
|
146
186
|
*/
|
|
147
187
|
export async function findLatestClaudeSessionId(
|
|
148
188
|
cwd: string,
|
|
149
|
-
options:
|
|
189
|
+
options: SessionSearchOptions = {},
|
|
150
190
|
): Promise<string | null> {
|
|
151
|
-
const found = await findLatestClaudeSession(cwd, options);
|
|
191
|
+
const found = await findLatestClaudeSession(options.cwd ?? cwd, options);
|
|
152
192
|
return found?.id ?? null;
|
|
153
193
|
}
|
|
154
194
|
|
|
@@ -167,6 +207,9 @@ export async function waitForClaudeSessionId(
|
|
|
167
207
|
until?: number;
|
|
168
208
|
preferClosestTo?: number;
|
|
169
209
|
windowMs?: number;
|
|
210
|
+
branch?: string | null;
|
|
211
|
+
worktrees?: { path: string; branch: string }[] | null;
|
|
212
|
+
cwd?: string | null;
|
|
170
213
|
} = {},
|
|
171
214
|
): Promise<string | null> {
|
|
172
215
|
const timeoutMs = options.timeoutMs ?? 120_000;
|
|
@@ -174,15 +217,22 @@ export async function waitForClaudeSessionId(
|
|
|
174
217
|
const deadline = Date.now() + timeoutMs;
|
|
175
218
|
|
|
176
219
|
// Build search options once outside the loop
|
|
177
|
-
const searchOptions:
|
|
220
|
+
const searchOptions: SessionSearchOptions = {};
|
|
178
221
|
if (options.since !== undefined) searchOptions.since = options.since;
|
|
179
222
|
if (options.until !== undefined) searchOptions.until = options.until;
|
|
180
223
|
if (options.preferClosestTo !== undefined)
|
|
181
224
|
searchOptions.preferClosestTo = options.preferClosestTo;
|
|
182
225
|
if (options.windowMs !== undefined) searchOptions.windowMs = options.windowMs;
|
|
226
|
+
if (options.branch !== undefined) searchOptions.branch = options.branch;
|
|
227
|
+
if (options.worktrees !== undefined)
|
|
228
|
+
searchOptions.worktrees = options.worktrees;
|
|
229
|
+
if (options.cwd !== undefined) searchOptions.cwd = options.cwd;
|
|
183
230
|
|
|
184
231
|
while (Date.now() < deadline) {
|
|
185
|
-
const found = await findLatestClaudeSession(
|
|
232
|
+
const found = await findLatestClaudeSession(
|
|
233
|
+
options.cwd ?? cwd,
|
|
234
|
+
searchOptions,
|
|
235
|
+
);
|
|
186
236
|
if (found?.id) return found.id;
|
|
187
237
|
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
188
238
|
}
|
|
@@ -14,8 +14,10 @@ import {
|
|
|
14
14
|
UUID_REGEX,
|
|
15
15
|
collectFilesIterative,
|
|
16
16
|
matchesCwd,
|
|
17
|
+
resolveBranchFromCwd,
|
|
17
18
|
readSessionInfoFromFile,
|
|
18
19
|
} from "../common.js";
|
|
20
|
+
import { listAllWorktrees } from "../../../worktree.js";
|
|
19
21
|
|
|
20
22
|
/**
|
|
21
23
|
* Finds the latest Codex session with optional time filtering and cwd matching.
|
|
@@ -63,32 +65,62 @@ export async function findLatestCodexSession(
|
|
|
63
65
|
return b.mtime - a.mtime;
|
|
64
66
|
});
|
|
65
67
|
|
|
68
|
+
const branchFilter =
|
|
69
|
+
typeof options.branch === "string" && options.branch.trim().length > 0
|
|
70
|
+
? options.branch.trim()
|
|
71
|
+
: null;
|
|
72
|
+
const shouldCheckBranch = Boolean(branchFilter);
|
|
73
|
+
const shouldCheckCwd = Boolean(options.cwd) && !shouldCheckBranch;
|
|
74
|
+
|
|
75
|
+
let worktrees: { path: string; branch: string }[] = [];
|
|
76
|
+
if (shouldCheckBranch) {
|
|
77
|
+
if (Array.isArray(options.worktrees) && options.worktrees.length > 0) {
|
|
78
|
+
worktrees = options.worktrees
|
|
79
|
+
.filter((entry) => entry?.path && entry?.branch)
|
|
80
|
+
.map((entry) => ({ path: entry.path, branch: entry.branch }));
|
|
81
|
+
} else {
|
|
82
|
+
try {
|
|
83
|
+
const allWorktrees = await listAllWorktrees();
|
|
84
|
+
worktrees = allWorktrees
|
|
85
|
+
.filter((entry) => entry?.path && entry?.branch)
|
|
86
|
+
.map((entry) => ({ path: entry.path, branch: entry.branch }));
|
|
87
|
+
} catch {
|
|
88
|
+
worktrees = [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (!worktrees.length) return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
66
94
|
for (const file of ordered) {
|
|
67
95
|
// Priority 1: Extract session ID from filename (most reliable for Codex)
|
|
68
96
|
const filenameMatch = path.basename(file.fullPath).match(UUID_REGEX);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
97
|
+
const idFromName = filenameMatch?.[0] ?? null;
|
|
98
|
+
const needsInfo = shouldCheckBranch || shouldCheckCwd || !idFromName;
|
|
99
|
+
const info = needsInfo
|
|
100
|
+
? await readSessionInfoFromFile(file.fullPath)
|
|
101
|
+
: null;
|
|
102
|
+
const sessionCwd = info?.cwd ?? null;
|
|
103
|
+
|
|
104
|
+
if (shouldCheckBranch) {
|
|
105
|
+
const resolvedBranch = resolveBranchFromCwd(sessionCwd, worktrees);
|
|
106
|
+
if (resolvedBranch !== branchFilter) {
|
|
107
|
+
continue;
|
|
78
108
|
}
|
|
79
|
-
return { id: sessionId, mtime: file.mtime };
|
|
80
109
|
}
|
|
81
110
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (options.cwd) {
|
|
86
|
-
if (matchesCwd(info.cwd, options.cwd)) {
|
|
87
|
-
return { id: info.id, mtime: file.mtime };
|
|
111
|
+
if (shouldCheckCwd && options.cwd) {
|
|
112
|
+
if (!matchesCwd(sessionCwd, options.cwd)) {
|
|
113
|
+
continue;
|
|
88
114
|
}
|
|
89
|
-
continue;
|
|
90
115
|
}
|
|
91
|
-
|
|
116
|
+
|
|
117
|
+
const sessionId = idFromName ?? info?.id ?? null;
|
|
118
|
+
if (sessionId) {
|
|
119
|
+
return { id: sessionId, mtime: file.mtime };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Priority 2: Fallback to reading file content if filename lacks UUID
|
|
123
|
+
// (already handled via info above)
|
|
92
124
|
}
|
|
93
125
|
|
|
94
126
|
return null;
|
|
@@ -12,8 +12,10 @@ import type { GeminiSessionInfo, SessionSearchOptions } from "../types.js";
|
|
|
12
12
|
import {
|
|
13
13
|
collectFilesIterative,
|
|
14
14
|
matchesCwd,
|
|
15
|
+
resolveBranchFromCwd,
|
|
15
16
|
readSessionInfoFromFile,
|
|
16
17
|
} from "../common.js";
|
|
18
|
+
import { listAllWorktrees } from "../../../worktree.js";
|
|
17
19
|
|
|
18
20
|
/**
|
|
19
21
|
* Finds the latest Gemini session with optional time filtering and cwd matching.
|
|
@@ -57,15 +59,50 @@ export async function findLatestGeminiSession(
|
|
|
57
59
|
return b.mtime - a.mtime;
|
|
58
60
|
});
|
|
59
61
|
|
|
62
|
+
const branchFilter =
|
|
63
|
+
typeof options.branch === "string" && options.branch.trim().length > 0
|
|
64
|
+
? options.branch.trim()
|
|
65
|
+
: null;
|
|
66
|
+
const shouldCheckBranch = Boolean(branchFilter);
|
|
67
|
+
const shouldCheckCwd = Boolean(options.cwd) && !shouldCheckBranch;
|
|
68
|
+
|
|
69
|
+
let worktrees: { path: string; branch: string }[] = [];
|
|
70
|
+
if (shouldCheckBranch) {
|
|
71
|
+
if (Array.isArray(options.worktrees) && options.worktrees.length > 0) {
|
|
72
|
+
worktrees = options.worktrees
|
|
73
|
+
.filter((entry) => entry?.path && entry?.branch)
|
|
74
|
+
.map((entry) => ({ path: entry.path, branch: entry.branch }));
|
|
75
|
+
} else {
|
|
76
|
+
try {
|
|
77
|
+
const allWorktrees = await listAllWorktrees();
|
|
78
|
+
worktrees = allWorktrees
|
|
79
|
+
.filter((entry) => entry?.path && entry?.branch)
|
|
80
|
+
.map((entry) => ({ path: entry.path, branch: entry.branch }));
|
|
81
|
+
} catch {
|
|
82
|
+
worktrees = [];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (!worktrees.length) return null;
|
|
86
|
+
}
|
|
87
|
+
|
|
60
88
|
for (const file of pool) {
|
|
61
89
|
const info = await readSessionInfoFromFile(file.fullPath);
|
|
62
90
|
if (!info.id) continue;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
91
|
+
const sessionCwd = info.cwd ?? null;
|
|
92
|
+
|
|
93
|
+
if (shouldCheckBranch) {
|
|
94
|
+
const resolvedBranch = resolveBranchFromCwd(sessionCwd, worktrees);
|
|
95
|
+
if (resolvedBranch !== branchFilter) {
|
|
96
|
+
continue;
|
|
66
97
|
}
|
|
67
|
-
continue;
|
|
68
98
|
}
|
|
99
|
+
|
|
100
|
+
if (shouldCheckCwd && options.cwd) {
|
|
101
|
+
if (!matchesCwd(sessionCwd, options.cwd)) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
69
106
|
return { id: info.id, mtime: file.mtime };
|
|
70
107
|
}
|
|
71
108
|
|
|
@@ -82,7 +119,11 @@ export async function findLatestGeminiSessionId(
|
|
|
82
119
|
cwd: string,
|
|
83
120
|
options: SessionSearchOptions = {},
|
|
84
121
|
): Promise<string | null> {
|
|
85
|
-
const searchOptions: SessionSearchOptions = {
|
|
122
|
+
const searchOptions: SessionSearchOptions = {
|
|
123
|
+
cwd: options.cwd ?? cwd,
|
|
124
|
+
branch: options.branch ?? null,
|
|
125
|
+
worktrees: options.worktrees ?? null,
|
|
126
|
+
};
|
|
86
127
|
if (options.since !== undefined) searchOptions.since = options.since;
|
|
87
128
|
if (options.until !== undefined) searchOptions.until = options.until;
|
|
88
129
|
if (options.preferClosestTo !== undefined)
|