@akiojin/gwt 4.9.1 → 4.11.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (605) hide show
  1. package/README.ja.md +4 -4
  2. package/README.md +4 -4
  3. package/dist/claude.d.ts +1 -0
  4. package/dist/claude.d.ts.map +1 -1
  5. package/dist/claude.js +52 -49
  6. package/dist/claude.js.map +1 -1
  7. package/dist/cli/ui/App.solid.d.ts +29 -0
  8. package/dist/cli/ui/App.solid.d.ts.map +1 -0
  9. package/dist/cli/ui/App.solid.js +1197 -0
  10. package/dist/cli/ui/App.solid.js.map +1 -0
  11. package/dist/cli/ui/components/solid/Footer.d.ts +10 -0
  12. package/dist/cli/ui/components/solid/Footer.d.ts.map +1 -0
  13. package/dist/cli/ui/components/solid/Footer.js +10 -0
  14. package/dist/cli/ui/components/solid/Footer.js.map +1 -0
  15. package/dist/cli/ui/components/{parts → solid}/Header.d.ts +1 -6
  16. package/dist/cli/ui/components/solid/Header.d.ts.map +1 -0
  17. package/dist/cli/ui/components/solid/Header.js +13 -0
  18. package/dist/cli/ui/components/solid/Header.js.map +1 -0
  19. package/dist/cli/ui/components/solid/HelpOverlay.d.ts +8 -0
  20. package/dist/cli/ui/components/solid/HelpOverlay.d.ts.map +1 -0
  21. package/dist/cli/ui/components/solid/HelpOverlay.js +118 -0
  22. package/dist/cli/ui/components/solid/HelpOverlay.js.map +1 -0
  23. package/dist/cli/ui/components/solid/QuickStartStep.d.ts +17 -0
  24. package/dist/cli/ui/components/solid/QuickStartStep.d.ts.map +1 -0
  25. package/dist/cli/ui/components/solid/QuickStartStep.js +139 -0
  26. package/dist/cli/ui/components/solid/QuickStartStep.js.map +1 -0
  27. package/dist/cli/ui/components/solid/SelectInput.d.ts +22 -0
  28. package/dist/cli/ui/components/solid/SelectInput.d.ts.map +1 -0
  29. package/dist/cli/ui/components/solid/SelectInput.js +44 -0
  30. package/dist/cli/ui/components/solid/SelectInput.js.map +1 -0
  31. package/dist/cli/ui/components/solid/TextInput.d.ts +12 -0
  32. package/dist/cli/ui/components/solid/TextInput.d.ts.map +1 -0
  33. package/dist/cli/ui/components/solid/TextInput.js +9 -0
  34. package/dist/cli/ui/components/solid/TextInput.js.map +1 -0
  35. package/dist/cli/ui/components/solid/WizardController.d.ts +34 -0
  36. package/dist/cli/ui/components/solid/WizardController.d.ts.map +1 -0
  37. package/dist/cli/ui/components/solid/WizardController.js +215 -0
  38. package/dist/cli/ui/components/solid/WizardController.js.map +1 -0
  39. package/dist/cli/ui/components/solid/WizardPopup.d.ts +26 -0
  40. package/dist/cli/ui/components/solid/WizardPopup.d.ts.map +1 -0
  41. package/dist/cli/ui/components/solid/WizardPopup.js +68 -0
  42. package/dist/cli/ui/components/solid/WizardPopup.js.map +1 -0
  43. package/dist/cli/ui/components/solid/WizardSteps.d.ts +52 -0
  44. package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +1 -0
  45. package/dist/cli/ui/components/solid/WizardSteps.js +462 -0
  46. package/dist/cli/ui/components/solid/WizardSteps.js.map +1 -0
  47. package/dist/cli/ui/core/index.d.ts +12 -0
  48. package/dist/cli/ui/core/index.d.ts.map +1 -0
  49. package/dist/cli/ui/core/index.js +15 -0
  50. package/dist/cli/ui/core/index.js.map +1 -0
  51. package/dist/cli/ui/core/keybindings.d.ts +106 -0
  52. package/dist/cli/ui/core/keybindings.d.ts.map +1 -0
  53. package/dist/cli/ui/core/keybindings.js +270 -0
  54. package/dist/cli/ui/core/keybindings.js.map +1 -0
  55. package/dist/cli/ui/core/theme.d.ts +114 -0
  56. package/dist/cli/ui/core/theme.d.ts.map +1 -0
  57. package/dist/cli/ui/core/theme.js +170 -0
  58. package/dist/cli/ui/core/theme.js.map +1 -0
  59. package/dist/cli/ui/core/types.d.ts +156 -0
  60. package/dist/cli/ui/core/types.d.ts.map +1 -0
  61. package/dist/cli/ui/core/types.js +10 -0
  62. package/dist/cli/ui/core/types.js.map +1 -0
  63. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts +26 -0
  64. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts.map +1 -0
  65. package/dist/cli/ui/hooks/solid/useScrollableList.js +89 -0
  66. package/dist/cli/ui/hooks/solid/useScrollableList.js.map +1 -0
  67. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts +10 -0
  68. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts.map +1 -0
  69. package/dist/cli/ui/hooks/solid/useTerminalSize.js +16 -0
  70. package/dist/cli/ui/hooks/solid/useTerminalSize.js.map +1 -0
  71. package/dist/cli/ui/index.solid.d.ts +5 -0
  72. package/dist/cli/ui/index.solid.d.ts.map +1 -0
  73. package/dist/cli/ui/index.solid.js +21 -0
  74. package/dist/cli/ui/index.solid.js.map +1 -0
  75. package/dist/cli/ui/{components/screens → screens/solid}/BranchListScreen.d.ts +8 -22
  76. package/dist/cli/ui/screens/solid/BranchListScreen.d.ts.map +1 -0
  77. package/dist/cli/ui/screens/solid/BranchListScreen.js +756 -0
  78. package/dist/cli/ui/screens/solid/BranchListScreen.js.map +1 -0
  79. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts +10 -0
  80. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts.map +1 -0
  81. package/dist/cli/ui/screens/solid/ConfirmScreen.js +37 -0
  82. package/dist/cli/ui/screens/solid/ConfirmScreen.js.map +1 -0
  83. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts +14 -0
  84. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts.map +1 -0
  85. package/dist/cli/ui/screens/solid/EnvironmentScreen.js +91 -0
  86. package/dist/cli/ui/screens/solid/EnvironmentScreen.js.map +1 -0
  87. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts +8 -0
  88. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts.map +1 -0
  89. package/dist/cli/ui/screens/solid/ErrorScreen.js +18 -0
  90. package/dist/cli/ui/screens/solid/ErrorScreen.js.map +1 -0
  91. package/dist/cli/ui/screens/solid/InputScreen.d.ts +13 -0
  92. package/dist/cli/ui/screens/solid/InputScreen.d.ts.map +1 -0
  93. package/dist/cli/ui/screens/solid/InputScreen.js +17 -0
  94. package/dist/cli/ui/screens/solid/InputScreen.js.map +1 -0
  95. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts +9 -0
  96. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts.map +1 -0
  97. package/dist/cli/ui/screens/solid/LoadingIndicator.js +43 -0
  98. package/dist/cli/ui/screens/solid/LoadingIndicator.js.map +1 -0
  99. package/dist/cli/ui/{components/screens → screens/solid}/LogDetailScreen.d.ts +2 -2
  100. package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts.map +1 -0
  101. package/dist/cli/ui/screens/solid/LogDetailScreen.js +34 -0
  102. package/dist/cli/ui/screens/solid/LogDetailScreen.js.map +1 -0
  103. package/dist/cli/ui/{components/screens/LogListScreen.d.ts → screens/solid/LogScreen.d.ts} +4 -4
  104. package/dist/cli/ui/screens/solid/LogScreen.d.ts.map +1 -0
  105. package/dist/cli/ui/screens/solid/LogScreen.js +95 -0
  106. package/dist/cli/ui/screens/solid/LogScreen.js.map +1 -0
  107. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts +17 -0
  108. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts.map +1 -0
  109. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js +112 -0
  110. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js.map +1 -0
  111. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts +17 -0
  112. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts.map +1 -0
  113. package/dist/cli/ui/screens/solid/ProfileScreen.js +50 -0
  114. package/dist/cli/ui/screens/solid/ProfileScreen.js.map +1 -0
  115. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts +20 -0
  116. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts.map +1 -0
  117. package/dist/cli/ui/screens/solid/SelectorScreen.js +90 -0
  118. package/dist/cli/ui/screens/solid/SelectorScreen.js.map +1 -0
  119. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts +13 -0
  120. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts.map +1 -0
  121. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js +59 -0
  122. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js.map +1 -0
  123. package/dist/cli/ui/stores/appStore.d.ts +143 -0
  124. package/dist/cli/ui/stores/appStore.d.ts.map +1 -0
  125. package/dist/cli/ui/stores/appStore.js +158 -0
  126. package/dist/cli/ui/stores/appStore.js.map +1 -0
  127. package/dist/cli/ui/stores/branchStore.d.ts +159 -0
  128. package/dist/cli/ui/stores/branchStore.d.ts.map +1 -0
  129. package/dist/cli/ui/stores/branchStore.js +275 -0
  130. package/dist/cli/ui/stores/branchStore.js.map +1 -0
  131. package/dist/cli/ui/stores/index.d.ts +11 -0
  132. package/dist/cli/ui/stores/index.d.ts.map +1 -0
  133. package/dist/cli/ui/stores/index.js +14 -0
  134. package/dist/cli/ui/stores/index.js.map +1 -0
  135. package/dist/cli/ui/stores/uiStore.d.ts +146 -0
  136. package/dist/cli/ui/stores/uiStore.d.ts.map +1 -0
  137. package/dist/cli/ui/stores/uiStore.js +166 -0
  138. package/dist/cli/ui/stores/uiStore.js.map +1 -0
  139. package/dist/cli/ui/types.d.ts +16 -1
  140. package/dist/cli/ui/types.d.ts.map +1 -1
  141. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
  142. package/dist/cli/ui/utils/branchFormatter.js +7 -210
  143. package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
  144. package/dist/cli/ui/utils/continueSession.d.ts +4 -0
  145. package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
  146. package/dist/cli/ui/utils/continueSession.js +30 -0
  147. package/dist/cli/ui/utils/continueSession.js.map +1 -1
  148. package/dist/client/assets/{index-ChHC-Puh.css → index-BbfV7Wuj.css} +1 -1
  149. package/dist/client/assets/index-CoAyq5x1.js +78 -0
  150. package/dist/client/index.html +2 -2
  151. package/dist/codex.d.ts +1 -0
  152. package/dist/codex.d.ts.map +1 -1
  153. package/dist/codex.js +86 -45
  154. package/dist/codex.js.map +1 -1
  155. package/dist/config/builtin-coding-agents.d.ts +4 -0
  156. package/dist/config/builtin-coding-agents.d.ts.map +1 -1
  157. package/dist/config/builtin-coding-agents.js +18 -3
  158. package/dist/config/builtin-coding-agents.js.map +1 -1
  159. package/dist/config/index.d.ts +2 -0
  160. package/dist/config/index.d.ts.map +1 -1
  161. package/dist/config/index.js +2 -0
  162. package/dist/config/index.js.map +1 -1
  163. package/dist/config/tools.d.ts.map +1 -1
  164. package/dist/config/tools.js +11 -0
  165. package/dist/config/tools.js.map +1 -1
  166. package/dist/gemini.d.ts +1 -0
  167. package/dist/gemini.d.ts.map +1 -1
  168. package/dist/gemini.js +42 -37
  169. package/dist/gemini.js.map +1 -1
  170. package/dist/index.d.ts +1 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +122 -102
  173. package/dist/index.js.map +1 -1
  174. package/dist/launcher.d.ts.map +1 -1
  175. package/dist/launcher.js +18 -3
  176. package/dist/launcher.js.map +1 -1
  177. package/dist/logging/logger.d.ts.map +1 -1
  178. package/dist/logging/logger.js +26 -9
  179. package/dist/logging/logger.js.map +1 -1
  180. package/dist/opentui/highlights-eq9cgrbb.scm +604 -0
  181. package/dist/opentui/highlights-ghv9g403.scm +205 -0
  182. package/dist/opentui/highlights-hk7bwhj4.scm +284 -0
  183. package/dist/opentui/highlights-r812a2qc.scm +150 -0
  184. package/dist/opentui/highlights-x6tmsnaa.scm +115 -0
  185. package/dist/opentui/index.solid.d.ts +2 -0
  186. package/dist/opentui/index.solid.d.ts.map +1 -0
  187. package/dist/opentui/index.solid.js +52034 -0
  188. package/dist/opentui/index.solid.js.map +1 -0
  189. package/dist/opentui/injections-73j83es3.scm +27 -0
  190. package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  191. package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
  192. package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  193. package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  194. package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
  195. package/dist/repositories/worktree.repository.d.ts +1 -0
  196. package/dist/repositories/worktree.repository.d.ts.map +1 -1
  197. package/dist/repositories/worktree.repository.js +7 -0
  198. package/dist/repositories/worktree.repository.js.map +1 -1
  199. package/dist/services/codingAgentResolver.d.ts +2 -0
  200. package/dist/services/codingAgentResolver.d.ts.map +1 -1
  201. package/dist/services/codingAgentResolver.js +30 -4
  202. package/dist/services/codingAgentResolver.js.map +1 -1
  203. package/dist/services/dependency-installer.d.ts.map +1 -1
  204. package/dist/services/dependency-installer.js +0 -5
  205. package/dist/services/dependency-installer.js.map +1 -1
  206. package/dist/types/api.d.ts +3 -0
  207. package/dist/types/api.d.ts.map +1 -1
  208. package/dist/types/coding-agent.d.ts +62 -0
  209. package/dist/types/coding-agent.d.ts.map +1 -0
  210. package/dist/types/coding-agent.js +29 -0
  211. package/dist/types/coding-agent.js.map +1 -0
  212. package/dist/types/tools.d.ts +17 -0
  213. package/dist/types/tools.d.ts.map +1 -1
  214. package/dist/utils/coding-agent-colors.d.ts +88 -0
  215. package/dist/utils/coding-agent-colors.d.ts.map +1 -0
  216. package/dist/utils/coding-agent-colors.js +137 -0
  217. package/dist/utils/coding-agent-colors.js.map +1 -0
  218. package/dist/utils/command.d.ts +1 -1
  219. package/dist/utils/command.d.ts.map +1 -1
  220. package/dist/utils/command.js +10 -1
  221. package/dist/utils/command.js.map +1 -1
  222. package/dist/utils/error-utils.d.ts +27 -0
  223. package/dist/utils/error-utils.d.ts.map +1 -0
  224. package/dist/utils/error-utils.js +98 -0
  225. package/dist/utils/error-utils.js.map +1 -0
  226. package/dist/utils/npmRegistry.d.ts +61 -0
  227. package/dist/utils/npmRegistry.d.ts.map +1 -0
  228. package/dist/utils/npmRegistry.js +180 -0
  229. package/dist/utils/npmRegistry.js.map +1 -0
  230. package/dist/utils/prompt.d.ts +1 -1
  231. package/dist/utils/prompt.js +1 -1
  232. package/dist/utils/session/index.d.ts +5 -3
  233. package/dist/utils/session/index.d.ts.map +1 -1
  234. package/dist/utils/session/index.js +5 -2
  235. package/dist/utils/session/index.js.map +1 -1
  236. package/dist/utils/session/parsers/codex.d.ts.map +1 -1
  237. package/dist/utils/session/parsers/codex.js +8 -1
  238. package/dist/utils/session/parsers/codex.js.map +1 -1
  239. package/dist/utils/session/parsers/index.d.ts +1 -0
  240. package/dist/utils/session/parsers/index.d.ts.map +1 -1
  241. package/dist/utils/session/parsers/index.js +2 -0
  242. package/dist/utils/session/parsers/index.js.map +1 -1
  243. package/dist/utils/session/parsers/opencode.d.ts +23 -0
  244. package/dist/utils/session/parsers/opencode.d.ts.map +1 -0
  245. package/dist/utils/session/parsers/opencode.js +89 -0
  246. package/dist/utils/session/parsers/opencode.js.map +1 -0
  247. package/dist/utils/session/types.d.ts +4 -0
  248. package/dist/utils/session/types.d.ts.map +1 -1
  249. package/dist/utils/terminal.d.ts +1 -0
  250. package/dist/utils/terminal.d.ts.map +1 -1
  251. package/dist/utils/terminal.js +20 -0
  252. package/dist/utils/terminal.js.map +1 -1
  253. package/dist/utils.d.ts +9 -0
  254. package/dist/utils.d.ts.map +1 -1
  255. package/dist/utils.js +33 -2
  256. package/dist/utils.js.map +1 -1
  257. package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +1 -1
  258. package/dist/web/client/src/components/CodingAgentLaunchModal.js +7 -16
  259. package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +1 -1
  260. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
  261. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +7 -2
  262. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
  263. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -1
  264. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +2 -1
  265. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -1
  266. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +2 -2
  267. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -1
  268. package/dist/web/client/src/components/branch-detail/ToolLauncher.js +5 -5
  269. package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -1
  270. package/dist/web/client/src/lib/coding-agent-colors.d.ts +86 -0
  271. package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +1 -0
  272. package/dist/web/client/src/lib/coding-agent-colors.js +135 -0
  273. package/dist/web/client/src/lib/coding-agent-colors.js.map +1 -0
  274. package/dist/web/client/src/pages/BranchDetailPage.js +10 -10
  275. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
  276. package/dist/web/server/pty/manager.d.ts +2 -0
  277. package/dist/web/server/pty/manager.d.ts.map +1 -1
  278. package/dist/web/server/pty/manager.js +104 -0
  279. package/dist/web/server/pty/manager.js.map +1 -1
  280. package/dist/web/server/routes/sessions.d.ts.map +1 -1
  281. package/dist/web/server/routes/sessions.js +5 -1
  282. package/dist/web/server/routes/sessions.js.map +1 -1
  283. package/dist/web/server/services/branches.d.ts.map +1 -1
  284. package/dist/web/server/services/branches.js +10 -8
  285. package/dist/web/server/services/branches.js.map +1 -1
  286. package/dist/web/server/services/worktrees.js +2 -2
  287. package/dist/web/server/services/worktrees.js.map +1 -1
  288. package/dist/worktree.d.ts +47 -1
  289. package/dist/worktree.d.ts.map +1 -1
  290. package/dist/worktree.js +280 -94
  291. package/dist/worktree.js.map +1 -1
  292. package/package.json +12 -14
  293. package/src/claude.ts +68 -70
  294. package/src/cli/ui/App.solid.tsx +1823 -0
  295. package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +255 -0
  296. package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +243 -0
  297. package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +237 -0
  298. package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +231 -0
  299. package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +238 -0
  300. package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +7 -289
  301. package/src/cli/ui/__tests__/utils/clipboard.test.ts +3 -3
  302. package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +1 -1
  303. package/src/cli/ui/components/solid/Footer.tsx +36 -0
  304. package/src/cli/ui/components/{parts → solid}/Header.tsx +17 -28
  305. package/src/cli/ui/components/solid/HelpOverlay.tsx +194 -0
  306. package/src/cli/ui/components/solid/QuickStartStep.tsx +197 -0
  307. package/src/cli/ui/components/{parts → solid}/ScrollableList.tsx +7 -8
  308. package/src/cli/ui/components/solid/SearchInput.tsx +42 -0
  309. package/src/cli/ui/components/solid/SelectInput.tsx +84 -0
  310. package/src/cli/ui/components/solid/Stats.tsx +92 -0
  311. package/src/cli/ui/components/solid/TextInput.tsx +49 -0
  312. package/src/cli/ui/components/solid/WizardController.tsx +384 -0
  313. package/src/cli/ui/components/solid/WizardPopup.tsx +135 -0
  314. package/src/cli/ui/components/solid/WizardSteps.tsx +793 -0
  315. package/src/cli/ui/core/index.ts +17 -0
  316. package/src/cli/ui/core/keybindings.ts +367 -0
  317. package/src/cli/ui/core/theme.ts +234 -0
  318. package/src/cli/ui/core/types.ts +235 -0
  319. package/src/cli/ui/hooks/solid/useAsyncOperation.ts +76 -0
  320. package/src/cli/ui/hooks/solid/useFilter.ts +86 -0
  321. package/src/cli/ui/hooks/solid/useGitOperations.ts +80 -0
  322. package/src/cli/ui/hooks/solid/useKeyHandler.ts +103 -0
  323. package/src/cli/ui/hooks/solid/useScrollableList.ts +149 -0
  324. package/src/cli/ui/hooks/solid/useSelection.ts +77 -0
  325. package/src/cli/ui/hooks/solid/useTerminalSize.ts +22 -0
  326. package/src/cli/ui/index.solid.ts +28 -0
  327. package/src/cli/ui/screens/solid/BranchListScreen.tsx +1050 -0
  328. package/src/cli/ui/screens/solid/ConfirmScreen.tsx +74 -0
  329. package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +159 -0
  330. package/src/cli/ui/screens/solid/ErrorScreen.tsx +42 -0
  331. package/src/cli/ui/screens/solid/InputScreen.tsx +55 -0
  332. package/src/cli/ui/screens/solid/LoadingIndicator.tsx +77 -0
  333. package/src/cli/ui/screens/solid/LogDetailScreen.tsx +75 -0
  334. package/src/cli/ui/screens/solid/LogScreen.tsx +175 -0
  335. package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +192 -0
  336. package/src/cli/ui/screens/solid/ProfileScreen.tsx +98 -0
  337. package/src/cli/ui/screens/solid/SelectorScreen.tsx +170 -0
  338. package/src/cli/ui/screens/solid/SettingsScreen.tsx +50 -0
  339. package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +136 -0
  340. package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +40 -0
  341. package/src/cli/ui/stores/appStore.ts +208 -0
  342. package/src/cli/ui/stores/branchStore.ts +357 -0
  343. package/src/cli/ui/stores/index.ts +31 -0
  344. package/src/cli/ui/stores/uiStore.ts +226 -0
  345. package/src/cli/ui/types.ts +20 -3
  346. package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +180 -0
  347. package/src/cli/ui/utils/branchFormatter.ts +8 -215
  348. package/src/cli/ui/utils/continueSession.ts +44 -0
  349. package/src/cli/ui/utils/modelOptions.test.ts +1 -1
  350. package/src/codex.ts +100 -43
  351. package/src/config/__tests__/saveSession.test.ts +143 -0
  352. package/src/config/builtin-coding-agents.ts +19 -3
  353. package/src/config/index.ts +4 -0
  354. package/src/config/tools.ts +16 -0
  355. package/src/gemini.ts +58 -43
  356. package/src/index.test.ts +12 -12
  357. package/src/index.ts +164 -142
  358. package/src/launcher.ts +22 -3
  359. package/src/logging/logger.ts +32 -10
  360. package/src/opentui/index.solid.ts +1 -0
  361. package/src/repositories/worktree.repository.ts +8 -0
  362. package/src/services/__tests__/BatchMergeService.test.ts +62 -66
  363. package/src/services/__tests__/WorktreeOrchestrator.test.ts +8 -7
  364. package/src/services/codingAgentResolver.ts +30 -4
  365. package/src/services/dependency-installer.ts +0 -7
  366. package/src/types/api.ts +3 -0
  367. package/src/types/coding-agent.ts +85 -0
  368. package/src/types/tools.ts +19 -0
  369. package/src/utils/__tests__/npmRegistry.test.ts +250 -0
  370. package/src/utils/__tests__/prompt.test.ts +4 -5
  371. package/src/utils/coding-agent-colors.ts +165 -0
  372. package/src/utils/command.ts +10 -1
  373. package/src/utils/error-utils.ts +133 -0
  374. package/src/utils/npmRegistry.ts +249 -0
  375. package/src/utils/prompt.ts +1 -1
  376. package/src/utils/session/index.ts +10 -2
  377. package/src/utils/session/parsers/codex.ts +9 -1
  378. package/src/utils/session/parsers/index.ts +6 -0
  379. package/src/utils/session/parsers/opencode.ts +110 -0
  380. package/src/utils/session/types.ts +5 -0
  381. package/src/utils/terminal.ts +24 -0
  382. package/src/utils.test.ts +1 -1
  383. package/src/utils.ts +37 -4
  384. package/src/web/client/src/components/CodingAgentLaunchModal.tsx +12 -21
  385. package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +16 -1
  386. package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +7 -1
  387. package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +11 -6
  388. package/src/web/client/src/lib/coding-agent-colors.ts +149 -0
  389. package/src/web/client/src/pages/BranchDetailPage.tsx +11 -11
  390. package/src/web/server/pty/manager.ts +139 -0
  391. package/src/web/server/routes/sessions.ts +6 -0
  392. package/src/web/server/services/branches.ts +11 -8
  393. package/src/web/server/services/worktrees.ts +2 -2
  394. package/src/worktree.ts +366 -107
  395. package/dist/cli/ui/components/App.d.ts +0 -25
  396. package/dist/cli/ui/components/App.d.ts.map +0 -1
  397. package/dist/cli/ui/components/App.js +0 -988
  398. package/dist/cli/ui/components/App.js.map +0 -1
  399. package/dist/cli/ui/components/common/Confirm.d.ts +0 -13
  400. package/dist/cli/ui/components/common/Confirm.d.ts.map +0 -1
  401. package/dist/cli/ui/components/common/Confirm.js +0 -20
  402. package/dist/cli/ui/components/common/Confirm.js.map +0 -1
  403. package/dist/cli/ui/components/common/ErrorBoundary.d.ts +0 -23
  404. package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +0 -1
  405. package/dist/cli/ui/components/common/ErrorBoundary.js +0 -37
  406. package/dist/cli/ui/components/common/ErrorBoundary.js.map +0 -1
  407. package/dist/cli/ui/components/common/Input.d.ts +0 -19
  408. package/dist/cli/ui/components/common/Input.d.ts.map +0 -1
  409. package/dist/cli/ui/components/common/Input.js +0 -22
  410. package/dist/cli/ui/components/common/Input.js.map +0 -1
  411. package/dist/cli/ui/components/common/LoadingIndicator.d.ts +0 -19
  412. package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +0 -1
  413. package/dist/cli/ui/components/common/LoadingIndicator.js +0 -61
  414. package/dist/cli/ui/components/common/LoadingIndicator.js.map +0 -1
  415. package/dist/cli/ui/components/common/Select.d.ts +0 -38
  416. package/dist/cli/ui/components/common/Select.d.ts.map +0 -1
  417. package/dist/cli/ui/components/common/Select.js +0 -151
  418. package/dist/cli/ui/components/common/Select.js.map +0 -1
  419. package/dist/cli/ui/components/common/SpinnerIcon.d.ts +0 -20
  420. package/dist/cli/ui/components/common/SpinnerIcon.d.ts.map +0 -1
  421. package/dist/cli/ui/components/common/SpinnerIcon.js +0 -61
  422. package/dist/cli/ui/components/common/SpinnerIcon.js.map +0 -1
  423. package/dist/cli/ui/components/parts/Footer.d.ts +0 -15
  424. package/dist/cli/ui/components/parts/Footer.d.ts.map +0 -1
  425. package/dist/cli/ui/components/parts/Footer.js +0 -20
  426. package/dist/cli/ui/components/parts/Footer.js.map +0 -1
  427. package/dist/cli/ui/components/parts/Header.d.ts.map +0 -1
  428. package/dist/cli/ui/components/parts/Header.js +0 -24
  429. package/dist/cli/ui/components/parts/Header.js.map +0 -1
  430. package/dist/cli/ui/components/parts/MergeStatusList.d.ts +0 -13
  431. package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +0 -1
  432. package/dist/cli/ui/components/parts/MergeStatusList.js +0 -52
  433. package/dist/cli/ui/components/parts/MergeStatusList.js.map +0 -1
  434. package/dist/cli/ui/components/parts/ProgressBar.d.ts +0 -13
  435. package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +0 -1
  436. package/dist/cli/ui/components/parts/ProgressBar.js +0 -53
  437. package/dist/cli/ui/components/parts/ProgressBar.js.map +0 -1
  438. package/dist/cli/ui/components/parts/ScrollableList.d.ts +0 -12
  439. package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +0 -1
  440. package/dist/cli/ui/components/parts/ScrollableList.js +0 -11
  441. package/dist/cli/ui/components/parts/ScrollableList.js.map +0 -1
  442. package/dist/cli/ui/components/parts/Stats.d.ts +0 -10
  443. package/dist/cli/ui/components/parts/Stats.d.ts.map +0 -1
  444. package/dist/cli/ui/components/parts/Stats.js +0 -55
  445. package/dist/cli/ui/components/parts/Stats.js.map +0 -1
  446. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +0 -17
  447. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +0 -1
  448. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +0 -42
  449. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +0 -1
  450. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +0 -17
  451. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +0 -1
  452. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +0 -72
  453. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +0 -1
  454. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +0 -18
  455. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +0 -1
  456. package/dist/cli/ui/components/screens/BranchCreatorScreen.js +0 -151
  457. package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +0 -1
  458. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +0 -1
  459. package/dist/cli/ui/components/screens/BranchListScreen.js +0 -476
  460. package/dist/cli/ui/components/screens/BranchListScreen.js.map +0 -1
  461. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +0 -30
  462. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +0 -1
  463. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +0 -145
  464. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +0 -1
  465. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts +0 -27
  466. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts.map +0 -1
  467. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js +0 -93
  468. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js.map +0 -1
  469. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +0 -19
  470. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +0 -1
  471. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +0 -577
  472. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +0 -1
  473. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +0 -45
  474. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +0 -1
  475. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +0 -95
  476. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +0 -1
  477. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +0 -10
  478. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +0 -1
  479. package/dist/cli/ui/components/screens/LogDatePickerScreen.js +0 -44
  480. package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +0 -1
  481. package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +0 -1
  482. package/dist/cli/ui/components/screens/LogDetailScreen.js +0 -34
  483. package/dist/cli/ui/components/screens/LogDetailScreen.js.map +0 -1
  484. package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +0 -1
  485. package/dist/cli/ui/components/screens/LogListScreen.js +0 -107
  486. package/dist/cli/ui/components/screens/LogListScreen.js.map +0 -1
  487. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +0 -24
  488. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +0 -1
  489. package/dist/cli/ui/components/screens/ModelSelectorScreen.js +0 -197
  490. package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +0 -1
  491. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +0 -29
  492. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +0 -1
  493. package/dist/cli/ui/components/screens/PRCleanupScreen.js +0 -92
  494. package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +0 -1
  495. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +0 -31
  496. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +0 -1
  497. package/dist/cli/ui/components/screens/SessionSelectorScreen.js +0 -67
  498. package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +0 -1
  499. package/dist/cli/ui/hooks/useAppInput.d.ts +0 -21
  500. package/dist/cli/ui/hooks/useAppInput.d.ts.map +0 -1
  501. package/dist/cli/ui/hooks/useAppInput.js +0 -138
  502. package/dist/cli/ui/hooks/useAppInput.js.map +0 -1
  503. package/dist/cli/ui/hooks/useBatchMerge.d.ts +0 -17
  504. package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +0 -1
  505. package/dist/cli/ui/hooks/useBatchMerge.js +0 -77
  506. package/dist/cli/ui/hooks/useBatchMerge.js.map +0 -1
  507. package/dist/cli/ui/hooks/useGitData.d.ts +0 -21
  508. package/dist/cli/ui/hooks/useGitData.d.ts.map +0 -1
  509. package/dist/cli/ui/hooks/useGitData.js +0 -229
  510. package/dist/cli/ui/hooks/useGitData.js.map +0 -1
  511. package/dist/cli/ui/hooks/useProfiles.d.ts +0 -41
  512. package/dist/cli/ui/hooks/useProfiles.d.ts.map +0 -1
  513. package/dist/cli/ui/hooks/useProfiles.js +0 -136
  514. package/dist/cli/ui/hooks/useProfiles.js.map +0 -1
  515. package/dist/cli/ui/hooks/useScreenState.d.ts +0 -12
  516. package/dist/cli/ui/hooks/useScreenState.d.ts.map +0 -1
  517. package/dist/cli/ui/hooks/useScreenState.js +0 -30
  518. package/dist/cli/ui/hooks/useScreenState.js.map +0 -1
  519. package/dist/cli/ui/hooks/useTerminalSize.d.ts +0 -9
  520. package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +0 -1
  521. package/dist/cli/ui/hooks/useTerminalSize.js +0 -24
  522. package/dist/cli/ui/hooks/useTerminalSize.js.map +0 -1
  523. package/dist/cli/ui/hooks/useToolStatus.d.ts +0 -30
  524. package/dist/cli/ui/hooks/useToolStatus.d.ts.map +0 -1
  525. package/dist/cli/ui/hooks/useToolStatus.js +0 -49
  526. package/dist/cli/ui/hooks/useToolStatus.js.map +0 -1
  527. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +0 -24
  528. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +0 -1
  529. package/dist/cli/ui/screens/BranchActionSelectorScreen.js +0 -65
  530. package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +0 -1
  531. package/dist/client/assets/index-LNPtOrn3.js +0 -78
  532. package/src/cli/ui/__tests__/SKIPPED_TESTS.md +0 -119
  533. package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +0 -239
  534. package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +0 -225
  535. package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +0 -219
  536. package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +0 -212
  537. package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +0 -440
  538. package/src/cli/ui/__tests__/components/App.test.tsx +0 -365
  539. package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +0 -91
  540. package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +0 -80
  541. package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +0 -104
  542. package/src/cli/ui/__tests__/components/common/Input.test.tsx +0 -100
  543. package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +0 -148
  544. package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +0 -255
  545. package/src/cli/ui/__tests__/components/common/Select.test.tsx +0 -335
  546. package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +0 -65
  547. package/src/cli/ui/__tests__/components/parts/Header.test.tsx +0 -55
  548. package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +0 -69
  549. package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +0 -148
  550. package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +0 -253
  551. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +0 -1070
  552. package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +0 -142
  553. package/src/cli/ui/__tests__/components/screens/CodingAgentSelectorScreen.test.tsx +0 -174
  554. package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +0 -182
  555. package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +0 -57
  556. package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +0 -102
  557. package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +0 -216
  558. package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +0 -147
  559. package/src/cli/ui/__tests__/hooks/useGitData.nonblocking.test.tsx +0 -206
  560. package/src/cli/ui/__tests__/hooks/useGitData.test.ts +0 -197
  561. package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +0 -228
  562. package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +0 -147
  563. package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +0 -99
  564. package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +0 -253
  565. package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +0 -436
  566. package/src/cli/ui/__tests__/integration/navigation.test.tsx +0 -514
  567. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +0 -509
  568. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +0 -216
  569. package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +0 -193
  570. package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +0 -234
  571. package/src/cli/ui/components/App.tsx +0 -1456
  572. package/src/cli/ui/components/common/Confirm.tsx +0 -44
  573. package/src/cli/ui/components/common/ErrorBoundary.tsx +0 -60
  574. package/src/cli/ui/components/common/Input.tsx +0 -58
  575. package/src/cli/ui/components/common/LoadingIndicator.tsx +0 -98
  576. package/src/cli/ui/components/common/Select.tsx +0 -247
  577. package/src/cli/ui/components/common/SpinnerIcon.tsx +0 -86
  578. package/src/cli/ui/components/parts/Footer.tsx +0 -41
  579. package/src/cli/ui/components/parts/Header.test.tsx +0 -75
  580. package/src/cli/ui/components/parts/MergeStatusList.tsx +0 -75
  581. package/src/cli/ui/components/parts/ProgressBar.tsx +0 -73
  582. package/src/cli/ui/components/parts/Stats.tsx +0 -88
  583. package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +0 -74
  584. package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +0 -108
  585. package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +0 -242
  586. package/src/cli/ui/components/screens/BranchListScreen.tsx +0 -744
  587. package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +0 -241
  588. package/src/cli/ui/components/screens/CodingAgentSelectorScreen.tsx +0 -159
  589. package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +0 -928
  590. package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +0 -176
  591. package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +0 -83
  592. package/src/cli/ui/components/screens/LogDetailScreen.tsx +0 -67
  593. package/src/cli/ui/components/screens/LogListScreen.tsx +0 -192
  594. package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +0 -320
  595. package/src/cli/ui/components/screens/PRCleanupScreen.tsx +0 -171
  596. package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +0 -135
  597. package/src/cli/ui/hooks/useAppInput.ts +0 -172
  598. package/src/cli/ui/hooks/useBatchMerge.ts +0 -96
  599. package/src/cli/ui/hooks/useGitData.ts +0 -347
  600. package/src/cli/ui/hooks/useProfiles.ts +0 -211
  601. package/src/cli/ui/hooks/useScreenState.ts +0 -44
  602. package/src/cli/ui/hooks/useTerminalSize.ts +0 -33
  603. package/src/cli/ui/hooks/useToolStatus.ts +0 -68
  604. package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +0 -111
  605. package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +0 -264
@@ -1,4 +1,9 @@
1
1
  import type { SessionData, ToolSessionEntry } from "../../../config/index.js";
2
+ import {
3
+ findLatestClaudeSessionId,
4
+ findLatestCodexSessionId,
5
+ findLatestGeminiSessionId,
6
+ } from "../../../utils/session.js";
2
7
 
3
8
  export interface ContinueSessionContext {
4
9
  history: ToolSessionEntry[];
@@ -6,6 +11,10 @@ export interface ContinueSessionContext {
6
11
  branch: string;
7
12
  toolId: string;
8
13
  repoRoot: string | null;
14
+ lookupLatestSessionId?: (params: {
15
+ toolId: string;
16
+ worktreePath: string;
17
+ }) => Promise<string | null>;
9
18
  }
10
19
 
11
20
  /**
@@ -41,6 +50,41 @@ export async function resolveContinueSessionId(
41
50
  return sessionData.lastSessionId;
42
51
  }
43
52
 
53
+ const latestEntry = findLatestBranchSession(history, branch, toolId);
54
+ const worktreePath = latestEntry?.worktreePath ?? null;
55
+ if (!worktreePath) {
56
+ return null;
57
+ }
58
+
59
+ if (context.lookupLatestSessionId) {
60
+ const lookupResult = await context.lookupLatestSessionId({
61
+ toolId,
62
+ worktreePath,
63
+ });
64
+ return lookupResult ?? null;
65
+ }
66
+
67
+ return lookupLatestSessionIdForTool(toolId, worktreePath);
68
+ }
69
+
70
+ async function lookupLatestSessionIdForTool(
71
+ toolId: string,
72
+ worktreePath: string,
73
+ ): Promise<string | null> {
74
+ try {
75
+ if (toolId === "claude-code") {
76
+ return await findLatestClaudeSessionId(worktreePath);
77
+ }
78
+ if (toolId === "codex-cli") {
79
+ return await findLatestCodexSessionId({ cwd: worktreePath });
80
+ }
81
+ if (toolId === "gemini-cli") {
82
+ return await findLatestGeminiSessionId(worktreePath);
83
+ }
84
+ } catch {
85
+ return null;
86
+ }
87
+
44
88
  return null;
45
89
  }
46
90
 
@@ -1,4 +1,4 @@
1
- import { describe, it, expect } from "vitest";
1
+ import { describe, it, expect } from "bun:test";
2
2
  import {
3
3
  getModelOptions,
4
4
  getDefaultInferenceForModel,
package/src/codex.ts CHANGED
@@ -6,10 +6,15 @@ import {
6
6
  createChildStdio,
7
7
  getTerminalStreams,
8
8
  resetTerminalModes,
9
+ writeTerminalLine,
9
10
  } from "./utils/terminal.js";
10
- import { findLatestCodexSession } from "./utils/session.js";
11
+ import {
12
+ findLatestCodexSession,
13
+ waitForCodexSessionId,
14
+ } from "./utils/session.js";
15
+ import { findCommand } from "./utils/command.js";
11
16
 
12
- const CODEX_CLI_PACKAGE = "@openai/codex@latest";
17
+ const CODEX_CLI_PACKAGE = "@openai/codex";
13
18
 
14
19
  /**
15
20
  * Reasoning effort levels supported by Codex CLI.
@@ -91,6 +96,7 @@ export async function launchCodexCLI(
91
96
  model?: string;
92
97
  reasoningEffort?: CodexReasoningEffort;
93
98
  sessionId?: string | null;
99
+ version?: string | null;
94
100
  } = {},
95
101
  ): Promise<{ sessionId?: string | null }> {
96
102
  const terminal = getTerminalStreams();
@@ -101,16 +107,16 @@ export async function launchCodexCLI(
101
107
  throw new Error(`Worktree path does not exist: ${worktreePath}`);
102
108
  }
103
109
 
104
- console.log(chalk.blue("🚀 Launching Codex CLI..."));
105
- console.log(chalk.gray(` Working directory: ${worktreePath}`));
110
+ writeTerminalLine(chalk.blue("🚀 Launching Codex CLI..."));
111
+ writeTerminalLine(chalk.gray(` Working directory: ${worktreePath}`));
106
112
 
107
113
  const args: string[] = [];
108
114
  const model = options.model ?? DEFAULT_CODEX_MODEL;
109
115
  const reasoningEffort =
110
116
  options.reasoningEffort ?? DEFAULT_CODEX_REASONING_EFFORT;
111
117
 
112
- console.log(chalk.green(` 🎯 Model: ${model}`));
113
- console.log(chalk.green(` 🧠 Reasoning: ${reasoningEffort}`));
118
+ writeTerminalLine(chalk.green(` 🎯 Model: ${model}`));
119
+ writeTerminalLine(chalk.green(` 🧠 Reasoning: ${reasoningEffort}`));
114
120
 
115
121
  const resumeSessionId =
116
122
  options.sessionId && options.sessionId.trim().length > 0
@@ -124,36 +130,36 @@ export async function launchCodexCLI(
124
130
  case "continue":
125
131
  if (resumeSessionId) {
126
132
  args.push("resume", resumeSessionId);
127
- console.log(
133
+ writeTerminalLine(
128
134
  chalk.cyan(
129
135
  ` ⏭️ Resuming specific Codex session: ${resumeSessionId}`,
130
136
  ),
131
137
  );
132
138
  } else {
133
139
  args.push("resume", "--last");
134
- console.log(chalk.cyan(" ⏭️ Resuming last Codex session"));
140
+ writeTerminalLine(chalk.cyan(" ⏭️ Resuming last Codex session"));
135
141
  }
136
142
  break;
137
143
  case "resume":
138
144
  if (resumeSessionId) {
139
145
  args.push("resume", resumeSessionId);
140
- console.log(
146
+ writeTerminalLine(
141
147
  chalk.cyan(` 🔄 Resuming Codex session: ${resumeSessionId}`),
142
148
  );
143
149
  } else {
144
150
  args.push("resume");
145
- console.log(chalk.cyan(" 🔄 Resume command"));
151
+ writeTerminalLine(chalk.cyan(" 🔄 Resume command"));
146
152
  }
147
153
  break;
148
154
  case "normal":
149
155
  default:
150
- console.log(chalk.green(" ✨ Starting new session"));
156
+ writeTerminalLine(chalk.green(" ✨ Starting new session"));
151
157
  break;
152
158
  }
153
159
 
154
160
  if (options.bypassApprovals) {
155
161
  args.push("--yolo");
156
- console.log(chalk.yellow(" ⚠️ Bypassing approvals and sandbox"));
162
+ writeTerminalLine(chalk.yellow(" ⚠️ Bypassing approvals and sandbox"));
157
163
  }
158
164
 
159
165
  if (options.extraArgs && options.extraArgs.length > 0) {
@@ -164,7 +170,7 @@ export async function launchCodexCLI(
164
170
 
165
171
  args.push(...codexArgs);
166
172
 
167
- console.log(chalk.gray(` 📋 Args: ${args.join(" ")}`));
173
+ writeTerminalLine(chalk.gray(` 📋 Args: ${args.join(" ")}`));
168
174
 
169
175
  terminal.exitRawMode();
170
176
  resetTerminalModes(terminal.stdout);
@@ -180,34 +186,68 @@ export async function launchCodexCLI(
180
186
  ),
181
187
  );
182
188
 
183
- try {
184
- const execChild = async (child: Promise<unknown>) => {
185
- try {
186
- await child;
187
- } catch (execError: unknown) {
188
- // Treat SIGINT/SIGTERM as normal exit (user pressed Ctrl+C)
189
- const signal = (execError as { signal?: unknown })?.signal;
190
- if (signal === "SIGINT" || signal === "SIGTERM") {
191
- return;
192
- }
193
- throw execError;
189
+ // Auto-detect locally installed codex command
190
+ const codexLookup = await findCommand("codex");
191
+
192
+ const execChild = async (child: Promise<unknown>) => {
193
+ try {
194
+ await child;
195
+ } catch (execError: unknown) {
196
+ // Treat SIGINT/SIGTERM as normal exit (user pressed Ctrl+C)
197
+ const signal = (execError as { signal?: unknown })?.signal;
198
+ if (signal === "SIGINT" || signal === "SIGTERM") {
199
+ return;
194
200
  }
195
- };
201
+ throw execError;
202
+ }
203
+ };
196
204
 
197
- const child = execa("bunx", [CODEX_CLI_PACKAGE, ...args], {
198
- cwd: worktreePath,
199
- stdin: childStdio.stdin,
200
- stdout: childStdio.stdout,
201
- stderr: childStdio.stderr,
202
- env,
203
- });
204
- await execChild(child);
205
+ // Determine execution strategy based on version selection
206
+ // FR-063b: "installed" option only appears when local command exists
207
+ const selectedVersion = options.version ?? "installed";
208
+
209
+ // Log version information (FR-072)
210
+ if (selectedVersion === "installed") {
211
+ writeTerminalLine(chalk.green(` 📦 Version: installed`));
212
+ } else {
213
+ writeTerminalLine(chalk.green(` 📦 Version: @${selectedVersion}`));
214
+ }
215
+
216
+ try {
217
+ if (selectedVersion === "installed" && codexLookup.path) {
218
+ // FR-066: Use locally installed command when "installed" is selected
219
+ // FR-063b guarantees local command exists when this option is shown
220
+ writeTerminalLine(
221
+ chalk.green(" ✨ Using locally installed codex command"),
222
+ );
223
+ const child = execa(codexLookup.path, args, {
224
+ cwd: worktreePath,
225
+ stdin: childStdio.stdin,
226
+ stdout: childStdio.stdout,
227
+ stderr: childStdio.stderr,
228
+ env,
229
+ });
230
+ await execChild(child);
231
+ } else {
232
+ // FR-067, FR-068: Use bunx with version suffix for latest/specific versions
233
+ const packageWithVersion = `${CODEX_CLI_PACKAGE}@${selectedVersion}`;
234
+ writeTerminalLine(chalk.cyan(` 🔄 Using bunx ${packageWithVersion}`));
235
+
236
+ const child = execa("bunx", [packageWithVersion, ...args], {
237
+ cwd: worktreePath,
238
+ stdin: childStdio.stdin,
239
+ stdout: childStdio.stdout,
240
+ stderr: childStdio.stderr,
241
+ env,
242
+ });
243
+ await execChild(child);
244
+ }
205
245
  } finally {
206
246
  childStdio.cleanup();
207
247
  }
208
248
 
209
249
  // File-based session detection only - no stdout capture
210
- // Use only findLatestCodexSession with short timeout, skip sessionProbe to avoid hanging
250
+ // Use only file inspection with a short wait to avoid hanging
211
251
  let capturedSessionId: string | null = null;
212
252
  const finishedAt = Date.now();
213
253
  try {
@@ -226,14 +266,25 @@ export async function launchCodexCLI(
226
266
  } catch {
227
267
  capturedSessionId = usedExplicitSessionId ? resumeSessionId : null;
228
268
  }
269
+ const shouldSkipWait =
270
+ typeof process !== "undefined" &&
271
+ (process.env?.NODE_ENV === "test" || Boolean(process.env?.VITEST));
272
+ if (!capturedSessionId && !shouldSkipWait) {
273
+ capturedSessionId = await waitForCodexSessionId({
274
+ startedAt,
275
+ timeoutMs: 15_000,
276
+ pollIntervalMs: 1_000,
277
+ cwd: worktreePath,
278
+ });
279
+ }
229
280
 
230
281
  if (capturedSessionId) {
231
- console.log(chalk.cyan(`\n 🆔 Session ID: ${capturedSessionId}`));
232
- console.log(
282
+ writeTerminalLine(chalk.cyan(`\n 🆔 Session ID: ${capturedSessionId}`));
283
+ writeTerminalLine(
233
284
  chalk.gray(` Resume command: codex resume ${capturedSessionId}`),
234
285
  );
235
286
  } else {
236
- console.log(
287
+ writeTerminalLine(
237
288
  chalk.yellow(
238
289
  "\n ℹ️ Could not determine Codex session ID automatically.",
239
290
  ),
@@ -250,19 +301,25 @@ export async function launchCodexCLI(
250
301
  : `Failed to launch Codex CLI: ${details || "Unknown error"}`;
251
302
 
252
303
  if (platform() === "win32") {
253
- console.error(chalk.red("\n💡 Windows troubleshooting tips:"));
254
- console.error(
304
+ writeTerminalLine(
305
+ chalk.red("\n💡 Windows troubleshooting tips:"),
306
+ "stderr",
307
+ );
308
+ writeTerminalLine(
255
309
  chalk.yellow(
256
310
  " 1. Confirm that Bun is installed and bunx is available",
257
311
  ),
312
+ "stderr",
258
313
  );
259
- console.error(
314
+ writeTerminalLine(
260
315
  chalk.yellow(
261
316
  ' 2. Run "bunx @openai/codex@latest -- --help" to verify the setup',
262
317
  ),
318
+ "stderr",
263
319
  );
264
- console.error(
320
+ writeTerminalLine(
265
321
  chalk.yellow(" 3. Restart your terminal or IDE to refresh PATH"),
322
+ "stderr",
266
323
  );
267
324
  }
268
325
 
@@ -278,12 +335,12 @@ export async function launchCodexCLI(
278
335
  */
279
336
  export async function isCodexAvailable(): Promise<boolean> {
280
337
  try {
281
- await execa("bunx", [CODEX_CLI_PACKAGE, "--help"]);
338
+ await execa("bunx", [`${CODEX_CLI_PACKAGE}@latest`, "--help"]);
282
339
  return true;
283
340
  } catch (error: unknown) {
284
341
  const err = error as NodeJS.ErrnoException;
285
342
  if (err.code === "ENOENT") {
286
- console.error(chalk.yellow("\n⚠️ bunx command not found"));
343
+ writeTerminalLine(chalk.yellow("\n⚠️ bunx command not found"), "stderr");
287
344
  }
288
345
  return false;
289
346
  }
@@ -0,0 +1,143 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "bun:test";
2
+ import { mkdir, rm } from "fs/promises";
3
+ import { join } from "path";
4
+ import { tmpdir } from "os";
5
+ import { saveSession, loadSession } from "../index.js";
6
+
7
+ describe("saveSession", () => {
8
+ let testDir: string;
9
+ let testRepoRoot: string;
10
+
11
+ beforeEach(async () => {
12
+ // Create a unique temporary directory for each test
13
+ testDir = join(
14
+ tmpdir(),
15
+ `gwt-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
16
+ );
17
+ testRepoRoot = join(testDir, "test-repo");
18
+ await mkdir(testRepoRoot, { recursive: true });
19
+ });
20
+
21
+ afterEach(async () => {
22
+ // Clean up temporary directory
23
+ try {
24
+ await rm(testDir, { recursive: true, force: true });
25
+ } catch {
26
+ // Ignore cleanup errors
27
+ }
28
+ });
29
+
30
+ it("should save toolVersion to session history", async () => {
31
+ // Arrange
32
+ const sessionData = {
33
+ lastWorktreePath: testRepoRoot,
34
+ lastBranch: "feature/test",
35
+ lastUsedTool: "claude-code",
36
+ toolLabel: "Claude Code",
37
+ mode: "normal" as const,
38
+ model: "opus",
39
+ reasoningLevel: "high",
40
+ skipPermissions: false,
41
+ toolVersion: "2.1.1",
42
+ timestamp: Date.now(),
43
+ repositoryRoot: testRepoRoot,
44
+ };
45
+
46
+ // Act
47
+ await saveSession(sessionData);
48
+ const loaded = await loadSession(testRepoRoot);
49
+
50
+ // Assert
51
+ expect(loaded).not.toBeNull();
52
+ expect(loaded?.history).toHaveLength(1);
53
+ expect(loaded?.history?.[0]?.toolVersion).toBe("2.1.1");
54
+ });
55
+
56
+ it("should save null toolVersion when not provided", async () => {
57
+ // Arrange
58
+ const sessionData = {
59
+ lastWorktreePath: testRepoRoot,
60
+ lastBranch: "feature/test",
61
+ lastUsedTool: "claude-code",
62
+ toolLabel: "Claude Code",
63
+ mode: "normal" as const,
64
+ model: "opus",
65
+ timestamp: Date.now(),
66
+ repositoryRoot: testRepoRoot,
67
+ };
68
+
69
+ // Act
70
+ await saveSession(sessionData);
71
+ const loaded = await loadSession(testRepoRoot);
72
+
73
+ // Assert
74
+ expect(loaded).not.toBeNull();
75
+ expect(loaded?.history).toHaveLength(1);
76
+ expect(loaded?.history?.[0]?.toolVersion).toBeNull();
77
+ });
78
+
79
+ it("should preserve toolVersion across multiple saves", async () => {
80
+ // Arrange - first save with version 1.0.0
81
+ await saveSession({
82
+ lastWorktreePath: testRepoRoot,
83
+ lastBranch: "feature/test",
84
+ lastUsedTool: "claude-code",
85
+ toolLabel: "Claude Code",
86
+ toolVersion: "1.0.0",
87
+ timestamp: Date.now() - 1000,
88
+ repositoryRoot: testRepoRoot,
89
+ });
90
+
91
+ // Act - second save with version 2.0.0
92
+ await saveSession({
93
+ lastWorktreePath: testRepoRoot,
94
+ lastBranch: "feature/test",
95
+ lastUsedTool: "claude-code",
96
+ toolLabel: "Claude Code",
97
+ toolVersion: "2.0.0",
98
+ timestamp: Date.now(),
99
+ repositoryRoot: testRepoRoot,
100
+ });
101
+
102
+ const loaded = await loadSession(testRepoRoot);
103
+
104
+ // Assert - should have 2 entries with different versions
105
+ expect(loaded?.history).toHaveLength(2);
106
+ // History is stored oldest first (newest at the end)
107
+ expect(loaded?.history?.[0]?.toolVersion).toBe("1.0.0");
108
+ expect(loaded?.history?.[1]?.toolVersion).toBe("2.0.0");
109
+ });
110
+
111
+ it("should not add to history when skipHistory is true", async () => {
112
+ // Arrange - first save
113
+ await saveSession({
114
+ lastWorktreePath: testRepoRoot,
115
+ lastBranch: "feature/test",
116
+ lastUsedTool: "claude-code",
117
+ toolLabel: "Claude Code",
118
+ toolVersion: "1.0.0",
119
+ timestamp: Date.now(),
120
+ repositoryRoot: testRepoRoot,
121
+ });
122
+
123
+ // Act - second save with skipHistory
124
+ await saveSession(
125
+ {
126
+ lastWorktreePath: testRepoRoot,
127
+ lastBranch: "feature/test",
128
+ lastUsedTool: "claude-code",
129
+ toolLabel: "Claude Code",
130
+ toolVersion: "2.0.0",
131
+ timestamp: Date.now(),
132
+ repositoryRoot: testRepoRoot,
133
+ },
134
+ { skipHistory: true },
135
+ );
136
+
137
+ const loaded = await loadSession(testRepoRoot);
138
+
139
+ // Assert - should still have only 1 entry
140
+ expect(loaded?.history).toHaveLength(1);
141
+ expect(loaded?.history?.[0]?.toolVersion).toBe("1.0.0");
142
+ });
143
+ });
@@ -17,7 +17,7 @@ export const CLAUDE_CODE_TOOL: CodingAgent = {
17
17
  id: "claude-code",
18
18
  displayName: "Claude Code",
19
19
  type: "bunx",
20
- command: "@anthropic-ai/claude-code@latest",
20
+ command: "@anthropic-ai/claude-code",
21
21
  modeArgs: {
22
22
  normal: [],
23
23
  continue: ["-c"],
@@ -36,7 +36,7 @@ export const CODEX_CLI_TOOL: CodingAgent = {
36
36
  id: "codex-cli",
37
37
  displayName: "Codex",
38
38
  type: "bunx",
39
- command: "@openai/codex@latest",
39
+ command: "@openai/codex",
40
40
  defaultArgs: Array.from(CODEX_DEFAULT_ARGS),
41
41
  modeArgs: {
42
42
  normal: [],
@@ -52,7 +52,7 @@ export const GEMINI_CLI_TOOL: CodingAgent = {
52
52
  id: "gemini-cli",
53
53
  displayName: "Gemini",
54
54
  type: "bunx",
55
- command: "@google/gemini-cli@latest",
55
+ command: "@google/gemini-cli",
56
56
  modeArgs: {
57
57
  normal: [],
58
58
  continue: ["-r", "latest"],
@@ -61,6 +61,21 @@ export const GEMINI_CLI_TOOL: CodingAgent = {
61
61
  permissionSkipArgs: ["-y"],
62
62
  };
63
63
 
64
+ /**
65
+ * OpenCode のビルトイン定義
66
+ */
67
+ export const OPENCODE_TOOL: CodingAgent = {
68
+ id: "opencode",
69
+ displayName: "OpenCode",
70
+ type: "bunx",
71
+ command: "opencode-ai",
72
+ modeArgs: {
73
+ normal: [],
74
+ continue: ["-c"],
75
+ resume: ["-s"],
76
+ },
77
+ };
78
+
64
79
  /**
65
80
  * すべてのビルトインコーディングエージェント
66
81
  */
@@ -68,4 +83,5 @@ export const BUILTIN_CODING_AGENTS: CodingAgent[] = [
68
83
  CLAUDE_CODE_TOOL,
69
84
  CODEX_CLI_TOOL,
70
85
  GEMINI_CLI_TOOL,
86
+ OPENCODE_TOOL,
71
87
  ];
@@ -22,6 +22,7 @@ export interface SessionData {
22
22
  mode?: "normal" | "continue" | "resume";
23
23
  model?: string | null;
24
24
  toolLabel?: string | null;
25
+ toolVersion?: string | null;
25
26
  history?: ToolSessionEntry[];
26
27
  }
27
28
 
@@ -35,6 +36,7 @@ export interface ToolSessionEntry {
35
36
  model?: string | null;
36
37
  reasoningLevel?: string | null;
37
38
  skipPermissions?: boolean | null;
39
+ toolVersion?: string | null;
38
40
  timestamp: number;
39
41
  }
40
42
 
@@ -152,6 +154,7 @@ export async function saveSession(
152
154
  model: sessionData.model ?? null,
153
155
  reasoningLevel: sessionData.reasoningLevel ?? null,
154
156
  skipPermissions: sessionData.skipPermissions ?? false,
157
+ toolVersion: sessionData.toolVersion ?? null,
155
158
  timestamp: sessionData.timestamp,
156
159
  };
157
160
  existingHistory = [...existingHistory, entry].slice(-100); // keep latest 100
@@ -277,6 +280,7 @@ export async function getLastToolUsageMap(
277
280
  worktreePath: parsed.lastWorktreePath,
278
281
  toolId: parsed.lastUsedTool ?? "unknown",
279
282
  toolLabel: parsed.toolLabel ?? parsed.lastUsedTool ?? "Custom",
283
+ sessionId: parsed.lastSessionId ?? null,
280
284
  mode: parsed.mode ?? null,
281
285
  model: parsed.model ?? null,
282
286
  reasoningLevel: parsed.reasoningLevel ?? null,
@@ -52,6 +52,22 @@ export async function loadCodingAgentsConfig(): Promise<CodingAgentsConfig> {
52
52
  const content = await readFile(TOOLS_CONFIG_PATH, "utf-8");
53
53
  const config = JSON.parse(content) as CodingAgentsConfig;
54
54
 
55
+ // マイグレーション: customTools → customCodingAgents (後方互換性)
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ const legacyConfig = config as any;
58
+ if (!config.customCodingAgents && legacyConfig.customTools) {
59
+ config.customCodingAgents = legacyConfig.customTools;
60
+ logger.warn(
61
+ { path: TOOLS_CONFIG_PATH },
62
+ "Migrating deprecated 'customTools' to 'customCodingAgents'",
63
+ );
64
+ }
65
+
66
+ // フォールバック: undefined/null → 空配列
67
+ if (!config.customCodingAgents) {
68
+ config.customCodingAgents = [];
69
+ }
70
+
55
71
  // 検証
56
72
  validateCodingAgentsConfig(config);
57
73