@akiojin/gwt 4.10.0 → 4.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/README.ja.md +4 -4
  2. package/README.md +4 -4
  3. package/bin/gwt.js +1 -1
  4. package/dist/claude.d.ts +2 -0
  5. package/dist/claude.d.ts.map +1 -1
  6. package/dist/claude.js +97 -68
  7. package/dist/claude.js.map +1 -1
  8. package/dist/cli/ui/App.solid.d.ts +29 -0
  9. package/dist/cli/ui/App.solid.d.ts.map +1 -0
  10. package/dist/cli/ui/App.solid.js +1395 -0
  11. package/dist/cli/ui/App.solid.js.map +1 -0
  12. package/dist/cli/ui/components/solid/Footer.d.ts +10 -0
  13. package/dist/cli/ui/components/solid/Footer.d.ts.map +1 -0
  14. package/dist/cli/ui/components/solid/Footer.js +10 -0
  15. package/dist/cli/ui/components/solid/Footer.js.map +1 -0
  16. package/dist/cli/ui/components/{parts → solid}/Header.d.ts +1 -6
  17. package/dist/cli/ui/components/solid/Header.d.ts.map +1 -0
  18. package/dist/cli/ui/components/solid/Header.js +13 -0
  19. package/dist/cli/ui/components/solid/Header.js.map +1 -0
  20. package/dist/cli/ui/components/solid/HelpOverlay.d.ts +8 -0
  21. package/dist/cli/ui/components/solid/HelpOverlay.d.ts.map +1 -0
  22. package/dist/cli/ui/components/solid/HelpOverlay.js +118 -0
  23. package/dist/cli/ui/components/solid/HelpOverlay.js.map +1 -0
  24. package/dist/cli/ui/components/solid/QuickStartStep.d.ts +17 -0
  25. package/dist/cli/ui/components/solid/QuickStartStep.d.ts.map +1 -0
  26. package/dist/cli/ui/components/solid/QuickStartStep.js +152 -0
  27. package/dist/cli/ui/components/solid/QuickStartStep.js.map +1 -0
  28. package/dist/cli/ui/components/solid/SelectInput.d.ts +22 -0
  29. package/dist/cli/ui/components/solid/SelectInput.d.ts.map +1 -0
  30. package/dist/cli/ui/components/solid/SelectInput.js +45 -0
  31. package/dist/cli/ui/components/solid/SelectInput.js.map +1 -0
  32. package/dist/cli/ui/components/solid/TextInput.d.ts +12 -0
  33. package/dist/cli/ui/components/solid/TextInput.d.ts.map +1 -0
  34. package/dist/cli/ui/components/solid/TextInput.js +9 -0
  35. package/dist/cli/ui/components/solid/TextInput.js.map +1 -0
  36. package/dist/cli/ui/components/solid/WizardController.d.ts +34 -0
  37. package/dist/cli/ui/components/solid/WizardController.d.ts.map +1 -0
  38. package/dist/cli/ui/components/solid/WizardController.js +223 -0
  39. package/dist/cli/ui/components/solid/WizardController.js.map +1 -0
  40. package/dist/cli/ui/components/solid/WizardPopup.d.ts +26 -0
  41. package/dist/cli/ui/components/solid/WizardPopup.d.ts.map +1 -0
  42. package/dist/cli/ui/components/solid/WizardPopup.js +68 -0
  43. package/dist/cli/ui/components/solid/WizardPopup.js.map +1 -0
  44. package/dist/cli/ui/components/solid/WizardSteps.d.ts +52 -0
  45. package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +1 -0
  46. package/dist/cli/ui/components/solid/WizardSteps.js +419 -0
  47. package/dist/cli/ui/components/solid/WizardSteps.js.map +1 -0
  48. package/dist/cli/ui/core/index.d.ts +12 -0
  49. package/dist/cli/ui/core/index.d.ts.map +1 -0
  50. package/dist/cli/ui/core/index.js +15 -0
  51. package/dist/cli/ui/core/index.js.map +1 -0
  52. package/dist/cli/ui/core/keybindings.d.ts +106 -0
  53. package/dist/cli/ui/core/keybindings.d.ts.map +1 -0
  54. package/dist/cli/ui/core/keybindings.js +270 -0
  55. package/dist/cli/ui/core/keybindings.js.map +1 -0
  56. package/dist/cli/ui/core/theme.d.ts +123 -0
  57. package/dist/cli/ui/core/theme.d.ts.map +1 -0
  58. package/dist/cli/ui/core/theme.js +191 -0
  59. package/dist/cli/ui/core/theme.js.map +1 -0
  60. package/dist/cli/ui/core/types.d.ts +156 -0
  61. package/dist/cli/ui/core/types.d.ts.map +1 -0
  62. package/dist/cli/ui/core/types.js +10 -0
  63. package/dist/cli/ui/core/types.js.map +1 -0
  64. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts +26 -0
  65. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts.map +1 -0
  66. package/dist/cli/ui/hooks/solid/useScrollableList.js +89 -0
  67. package/dist/cli/ui/hooks/solid/useScrollableList.js.map +1 -0
  68. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts +10 -0
  69. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts.map +1 -0
  70. package/dist/cli/ui/hooks/solid/useTerminalSize.js +16 -0
  71. package/dist/cli/ui/hooks/solid/useTerminalSize.js.map +1 -0
  72. package/dist/cli/ui/index.solid.d.ts +5 -0
  73. package/dist/cli/ui/index.solid.d.ts.map +1 -0
  74. package/dist/cli/ui/index.solid.js +21 -0
  75. package/dist/cli/ui/index.solid.js.map +1 -0
  76. package/dist/cli/ui/screens/solid/BranchListScreen.d.ts +53 -0
  77. package/dist/cli/ui/screens/solid/BranchListScreen.d.ts.map +1 -0
  78. package/dist/cli/ui/screens/solid/BranchListScreen.js +829 -0
  79. package/dist/cli/ui/screens/solid/BranchListScreen.js.map +1 -0
  80. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts +11 -0
  81. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts.map +1 -0
  82. package/dist/cli/ui/screens/solid/ConfirmScreen.js +45 -0
  83. package/dist/cli/ui/screens/solid/ConfirmScreen.js.map +1 -0
  84. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts +14 -0
  85. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts.map +1 -0
  86. package/dist/cli/ui/screens/solid/EnvironmentScreen.js +90 -0
  87. package/dist/cli/ui/screens/solid/EnvironmentScreen.js.map +1 -0
  88. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts +8 -0
  89. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts.map +1 -0
  90. package/dist/cli/ui/screens/solid/ErrorScreen.js +18 -0
  91. package/dist/cli/ui/screens/solid/ErrorScreen.js.map +1 -0
  92. package/dist/cli/ui/screens/solid/InputScreen.d.ts +13 -0
  93. package/dist/cli/ui/screens/solid/InputScreen.d.ts.map +1 -0
  94. package/dist/cli/ui/screens/solid/InputScreen.js +17 -0
  95. package/dist/cli/ui/screens/solid/InputScreen.js.map +1 -0
  96. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts +9 -0
  97. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts.map +1 -0
  98. package/dist/cli/ui/screens/solid/LoadingIndicator.js +43 -0
  99. package/dist/cli/ui/screens/solid/LoadingIndicator.js.map +1 -0
  100. package/dist/cli/ui/{components/screens → screens/solid}/LogDetailScreen.d.ts +2 -2
  101. package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts.map +1 -0
  102. package/dist/cli/ui/screens/solid/LogDetailScreen.js +34 -0
  103. package/dist/cli/ui/screens/solid/LogDetailScreen.js.map +1 -0
  104. package/dist/cli/ui/{components/screens/LogListScreen.d.ts → screens/solid/LogScreen.d.ts} +10 -4
  105. package/dist/cli/ui/screens/solid/LogScreen.d.ts.map +1 -0
  106. package/dist/cli/ui/screens/solid/LogScreen.js +333 -0
  107. package/dist/cli/ui/screens/solid/LogScreen.js.map +1 -0
  108. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts +17 -0
  109. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts.map +1 -0
  110. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js +115 -0
  111. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js.map +1 -0
  112. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts +17 -0
  113. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts.map +1 -0
  114. package/dist/cli/ui/screens/solid/ProfileScreen.js +50 -0
  115. package/dist/cli/ui/screens/solid/ProfileScreen.js.map +1 -0
  116. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts +20 -0
  117. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts.map +1 -0
  118. package/dist/cli/ui/screens/solid/SelectorScreen.js +98 -0
  119. package/dist/cli/ui/screens/solid/SelectorScreen.js.map +1 -0
  120. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts +13 -0
  121. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts.map +1 -0
  122. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js +59 -0
  123. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js.map +1 -0
  124. package/dist/cli/ui/stores/appStore.d.ts +143 -0
  125. package/dist/cli/ui/stores/appStore.d.ts.map +1 -0
  126. package/dist/cli/ui/stores/appStore.js +158 -0
  127. package/dist/cli/ui/stores/appStore.js.map +1 -0
  128. package/dist/cli/ui/stores/branchStore.d.ts +159 -0
  129. package/dist/cli/ui/stores/branchStore.d.ts.map +1 -0
  130. package/dist/cli/ui/stores/branchStore.js +275 -0
  131. package/dist/cli/ui/stores/branchStore.js.map +1 -0
  132. package/dist/cli/ui/stores/index.d.ts +11 -0
  133. package/dist/cli/ui/stores/index.d.ts.map +1 -0
  134. package/dist/cli/ui/stores/index.js +14 -0
  135. package/dist/cli/ui/stores/index.js.map +1 -0
  136. package/dist/cli/ui/stores/uiStore.d.ts +146 -0
  137. package/dist/cli/ui/stores/uiStore.d.ts.map +1 -0
  138. package/dist/cli/ui/stores/uiStore.js +166 -0
  139. package/dist/cli/ui/stores/uiStore.js.map +1 -0
  140. package/dist/cli/ui/types.d.ts +17 -1
  141. package/dist/cli/ui/types.d.ts.map +1 -1
  142. package/dist/cli/ui/utils/branchFormatter.d.ts +1 -0
  143. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
  144. package/dist/cli/ui/utils/branchFormatter.js +36 -217
  145. package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
  146. package/dist/cli/ui/utils/continueSession.d.ts +18 -0
  147. package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
  148. package/dist/cli/ui/utils/continueSession.js +90 -2
  149. package/dist/cli/ui/utils/continueSession.js.map +1 -1
  150. package/dist/cli/ui/utils/versionCache.d.ts +37 -0
  151. package/dist/cli/ui/utils/versionCache.d.ts.map +1 -0
  152. package/dist/cli/ui/utils/versionCache.js +70 -0
  153. package/dist/cli/ui/utils/versionCache.js.map +1 -0
  154. package/dist/cli/ui/utils/versionFetcher.d.ts +41 -0
  155. package/dist/cli/ui/utils/versionFetcher.d.ts.map +1 -0
  156. package/dist/cli/ui/utils/versionFetcher.js +89 -0
  157. package/dist/cli/ui/utils/versionFetcher.js.map +1 -0
  158. package/dist/client/assets/{index-ChHC-Puh.css → index-BbfV7Wuj.css} +1 -1
  159. package/dist/client/assets/index-CoAyq5x1.js +78 -0
  160. package/dist/client/index.html +2 -2
  161. package/dist/codex.d.ts +2 -0
  162. package/dist/codex.d.ts.map +1 -1
  163. package/dist/codex.js +109 -39
  164. package/dist/codex.js.map +1 -1
  165. package/dist/config/builtin-coding-agents.js +4 -4
  166. package/dist/config/builtin-coding-agents.js.map +1 -1
  167. package/dist/config/index.d.ts +2 -0
  168. package/dist/config/index.d.ts.map +1 -1
  169. package/dist/config/index.js +11 -0
  170. package/dist/config/index.js.map +1 -1
  171. package/dist/gemini.d.ts +2 -0
  172. package/dist/gemini.d.ts.map +1 -1
  173. package/dist/gemini.js +77 -39
  174. package/dist/gemini.js.map +1 -1
  175. package/dist/index.d.ts +1 -1
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +153 -103
  178. package/dist/index.js.map +1 -1
  179. package/dist/launcher.d.ts.map +1 -1
  180. package/dist/launcher.js +56 -6
  181. package/dist/launcher.js.map +1 -1
  182. package/dist/logging/agentOutput.d.ts +21 -0
  183. package/dist/logging/agentOutput.d.ts.map +1 -0
  184. package/dist/logging/agentOutput.js +164 -0
  185. package/dist/logging/agentOutput.js.map +1 -0
  186. package/dist/logging/formatter.d.ts.map +1 -1
  187. package/dist/logging/formatter.js +18 -4
  188. package/dist/logging/formatter.js.map +1 -1
  189. package/dist/logging/logger.d.ts.map +1 -1
  190. package/dist/logging/logger.js +28 -9
  191. package/dist/logging/logger.js.map +1 -1
  192. package/dist/logging/reader.d.ts +21 -0
  193. package/dist/logging/reader.d.ts.map +1 -1
  194. package/dist/logging/reader.js +79 -0
  195. package/dist/logging/reader.js.map +1 -1
  196. package/dist/opentui/highlights-eq9cgrbb.scm +604 -0
  197. package/dist/opentui/highlights-ghv9g403.scm +205 -0
  198. package/dist/opentui/highlights-hk7bwhj4.scm +284 -0
  199. package/dist/opentui/highlights-r812a2qc.scm +150 -0
  200. package/dist/opentui/highlights-x6tmsnaa.scm +115 -0
  201. package/dist/opentui/index.solid.d.ts +2 -0
  202. package/dist/opentui/index.solid.d.ts.map +1 -0
  203. package/dist/opentui/index.solid.js +53687 -0
  204. package/dist/opentui/index.solid.js.map +1 -0
  205. package/dist/opentui/injections-73j83es3.scm +27 -0
  206. package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  207. package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
  208. package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  209. package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  210. package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
  211. package/dist/repositories/worktree.repository.d.ts +1 -0
  212. package/dist/repositories/worktree.repository.d.ts.map +1 -1
  213. package/dist/repositories/worktree.repository.js +7 -0
  214. package/dist/repositories/worktree.repository.js.map +1 -1
  215. package/dist/services/codingAgentResolver.d.ts +2 -0
  216. package/dist/services/codingAgentResolver.d.ts.map +1 -1
  217. package/dist/services/codingAgentResolver.js +30 -4
  218. package/dist/services/codingAgentResolver.js.map +1 -1
  219. package/dist/services/dependency-installer.d.ts.map +1 -1
  220. package/dist/services/dependency-installer.js +2 -7
  221. package/dist/services/dependency-installer.js.map +1 -1
  222. package/dist/types/api.d.ts +3 -0
  223. package/dist/types/api.d.ts.map +1 -1
  224. package/dist/types/coding-agent.d.ts +62 -0
  225. package/dist/types/coding-agent.d.ts.map +1 -0
  226. package/dist/types/coding-agent.js +29 -0
  227. package/dist/types/coding-agent.js.map +1 -0
  228. package/dist/types/tools.d.ts +17 -0
  229. package/dist/types/tools.d.ts.map +1 -1
  230. package/dist/utils/coding-agent-colors.d.ts +88 -0
  231. package/dist/utils/coding-agent-colors.d.ts.map +1 -0
  232. package/dist/utils/coding-agent-colors.js +137 -0
  233. package/dist/utils/coding-agent-colors.js.map +1 -0
  234. package/dist/utils/command.d.ts +1 -1
  235. package/dist/utils/command.js +1 -1
  236. package/dist/utils/error-utils.d.ts +27 -0
  237. package/dist/utils/error-utils.d.ts.map +1 -0
  238. package/dist/utils/error-utils.js +98 -0
  239. package/dist/utils/error-utils.js.map +1 -0
  240. package/dist/utils/npmRegistry.d.ts +61 -0
  241. package/dist/utils/npmRegistry.d.ts.map +1 -0
  242. package/dist/utils/npmRegistry.js +180 -0
  243. package/dist/utils/npmRegistry.js.map +1 -0
  244. package/dist/utils/prompt.d.ts +1 -1
  245. package/dist/utils/prompt.js +1 -1
  246. package/dist/utils/session/common.d.ts +8 -0
  247. package/dist/utils/session/common.d.ts.map +1 -1
  248. package/dist/utils/session/common.js +22 -0
  249. package/dist/utils/session/common.js.map +1 -1
  250. package/dist/utils/session/parsers/claude.d.ts +10 -4
  251. package/dist/utils/session/parsers/claude.d.ts.map +1 -1
  252. package/dist/utils/session/parsers/claude.js +64 -18
  253. package/dist/utils/session/parsers/claude.js.map +1 -1
  254. package/dist/utils/session/parsers/codex.d.ts.map +1 -1
  255. package/dist/utils/session/parsers/codex.js +47 -20
  256. package/dist/utils/session/parsers/codex.js.map +1 -1
  257. package/dist/utils/session/parsers/gemini.d.ts.map +1 -1
  258. package/dist/utils/session/parsers/gemini.js +43 -6
  259. package/dist/utils/session/parsers/gemini.js.map +1 -1
  260. package/dist/utils/session/parsers/opencode.d.ts.map +1 -1
  261. package/dist/utils/session/parsers/opencode.js +43 -6
  262. package/dist/utils/session/parsers/opencode.js.map +1 -1
  263. package/dist/utils/session/types.d.ts +7 -0
  264. package/dist/utils/session/types.d.ts.map +1 -1
  265. package/dist/utils/terminal.d.ts +1 -0
  266. package/dist/utils/terminal.d.ts.map +1 -1
  267. package/dist/utils/terminal.js +20 -0
  268. package/dist/utils/terminal.js.map +1 -1
  269. package/dist/utils.d.ts +9 -0
  270. package/dist/utils.d.ts.map +1 -1
  271. package/dist/utils.js +33 -2
  272. package/dist/utils.js.map +1 -1
  273. package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +1 -1
  274. package/dist/web/client/src/components/CodingAgentLaunchModal.js +7 -16
  275. package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +1 -1
  276. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
  277. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +7 -2
  278. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
  279. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -1
  280. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +2 -1
  281. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -1
  282. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +2 -2
  283. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -1
  284. package/dist/web/client/src/components/branch-detail/ToolLauncher.js +5 -5
  285. package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -1
  286. package/dist/web/client/src/components/ui/alert.d.ts +1 -1
  287. package/dist/web/client/src/lib/coding-agent-colors.d.ts +86 -0
  288. package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +1 -0
  289. package/dist/web/client/src/lib/coding-agent-colors.js +135 -0
  290. package/dist/web/client/src/lib/coding-agent-colors.js.map +1 -0
  291. package/dist/web/client/src/pages/BranchDetailPage.js +10 -10
  292. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
  293. package/dist/web/server/pty/manager.d.ts +2 -0
  294. package/dist/web/server/pty/manager.d.ts.map +1 -1
  295. package/dist/web/server/pty/manager.js +104 -0
  296. package/dist/web/server/pty/manager.js.map +1 -1
  297. package/dist/web/server/routes/sessions.d.ts.map +1 -1
  298. package/dist/web/server/routes/sessions.js +5 -1
  299. package/dist/web/server/routes/sessions.js.map +1 -1
  300. package/dist/web/server/services/branches.d.ts.map +1 -1
  301. package/dist/web/server/services/branches.js +10 -8
  302. package/dist/web/server/services/branches.js.map +1 -1
  303. package/dist/web/server/services/worktrees.js +2 -2
  304. package/dist/web/server/services/worktrees.js.map +1 -1
  305. package/dist/worktree.d.ts +50 -1
  306. package/dist/worktree.d.ts.map +1 -1
  307. package/dist/worktree.js +292 -100
  308. package/dist/worktree.js.map +1 -1
  309. package/package.json +13 -14
  310. package/src/claude.ts +129 -95
  311. package/src/cli/ui/App.solid.tsx +2096 -0
  312. package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +1084 -0
  313. package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +343 -0
  314. package/src/cli/ui/__tests__/solid/ConfirmScreen.test.tsx +77 -0
  315. package/src/cli/ui/__tests__/solid/LogScreen.test.tsx +351 -0
  316. package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +308 -0
  317. package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +231 -0
  318. package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +241 -0
  319. package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +79 -334
  320. package/src/cli/ui/__tests__/utils/clipboard.test.ts +3 -3
  321. package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +1 -1
  322. package/src/cli/ui/components/solid/Footer.tsx +36 -0
  323. package/src/cli/ui/components/{parts → solid}/Header.tsx +17 -28
  324. package/src/cli/ui/components/solid/HelpOverlay.tsx +194 -0
  325. package/src/cli/ui/components/solid/QuickStartStep.tsx +209 -0
  326. package/src/cli/ui/components/{parts → solid}/ScrollableList.tsx +7 -8
  327. package/src/cli/ui/components/solid/SearchInput.tsx +42 -0
  328. package/src/cli/ui/components/solid/SelectInput.tsx +88 -0
  329. package/src/cli/ui/components/solid/Stats.tsx +92 -0
  330. package/src/cli/ui/components/solid/TextInput.tsx +49 -0
  331. package/src/cli/ui/components/solid/WizardController.tsx +393 -0
  332. package/src/cli/ui/components/solid/WizardPopup.tsx +135 -0
  333. package/src/cli/ui/components/solid/WizardSteps.tsx +736 -0
  334. package/src/cli/ui/core/index.ts +17 -0
  335. package/src/cli/ui/core/keybindings.ts +367 -0
  336. package/src/cli/ui/core/theme.ts +266 -0
  337. package/src/cli/ui/core/types.ts +235 -0
  338. package/src/cli/ui/hooks/solid/useAsyncOperation.ts +78 -0
  339. package/src/cli/ui/hooks/solid/useFilter.ts +86 -0
  340. package/src/cli/ui/hooks/solid/useGitOperations.ts +81 -0
  341. package/src/cli/ui/hooks/solid/useKeyHandler.ts +103 -0
  342. package/src/cli/ui/hooks/solid/useScrollableList.ts +149 -0
  343. package/src/cli/ui/hooks/solid/useSelection.ts +77 -0
  344. package/src/cli/ui/hooks/solid/useTerminalSize.ts +22 -0
  345. package/src/cli/ui/index.solid.ts +28 -0
  346. package/src/cli/ui/screens/solid/BranchListScreen.tsx +1153 -0
  347. package/src/cli/ui/screens/solid/ConfirmScreen.tsx +86 -0
  348. package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +161 -0
  349. package/src/cli/ui/screens/solid/ErrorScreen.tsx +42 -0
  350. package/src/cli/ui/screens/solid/InputScreen.tsx +55 -0
  351. package/src/cli/ui/screens/solid/LoadingIndicator.tsx +77 -0
  352. package/src/cli/ui/screens/solid/LogDetailScreen.tsx +75 -0
  353. package/src/cli/ui/screens/solid/LogScreen.tsx +504 -0
  354. package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +196 -0
  355. package/src/cli/ui/screens/solid/ProfileScreen.tsx +98 -0
  356. package/src/cli/ui/screens/solid/SelectorScreen.tsx +181 -0
  357. package/src/cli/ui/screens/solid/SettingsScreen.tsx +52 -0
  358. package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +136 -0
  359. package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +40 -0
  360. package/src/cli/ui/stores/appStore.ts +208 -0
  361. package/src/cli/ui/stores/branchStore.ts +357 -0
  362. package/src/cli/ui/stores/index.ts +31 -0
  363. package/src/cli/ui/stores/uiStore.ts +226 -0
  364. package/src/cli/ui/types.ts +21 -3
  365. package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +227 -0
  366. package/src/cli/ui/utils/branchFormatter.ts +43 -222
  367. package/src/cli/ui/utils/continueSession.ts +133 -2
  368. package/src/cli/ui/utils/modelOptions.test.ts +1 -1
  369. package/src/cli/ui/utils/versionCache.ts +93 -0
  370. package/src/cli/ui/utils/versionFetcher.ts +120 -0
  371. package/src/codex.ts +138 -39
  372. package/src/config/__tests__/saveSession.test.ts +143 -0
  373. package/src/config/builtin-coding-agents.ts +4 -4
  374. package/src/config/index.ts +14 -0
  375. package/src/gemini.ts +107 -46
  376. package/src/index.test.ts +25 -19
  377. package/src/index.ts +202 -143
  378. package/src/launcher.ts +66 -6
  379. package/src/logging/agentOutput.ts +216 -0
  380. package/src/logging/formatter.ts +23 -4
  381. package/src/logging/logger.ts +34 -10
  382. package/src/logging/reader.ts +117 -0
  383. package/src/opentui/index.solid.ts +1 -0
  384. package/src/repositories/worktree.repository.ts +8 -0
  385. package/src/services/__tests__/BatchMergeService.test.ts +83 -67
  386. package/src/services/__tests__/WorktreeOrchestrator.test.ts +8 -7
  387. package/src/services/codingAgentResolver.ts +30 -4
  388. package/src/services/dependency-installer.ts +2 -9
  389. package/src/types/api.ts +3 -0
  390. package/src/types/coding-agent.ts +85 -0
  391. package/src/types/tools.ts +19 -0
  392. package/src/utils/__tests__/npmRegistry.test.ts +250 -0
  393. package/src/utils/__tests__/prompt.test.ts +4 -5
  394. package/src/utils/coding-agent-colors.ts +165 -0
  395. package/src/utils/command.ts +1 -1
  396. package/src/utils/error-utils.ts +133 -0
  397. package/src/utils/npmRegistry.ts +249 -0
  398. package/src/utils/prompt.ts +1 -1
  399. package/src/utils/session/common.ts +28 -0
  400. package/src/utils/session/parsers/claude.ts +79 -29
  401. package/src/utils/session/parsers/codex.ts +50 -18
  402. package/src/utils/session/parsers/gemini.ts +46 -5
  403. package/src/utils/session/parsers/opencode.ts +46 -5
  404. package/src/utils/session/types.ts +4 -0
  405. package/src/utils/terminal.ts +24 -0
  406. package/src/utils.test.ts +1 -1
  407. package/src/utils.ts +37 -4
  408. package/src/web/client/src/components/CodingAgentLaunchModal.tsx +12 -21
  409. package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +16 -1
  410. package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +7 -1
  411. package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +11 -6
  412. package/src/web/client/src/lib/coding-agent-colors.ts +149 -0
  413. package/src/web/client/src/pages/BranchDetailPage.tsx +11 -11
  414. package/src/web/server/pty/manager.ts +139 -0
  415. package/src/web/server/routes/sessions.ts +6 -0
  416. package/src/web/server/services/branches.ts +11 -8
  417. package/src/web/server/services/worktrees.ts +2 -2
  418. package/src/worktree.ts +386 -114
  419. package/dist/cli/ui/components/App.d.ts +0 -25
  420. package/dist/cli/ui/components/App.d.ts.map +0 -1
  421. package/dist/cli/ui/components/App.js +0 -1006
  422. package/dist/cli/ui/components/App.js.map +0 -1
  423. package/dist/cli/ui/components/common/Confirm.d.ts +0 -13
  424. package/dist/cli/ui/components/common/Confirm.d.ts.map +0 -1
  425. package/dist/cli/ui/components/common/Confirm.js +0 -20
  426. package/dist/cli/ui/components/common/Confirm.js.map +0 -1
  427. package/dist/cli/ui/components/common/ErrorBoundary.d.ts +0 -23
  428. package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +0 -1
  429. package/dist/cli/ui/components/common/ErrorBoundary.js +0 -37
  430. package/dist/cli/ui/components/common/ErrorBoundary.js.map +0 -1
  431. package/dist/cli/ui/components/common/Input.d.ts +0 -19
  432. package/dist/cli/ui/components/common/Input.d.ts.map +0 -1
  433. package/dist/cli/ui/components/common/Input.js +0 -22
  434. package/dist/cli/ui/components/common/Input.js.map +0 -1
  435. package/dist/cli/ui/components/common/LoadingIndicator.d.ts +0 -19
  436. package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +0 -1
  437. package/dist/cli/ui/components/common/LoadingIndicator.js +0 -61
  438. package/dist/cli/ui/components/common/LoadingIndicator.js.map +0 -1
  439. package/dist/cli/ui/components/common/Select.d.ts +0 -38
  440. package/dist/cli/ui/components/common/Select.d.ts.map +0 -1
  441. package/dist/cli/ui/components/common/Select.js +0 -151
  442. package/dist/cli/ui/components/common/Select.js.map +0 -1
  443. package/dist/cli/ui/components/common/SpinnerIcon.d.ts +0 -20
  444. package/dist/cli/ui/components/common/SpinnerIcon.d.ts.map +0 -1
  445. package/dist/cli/ui/components/common/SpinnerIcon.js +0 -61
  446. package/dist/cli/ui/components/common/SpinnerIcon.js.map +0 -1
  447. package/dist/cli/ui/components/parts/Footer.d.ts +0 -15
  448. package/dist/cli/ui/components/parts/Footer.d.ts.map +0 -1
  449. package/dist/cli/ui/components/parts/Footer.js +0 -20
  450. package/dist/cli/ui/components/parts/Footer.js.map +0 -1
  451. package/dist/cli/ui/components/parts/Header.d.ts.map +0 -1
  452. package/dist/cli/ui/components/parts/Header.js +0 -24
  453. package/dist/cli/ui/components/parts/Header.js.map +0 -1
  454. package/dist/cli/ui/components/parts/MergeStatusList.d.ts +0 -13
  455. package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +0 -1
  456. package/dist/cli/ui/components/parts/MergeStatusList.js +0 -52
  457. package/dist/cli/ui/components/parts/MergeStatusList.js.map +0 -1
  458. package/dist/cli/ui/components/parts/ProgressBar.d.ts +0 -13
  459. package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +0 -1
  460. package/dist/cli/ui/components/parts/ProgressBar.js +0 -53
  461. package/dist/cli/ui/components/parts/ProgressBar.js.map +0 -1
  462. package/dist/cli/ui/components/parts/ScrollableList.d.ts +0 -12
  463. package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +0 -1
  464. package/dist/cli/ui/components/parts/ScrollableList.js +0 -11
  465. package/dist/cli/ui/components/parts/ScrollableList.js.map +0 -1
  466. package/dist/cli/ui/components/parts/Stats.d.ts +0 -10
  467. package/dist/cli/ui/components/parts/Stats.d.ts.map +0 -1
  468. package/dist/cli/ui/components/parts/Stats.js +0 -55
  469. package/dist/cli/ui/components/parts/Stats.js.map +0 -1
  470. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +0 -17
  471. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +0 -1
  472. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +0 -42
  473. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +0 -1
  474. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +0 -17
  475. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +0 -1
  476. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +0 -72
  477. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +0 -1
  478. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +0 -18
  479. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +0 -1
  480. package/dist/cli/ui/components/screens/BranchCreatorScreen.js +0 -151
  481. package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +0 -1
  482. package/dist/cli/ui/components/screens/BranchListScreen.d.ts +0 -60
  483. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +0 -1
  484. package/dist/cli/ui/components/screens/BranchListScreen.js +0 -476
  485. package/dist/cli/ui/components/screens/BranchListScreen.js.map +0 -1
  486. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +0 -30
  487. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +0 -1
  488. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +0 -148
  489. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +0 -1
  490. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts +0 -27
  491. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts.map +0 -1
  492. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js +0 -93
  493. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js.map +0 -1
  494. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +0 -19
  495. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +0 -1
  496. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +0 -577
  497. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +0 -1
  498. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +0 -45
  499. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +0 -1
  500. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +0 -95
  501. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +0 -1
  502. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +0 -10
  503. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +0 -1
  504. package/dist/cli/ui/components/screens/LogDatePickerScreen.js +0 -44
  505. package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +0 -1
  506. package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +0 -1
  507. package/dist/cli/ui/components/screens/LogDetailScreen.js +0 -34
  508. package/dist/cli/ui/components/screens/LogDetailScreen.js.map +0 -1
  509. package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +0 -1
  510. package/dist/cli/ui/components/screens/LogListScreen.js +0 -107
  511. package/dist/cli/ui/components/screens/LogListScreen.js.map +0 -1
  512. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +0 -24
  513. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +0 -1
  514. package/dist/cli/ui/components/screens/ModelSelectorScreen.js +0 -197
  515. package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +0 -1
  516. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +0 -29
  517. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +0 -1
  518. package/dist/cli/ui/components/screens/PRCleanupScreen.js +0 -92
  519. package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +0 -1
  520. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +0 -31
  521. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +0 -1
  522. package/dist/cli/ui/components/screens/SessionSelectorScreen.js +0 -67
  523. package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +0 -1
  524. package/dist/cli/ui/hooks/useAppInput.d.ts +0 -21
  525. package/dist/cli/ui/hooks/useAppInput.d.ts.map +0 -1
  526. package/dist/cli/ui/hooks/useAppInput.js +0 -138
  527. package/dist/cli/ui/hooks/useAppInput.js.map +0 -1
  528. package/dist/cli/ui/hooks/useBatchMerge.d.ts +0 -17
  529. package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +0 -1
  530. package/dist/cli/ui/hooks/useBatchMerge.js +0 -77
  531. package/dist/cli/ui/hooks/useBatchMerge.js.map +0 -1
  532. package/dist/cli/ui/hooks/useGitData.d.ts +0 -21
  533. package/dist/cli/ui/hooks/useGitData.d.ts.map +0 -1
  534. package/dist/cli/ui/hooks/useGitData.js +0 -229
  535. package/dist/cli/ui/hooks/useGitData.js.map +0 -1
  536. package/dist/cli/ui/hooks/useProfiles.d.ts +0 -41
  537. package/dist/cli/ui/hooks/useProfiles.d.ts.map +0 -1
  538. package/dist/cli/ui/hooks/useProfiles.js +0 -136
  539. package/dist/cli/ui/hooks/useProfiles.js.map +0 -1
  540. package/dist/cli/ui/hooks/useScreenState.d.ts +0 -12
  541. package/dist/cli/ui/hooks/useScreenState.d.ts.map +0 -1
  542. package/dist/cli/ui/hooks/useScreenState.js +0 -30
  543. package/dist/cli/ui/hooks/useScreenState.js.map +0 -1
  544. package/dist/cli/ui/hooks/useTerminalSize.d.ts +0 -9
  545. package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +0 -1
  546. package/dist/cli/ui/hooks/useTerminalSize.js +0 -24
  547. package/dist/cli/ui/hooks/useTerminalSize.js.map +0 -1
  548. package/dist/cli/ui/hooks/useToolStatus.d.ts +0 -30
  549. package/dist/cli/ui/hooks/useToolStatus.d.ts.map +0 -1
  550. package/dist/cli/ui/hooks/useToolStatus.js +0 -49
  551. package/dist/cli/ui/hooks/useToolStatus.js.map +0 -1
  552. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +0 -24
  553. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +0 -1
  554. package/dist/cli/ui/screens/BranchActionSelectorScreen.js +0 -65
  555. package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +0 -1
  556. package/dist/client/assets/index-LNPtOrn3.js +0 -78
  557. package/src/cli/ui/__tests__/SKIPPED_TESTS.md +0 -119
  558. package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +0 -239
  559. package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +0 -225
  560. package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +0 -219
  561. package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +0 -212
  562. package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +0 -440
  563. package/src/cli/ui/__tests__/components/App.test.tsx +0 -365
  564. package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +0 -91
  565. package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +0 -80
  566. package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +0 -104
  567. package/src/cli/ui/__tests__/components/common/Input.test.tsx +0 -100
  568. package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +0 -148
  569. package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +0 -255
  570. package/src/cli/ui/__tests__/components/common/Select.test.tsx +0 -335
  571. package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +0 -65
  572. package/src/cli/ui/__tests__/components/parts/Header.test.tsx +0 -55
  573. package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +0 -69
  574. package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +0 -148
  575. package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +0 -253
  576. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +0 -1070
  577. package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +0 -142
  578. package/src/cli/ui/__tests__/components/screens/CodingAgentSelectorScreen.test.tsx +0 -174
  579. package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +0 -182
  580. package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +0 -57
  581. package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +0 -102
  582. package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +0 -216
  583. package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +0 -147
  584. package/src/cli/ui/__tests__/hooks/useGitData.nonblocking.test.tsx +0 -206
  585. package/src/cli/ui/__tests__/hooks/useGitData.test.ts +0 -197
  586. package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +0 -228
  587. package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +0 -147
  588. package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +0 -99
  589. package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +0 -253
  590. package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +0 -436
  591. package/src/cli/ui/__tests__/integration/navigation.test.tsx +0 -514
  592. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +0 -509
  593. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +0 -216
  594. package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +0 -193
  595. package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +0 -234
  596. package/src/cli/ui/components/App.tsx +0 -1478
  597. package/src/cli/ui/components/common/Confirm.tsx +0 -44
  598. package/src/cli/ui/components/common/ErrorBoundary.tsx +0 -60
  599. package/src/cli/ui/components/common/Input.tsx +0 -58
  600. package/src/cli/ui/components/common/LoadingIndicator.tsx +0 -98
  601. package/src/cli/ui/components/common/Select.tsx +0 -247
  602. package/src/cli/ui/components/common/SpinnerIcon.tsx +0 -86
  603. package/src/cli/ui/components/parts/Footer.tsx +0 -41
  604. package/src/cli/ui/components/parts/Header.test.tsx +0 -75
  605. package/src/cli/ui/components/parts/MergeStatusList.tsx +0 -75
  606. package/src/cli/ui/components/parts/ProgressBar.tsx +0 -73
  607. package/src/cli/ui/components/parts/Stats.tsx +0 -88
  608. package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +0 -74
  609. package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +0 -108
  610. package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +0 -242
  611. package/src/cli/ui/components/screens/BranchListScreen.tsx +0 -744
  612. package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +0 -244
  613. package/src/cli/ui/components/screens/CodingAgentSelectorScreen.tsx +0 -159
  614. package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +0 -928
  615. package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +0 -176
  616. package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +0 -83
  617. package/src/cli/ui/components/screens/LogDetailScreen.tsx +0 -67
  618. package/src/cli/ui/components/screens/LogListScreen.tsx +0 -192
  619. package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +0 -320
  620. package/src/cli/ui/components/screens/PRCleanupScreen.tsx +0 -171
  621. package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +0 -135
  622. package/src/cli/ui/hooks/useAppInput.ts +0 -172
  623. package/src/cli/ui/hooks/useBatchMerge.ts +0 -96
  624. package/src/cli/ui/hooks/useGitData.ts +0 -347
  625. package/src/cli/ui/hooks/useProfiles.ts +0 -211
  626. package/src/cli/ui/hooks/useScreenState.ts +0 -44
  627. package/src/cli/ui/hooks/useTerminalSize.ts +0 -33
  628. package/src/cli/ui/hooks/useToolStatus.ts +0 -68
  629. package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +0 -111
  630. package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +0 -264
@@ -0,0 +1,249 @@
1
+ /**
2
+ * npm Registry API utilities for fetching package versions
3
+ */
4
+
5
+ export interface VersionInfo {
6
+ version: string;
7
+ isPrerelease: boolean;
8
+ publishedAt?: string;
9
+ }
10
+
11
+ export type VersionSelection = "installed" | "latest" | string;
12
+
13
+ interface NpmRegistryResponse {
14
+ "dist-tags"?: Record<string, string>;
15
+ time?: Record<string, string>;
16
+ versions?: Record<string, unknown>;
17
+ }
18
+
19
+ const DEFAULT_TIMEOUT_MS = 3000;
20
+ const DEFAULT_LIMIT = 10;
21
+
22
+ /**
23
+ * Check if a version string is a prerelease version
24
+ */
25
+ function isPrerelease(version: string): boolean {
26
+ // Prerelease versions contain - followed by alpha, beta, rc, canary, next, etc.
27
+ return /-(alpha|beta|rc|canary|next|dev|pre)\b/i.test(version);
28
+ }
29
+
30
+ /**
31
+ * Fetch package versions from npm registry
32
+ * Returns the latest N versions sorted by publish date (newest first)
33
+ */
34
+ export async function fetchPackageVersions(
35
+ packageName: string,
36
+ limit: number = DEFAULT_LIMIT,
37
+ timeoutMs: number = DEFAULT_TIMEOUT_MS,
38
+ ): Promise<VersionInfo[]> {
39
+ try {
40
+ const controller = new AbortController();
41
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
42
+
43
+ const response = await fetch(
44
+ `https://registry.npmjs.org/${encodeURIComponent(packageName)}`,
45
+ {
46
+ signal: controller.signal,
47
+ headers: {
48
+ Accept: "application/json",
49
+ },
50
+ },
51
+ );
52
+
53
+ clearTimeout(timeoutId);
54
+
55
+ if (!response.ok) {
56
+ return [];
57
+ }
58
+
59
+ const data = (await response.json()) as NpmRegistryResponse;
60
+
61
+ if (!data.versions || !data.time) {
62
+ return [];
63
+ }
64
+
65
+ // Get all versions with their publish times
66
+ const versionsWithTime: Array<{
67
+ version: string;
68
+ publishedAt: string;
69
+ }> = [];
70
+
71
+ for (const version of Object.keys(data.versions)) {
72
+ const publishedAt = data.time[version];
73
+ if (publishedAt) {
74
+ versionsWithTime.push({ version, publishedAt });
75
+ }
76
+ }
77
+
78
+ // Sort by publish date (newest first)
79
+ versionsWithTime.sort((a, b) => {
80
+ const dateA = new Date(a.publishedAt).getTime();
81
+ const dateB = new Date(b.publishedAt).getTime();
82
+ return dateB - dateA;
83
+ });
84
+
85
+ // Take the top N versions
86
+ const topVersions = versionsWithTime.slice(0, limit);
87
+
88
+ // Convert to VersionInfo
89
+ return topVersions.map((v) => ({
90
+ version: v.version,
91
+ isPrerelease: isPrerelease(v.version),
92
+ publishedAt: v.publishedAt,
93
+ }));
94
+ } catch {
95
+ // Return empty array on any error (network, timeout, parse error, etc.)
96
+ return [];
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Parse a package command to extract package name and version
102
+ * Examples:
103
+ * "@anthropic-ai/claude-code" -> { packageName: "@anthropic-ai/claude-code", version: null }
104
+ * "@anthropic-ai/claude-code@latest" -> { packageName: "@anthropic-ai/claude-code", version: "latest" }
105
+ * "@anthropic-ai/claude-code@1.0.3" -> { packageName: "@anthropic-ai/claude-code", version: "1.0.3" }
106
+ * "opencode-ai@latest" -> { packageName: "opencode-ai", version: "latest" }
107
+ */
108
+ export function parsePackageCommand(command: string): {
109
+ packageName: string;
110
+ version: string | null;
111
+ } {
112
+ // Handle scoped packages (@scope/name@version)
113
+ if (command.startsWith("@")) {
114
+ // Find the second @ which separates version
115
+ const firstSlash = command.indexOf("/");
116
+ if (firstSlash === -1) {
117
+ // Invalid scoped package format
118
+ return { packageName: command, version: null };
119
+ }
120
+ const afterScope = command.substring(firstSlash + 1);
121
+ const atIndex = afterScope.indexOf("@");
122
+ if (atIndex === -1) {
123
+ return { packageName: command, version: null };
124
+ }
125
+ const packageName = command.substring(0, firstSlash + 1 + atIndex);
126
+ const version = afterScope.substring(atIndex + 1);
127
+ return { packageName, version };
128
+ }
129
+
130
+ // Handle non-scoped packages (name@version)
131
+ const atIndex = command.indexOf("@");
132
+ if (atIndex === -1) {
133
+ return { packageName: command, version: null };
134
+ }
135
+ const packageName = command.substring(0, atIndex);
136
+ const version = command.substring(atIndex + 1);
137
+ return { packageName, version };
138
+ }
139
+
140
+ /**
141
+ * Resolve version selection to a bunx-compatible suffix
142
+ * Examples:
143
+ * "installed" -> "" (use bunx default/cached version)
144
+ * "latest" -> "@latest"
145
+ * "1.0.3" -> "@1.0.3"
146
+ * undefined -> "" (use bunx default/cached version)
147
+ */
148
+ export function resolveVersionSuffix(version?: VersionSelection): string {
149
+ if (!version || version === "installed") {
150
+ return "";
151
+ }
152
+ return `@${version}`;
153
+ }
154
+
155
+ export interface GlobalPackageInfo {
156
+ name: string;
157
+ version: string;
158
+ }
159
+
160
+ export interface GlobalPackagesResult {
161
+ path: string | null;
162
+ packages: GlobalPackageInfo[];
163
+ }
164
+
165
+ /**
166
+ * Parse the output of `bun pm ls -g` command
167
+ * Example output:
168
+ * /root/.bun/install/global node_modules (17)
169
+ * ├── @anthropic-ai/claude-code@2.0.76
170
+ * └── @openai/codex@0.77.0
171
+ */
172
+ export function parseGlobalPackagesOutput(
173
+ output: string,
174
+ ): GlobalPackagesResult {
175
+ const lines = output.trim().split("\n");
176
+ if (lines.length === 0 || !lines[0]) {
177
+ return { path: null, packages: [] };
178
+ }
179
+
180
+ // Parse the first line to get the path
181
+ // Format: "/path/to/global node_modules (N)"
182
+ const firstLine = lines[0];
183
+ const pathMatch = firstLine.match(/^(.+?)\s+node_modules\s+\(\d+\)$/);
184
+ const path = pathMatch?.[1] ?? null;
185
+
186
+ // Parse package lines
187
+ const packages: GlobalPackageInfo[] = [];
188
+ for (let i = 1; i < lines.length; i++) {
189
+ const line = lines[i];
190
+ if (!line) continue;
191
+
192
+ // Remove tree characters (├── └── │)
193
+ const cleaned = line.replace(/^[├└│─\s]+/, "").trim();
194
+ if (!cleaned) continue;
195
+
196
+ // Parse package@version format
197
+ // Handle scoped packages like @anthropic-ai/claude-code@2.0.76
198
+ const lastAtIndex = cleaned.lastIndexOf("@");
199
+ if (lastAtIndex <= 0) continue; // No version or invalid format
200
+
201
+ const name = cleaned.substring(0, lastAtIndex);
202
+ const version = cleaned.substring(lastAtIndex + 1);
203
+
204
+ if (name && version) {
205
+ packages.push({ name, version });
206
+ }
207
+ }
208
+
209
+ return { path, packages };
210
+ }
211
+
212
+ export interface InstalledPackageInfo {
213
+ version: string;
214
+ path: string;
215
+ }
216
+
217
+ /**
218
+ * Get information about a globally installed package
219
+ * Returns null if the package is not installed
220
+ */
221
+ export async function getInstalledPackageInfo(
222
+ packageName: string,
223
+ ): Promise<InstalledPackageInfo | null> {
224
+ try {
225
+ const { execa } = await import("execa");
226
+ const result = await execa("bun", ["pm", "ls", "-g"], {
227
+ timeout: 5000,
228
+ reject: false,
229
+ });
230
+
231
+ if (result.exitCode !== 0 || !result.stdout) {
232
+ return null;
233
+ }
234
+
235
+ const parsed = parseGlobalPackagesOutput(result.stdout);
236
+ const pkg = parsed.packages.find((p) => p.name === packageName);
237
+
238
+ if (!pkg || !parsed.path) {
239
+ return null;
240
+ }
241
+
242
+ return {
243
+ version: pkg.version,
244
+ path: `${parsed.path}/node_modules/${packageName}`,
245
+ };
246
+ } catch {
247
+ return null;
248
+ }
249
+ }
@@ -95,7 +95,7 @@ async function runReadlinePrompt<T>(
95
95
  }
96
96
 
97
97
  /**
98
- * Wait for Enter using the same terminal streams as Ink.
98
+ * Wait for Enter using the same terminal streams as the CLI UI.
99
99
  * Falls back to no-op on non-interactive stdin to avoid blocking pipelines.
100
100
  */
101
101
  export async function waitForEnter(promptMessage: string): Promise<void> {
@@ -444,3 +444,31 @@ export function matchesCwd(
444
444
  isPathPrefix(normalizedSession, normalizedTarget)
445
445
  );
446
446
  }
447
+
448
+ /**
449
+ * Resolves a branch name for a session cwd using worktree paths.
450
+ * Picks the worktree with the longest matching path prefix.
451
+ */
452
+ export function resolveBranchFromCwd(
453
+ sessionCwd: string | null,
454
+ worktrees: { path: string; branch: string }[],
455
+ ): string | null {
456
+ if (!sessionCwd) return null;
457
+ const normalizedSession = normalizePath(sessionCwd);
458
+ let bestMatch: { branch: string; path: string } | null = null;
459
+
460
+ for (const worktree of worktrees) {
461
+ if (!worktree?.path || !worktree.branch) continue;
462
+ const normalizedPath = normalizePath(worktree.path);
463
+ if (
464
+ normalizedSession === normalizedPath ||
465
+ isPathPrefix(normalizedPath, normalizedSession)
466
+ ) {
467
+ if (!bestMatch || normalizedPath.length > bestMatch.path.length) {
468
+ bestMatch = { branch: worktree.branch, path: normalizedPath };
469
+ }
470
+ }
471
+ }
472
+
473
+ return bestMatch?.branch ?? null;
474
+ }
@@ -16,6 +16,7 @@ import {
16
16
  readFileContent,
17
17
  checkFileStat,
18
18
  } from "../common.js";
19
+ import { listAllWorktrees } from "../../../worktree.js";
19
20
 
20
21
  /**
21
22
  * Encodes a project path for Claude's directory structure.
@@ -75,36 +76,72 @@ function getClaudeRootCandidates(): string[] {
75
76
  * 3. ~/.claude/history.jsonl (global history fallback)
76
77
  *
77
78
  * @param cwd - The working directory to find sessions for
78
- * @param options - Search options (since, until, preferClosestTo, windowMs)
79
+ * @param options - Search options (since, until, preferClosestTo, windowMs, branch/worktrees)
79
80
  * @returns Session info with ID and modification time, or null if not found
80
81
  */
81
82
  export async function findLatestClaudeSession(
82
83
  cwd: string,
83
- options: Omit<SessionSearchOptions, "cwd"> = {},
84
+ options: SessionSearchOptions = {},
84
85
  ): Promise<ClaudeSessionInfo | null> {
85
86
  const rootCandidates = getClaudeRootCandidates();
86
- const encodedPaths = generateClaudeProjectPathCandidates(cwd);
87
-
88
- for (const claudeRoot of rootCandidates) {
89
- for (const encoded of encodedPaths) {
90
- const projectDir = path.join(claudeRoot, "projects", encoded);
91
- const sessionsDir = path.join(projectDir, "sessions");
92
-
93
- // 1) Look under sessions/ (official location)
94
- const session = await findNewestSessionIdFromDir(
95
- sessionsDir,
96
- false,
97
- options,
98
- );
99
- if (session) return session;
87
+ const branchFilter =
88
+ typeof options.branch === "string" && options.branch.trim().length > 0
89
+ ? options.branch.trim()
90
+ : null;
100
91
 
101
- // 2) Look directly under project dir and subdirs
102
- const rootSession = await findNewestSessionIdFromDir(
103
- projectDir,
104
- true,
105
- options,
106
- );
107
- if (rootSession) return rootSession;
92
+ let cwdCandidates: string[] = [];
93
+ if (branchFilter) {
94
+ let worktrees: { path: string; branch: string }[] = [];
95
+ if (Array.isArray(options.worktrees) && options.worktrees.length > 0) {
96
+ worktrees = options.worktrees
97
+ .filter((entry) => entry?.path && entry?.branch)
98
+ .map((entry) => ({ path: entry.path, branch: entry.branch }));
99
+ } else {
100
+ try {
101
+ const allWorktrees = await listAllWorktrees();
102
+ worktrees = allWorktrees
103
+ .filter((entry) => entry?.path && entry?.branch)
104
+ .map((entry) => ({ path: entry.path, branch: entry.branch }));
105
+ } catch {
106
+ worktrees = [];
107
+ }
108
+ }
109
+ const matches = worktrees
110
+ .filter((entry) => entry.branch === branchFilter)
111
+ .map((entry) => entry.path);
112
+ if (!matches.length) return null;
113
+ cwdCandidates = matches;
114
+ } else {
115
+ const baseCwd = options.cwd ?? cwd;
116
+ if (!baseCwd) return null;
117
+ cwdCandidates = [baseCwd];
118
+ }
119
+
120
+ const uniqueCwds = Array.from(new Set(cwdCandidates));
121
+
122
+ for (const candidateCwd of uniqueCwds) {
123
+ const encodedPaths = generateClaudeProjectPathCandidates(candidateCwd);
124
+ for (const claudeRoot of rootCandidates) {
125
+ for (const encoded of encodedPaths) {
126
+ const projectDir = path.join(claudeRoot, "projects", encoded);
127
+ const sessionsDir = path.join(projectDir, "sessions");
128
+
129
+ // 1) Look under sessions/ (official location)
130
+ const session = await findNewestSessionIdFromDir(
131
+ sessionsDir,
132
+ false,
133
+ options,
134
+ );
135
+ if (session) return session;
136
+
137
+ // 2) Look directly under project dir and subdirs
138
+ const rootSession = await findNewestSessionIdFromDir(
139
+ projectDir,
140
+ true,
141
+ options,
142
+ );
143
+ if (rootSession) return rootSession;
144
+ }
108
145
  }
109
146
  }
110
147
 
@@ -124,7 +161,10 @@ export async function findLatestClaudeSession(
124
161
  typeof parsed.project === "string" ? parsed.project : null;
125
162
  const sessionId =
126
163
  typeof parsed.sessionId === "string" ? parsed.sessionId : null;
127
- if (project && sessionId && matchesCwd(project, cwd)) {
164
+ const matchesProject = uniqueCwds.some((candidate) =>
165
+ matchesCwd(project, candidate),
166
+ );
167
+ if (project && sessionId && matchesProject) {
128
168
  return { id: sessionId, mtime: historyStat.mtimeMs };
129
169
  }
130
170
  } catch {
@@ -141,14 +181,14 @@ export async function findLatestClaudeSession(
141
181
  /**
142
182
  * Finds the latest Claude session ID for a given working directory.
143
183
  * @param cwd - The working directory to find sessions for
144
- * @param options - Search options (since, until, preferClosestTo, windowMs)
184
+ * @param options - Search options (since, until, preferClosestTo, windowMs, branch/worktrees)
145
185
  * @returns Session ID string or null if not found
146
186
  */
147
187
  export async function findLatestClaudeSessionId(
148
188
  cwd: string,
149
- options: Omit<SessionSearchOptions, "cwd"> = {},
189
+ options: SessionSearchOptions = {},
150
190
  ): Promise<string | null> {
151
- const found = await findLatestClaudeSession(cwd, options);
191
+ const found = await findLatestClaudeSession(options.cwd ?? cwd, options);
152
192
  return found?.id ?? null;
153
193
  }
154
194
 
@@ -167,6 +207,9 @@ export async function waitForClaudeSessionId(
167
207
  until?: number;
168
208
  preferClosestTo?: number;
169
209
  windowMs?: number;
210
+ branch?: string | null;
211
+ worktrees?: { path: string; branch: string }[] | null;
212
+ cwd?: string | null;
170
213
  } = {},
171
214
  ): Promise<string | null> {
172
215
  const timeoutMs = options.timeoutMs ?? 120_000;
@@ -174,15 +217,22 @@ export async function waitForClaudeSessionId(
174
217
  const deadline = Date.now() + timeoutMs;
175
218
 
176
219
  // Build search options once outside the loop
177
- const searchOptions: Omit<SessionSearchOptions, "cwd"> = {};
220
+ const searchOptions: SessionSearchOptions = {};
178
221
  if (options.since !== undefined) searchOptions.since = options.since;
179
222
  if (options.until !== undefined) searchOptions.until = options.until;
180
223
  if (options.preferClosestTo !== undefined)
181
224
  searchOptions.preferClosestTo = options.preferClosestTo;
182
225
  if (options.windowMs !== undefined) searchOptions.windowMs = options.windowMs;
226
+ if (options.branch !== undefined) searchOptions.branch = options.branch;
227
+ if (options.worktrees !== undefined)
228
+ searchOptions.worktrees = options.worktrees;
229
+ if (options.cwd !== undefined) searchOptions.cwd = options.cwd;
183
230
 
184
231
  while (Date.now() < deadline) {
185
- const found = await findLatestClaudeSession(cwd, searchOptions);
232
+ const found = await findLatestClaudeSession(
233
+ options.cwd ?? cwd,
234
+ searchOptions,
235
+ );
186
236
  if (found?.id) return found.id;
187
237
  await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
188
238
  }
@@ -14,8 +14,10 @@ import {
14
14
  UUID_REGEX,
15
15
  collectFilesIterative,
16
16
  matchesCwd,
17
+ resolveBranchFromCwd,
17
18
  readSessionInfoFromFile,
18
19
  } from "../common.js";
20
+ import { listAllWorktrees } from "../../../worktree.js";
19
21
 
20
22
  /**
21
23
  * Finds the latest Codex session with optional time filtering and cwd matching.
@@ -63,32 +65,62 @@ export async function findLatestCodexSession(
63
65
  return b.mtime - a.mtime;
64
66
  });
65
67
 
68
+ const branchFilter =
69
+ typeof options.branch === "string" && options.branch.trim().length > 0
70
+ ? options.branch.trim()
71
+ : null;
72
+ const shouldCheckBranch = Boolean(branchFilter);
73
+ const shouldCheckCwd = Boolean(options.cwd) && !shouldCheckBranch;
74
+
75
+ let worktrees: { path: string; branch: string }[] = [];
76
+ if (shouldCheckBranch) {
77
+ if (Array.isArray(options.worktrees) && options.worktrees.length > 0) {
78
+ worktrees = options.worktrees
79
+ .filter((entry) => entry?.path && entry?.branch)
80
+ .map((entry) => ({ path: entry.path, branch: entry.branch }));
81
+ } else {
82
+ try {
83
+ const allWorktrees = await listAllWorktrees();
84
+ worktrees = allWorktrees
85
+ .filter((entry) => entry?.path && entry?.branch)
86
+ .map((entry) => ({ path: entry.path, branch: entry.branch }));
87
+ } catch {
88
+ worktrees = [];
89
+ }
90
+ }
91
+ if (!worktrees.length) return null;
92
+ }
93
+
66
94
  for (const file of ordered) {
67
95
  // Priority 1: Extract session ID from filename (most reliable for Codex)
68
96
  const filenameMatch = path.basename(file.fullPath).match(UUID_REGEX);
69
- if (filenameMatch) {
70
- const sessionId = filenameMatch[0];
71
- // If cwd filtering is needed, read file content to check cwd
72
- if (options.cwd) {
73
- const info = await readSessionInfoFromFile(file.fullPath);
74
- if (matchesCwd(info.cwd, options.cwd)) {
75
- return { id: sessionId, mtime: file.mtime };
76
- }
77
- continue; // cwd doesn't match, try next file
97
+ const idFromName = filenameMatch?.[0] ?? null;
98
+ const needsInfo = shouldCheckBranch || shouldCheckCwd || !idFromName;
99
+ const info = needsInfo
100
+ ? await readSessionInfoFromFile(file.fullPath)
101
+ : null;
102
+ const sessionCwd = info?.cwd ?? null;
103
+
104
+ if (shouldCheckBranch) {
105
+ const resolvedBranch = resolveBranchFromCwd(sessionCwd, worktrees);
106
+ if (resolvedBranch !== branchFilter) {
107
+ continue;
78
108
  }
79
- return { id: sessionId, mtime: file.mtime };
80
109
  }
81
110
 
82
- // Priority 2: Fallback to reading file content if filename lacks UUID
83
- const info = await readSessionInfoFromFile(file.fullPath);
84
- if (!info.id) continue;
85
- if (options.cwd) {
86
- if (matchesCwd(info.cwd, options.cwd)) {
87
- return { id: info.id, mtime: file.mtime };
111
+ if (shouldCheckCwd && options.cwd) {
112
+ if (!matchesCwd(sessionCwd, options.cwd)) {
113
+ continue;
88
114
  }
89
- continue;
90
115
  }
91
- return { id: info.id, mtime: file.mtime };
116
+
117
+ const sessionId = idFromName ?? info?.id ?? null;
118
+ if (sessionId) {
119
+ return { id: sessionId, mtime: file.mtime };
120
+ }
121
+
122
+ // Priority 2: Fallback to reading file content if filename lacks UUID
123
+ // (already handled via info above)
92
124
  }
93
125
 
94
126
  return null;
@@ -12,8 +12,10 @@ import type { GeminiSessionInfo, SessionSearchOptions } from "../types.js";
12
12
  import {
13
13
  collectFilesIterative,
14
14
  matchesCwd,
15
+ resolveBranchFromCwd,
15
16
  readSessionInfoFromFile,
16
17
  } from "../common.js";
18
+ import { listAllWorktrees } from "../../../worktree.js";
17
19
 
18
20
  /**
19
21
  * Finds the latest Gemini session with optional time filtering and cwd matching.
@@ -57,15 +59,50 @@ export async function findLatestGeminiSession(
57
59
  return b.mtime - a.mtime;
58
60
  });
59
61
 
62
+ const branchFilter =
63
+ typeof options.branch === "string" && options.branch.trim().length > 0
64
+ ? options.branch.trim()
65
+ : null;
66
+ const shouldCheckBranch = Boolean(branchFilter);
67
+ const shouldCheckCwd = Boolean(options.cwd) && !shouldCheckBranch;
68
+
69
+ let worktrees: { path: string; branch: string }[] = [];
70
+ if (shouldCheckBranch) {
71
+ if (Array.isArray(options.worktrees) && options.worktrees.length > 0) {
72
+ worktrees = options.worktrees
73
+ .filter((entry) => entry?.path && entry?.branch)
74
+ .map((entry) => ({ path: entry.path, branch: entry.branch }));
75
+ } else {
76
+ try {
77
+ const allWorktrees = await listAllWorktrees();
78
+ worktrees = allWorktrees
79
+ .filter((entry) => entry?.path && entry?.branch)
80
+ .map((entry) => ({ path: entry.path, branch: entry.branch }));
81
+ } catch {
82
+ worktrees = [];
83
+ }
84
+ }
85
+ if (!worktrees.length) return null;
86
+ }
87
+
60
88
  for (const file of pool) {
61
89
  const info = await readSessionInfoFromFile(file.fullPath);
62
90
  if (!info.id) continue;
63
- if (options.cwd) {
64
- if (matchesCwd(info.cwd, options.cwd)) {
65
- return { id: info.id, mtime: file.mtime };
91
+ const sessionCwd = info.cwd ?? null;
92
+
93
+ if (shouldCheckBranch) {
94
+ const resolvedBranch = resolveBranchFromCwd(sessionCwd, worktrees);
95
+ if (resolvedBranch !== branchFilter) {
96
+ continue;
66
97
  }
67
- continue;
68
98
  }
99
+
100
+ if (shouldCheckCwd && options.cwd) {
101
+ if (!matchesCwd(sessionCwd, options.cwd)) {
102
+ continue;
103
+ }
104
+ }
105
+
69
106
  return { id: info.id, mtime: file.mtime };
70
107
  }
71
108
 
@@ -82,7 +119,11 @@ export async function findLatestGeminiSessionId(
82
119
  cwd: string,
83
120
  options: SessionSearchOptions = {},
84
121
  ): Promise<string | null> {
85
- const searchOptions: SessionSearchOptions = { cwd: options.cwd ?? cwd };
122
+ const searchOptions: SessionSearchOptions = {
123
+ cwd: options.cwd ?? cwd,
124
+ branch: options.branch ?? null,
125
+ worktrees: options.worktrees ?? null,
126
+ };
86
127
  if (options.since !== undefined) searchOptions.since = options.since;
87
128
  if (options.until !== undefined) searchOptions.until = options.until;
88
129
  if (options.preferClosestTo !== undefined)