dmux 5.6.3 → 5.7.1
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 +93 -0
- package/README.md +16 -1
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +282 -43
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/implementations/closeAction.d.ts.map +1 -1
- package/dist/actions/implementations/closeAction.js +85 -70
- package/dist/actions/implementations/closeAction.js.map +1 -1
- package/dist/actions/implementations/createPullRequestAction.d.ts +4 -0
- package/dist/actions/implementations/createPullRequestAction.d.ts.map +1 -0
- package/dist/actions/implementations/createPullRequestAction.js +218 -0
- package/dist/actions/implementations/createPullRequestAction.js.map +1 -0
- package/dist/actions/implementations/index.d.ts +1 -0
- package/dist/actions/implementations/index.d.ts.map +1 -1
- package/dist/actions/implementations/index.js +1 -0
- package/dist/actions/implementations/index.js.map +1 -1
- package/dist/actions/implementations/mergeAction.js +8 -3
- package/dist/actions/implementations/mergeAction.js.map +1 -1
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +2 -0
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/paneActions.d.ts +1 -1
- package/dist/actions/paneActions.d.ts.map +1 -1
- package/dist/actions/paneActions.js +1 -1
- package/dist/actions/paneActions.js.map +1 -1
- package/dist/actions/types.d.ts +11 -2
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js +9 -0
- package/dist/actions/types.js.map +1 -1
- package/dist/components/inputs/CleanTextInput.d.ts +1 -0
- package/dist/components/inputs/CleanTextInput.d.ts.map +1 -1
- package/dist/components/inputs/CleanTextInput.js +40 -42
- package/dist/components/inputs/CleanTextInput.js.map +1 -1
- package/dist/components/inputs/InlineCursorInput.d.ts +10 -0
- package/dist/components/inputs/InlineCursorInput.d.ts.map +1 -0
- package/dist/components/inputs/InlineCursorInput.js +101 -0
- package/dist/components/inputs/InlineCursorInput.js.map +1 -0
- package/dist/components/panes/PaneCard.d.ts +3 -1
- package/dist/components/panes/PaneCard.d.ts.map +1 -1
- package/dist/components/panes/PaneCard.js +14 -4
- package/dist/components/panes/PaneCard.js.map +1 -1
- package/dist/components/panes/PanesGrid.d.ts +4 -1
- package/dist/components/panes/PanesGrid.d.ts.map +1 -1
- package/dist/components/panes/PanesGrid.js +27 -15
- package/dist/components/panes/PanesGrid.js.map +1 -1
- package/dist/components/popups/config.d.ts +4 -4
- package/dist/components/popups/config.js +6 -6
- package/dist/components/popups/config.js.map +1 -1
- package/dist/components/popups/inputPopup.js +3 -3
- package/dist/components/popups/inputPopup.js.map +1 -1
- package/dist/components/popups/newPaneFieldNavigation.d.ts +9 -0
- package/dist/components/popups/newPaneFieldNavigation.d.ts.map +1 -0
- package/dist/components/popups/newPaneFieldNavigation.js +20 -0
- package/dist/components/popups/newPaneFieldNavigation.js.map +1 -0
- package/dist/components/popups/newPaneGitOptions.d.ts +23 -0
- package/dist/components/popups/newPaneGitOptions.d.ts.map +1 -0
- package/dist/components/popups/newPaneGitOptions.js +91 -0
- package/dist/components/popups/newPaneGitOptions.js.map +1 -0
- package/dist/components/popups/newPanePopup.d.ts +7 -2
- package/dist/components/popups/newPanePopup.d.ts.map +1 -1
- package/dist/components/popups/newPanePopup.js +256 -19
- package/dist/components/popups/newPanePopup.js.map +1 -1
- package/dist/components/popups/prReviewPopup.d.ts +12 -0
- package/dist/components/popups/prReviewPopup.d.ts.map +1 -0
- package/dist/components/popups/prReviewPopup.js +278 -0
- package/dist/components/popups/prReviewPopup.js.map +1 -0
- package/dist/components/popups/reopenWorktreePopup.js +1 -1
- package/dist/components/popups/reopenWorktreePopup.js.map +1 -1
- package/dist/components/popups/settingsPopup.js +72 -6
- package/dist/components/popups/settingsPopup.js.map +1 -1
- package/dist/components/ui/FooterHelp.d.ts.map +1 -1
- package/dist/components/ui/FooterHelp.js +5 -4
- package/dist/components/ui/FooterHelp.js.map +1 -1
- package/dist/hooks/useActionSystem.d.ts +12 -2
- package/dist/hooks/useActionSystem.d.ts.map +1 -1
- package/dist/hooks/useActionSystem.js +19 -1
- package/dist/hooks/useActionSystem.js.map +1 -1
- package/dist/hooks/useInputHandling.d.ts +5 -3
- package/dist/hooks/useInputHandling.d.ts.map +1 -1
- package/dist/hooks/useInputHandling.js +93 -32
- package/dist/hooks/useInputHandling.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +5 -3
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +16 -3
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePaneLoading.d.ts.map +1 -1
- package/dist/hooks/usePaneLoading.js +28 -3
- package/dist/hooks/usePaneLoading.js.map +1 -1
- package/dist/hooks/usePaneSync.d.ts.map +1 -1
- package/dist/hooks/usePaneSync.js +8 -5
- package/dist/hooks/usePaneSync.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +8 -1
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useShellDetection.d.ts.map +1 -1
- package/dist/hooks/useShellDetection.js +7 -1
- package/dist/hooks/useShellDetection.js.map +1 -1
- package/dist/index.js +49 -22
- package/dist/index.js.map +1 -1
- package/dist/panes/decorative-pane.js +57 -27
- package/dist/panes/decorative-pane.js.map +1 -1
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +4 -12
- package/dist/server/embedded-assets.js.map +1 -1
- package/dist/services/DmuxFocusService.d.ts.map +1 -1
- package/dist/services/DmuxFocusService.js +19 -14
- package/dist/services/DmuxFocusService.js.map +1 -1
- package/dist/services/PaneEventService.d.ts +11 -0
- package/dist/services/PaneEventService.d.ts.map +1 -1
- package/dist/services/PaneEventService.js +31 -3
- package/dist/services/PaneEventService.js.map +1 -1
- package/dist/services/PaneWorkerManager.d.ts.map +1 -1
- package/dist/services/PaneWorkerManager.js +1 -0
- package/dist/services/PaneWorkerManager.js.map +1 -1
- package/dist/services/PopupManager.d.ts +23 -6
- package/dist/services/PopupManager.d.ts.map +1 -1
- package/dist/services/PopupManager.js +170 -33
- package/dist/services/PopupManager.js.map +1 -1
- package/dist/services/StatusDetector.d.ts +1 -0
- package/dist/services/StatusDetector.d.ts.map +1 -1
- package/dist/services/StatusDetector.js +44 -0
- package/dist/services/StatusDetector.js.map +1 -1
- package/dist/services/TmuxHookManager.d.ts.map +1 -1
- package/dist/services/TmuxHookManager.js +3 -2
- package/dist/services/TmuxHookManager.js.map +1 -1
- package/dist/services/TmuxService.d.ts +7 -0
- package/dist/services/TmuxService.d.ts.map +1 -1
- package/dist/services/TmuxService.js +15 -1
- package/dist/services/TmuxService.js.map +1 -1
- package/dist/theme/colors.d.ts +24 -10
- package/dist/theme/colors.d.ts.map +1 -1
- package/dist/theme/colors.js +143 -19
- package/dist/theme/colors.js.map +1 -1
- package/dist/theme/themePalette.d.ts +6 -0
- package/dist/theme/themePalette.d.ts.map +1 -0
- package/dist/theme/themePalette.js +18 -0
- package/dist/theme/themePalette.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agentLaunch.d.ts +2 -0
- package/dist/utils/agentLaunch.d.ts.map +1 -1
- package/dist/utils/agentLaunch.js +10 -9
- package/dist/utils/agentLaunch.js.map +1 -1
- package/dist/utils/aiMerge.d.ts +4 -0
- package/dist/utils/aiMerge.d.ts.map +1 -1
- package/dist/utils/aiMerge.js +7 -4
- package/dist/utils/aiMerge.js.map +1 -1
- package/dist/utils/asciiArt.d.ts.map +1 -1
- package/dist/utils/asciiArt.js +2 -1
- package/dist/utils/asciiArt.js.map +1 -1
- package/dist/utils/attachAgent.d.ts.map +1 -1
- package/dist/utils/attachAgent.js +20 -1
- package/dist/utils/attachAgent.js.map +1 -1
- package/dist/utils/codexHooks.d.ts +25 -0
- package/dist/utils/codexHooks.d.ts.map +1 -0
- package/dist/utils/codexHooks.js +131 -0
- package/dist/utils/codexHooks.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
- package/dist/utils/conflictResolutionPane.js +4 -0
- package/dist/utils/conflictResolutionPane.js.map +1 -1
- package/dist/utils/devWatchCommand.d.ts.map +1 -1
- package/dist/utils/devWatchCommand.js +6 -2
- package/dist/utils/devWatchCommand.js.map +1 -1
- package/dist/utils/dmuxCommand.d.ts +4 -3
- package/dist/utils/dmuxCommand.d.ts.map +1 -1
- package/dist/utils/dmuxCommand.js +15 -14
- package/dist/utils/dmuxCommand.js.map +1 -1
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.d.ts.map +1 -1
- package/dist/utils/generated-agents-doc.js +46 -11
- package/dist/utils/generated-agents-doc.js.map +1 -1
- package/dist/utils/git.d.ts +8 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +26 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/githubPullRequest.d.ts +18 -0
- package/dist/utils/githubPullRequest.d.ts.map +1 -0
- package/dist/utils/githubPullRequest.js +196 -0
- package/dist/utils/githubPullRequest.js.map +1 -0
- package/dist/utils/hooks.d.ts +15 -0
- package/dist/utils/hooks.d.ts.map +1 -1
- package/dist/utils/hooks.js +105 -0
- package/dist/utils/hooks.js.map +1 -1
- package/dist/utils/hooksDocs.d.ts +1 -1
- package/dist/utils/hooksDocs.d.ts.map +1 -1
- package/dist/utils/hooksDocs.js +21 -11
- package/dist/utils/hooksDocs.js.map +1 -1
- package/dist/utils/input.d.ts +7 -6
- package/dist/utils/input.d.ts.map +1 -1
- package/dist/utils/input.js +47 -24
- package/dist/utils/input.js.map +1 -1
- package/dist/utils/paneBootstrapConfig.d.ts +27 -0
- package/dist/utils/paneBootstrapConfig.d.ts.map +1 -0
- package/dist/utils/paneBootstrapConfig.js +2 -0
- package/dist/utils/paneBootstrapConfig.js.map +1 -0
- package/dist/utils/paneBootstrapRunner.d.ts +3 -0
- package/dist/utils/paneBootstrapRunner.d.ts.map +1 -0
- package/dist/utils/paneBootstrapRunner.js +517 -0
- package/dist/utils/paneBootstrapRunner.js.map +1 -0
- package/dist/utils/paneColors.d.ts +7 -0
- package/dist/utils/paneColors.d.ts.map +1 -0
- package/dist/utils/paneColors.js +42 -0
- package/dist/utils/paneColors.js.map +1 -0
- package/dist/utils/paneCreation.d.ts +3 -1
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +165 -225
- package/dist/utils/paneCreation.js.map +1 -1
- package/dist/utils/paneNaming.d.ts +16 -0
- package/dist/utils/paneNaming.d.ts.map +1 -0
- package/dist/utils/paneNaming.js +47 -0
- package/dist/utils/paneNaming.js.map +1 -0
- package/dist/utils/paneTitle.d.ts +1 -0
- package/dist/utils/paneTitle.d.ts.map +1 -1
- package/dist/utils/paneTitle.js +5 -1
- package/dist/utils/paneTitle.js.map +1 -1
- package/dist/utils/paneTitlePrefix.d.ts +8 -0
- package/dist/utils/paneTitlePrefix.d.ts.map +1 -0
- package/dist/utils/paneTitlePrefix.js +20 -0
- package/dist/utils/paneTitlePrefix.js.map +1 -0
- package/dist/utils/pathEnvironment.d.ts +6 -0
- package/dist/utils/pathEnvironment.d.ts.map +1 -0
- package/dist/utils/pathEnvironment.js +59 -0
- package/dist/utils/pathEnvironment.js.map +1 -0
- package/dist/utils/popup.d.ts +1 -0
- package/dist/utils/popup.d.ts.map +1 -1
- package/dist/utils/popup.js +9 -2
- package/dist/utils/popup.js.map +1 -1
- package/dist/utils/prSummary.d.ts +34 -0
- package/dist/utils/prSummary.d.ts.map +1 -0
- package/dist/utils/prSummary.js +130 -0
- package/dist/utils/prSummary.js.map +1 -0
- package/dist/utils/projectActions.d.ts +6 -0
- package/dist/utils/projectActions.d.ts.map +1 -1
- package/dist/utils/projectActions.js +46 -0
- package/dist/utils/projectActions.js.map +1 -1
- package/dist/utils/reopenWorktree.d.ts.map +1 -1
- package/dist/utils/reopenWorktree.js +37 -5
- package/dist/utils/reopenWorktree.js.map +1 -1
- package/dist/utils/resumeBranches.d.ts.map +1 -1
- package/dist/utils/resumeBranches.js +9 -3
- package/dist/utils/resumeBranches.js.map +1 -1
- package/dist/utils/settingsManager.d.ts +11 -3
- package/dist/utils/settingsManager.d.ts.map +1 -1
- package/dist/utils/settingsManager.js +106 -21
- package/dist/utils/settingsManager.js.map +1 -1
- package/dist/utils/shellPaneDetection.d.ts.map +1 -1
- package/dist/utils/shellPaneDetection.js +4 -0
- package/dist/utils/shellPaneDetection.js.map +1 -1
- package/dist/utils/sidebarProjects.d.ts +10 -3
- package/dist/utils/sidebarProjects.d.ts.map +1 -1
- package/dist/utils/sidebarProjects.js +125 -10
- package/dist/utils/sidebarProjects.js.map +1 -1
- package/dist/utils/tmuxHookCommands.d.ts +6 -0
- package/dist/utils/tmuxHookCommands.d.ts.map +1 -1
- package/dist/utils/tmuxHookCommands.js +12 -0
- package/dist/utils/tmuxHookCommands.js.map +1 -1
- package/dist/utils/tmuxSendKeys.d.ts +2 -0
- package/dist/utils/tmuxSendKeys.d.ts.map +1 -0
- package/dist/utils/tmuxSendKeys.js +8 -0
- package/dist/utils/tmuxSendKeys.js.map +1 -0
- package/dist/utils/toastLayout.d.ts +10 -0
- package/dist/utils/toastLayout.d.ts.map +1 -0
- package/dist/utils/toastLayout.js +24 -0
- package/dist/utils/toastLayout.js.map +1 -0
- package/dist/utils/welcomePane.d.ts +5 -1
- package/dist/utils/welcomePane.d.ts.map +1 -1
- package/dist/utils/welcomePane.js +33 -3
- package/dist/utils/welcomePane.js.map +1 -1
- package/dist/utils/welcomePaneManager.d.ts +3 -1
- package/dist/utils/welcomePaneManager.d.ts.map +1 -1
- package/dist/utils/welcomePaneManager.js +40 -2
- package/dist/utils/welcomePaneManager.js.map +1 -1
- package/dist/workers/PaneWorker.js +77 -0
- package/dist/workers/PaneWorker.js.map +1 -1
- package/dist/workers/WorkerMessages.d.ts +9 -1
- package/dist/workers/WorkerMessages.d.ts.map +1 -1
- package/dist/workers/WorkerMessages.js.map +1 -1
- package/dist/workers/panePollingWorker.js +33 -2
- package/dist/workers/panePollingWorker.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare const POPUP_CONFIG: {
|
|
6
6
|
readonly borderStyle: "round";
|
|
7
|
-
readonly borderColor: "
|
|
7
|
+
readonly borderColor: "";
|
|
8
8
|
readonly inputBorderStyle: "bold";
|
|
9
|
-
readonly inputBorderColor: "
|
|
10
|
-
readonly titleColor: "
|
|
9
|
+
readonly inputBorderColor: "";
|
|
10
|
+
readonly titleColor: "";
|
|
11
11
|
readonly successColor: "green";
|
|
12
12
|
readonly errorColor: "red";
|
|
13
13
|
readonly dimColor: "gray";
|
|
14
|
-
readonly tmuxBorderColor: "
|
|
14
|
+
readonly tmuxBorderColor: "";
|
|
15
15
|
readonly defaultWidth: 60;
|
|
16
16
|
readonly defaultHeight: 20;
|
|
17
17
|
readonly largeWidth: 90;
|
|
@@ -6,15 +6,15 @@ import { COLORS, TMUX_COLORS } from '../../theme/colors.js';
|
|
|
6
6
|
export const POPUP_CONFIG = {
|
|
7
7
|
// Visual theme
|
|
8
8
|
borderStyle: 'round',
|
|
9
|
-
borderColor
|
|
9
|
+
get borderColor() { return COLORS.accent; },
|
|
10
10
|
inputBorderStyle: 'bold',
|
|
11
|
-
inputBorderColor
|
|
12
|
-
titleColor
|
|
13
|
-
successColor
|
|
14
|
-
errorColor
|
|
11
|
+
get inputBorderColor() { return COLORS.accent; },
|
|
12
|
+
get titleColor() { return COLORS.accent; },
|
|
13
|
+
get successColor() { return COLORS.success; },
|
|
14
|
+
get errorColor() { return COLORS.error; },
|
|
15
15
|
dimColor: 'gray', // Gray for hints/secondary text
|
|
16
16
|
// Tmux popup styling (used in popup.ts) - foreground only
|
|
17
|
-
tmuxBorderColor
|
|
17
|
+
get tmuxBorderColor() { return TMUX_COLORS.activeBorder; },
|
|
18
18
|
// Default dimensions
|
|
19
19
|
defaultWidth: 60,
|
|
20
20
|
defaultHeight: 20,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/components/popups/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,eAAe;IACf,WAAW,EAAE,OAAgB;IAC7B,WAAW,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/components/popups/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,eAAe;IACf,WAAW,EAAE,OAAgB;IAC7B,IAAI,WAAW,KAAK,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,gBAAgB,EAAE,MAAe;IACjC,IAAI,gBAAgB,KAAK,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,IAAI,UAAU,KAAK,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,IAAI,YAAY,KAAK,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,IAAI,UAAU,KAAK,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,QAAQ,EAAE,MAAe,EAAY,gCAAgC;IAErE,0DAA0D;IAC1D,IAAI,eAAe,KAAK,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IAE1D,qBAAqB;IACrB,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IAEd,kBAAkB;IAClB,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAChC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC5B,cAAc,EAAE,CAAC;IAEjB,eAAe;IACf,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,iBAAiB;IAC7B,cAAc,EAAE,kCAAkC;CAC1C,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,UAAU,MAAM,YAAY,CAAC,UAAU,EAAE;IAEtE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,cAAc,MAAM,YAAY,CAAC,UAAU,EAAE;IAE3E,OAAO,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,EAAE,CACrC,IAAI,MAAM,UAAU,KAAK,QAAQ,YAAY,CAAC,UAAU,EAAE;CAC7D,CAAC"}
|
|
@@ -9,7 +9,7 @@ import * as fs from 'fs';
|
|
|
9
9
|
import CleanTextInput from '../inputs/CleanTextInput.js';
|
|
10
10
|
import { PopupContainer, PopupInputBox, PopupWrapper, writeSuccessAndExit } from './shared/index.js';
|
|
11
11
|
import { PopupFooters } from './config.js';
|
|
12
|
-
const InputPopupApp = ({ resultFile, title, message, placeholder = '', defaultValue = '', }) => {
|
|
12
|
+
const InputPopupApp = ({ resultFile, title, message, placeholder = '', defaultValue = '', maxVisibleLines, }) => {
|
|
13
13
|
const [value, setValue] = useState(defaultValue);
|
|
14
14
|
const { exit } = useApp();
|
|
15
15
|
const handleSubmit = (submittedValue) => {
|
|
@@ -20,7 +20,7 @@ const InputPopupApp = ({ resultFile, title, message, placeholder = '', defaultVa
|
|
|
20
20
|
React.createElement(Box, { marginBottom: 1, flexDirection: "column" }, message.split('\n').map((line, idx) => (React.createElement(Text, { key: idx, wrap: "truncate-end" }, line)))),
|
|
21
21
|
React.createElement(Box, { marginBottom: 1 },
|
|
22
22
|
React.createElement(PopupInputBox, null,
|
|
23
|
-
React.createElement(CleanTextInput, { value: value, onChange: setValue, onSubmit: handleSubmit, placeholder: placeholder }))),
|
|
23
|
+
React.createElement(CleanTextInput, { value: value, onChange: setValue, onSubmit: handleSubmit, placeholder: placeholder, maxVisibleLines: maxVisibleLines }))),
|
|
24
24
|
React.createElement(Box, null,
|
|
25
25
|
React.createElement(Text, { dimColor: true, italic: true }, "\uD83D\uDCA1 Tip: Shift+Enter for multi-line")))));
|
|
26
26
|
};
|
|
@@ -41,7 +41,7 @@ function main() {
|
|
|
41
41
|
console.error('Error: Failed to read or parse data file');
|
|
42
42
|
process.exit(1);
|
|
43
43
|
}
|
|
44
|
-
render(React.createElement(InputPopupApp, { resultFile: resultFile, title: data.title, message: data.message, placeholder: data.placeholder, defaultValue: data.defaultValue }));
|
|
44
|
+
render(React.createElement(InputPopupApp, { resultFile: resultFile, title: data.title, message: data.message, placeholder: data.placeholder, defaultValue: data.defaultValue, maxVisibleLines: data.maxVisibleLines }));
|
|
45
45
|
}
|
|
46
46
|
main();
|
|
47
47
|
//# sourceMappingURL=inputPopup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputPopup.js","sourceRoot":"","sources":["../../../src/components/popups/inputPopup.tsx"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"inputPopup.js","sourceRoot":"","sources":["../../../src/components/popups/inputPopup.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Implements the cyclic behavior for the 'new pane' tab of creating a new agent.
|
|
3
|
+
*
|
|
4
|
+
* Specifically, the 'prompt' -> 'base branch' -> 'new branch name' cycle.
|
|
5
|
+
*/
|
|
6
|
+
export type NewPaneField = 'prompt' | 'baseBranch' | 'branchName';
|
|
7
|
+
export declare function getNextNewPaneField(current: NewPaneField): NewPaneField;
|
|
8
|
+
export declare function getPreviousNewPaneField(current: NewPaneField): NewPaneField;
|
|
9
|
+
//# sourceMappingURL=newPaneFieldNavigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newPaneFieldNavigation.d.ts","sourceRoot":"","sources":["../../../src/components/popups/newPaneFieldNavigation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AAElE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAIvE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAI3E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Implements the cyclic behavior for the 'new pane' tab of creating a new agent.
|
|
3
|
+
*
|
|
4
|
+
* Specifically, the 'prompt' -> 'base branch' -> 'new branch name' cycle.
|
|
5
|
+
*/
|
|
6
|
+
export function getNextNewPaneField(current) {
|
|
7
|
+
if (current === 'prompt')
|
|
8
|
+
return 'baseBranch';
|
|
9
|
+
if (current === 'baseBranch')
|
|
10
|
+
return 'branchName';
|
|
11
|
+
return 'prompt';
|
|
12
|
+
}
|
|
13
|
+
export function getPreviousNewPaneField(current) {
|
|
14
|
+
if (current === 'prompt')
|
|
15
|
+
return 'branchName';
|
|
16
|
+
if (current === 'baseBranch')
|
|
17
|
+
return 'prompt';
|
|
18
|
+
return 'baseBranch';
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=newPaneFieldNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newPaneFieldNavigation.js","sourceRoot":"","sources":["../../../src/components/popups/newPaneFieldNavigation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,UAAU,mBAAmB,CAAC,OAAqB;IACvD,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC;IAC9C,IAAI,OAAO,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAClD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAqB;IAC3D,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC;IAC9C,IAAI,OAAO,KAAK,YAAY;QAAE,OAAO,QAAQ,CAAC;IAC9C,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const MAX_VISIBLE_BRANCHES = 10;
|
|
2
|
+
export declare const BASE_BRANCH_ERROR_MESSAGE = "Base branch must match an existing local branch (choose from the list).";
|
|
3
|
+
export interface BaseBranchEnterResolution {
|
|
4
|
+
accepted: boolean;
|
|
5
|
+
nextValue: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function loadLocalBranchNames(repoRoot: string): string[];
|
|
9
|
+
export declare function parseBranchList(raw: string): string[];
|
|
10
|
+
export declare function filterBranches(branches: string[], query: string): string[];
|
|
11
|
+
export declare function clampSelectedIndex(selectedIndex: number, totalItems: number): number;
|
|
12
|
+
export declare function getVisibleBranchWindow(branches: string[], selectedIndex: number, maxVisible?: number): {
|
|
13
|
+
startIndex: number;
|
|
14
|
+
visibleBranches: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare function isValidBaseBranchOverride(value: string, availableBranches: string[]): boolean;
|
|
17
|
+
export declare function resolveBaseBranchEnter(input: {
|
|
18
|
+
baseBranch: string;
|
|
19
|
+
availableBranches: string[];
|
|
20
|
+
filteredBranches: string[];
|
|
21
|
+
selectedIndex: number;
|
|
22
|
+
}): BaseBranchEnterResolution;
|
|
23
|
+
//# sourceMappingURL=newPaneGitOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newPaneGitOptions.d.ts","sourceRoot":"","sources":["../../../src/components/popups/newPaneGitOptions.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,yBAAyB,4EAA4E,CAAC;AAEnH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAe/D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAcrD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAO1E;AAED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAKpF;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAAE,EAClB,aAAa,EAAE,MAAM,EACrB,UAAU,GAAE,MAA6B,GACxC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAcnD;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,OAAO,CAI7F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,yBAAyB,CA4B5B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
export const MAX_VISIBLE_BRANCHES = 10;
|
|
3
|
+
export const BASE_BRANCH_ERROR_MESSAGE = 'Base branch must match an existing local branch (choose from the list).';
|
|
4
|
+
export function loadLocalBranchNames(repoRoot) {
|
|
5
|
+
try {
|
|
6
|
+
const raw = execSync("git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads", {
|
|
7
|
+
cwd: repoRoot,
|
|
8
|
+
encoding: 'utf-8',
|
|
9
|
+
stdio: 'pipe',
|
|
10
|
+
});
|
|
11
|
+
return parseBranchList(raw);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function parseBranchList(raw) {
|
|
18
|
+
const seen = new Set();
|
|
19
|
+
const ordered = [];
|
|
20
|
+
for (const line of raw.split('\n')) {
|
|
21
|
+
const branch = line.trim();
|
|
22
|
+
if (!branch || seen.has(branch)) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
seen.add(branch);
|
|
26
|
+
ordered.push(branch);
|
|
27
|
+
}
|
|
28
|
+
return ordered;
|
|
29
|
+
}
|
|
30
|
+
export function filterBranches(branches, query) {
|
|
31
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
32
|
+
if (!normalizedQuery) {
|
|
33
|
+
return branches;
|
|
34
|
+
}
|
|
35
|
+
return branches.filter((branch) => branch.toLowerCase().includes(normalizedQuery));
|
|
36
|
+
}
|
|
37
|
+
export function clampSelectedIndex(selectedIndex, totalItems) {
|
|
38
|
+
if (totalItems <= 0)
|
|
39
|
+
return 0;
|
|
40
|
+
if (selectedIndex < 0)
|
|
41
|
+
return 0;
|
|
42
|
+
if (selectedIndex >= totalItems)
|
|
43
|
+
return totalItems - 1;
|
|
44
|
+
return selectedIndex;
|
|
45
|
+
}
|
|
46
|
+
export function getVisibleBranchWindow(branches, selectedIndex, maxVisible = MAX_VISIBLE_BRANCHES) {
|
|
47
|
+
if (branches.length <= maxVisible) {
|
|
48
|
+
return { startIndex: 0, visibleBranches: branches };
|
|
49
|
+
}
|
|
50
|
+
const clampedIndex = clampSelectedIndex(selectedIndex, branches.length);
|
|
51
|
+
let startIndex = Math.max(0, clampedIndex - Math.floor(maxVisible / 2));
|
|
52
|
+
const maxStart = Math.max(0, branches.length - maxVisible);
|
|
53
|
+
startIndex = Math.min(startIndex, maxStart);
|
|
54
|
+
return {
|
|
55
|
+
startIndex,
|
|
56
|
+
visibleBranches: branches.slice(startIndex, startIndex + maxVisible),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function isValidBaseBranchOverride(value, availableBranches) {
|
|
60
|
+
const trimmed = value.trim();
|
|
61
|
+
if (!trimmed)
|
|
62
|
+
return true;
|
|
63
|
+
return availableBranches.includes(trimmed);
|
|
64
|
+
}
|
|
65
|
+
export function resolveBaseBranchEnter(input) {
|
|
66
|
+
if (input.filteredBranches.length > 0 && input.selectedIndex < input.filteredBranches.length) {
|
|
67
|
+
return {
|
|
68
|
+
accepted: true,
|
|
69
|
+
nextValue: input.filteredBranches[input.selectedIndex],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const trimmed = input.baseBranch.trim();
|
|
73
|
+
if (!trimmed) {
|
|
74
|
+
return {
|
|
75
|
+
accepted: true,
|
|
76
|
+
nextValue: '',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (input.availableBranches.includes(trimmed)) {
|
|
80
|
+
return {
|
|
81
|
+
accepted: true,
|
|
82
|
+
nextValue: trimmed,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
accepted: false,
|
|
87
|
+
nextValue: trimmed,
|
|
88
|
+
error: BASE_BRANCH_ERROR_MESSAGE,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=newPaneGitOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newPaneGitOptions.js","sourceRoot":"","sources":["../../../src/components/popups/newPaneGitOptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Standalone popup
|
|
4
|
-
*
|
|
3
|
+
* Standalone popup used by dmux when creating a new pane.
|
|
4
|
+
*
|
|
5
|
+
* Behavior:
|
|
6
|
+
* - Captures the initial agent prompt (with @file autocomplete support).
|
|
7
|
+
* - Optionally captures per-pane git overrides (base branch + branch/worktree name)
|
|
8
|
+
* when enabled by settings/caller.
|
|
9
|
+
* - Writes a structured popup result payload to the provided result file.
|
|
5
10
|
*/
|
|
6
11
|
import React from "react";
|
|
7
12
|
export declare const NewPanePopupApp: React.FC<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"newPanePopup.d.ts","sourceRoot":"","sources":["../../../src/components/popups/newPanePopup.tsx"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"newPanePopup.d.ts","sourceRoot":"","sources":["../../../src/components/popups/newPanePopup.tsx"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAsC,MAAM,OAAO,CAAA;AAgD1D,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAmnB5D,CAAA"}
|
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Standalone popup
|
|
4
|
-
*
|
|
3
|
+
* Standalone popup used by dmux when creating a new pane.
|
|
4
|
+
*
|
|
5
|
+
* Behavior:
|
|
6
|
+
* - Captures the initial agent prompt (with @file autocomplete support).
|
|
7
|
+
* - Optionally captures per-pane git overrides (base branch + branch/worktree name)
|
|
8
|
+
* when enabled by settings/caller.
|
|
9
|
+
* - Writes a structured popup result payload to the provided result file.
|
|
5
10
|
*/
|
|
6
11
|
import React, { useState, useEffect, useRef } from "react";
|
|
7
12
|
import { render, Box, Text, useApp, useInput } from "ink";
|
|
8
13
|
import { PopupContainer, PopupWrapper, writeSuccessAndExit, FileList, } from "./shared/index.js";
|
|
9
14
|
import { PopupFooters, POPUP_CONFIG } from "./config.js";
|
|
10
15
|
import CleanTextInput from "../inputs/CleanTextInput.js";
|
|
16
|
+
import InlineCursorInput from "../inputs/InlineCursorInput.js";
|
|
11
17
|
import { scanProjectFiles, fuzzyMatchFiles } from "../../utils/fileScanner.js";
|
|
18
|
+
import { BASE_BRANCH_ERROR_MESSAGE, clampSelectedIndex, filterBranches, getVisibleBranchWindow, isValidBaseBranchOverride, loadLocalBranchNames, resolveBaseBranchEnter, } from "./newPaneGitOptions.js";
|
|
19
|
+
import { getNextNewPaneField, getPreviousNewPaneField, } from "./newPaneFieldNavigation.js";
|
|
12
20
|
import fs from "fs";
|
|
13
21
|
import path from "path";
|
|
14
22
|
import { pathToFileURL } from "url";
|
|
15
23
|
const PROJECT_PATH_ARG = process.argv[3];
|
|
24
|
+
const ENABLE_GIT_OPTIONS_ARG = process.argv[4] === '1';
|
|
16
25
|
const FILE_SCAN_ROOT = PROJECT_PATH_ARG || process.cwd();
|
|
17
26
|
const PROJECT_NAME = path.basename(FILE_SCAN_ROOT);
|
|
18
27
|
const ESC_CLEAR_CONFIRMATION_MS = 500;
|
|
@@ -30,6 +39,14 @@ function debugLog(message, data) {
|
|
|
30
39
|
}
|
|
31
40
|
export const NewPanePopupApp = ({ resultFile }) => {
|
|
32
41
|
const [prompt, setPrompt] = useState("");
|
|
42
|
+
const [mode, setMode] = useState('prompt');
|
|
43
|
+
const [baseBranch, setBaseBranch] = useState("");
|
|
44
|
+
const [branchName, setBranchName] = useState("");
|
|
45
|
+
const [activeGitField, setActiveGitField] = useState('baseBranch');
|
|
46
|
+
const [availableBranches, setAvailableBranches] = useState([]);
|
|
47
|
+
const [filteredBranches, setFilteredBranches] = useState([]);
|
|
48
|
+
const [selectedBranchIndex, setSelectedBranchIndex] = useState(0);
|
|
49
|
+
const [gitOptionsError, setGitOptionsError] = useState(null);
|
|
33
50
|
const [pendingClearEsc, setPendingClearEsc] = useState(false);
|
|
34
51
|
const { exit } = useApp();
|
|
35
52
|
const clearEscTimeoutRef = useRef(null);
|
|
@@ -40,6 +57,53 @@ export const NewPanePopupApp = ({ resultFile }) => {
|
|
|
40
57
|
const [atPosition, setAtPosition] = useState(-1); // Position of @ in text
|
|
41
58
|
const [cursorPosition, setCursorPosition] = useState(undefined);
|
|
42
59
|
const [currentCursor, setCurrentCursor] = useState(0); // Track cursor position from CleanTextInput
|
|
60
|
+
const getCurrentField = () => mode === 'prompt' ? 'prompt' : activeGitField;
|
|
61
|
+
const setCurrentField = (field) => {
|
|
62
|
+
if (field === 'prompt') {
|
|
63
|
+
setMode('prompt');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
setMode('gitOptions');
|
|
67
|
+
setActiveGitField(field);
|
|
68
|
+
};
|
|
69
|
+
const writeSuccessResult = () => {
|
|
70
|
+
const trimmedBaseBranch = baseBranch.trim();
|
|
71
|
+
if (!isValidBaseBranchOverride(trimmedBaseBranch, availableBranches)) {
|
|
72
|
+
setGitOptionsError(BASE_BRANCH_ERROR_MESSAGE);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const payload = {
|
|
76
|
+
prompt,
|
|
77
|
+
};
|
|
78
|
+
const trimmedBranchName = branchName.trim();
|
|
79
|
+
if (trimmedBaseBranch)
|
|
80
|
+
payload.baseBranch = trimmedBaseBranch;
|
|
81
|
+
if (trimmedBranchName)
|
|
82
|
+
payload.branchName = trimmedBranchName;
|
|
83
|
+
writeSuccessAndExit(resultFile, payload, exit);
|
|
84
|
+
};
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
if (!ENABLE_GIT_OPTIONS_ARG) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const branches = loadLocalBranchNames(FILE_SCAN_ROOT);
|
|
90
|
+
setAvailableBranches(branches);
|
|
91
|
+
}, []);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (mode !== 'gitOptions' || activeGitField !== 'baseBranch') {
|
|
94
|
+
setFilteredBranches([]);
|
|
95
|
+
setSelectedBranchIndex(0);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const matches = filterBranches(availableBranches, baseBranch);
|
|
99
|
+
setFilteredBranches(matches);
|
|
100
|
+
setSelectedBranchIndex((prev) => clampSelectedIndex(prev, matches.length));
|
|
101
|
+
}, [mode, activeGitField, baseBranch, availableBranches]);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (gitOptionsError) {
|
|
104
|
+
setGitOptionsError(null);
|
|
105
|
+
}
|
|
106
|
+
}, [baseBranch, branchName]);
|
|
43
107
|
const resetPendingClearEsc = () => {
|
|
44
108
|
if (clearEscTimeoutRef.current) {
|
|
45
109
|
clearTimeout(clearEscTimeoutRef.current);
|
|
@@ -80,6 +144,12 @@ export const NewPanePopupApp = ({ resultFile }) => {
|
|
|
80
144
|
}, []);
|
|
81
145
|
// Detect @ and scan files (cursor-aware)
|
|
82
146
|
useEffect(() => {
|
|
147
|
+
if (mode !== 'prompt') {
|
|
148
|
+
setIsFileListActive(false);
|
|
149
|
+
setFilteredFiles([]);
|
|
150
|
+
setAtPosition(-1);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
83
153
|
debugLog('[@Detection] Running with:', {
|
|
84
154
|
prompt,
|
|
85
155
|
currentCursor,
|
|
@@ -159,14 +229,118 @@ export const NewPanePopupApp = ({ resultFile }) => {
|
|
|
159
229
|
setFilteredFiles([]);
|
|
160
230
|
setAtPosition(-1);
|
|
161
231
|
}
|
|
162
|
-
}, [prompt, currentCursor]);
|
|
232
|
+
}, [prompt, currentCursor, mode]);
|
|
163
233
|
// Handle keyboard navigation - runs BEFORE other handlers
|
|
164
234
|
// This is critical: we need to intercept ESC for progressive behavior
|
|
165
235
|
useInput((input, key) => {
|
|
236
|
+
// Some terminals send BackTab as the raw escape sequence "\u001b[Z"
|
|
237
|
+
// instead of setting key.shift+key.tab. Support both forms so
|
|
238
|
+
// Shift+Tab reliably cycles fields in tmux popups.
|
|
239
|
+
const isBackTab = input === '\u001b[Z' || (key.tab && key.shift);
|
|
240
|
+
const isForwardTab = key.tab && !key.shift;
|
|
241
|
+
// Git-options mode has a different interaction model from the prompt editor:
|
|
242
|
+
// - We cycle across prompt/base/branch with Tab and Shift+Tab
|
|
243
|
+
// - Enter advances field -> submit (on second field)
|
|
244
|
+
// - ESC backs out progressively (clear field -> switch field -> return to prompt)
|
|
245
|
+
// This keeps behavior predictable and mirrors the "progressive ESC" style
|
|
246
|
+
// used below in prompt mode.
|
|
247
|
+
if (mode === 'gitOptions') {
|
|
248
|
+
// ESC in git-options mode is intentionally layered:
|
|
249
|
+
// 1) clear current field if it has text
|
|
250
|
+
// 2) otherwise jump to the other field if that one has text
|
|
251
|
+
// 3) otherwise return to prompt mode
|
|
252
|
+
if (key.escape) {
|
|
253
|
+
setGitOptionsError(null);
|
|
254
|
+
if (activeGitField === 'baseBranch') {
|
|
255
|
+
if (baseBranch.length > 0) {
|
|
256
|
+
setBaseBranch('');
|
|
257
|
+
}
|
|
258
|
+
else if (branchName.length > 0) {
|
|
259
|
+
setActiveGitField('branchName');
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
setMode('prompt');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
if (branchName.length > 0) {
|
|
267
|
+
setBranchName('');
|
|
268
|
+
}
|
|
269
|
+
else if (baseBranch.length > 0) {
|
|
270
|
+
setActiveGitField('baseBranch');
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
setMode('prompt');
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
// Up navigates the branch list while base field is active.
|
|
279
|
+
// Otherwise it focuses the base-branch field.
|
|
280
|
+
if (key.upArrow) {
|
|
281
|
+
if (activeGitField === 'baseBranch' && filteredBranches.length > 0) {
|
|
282
|
+
setSelectedBranchIndex((prev) => Math.max(0, prev - 1));
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
setActiveGitField('baseBranch');
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
// Down navigates the branch list while base field is active.
|
|
289
|
+
// If no list is active, it moves focus to branch-name field.
|
|
290
|
+
if (key.downArrow) {
|
|
291
|
+
if (activeGitField === 'baseBranch' && filteredBranches.length > 0) {
|
|
292
|
+
setSelectedBranchIndex((prev) => Math.min(filteredBranches.length - 1, prev + 1));
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
setActiveGitField('branchName');
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
// Tab and Shift+Tab cycle across prompt/base/branch fields.
|
|
299
|
+
if (isForwardTab || isBackTab) {
|
|
300
|
+
const nextField = isForwardTab
|
|
301
|
+
? getNextNewPaneField(getCurrentField())
|
|
302
|
+
: getPreviousNewPaneField(getCurrentField());
|
|
303
|
+
setCurrentField(nextField);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
// Enter is a two-step action:
|
|
307
|
+
// - on base field: accept highlighted/exact branch, then move to branch field
|
|
308
|
+
// - on branch field: submit both overrides + prompt payload
|
|
309
|
+
if (key.return) {
|
|
310
|
+
if (activeGitField === 'baseBranch') {
|
|
311
|
+
const resolution = resolveBaseBranchEnter({
|
|
312
|
+
baseBranch,
|
|
313
|
+
availableBranches,
|
|
314
|
+
filteredBranches,
|
|
315
|
+
selectedIndex: selectedBranchIndex,
|
|
316
|
+
});
|
|
317
|
+
if (!resolution.accepted) {
|
|
318
|
+
setGitOptionsError(resolution.error || BASE_BRANCH_ERROR_MESSAGE);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
setBaseBranch(resolution.nextValue);
|
|
322
|
+
setActiveGitField('branchName');
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
writeSuccessResult();
|
|
326
|
+
}
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
166
331
|
// Handle ESC with progressive behavior:
|
|
167
332
|
// 1. If file list is active, dismiss it
|
|
168
333
|
// 2. If text is present, arm a clear, then clear on a second ESC
|
|
169
334
|
// 3. If no text, allow PopupWrapper to close the popup
|
|
335
|
+
// With git options enabled, Tab/Shift+Tab also cycle into git fields
|
|
336
|
+
// from the prompt editor when file autocomplete is not active.
|
|
337
|
+
if (ENABLE_GIT_OPTIONS_ARG && !isFileListActive && (isForwardTab || isBackTab)) {
|
|
338
|
+
const nextField = isForwardTab
|
|
339
|
+
? getNextNewPaneField(getCurrentField())
|
|
340
|
+
: getPreviousNewPaneField(getCurrentField());
|
|
341
|
+
setCurrentField(nextField);
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
170
344
|
if (key.escape) {
|
|
171
345
|
if (isFileListActive) {
|
|
172
346
|
// Dismiss file list
|
|
@@ -234,9 +408,19 @@ export const NewPanePopupApp = ({ resultFile }) => {
|
|
|
234
408
|
if (isFileListActive) {
|
|
235
409
|
return;
|
|
236
410
|
}
|
|
237
|
-
|
|
411
|
+
const nextPrompt = value || prompt;
|
|
412
|
+
updatePrompt(nextPrompt);
|
|
413
|
+
if (ENABLE_GIT_OPTIONS_ARG) {
|
|
414
|
+
setMode('gitOptions');
|
|
415
|
+
setActiveGitField('baseBranch');
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
writeSuccessAndExit(resultFile, { prompt: nextPrompt }, exit);
|
|
238
419
|
};
|
|
239
420
|
const shouldAllowCancel = () => {
|
|
421
|
+
if (mode !== 'prompt') {
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
240
424
|
// Block cancel (ESC key) if:
|
|
241
425
|
// 1. File list is currently active, OR
|
|
242
426
|
// 2. There's text in the prompt
|
|
@@ -254,22 +438,75 @@ export const NewPanePopupApp = ({ resultFile }) => {
|
|
|
254
438
|
debugLog('[shouldAllowCancel] Allowing cancel');
|
|
255
439
|
return true;
|
|
256
440
|
};
|
|
441
|
+
const branchWindow = getVisibleBranchWindow(filteredBranches, selectedBranchIndex);
|
|
442
|
+
const hasHiddenAbove = branchWindow.startIndex > 0;
|
|
443
|
+
const hiddenAboveCount = branchWindow.startIndex;
|
|
444
|
+
const hiddenBelowCount = Math.max(0, filteredBranches.length - (branchWindow.startIndex + branchWindow.visibleBranches.length));
|
|
445
|
+
const isBaseBranchInvalidLive = baseBranch.trim().length > 0 && !isValidBaseBranchOverride(baseBranch.trim(), availableBranches);
|
|
446
|
+
const baseBranchBorderColor = isBaseBranchInvalidLive ? POPUP_CONFIG.errorColor : 'gray';
|
|
257
447
|
return (React.createElement(PopupWrapper, { resultFile: resultFile, allowEscapeToCancel: true, shouldAllowCancel: shouldAllowCancel },
|
|
258
|
-
React.createElement(PopupContainer, { footer:
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
React.createElement(
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
React.createElement(
|
|
270
|
-
|
|
271
|
-
React.createElement(
|
|
272
|
-
|
|
448
|
+
React.createElement(PopupContainer, { footer: mode === 'prompt'
|
|
449
|
+
? PopupFooters.input()
|
|
450
|
+
: '↑↓ branch list • Tab/Shift+Tab cycle fields • Enter select/create • ESC progressive back' },
|
|
451
|
+
mode === 'prompt' && (React.createElement(React.Fragment, null,
|
|
452
|
+
React.createElement(Box, { marginBottom: 0 },
|
|
453
|
+
React.createElement(Text, { dimColor: true }, "Project: "),
|
|
454
|
+
React.createElement(Text, { bold: true, color: "cyan" }, PROJECT_NAME),
|
|
455
|
+
React.createElement(Text, { dimColor: true },
|
|
456
|
+
" (",
|
|
457
|
+
FILE_SCAN_ROOT,
|
|
458
|
+
")")),
|
|
459
|
+
React.createElement(Box, { marginBottom: 1 },
|
|
460
|
+
React.createElement(Text, { dimColor: true }, "Enter a prompt for your AI agent.")),
|
|
461
|
+
pendingClearEsc && (React.createElement(Box, { marginBottom: 1 },
|
|
462
|
+
React.createElement(Text, { color: POPUP_CONFIG.titleColor }, "Press Esc again to clear the prompt."))),
|
|
463
|
+
React.createElement(Box, { width: "100%", borderStyle: POPUP_CONFIG.inputBorderStyle, borderColor: POPUP_CONFIG.inputBorderColor, paddingX: POPUP_CONFIG.inputPadding.x, paddingY: POPUP_CONFIG.inputPadding.y },
|
|
464
|
+
React.createElement(CleanTextInput, { value: prompt, onChange: updatePrompt, onSubmit: handleSubmit, placeholder: "e.g., Add user authentication with JWT", maxWidth: 76, maxVisibleLines: 10, cursorPosition: cursorPosition, disableUpDownArrows: isFileListActive, disableEscape: true, onCursorChange: setCurrentCursor, ignoreFocus: true })),
|
|
465
|
+
isFileListActive && (React.createElement(FileList, { files: filteredFiles, selectedIndex: selectedFileIndex, maxVisible: 10 })))),
|
|
466
|
+
mode === 'gitOptions' && (React.createElement(React.Fragment, null,
|
|
467
|
+
React.createElement(Box, { marginBottom: 1 },
|
|
468
|
+
React.createElement(Text, { dimColor: true }, "Optional Git overrides for this pane.")),
|
|
469
|
+
gitOptionsError && (React.createElement(Box, { marginBottom: 1 },
|
|
470
|
+
React.createElement(Text, { color: "red" }, gitOptionsError))),
|
|
471
|
+
React.createElement(Box, { marginBottom: 1 },
|
|
472
|
+
React.createElement(Text, { dimColor: true }, "Prompt: "),
|
|
473
|
+
React.createElement(Text, null, prompt.trim() || '(empty prompt)')),
|
|
474
|
+
React.createElement(Box, { marginBottom: 0 },
|
|
475
|
+
React.createElement(Text, { color: activeGitField === 'baseBranch' ? POPUP_CONFIG.titleColor : 'white' },
|
|
476
|
+
activeGitField === 'baseBranch' ? '▶ ' : ' ',
|
|
477
|
+
"Base branch override (optional)")),
|
|
478
|
+
React.createElement(Box, { width: "100%", borderStyle: POPUP_CONFIG.inputBorderStyle, borderColor: baseBranchBorderColor, paddingX: POPUP_CONFIG.inputPadding.x, paddingY: POPUP_CONFIG.inputPadding.y, marginBottom: 0, flexDirection: "column" },
|
|
479
|
+
React.createElement(InlineCursorInput, { value: baseBranch, onChange: setBaseBranch, focus: activeGitField === 'baseBranch', placeholder: "e.g., develop" }),
|
|
480
|
+
activeGitField === 'baseBranch' && filteredBranches.length > 0 && (React.createElement(React.Fragment, null,
|
|
481
|
+
React.createElement(Box, { marginBottom: 0 },
|
|
482
|
+
React.createElement(Text, { dimColor: true },
|
|
483
|
+
"Existing branches (",
|
|
484
|
+
filteredBranches.length,
|
|
485
|
+
") - Use \u2191\u2193 to navigate, Enter to pick")),
|
|
486
|
+
hasHiddenAbove && (React.createElement(Box, { justifyContent: "center" },
|
|
487
|
+
React.createElement(Text, { dimColor: true },
|
|
488
|
+
"\u2191 ",
|
|
489
|
+
hiddenAboveCount,
|
|
490
|
+
" more above"))),
|
|
491
|
+
branchWindow.visibleBranches.map((branch, index) => {
|
|
492
|
+
const actualIndex = branchWindow.startIndex + index;
|
|
493
|
+
const isSelected = actualIndex === selectedBranchIndex;
|
|
494
|
+
return (React.createElement(Box, { key: branch },
|
|
495
|
+
React.createElement(Text, { color: isSelected ? 'black' : undefined, backgroundColor: isSelected ? 'cyan' : undefined, bold: isSelected },
|
|
496
|
+
isSelected ? '▶ ' : ' ',
|
|
497
|
+
branch)));
|
|
498
|
+
}),
|
|
499
|
+
hiddenBelowCount > 0 && (React.createElement(Box, { justifyContent: "center" },
|
|
500
|
+
React.createElement(Text, { dimColor: true },
|
|
501
|
+
"\u2193 ",
|
|
502
|
+
hiddenBelowCount,
|
|
503
|
+
" more below")))))),
|
|
504
|
+
React.createElement(Box, { marginBottom: 0 },
|
|
505
|
+
React.createElement(Text, { color: activeGitField === 'branchName' ? POPUP_CONFIG.titleColor : 'white' },
|
|
506
|
+
activeGitField === 'branchName' ? '▶ ' : ' ',
|
|
507
|
+
"Branch/worktree name override (optional)")),
|
|
508
|
+
React.createElement(Box, { width: "100%", borderStyle: POPUP_CONFIG.inputBorderStyle, borderColor: activeGitField === 'branchName' ? POPUP_CONFIG.inputBorderColor : 'gray', paddingX: POPUP_CONFIG.inputPadding.x, paddingY: POPUP_CONFIG.inputPadding.y },
|
|
509
|
+
React.createElement(InlineCursorInput, { value: branchName, onChange: setBranchName, focus: activeGitField === 'branchName', placeholder: "e.g., feat/LIN-123-fix-auth" })))))));
|
|
273
510
|
};
|
|
274
511
|
// Entry point
|
|
275
512
|
function main() {
|