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.
Files changed (280) hide show
  1. package/README.ja.md +93 -0
  2. package/README.md +16 -1
  3. package/dist/DmuxApp.d.ts.map +1 -1
  4. package/dist/DmuxApp.js +282 -43
  5. package/dist/DmuxApp.js.map +1 -1
  6. package/dist/actions/implementations/closeAction.d.ts.map +1 -1
  7. package/dist/actions/implementations/closeAction.js +85 -70
  8. package/dist/actions/implementations/closeAction.js.map +1 -1
  9. package/dist/actions/implementations/createPullRequestAction.d.ts +4 -0
  10. package/dist/actions/implementations/createPullRequestAction.d.ts.map +1 -0
  11. package/dist/actions/implementations/createPullRequestAction.js +218 -0
  12. package/dist/actions/implementations/createPullRequestAction.js.map +1 -0
  13. package/dist/actions/implementations/index.d.ts +1 -0
  14. package/dist/actions/implementations/index.d.ts.map +1 -1
  15. package/dist/actions/implementations/index.js +1 -0
  16. package/dist/actions/implementations/index.js.map +1 -1
  17. package/dist/actions/implementations/mergeAction.js +8 -3
  18. package/dist/actions/implementations/mergeAction.js.map +1 -1
  19. package/dist/actions/index.d.ts.map +1 -1
  20. package/dist/actions/index.js +2 -0
  21. package/dist/actions/index.js.map +1 -1
  22. package/dist/actions/paneActions.d.ts +1 -1
  23. package/dist/actions/paneActions.d.ts.map +1 -1
  24. package/dist/actions/paneActions.js +1 -1
  25. package/dist/actions/paneActions.js.map +1 -1
  26. package/dist/actions/types.d.ts +11 -2
  27. package/dist/actions/types.d.ts.map +1 -1
  28. package/dist/actions/types.js +9 -0
  29. package/dist/actions/types.js.map +1 -1
  30. package/dist/components/inputs/CleanTextInput.d.ts +1 -0
  31. package/dist/components/inputs/CleanTextInput.d.ts.map +1 -1
  32. package/dist/components/inputs/CleanTextInput.js +40 -42
  33. package/dist/components/inputs/CleanTextInput.js.map +1 -1
  34. package/dist/components/inputs/InlineCursorInput.d.ts +10 -0
  35. package/dist/components/inputs/InlineCursorInput.d.ts.map +1 -0
  36. package/dist/components/inputs/InlineCursorInput.js +101 -0
  37. package/dist/components/inputs/InlineCursorInput.js.map +1 -0
  38. package/dist/components/panes/PaneCard.d.ts +3 -1
  39. package/dist/components/panes/PaneCard.d.ts.map +1 -1
  40. package/dist/components/panes/PaneCard.js +14 -4
  41. package/dist/components/panes/PaneCard.js.map +1 -1
  42. package/dist/components/panes/PanesGrid.d.ts +4 -1
  43. package/dist/components/panes/PanesGrid.d.ts.map +1 -1
  44. package/dist/components/panes/PanesGrid.js +27 -15
  45. package/dist/components/panes/PanesGrid.js.map +1 -1
  46. package/dist/components/popups/config.d.ts +4 -4
  47. package/dist/components/popups/config.js +6 -6
  48. package/dist/components/popups/config.js.map +1 -1
  49. package/dist/components/popups/inputPopup.js +3 -3
  50. package/dist/components/popups/inputPopup.js.map +1 -1
  51. package/dist/components/popups/newPaneFieldNavigation.d.ts +9 -0
  52. package/dist/components/popups/newPaneFieldNavigation.d.ts.map +1 -0
  53. package/dist/components/popups/newPaneFieldNavigation.js +20 -0
  54. package/dist/components/popups/newPaneFieldNavigation.js.map +1 -0
  55. package/dist/components/popups/newPaneGitOptions.d.ts +23 -0
  56. package/dist/components/popups/newPaneGitOptions.d.ts.map +1 -0
  57. package/dist/components/popups/newPaneGitOptions.js +91 -0
  58. package/dist/components/popups/newPaneGitOptions.js.map +1 -0
  59. package/dist/components/popups/newPanePopup.d.ts +7 -2
  60. package/dist/components/popups/newPanePopup.d.ts.map +1 -1
  61. package/dist/components/popups/newPanePopup.js +256 -19
  62. package/dist/components/popups/newPanePopup.js.map +1 -1
  63. package/dist/components/popups/prReviewPopup.d.ts +12 -0
  64. package/dist/components/popups/prReviewPopup.d.ts.map +1 -0
  65. package/dist/components/popups/prReviewPopup.js +278 -0
  66. package/dist/components/popups/prReviewPopup.js.map +1 -0
  67. package/dist/components/popups/reopenWorktreePopup.js +1 -1
  68. package/dist/components/popups/reopenWorktreePopup.js.map +1 -1
  69. package/dist/components/popups/settingsPopup.js +72 -6
  70. package/dist/components/popups/settingsPopup.js.map +1 -1
  71. package/dist/components/ui/FooterHelp.d.ts.map +1 -1
  72. package/dist/components/ui/FooterHelp.js +5 -4
  73. package/dist/components/ui/FooterHelp.js.map +1 -1
  74. package/dist/hooks/useActionSystem.d.ts +12 -2
  75. package/dist/hooks/useActionSystem.d.ts.map +1 -1
  76. package/dist/hooks/useActionSystem.js +19 -1
  77. package/dist/hooks/useActionSystem.js.map +1 -1
  78. package/dist/hooks/useInputHandling.d.ts +5 -3
  79. package/dist/hooks/useInputHandling.d.ts.map +1 -1
  80. package/dist/hooks/useInputHandling.js +93 -32
  81. package/dist/hooks/useInputHandling.js.map +1 -1
  82. package/dist/hooks/usePaneCreation.d.ts +5 -3
  83. package/dist/hooks/usePaneCreation.d.ts.map +1 -1
  84. package/dist/hooks/usePaneCreation.js +16 -3
  85. package/dist/hooks/usePaneCreation.js.map +1 -1
  86. package/dist/hooks/usePaneLoading.d.ts.map +1 -1
  87. package/dist/hooks/usePaneLoading.js +28 -3
  88. package/dist/hooks/usePaneLoading.js.map +1 -1
  89. package/dist/hooks/usePaneSync.d.ts.map +1 -1
  90. package/dist/hooks/usePaneSync.js +8 -5
  91. package/dist/hooks/usePaneSync.js.map +1 -1
  92. package/dist/hooks/usePanes.d.ts.map +1 -1
  93. package/dist/hooks/usePanes.js +8 -1
  94. package/dist/hooks/usePanes.js.map +1 -1
  95. package/dist/hooks/useShellDetection.d.ts.map +1 -1
  96. package/dist/hooks/useShellDetection.js +7 -1
  97. package/dist/hooks/useShellDetection.js.map +1 -1
  98. package/dist/index.js +49 -22
  99. package/dist/index.js.map +1 -1
  100. package/dist/panes/decorative-pane.js +57 -27
  101. package/dist/panes/decorative-pane.js.map +1 -1
  102. package/dist/server/embedded-assets.d.ts.map +1 -1
  103. package/dist/server/embedded-assets.js +4 -12
  104. package/dist/server/embedded-assets.js.map +1 -1
  105. package/dist/services/DmuxFocusService.d.ts.map +1 -1
  106. package/dist/services/DmuxFocusService.js +19 -14
  107. package/dist/services/DmuxFocusService.js.map +1 -1
  108. package/dist/services/PaneEventService.d.ts +11 -0
  109. package/dist/services/PaneEventService.d.ts.map +1 -1
  110. package/dist/services/PaneEventService.js +31 -3
  111. package/dist/services/PaneEventService.js.map +1 -1
  112. package/dist/services/PaneWorkerManager.d.ts.map +1 -1
  113. package/dist/services/PaneWorkerManager.js +1 -0
  114. package/dist/services/PaneWorkerManager.js.map +1 -1
  115. package/dist/services/PopupManager.d.ts +23 -6
  116. package/dist/services/PopupManager.d.ts.map +1 -1
  117. package/dist/services/PopupManager.js +170 -33
  118. package/dist/services/PopupManager.js.map +1 -1
  119. package/dist/services/StatusDetector.d.ts +1 -0
  120. package/dist/services/StatusDetector.d.ts.map +1 -1
  121. package/dist/services/StatusDetector.js +44 -0
  122. package/dist/services/StatusDetector.js.map +1 -1
  123. package/dist/services/TmuxHookManager.d.ts.map +1 -1
  124. package/dist/services/TmuxHookManager.js +3 -2
  125. package/dist/services/TmuxHookManager.js.map +1 -1
  126. package/dist/services/TmuxService.d.ts +7 -0
  127. package/dist/services/TmuxService.d.ts.map +1 -1
  128. package/dist/services/TmuxService.js +15 -1
  129. package/dist/services/TmuxService.js.map +1 -1
  130. package/dist/theme/colors.d.ts +24 -10
  131. package/dist/theme/colors.d.ts.map +1 -1
  132. package/dist/theme/colors.js +143 -19
  133. package/dist/theme/colors.js.map +1 -1
  134. package/dist/theme/themePalette.d.ts +6 -0
  135. package/dist/theme/themePalette.d.ts.map +1 -0
  136. package/dist/theme/themePalette.js +18 -0
  137. package/dist/theme/themePalette.js.map +1 -0
  138. package/dist/types.d.ts +13 -0
  139. package/dist/types.d.ts.map +1 -1
  140. package/dist/utils/agentLaunch.d.ts +2 -0
  141. package/dist/utils/agentLaunch.d.ts.map +1 -1
  142. package/dist/utils/agentLaunch.js +10 -9
  143. package/dist/utils/agentLaunch.js.map +1 -1
  144. package/dist/utils/aiMerge.d.ts +4 -0
  145. package/dist/utils/aiMerge.d.ts.map +1 -1
  146. package/dist/utils/aiMerge.js +7 -4
  147. package/dist/utils/aiMerge.js.map +1 -1
  148. package/dist/utils/asciiArt.d.ts.map +1 -1
  149. package/dist/utils/asciiArt.js +2 -1
  150. package/dist/utils/asciiArt.js.map +1 -1
  151. package/dist/utils/attachAgent.d.ts.map +1 -1
  152. package/dist/utils/attachAgent.js +20 -1
  153. package/dist/utils/attachAgent.js.map +1 -1
  154. package/dist/utils/codexHooks.d.ts +25 -0
  155. package/dist/utils/codexHooks.d.ts.map +1 -0
  156. package/dist/utils/codexHooks.js +131 -0
  157. package/dist/utils/codexHooks.js.map +1 -0
  158. package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
  159. package/dist/utils/conflictResolutionPane.js +4 -0
  160. package/dist/utils/conflictResolutionPane.js.map +1 -1
  161. package/dist/utils/devWatchCommand.d.ts.map +1 -1
  162. package/dist/utils/devWatchCommand.js +6 -2
  163. package/dist/utils/devWatchCommand.js.map +1 -1
  164. package/dist/utils/dmuxCommand.d.ts +4 -3
  165. package/dist/utils/dmuxCommand.d.ts.map +1 -1
  166. package/dist/utils/dmuxCommand.js +15 -14
  167. package/dist/utils/dmuxCommand.js.map +1 -1
  168. package/dist/utils/generated-agents-doc.d.ts +1 -1
  169. package/dist/utils/generated-agents-doc.d.ts.map +1 -1
  170. package/dist/utils/generated-agents-doc.js +46 -11
  171. package/dist/utils/generated-agents-doc.js.map +1 -1
  172. package/dist/utils/git.d.ts +8 -0
  173. package/dist/utils/git.d.ts.map +1 -1
  174. package/dist/utils/git.js +26 -0
  175. package/dist/utils/git.js.map +1 -1
  176. package/dist/utils/githubPullRequest.d.ts +18 -0
  177. package/dist/utils/githubPullRequest.d.ts.map +1 -0
  178. package/dist/utils/githubPullRequest.js +196 -0
  179. package/dist/utils/githubPullRequest.js.map +1 -0
  180. package/dist/utils/hooks.d.ts +15 -0
  181. package/dist/utils/hooks.d.ts.map +1 -1
  182. package/dist/utils/hooks.js +105 -0
  183. package/dist/utils/hooks.js.map +1 -1
  184. package/dist/utils/hooksDocs.d.ts +1 -1
  185. package/dist/utils/hooksDocs.d.ts.map +1 -1
  186. package/dist/utils/hooksDocs.js +21 -11
  187. package/dist/utils/hooksDocs.js.map +1 -1
  188. package/dist/utils/input.d.ts +7 -6
  189. package/dist/utils/input.d.ts.map +1 -1
  190. package/dist/utils/input.js +47 -24
  191. package/dist/utils/input.js.map +1 -1
  192. package/dist/utils/paneBootstrapConfig.d.ts +27 -0
  193. package/dist/utils/paneBootstrapConfig.d.ts.map +1 -0
  194. package/dist/utils/paneBootstrapConfig.js +2 -0
  195. package/dist/utils/paneBootstrapConfig.js.map +1 -0
  196. package/dist/utils/paneBootstrapRunner.d.ts +3 -0
  197. package/dist/utils/paneBootstrapRunner.d.ts.map +1 -0
  198. package/dist/utils/paneBootstrapRunner.js +517 -0
  199. package/dist/utils/paneBootstrapRunner.js.map +1 -0
  200. package/dist/utils/paneColors.d.ts +7 -0
  201. package/dist/utils/paneColors.d.ts.map +1 -0
  202. package/dist/utils/paneColors.js +42 -0
  203. package/dist/utils/paneColors.js.map +1 -0
  204. package/dist/utils/paneCreation.d.ts +3 -1
  205. package/dist/utils/paneCreation.d.ts.map +1 -1
  206. package/dist/utils/paneCreation.js +165 -225
  207. package/dist/utils/paneCreation.js.map +1 -1
  208. package/dist/utils/paneNaming.d.ts +16 -0
  209. package/dist/utils/paneNaming.d.ts.map +1 -0
  210. package/dist/utils/paneNaming.js +47 -0
  211. package/dist/utils/paneNaming.js.map +1 -0
  212. package/dist/utils/paneTitle.d.ts +1 -0
  213. package/dist/utils/paneTitle.d.ts.map +1 -1
  214. package/dist/utils/paneTitle.js +5 -1
  215. package/dist/utils/paneTitle.js.map +1 -1
  216. package/dist/utils/paneTitlePrefix.d.ts +8 -0
  217. package/dist/utils/paneTitlePrefix.d.ts.map +1 -0
  218. package/dist/utils/paneTitlePrefix.js +20 -0
  219. package/dist/utils/paneTitlePrefix.js.map +1 -0
  220. package/dist/utils/pathEnvironment.d.ts +6 -0
  221. package/dist/utils/pathEnvironment.d.ts.map +1 -0
  222. package/dist/utils/pathEnvironment.js +59 -0
  223. package/dist/utils/pathEnvironment.js.map +1 -0
  224. package/dist/utils/popup.d.ts +1 -0
  225. package/dist/utils/popup.d.ts.map +1 -1
  226. package/dist/utils/popup.js +9 -2
  227. package/dist/utils/popup.js.map +1 -1
  228. package/dist/utils/prSummary.d.ts +34 -0
  229. package/dist/utils/prSummary.d.ts.map +1 -0
  230. package/dist/utils/prSummary.js +130 -0
  231. package/dist/utils/prSummary.js.map +1 -0
  232. package/dist/utils/projectActions.d.ts +6 -0
  233. package/dist/utils/projectActions.d.ts.map +1 -1
  234. package/dist/utils/projectActions.js +46 -0
  235. package/dist/utils/projectActions.js.map +1 -1
  236. package/dist/utils/reopenWorktree.d.ts.map +1 -1
  237. package/dist/utils/reopenWorktree.js +37 -5
  238. package/dist/utils/reopenWorktree.js.map +1 -1
  239. package/dist/utils/resumeBranches.d.ts.map +1 -1
  240. package/dist/utils/resumeBranches.js +9 -3
  241. package/dist/utils/resumeBranches.js.map +1 -1
  242. package/dist/utils/settingsManager.d.ts +11 -3
  243. package/dist/utils/settingsManager.d.ts.map +1 -1
  244. package/dist/utils/settingsManager.js +106 -21
  245. package/dist/utils/settingsManager.js.map +1 -1
  246. package/dist/utils/shellPaneDetection.d.ts.map +1 -1
  247. package/dist/utils/shellPaneDetection.js +4 -0
  248. package/dist/utils/shellPaneDetection.js.map +1 -1
  249. package/dist/utils/sidebarProjects.d.ts +10 -3
  250. package/dist/utils/sidebarProjects.d.ts.map +1 -1
  251. package/dist/utils/sidebarProjects.js +125 -10
  252. package/dist/utils/sidebarProjects.js.map +1 -1
  253. package/dist/utils/tmuxHookCommands.d.ts +6 -0
  254. package/dist/utils/tmuxHookCommands.d.ts.map +1 -1
  255. package/dist/utils/tmuxHookCommands.js +12 -0
  256. package/dist/utils/tmuxHookCommands.js.map +1 -1
  257. package/dist/utils/tmuxSendKeys.d.ts +2 -0
  258. package/dist/utils/tmuxSendKeys.d.ts.map +1 -0
  259. package/dist/utils/tmuxSendKeys.js +8 -0
  260. package/dist/utils/tmuxSendKeys.js.map +1 -0
  261. package/dist/utils/toastLayout.d.ts +10 -0
  262. package/dist/utils/toastLayout.d.ts.map +1 -0
  263. package/dist/utils/toastLayout.js +24 -0
  264. package/dist/utils/toastLayout.js.map +1 -0
  265. package/dist/utils/welcomePane.d.ts +5 -1
  266. package/dist/utils/welcomePane.d.ts.map +1 -1
  267. package/dist/utils/welcomePane.js +33 -3
  268. package/dist/utils/welcomePane.js.map +1 -1
  269. package/dist/utils/welcomePaneManager.d.ts +3 -1
  270. package/dist/utils/welcomePaneManager.d.ts.map +1 -1
  271. package/dist/utils/welcomePaneManager.js +40 -2
  272. package/dist/utils/welcomePaneManager.js.map +1 -1
  273. package/dist/workers/PaneWorker.js +77 -0
  274. package/dist/workers/PaneWorker.js.map +1 -1
  275. package/dist/workers/WorkerMessages.d.ts +9 -1
  276. package/dist/workers/WorkerMessages.d.ts.map +1 -1
  277. package/dist/workers/WorkerMessages.js.map +1 -1
  278. package/dist/workers/panePollingWorker.js +33 -2
  279. package/dist/workers/panePollingWorker.js.map +1 -1
  280. 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: "#ff8700";
7
+ readonly borderColor: "";
8
8
  readonly inputBorderStyle: "bold";
9
- readonly inputBorderColor: "#ff8700";
10
- readonly titleColor: "#ff8700";
9
+ readonly inputBorderColor: "";
10
+ readonly titleColor: "";
11
11
  readonly successColor: "green";
12
12
  readonly errorColor: "red";
13
13
  readonly dimColor: "gray";
14
- readonly tmuxBorderColor: "214";
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: COLORS.accent, // Orange border for main containers
9
+ get borderColor() { return COLORS.accent; },
10
10
  inputBorderStyle: 'bold',
11
- inputBorderColor: COLORS.accent, // Orange border for input boxes
12
- titleColor: COLORS.accent, // Orange titles
13
- successColor: COLORS.success, // Green for success states
14
- errorColor: COLORS.error, // Red for error states
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: TMUX_COLORS.activeBorder, // colour214
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,EAAE,MAAM,CAAC,MAAM,EAAW,oCAAoC;IACzE,gBAAgB,EAAE,MAAe;IACjC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAM,gCAAgC;IACrE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAY,gBAAgB;IACrD,YAAY,EAAE,MAAM,CAAC,OAAO,EAAS,2BAA2B;IAChE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAa,uBAAuB;IAC5D,QAAQ,EAAE,MAAe,EAAY,gCAAgC;IAErE,0DAA0D;IAC1D,eAAe,EAAE,WAAW,CAAC,YAAY,EAAK,YAAY;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"}
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":"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"}
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 for creating a new dmux pane
4
- * Runs in a tmux popup modal and writes result to a file
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;;;GAGG;AAEH,OAAO,KAAsC,MAAM,OAAO,CAAA;AAgC1D,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAyT5D,CAAA"}
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 for creating a new dmux pane
4
- * Runs in a tmux popup modal and writes result to a file
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
- writeSuccessAndExit(resultFile, value || prompt, exit);
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: PopupFooters.input() },
259
- React.createElement(Box, { marginBottom: 0 },
260
- React.createElement(Text, { dimColor: true }, "Project: "),
261
- React.createElement(Text, { bold: true, color: "cyan" }, PROJECT_NAME),
262
- React.createElement(Text, { dimColor: true },
263
- " (",
264
- FILE_SCAN_ROOT,
265
- ")")),
266
- React.createElement(Box, { marginBottom: 1 },
267
- React.createElement(Text, { dimColor: true }, "Enter a prompt for your AI agent.")),
268
- pendingClearEsc && (React.createElement(Box, { marginBottom: 1 },
269
- React.createElement(Text, { color: POPUP_CONFIG.titleColor }, "Press Esc again to clear the prompt."))),
270
- React.createElement(Box, { width: "100%", borderStyle: POPUP_CONFIG.inputBorderStyle, borderColor: POPUP_CONFIG.inputBorderColor, paddingX: POPUP_CONFIG.inputPadding.x, paddingY: POPUP_CONFIG.inputPadding.y },
271
- 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 })),
272
- isFileListActive && (React.createElement(FileList, { files: filteredFiles, selectedIndex: selectedFileIndex, maxVisible: 10 })))));
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() {