@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
package/src/index.ts CHANGED
@@ -13,30 +13,28 @@ import {
13
13
  hasUnpushedCommits,
14
14
  getUncommittedChangesCount,
15
15
  getUnpushedCommitsCount,
16
- GitError,
17
16
  } from "./git.js";
18
17
  import { launchClaudeCode } from "./claude.js";
19
- import {
20
- launchCodexCLI,
21
- CodexError,
22
- type CodexReasoningEffort,
23
- } from "./codex.js";
24
- import { launchGeminiCLI, GeminiError } from "./gemini.js";
18
+ import { launchCodexCLI, type CodexReasoningEffort } from "./codex.js";
19
+ import { launchGeminiCLI } from "./gemini.js";
25
20
  import {
26
21
  WorktreeOrchestrator,
27
22
  type EnsureWorktreeOptions,
28
23
  } from "./services/WorktreeOrchestrator.js";
29
24
  import chalk from "chalk";
30
- import type { SelectionResult } from "./cli/ui/components/App.js";
25
+ import type { SelectionResult } from "./cli/ui/App.solid.js";
31
26
  import {
32
27
  isProtectedBranchName,
33
28
  switchToProtectedBranch,
34
- WorktreeError,
35
29
  resolveWorktreePathForBranch,
30
+ listAllWorktrees,
31
+ repairWorktreePath,
36
32
  } from "./worktree.js";
37
33
  import {
38
34
  getTerminalStreams,
35
+ resetTerminalModes,
39
36
  waitForUserAcknowledgement,
37
+ writeTerminalLine,
40
38
  } from "./utils/terminal.js";
41
39
  import { createLogger } from "./logging/logger.js";
42
40
  import { getCodingAgentById, getSharedEnvironment } from "./config/tools.js";
@@ -47,7 +45,12 @@ import {
47
45
  findLatestClaudeSession,
48
46
  findLatestGeminiSession,
49
47
  } from "./utils/session.js";
50
- import { getPackageVersion } from "./utils.js";
48
+ import {
49
+ getPackageVersion,
50
+ setupExitHandlers,
51
+ registerExitCleanup,
52
+ clearExitCleanup,
53
+ } from "./utils.js";
51
54
  import { findLatestClaudeSessionId } from "./utils/session.js";
52
55
  import { resolveContinueSessionId } from "./cli/ui/utils/continueSession.js";
53
56
  import { normalizeModelId } from "./cli/ui/utils/modelOptions.js";
@@ -56,12 +59,13 @@ import {
56
59
  DependencyInstallError,
57
60
  type DependencyInstallResult,
58
61
  } from "./services/dependency-installer.js";
59
- import { waitForEnter } from "./utils/prompt.js";
62
+ import { isGitRelatedError, isRecoverableError } from "./utils/error-utils.js";
60
63
 
61
64
  const ERROR_PROMPT = chalk.yellow(
62
65
  "Review the error details, then press Enter to continue.",
63
66
  );
64
- const POST_SESSION_DELAY_MS = 3000;
67
+ const SUCCESS_PROMPT = chalk.green("Press Enter to return to main menu...");
68
+ const POST_SESSION_DELAY_MS = 500;
65
69
 
66
70
  // Category: cli
67
71
  const appLogger = createLogger({ category: "cli" });
@@ -74,87 +78,23 @@ async function waitForErrorAcknowledgement(): Promise<void> {
74
78
  * Simple print functions (replacing legacy UI display functions)
75
79
  */
76
80
  function printError(message: string): void {
77
- console.error(chalk.red(`❌ ${message}`));
81
+ writeTerminalLine(chalk.red(`❌ ${message}`), "stderr");
78
82
  appLogger.error({ message });
79
83
  }
80
84
 
81
85
  function printInfo(message: string): void {
82
- console.log(chalk.blue(`ℹ️ ${message}`));
86
+ writeTerminalLine(chalk.blue(`ℹ️ ${message}`));
83
87
  appLogger.info({ message });
84
88
  }
85
89
 
86
90
  function printWarning(message: string): void {
87
- console.warn(chalk.yellow(`⚠️ ${message}`));
91
+ writeTerminalLine(chalk.yellow(`⚠️ ${message}`), "stderr");
88
92
  appLogger.warn({ message });
89
93
  }
90
94
 
91
95
  type GitStepResult<T> = { ok: true; value: T } | { ok: false };
92
96
 
93
- function isGitRelatedError(error: unknown): boolean {
94
- if (!error) {
95
- return false;
96
- }
97
-
98
- if (error instanceof GitError || error instanceof WorktreeError) {
99
- return true;
100
- }
101
-
102
- if (error instanceof Error) {
103
- return error.name === "GitError" || error.name === "WorktreeError";
104
- }
105
-
106
- if (
107
- typeof error === "object" &&
108
- "name" in (error as Record<string, unknown>)
109
- ) {
110
- const name = (error as { name?: string }).name;
111
- return name === "GitError" || name === "WorktreeError";
112
- }
113
-
114
- return false;
115
- }
116
-
117
- function isRecoverableError(error: unknown): boolean {
118
- if (!error) {
119
- return false;
120
- }
121
-
122
- if (
123
- error instanceof GitError ||
124
- error instanceof WorktreeError ||
125
- error instanceof CodexError ||
126
- error instanceof GeminiError ||
127
- error instanceof DependencyInstallError
128
- ) {
129
- return true;
130
- }
131
-
132
- if (error instanceof Error) {
133
- return (
134
- error.name === "GitError" ||
135
- error.name === "WorktreeError" ||
136
- error.name === "CodexError" ||
137
- error.name === "GeminiError" ||
138
- error.name === "DependencyInstallError"
139
- );
140
- }
141
-
142
- if (
143
- typeof error === "object" &&
144
- "name" in (error as Record<string, unknown>)
145
- ) {
146
- const name = (error as { name?: string }).name;
147
- return (
148
- name === "GitError" ||
149
- name === "WorktreeError" ||
150
- name === "CodexError" ||
151
- name === "GeminiError" ||
152
- name === "DependencyInstallError"
153
- );
154
- }
155
-
156
- return false;
157
- }
97
+ // Note: isGitRelatedError and isRecoverableError are now imported from ./utils/error-utils.js
158
98
 
159
99
  async function runGitStep<T>(
160
100
  description: string,
@@ -240,49 +180,76 @@ async function showVersion(): Promise<void> {
240
180
  }
241
181
 
242
182
  /**
243
- * Main function for Ink.js UI
183
+ * Performs terminal cleanup when exiting.
184
+ */
185
+ function performTerminalCleanup(): void {
186
+ const terminal = getTerminalStreams();
187
+ terminal.exitRawMode();
188
+ resetTerminalModes(terminal.stdout);
189
+ }
190
+
191
+ /**
192
+ * Main function for OpenTUI UI
244
193
  * Returns SelectionResult if user made selections, undefined if user quit
245
194
  */
246
- async function mainInkUI(): Promise<SelectionResult | undefined> {
247
- const { render } = await import("ink");
248
- const React = await import("react");
249
- const { App } = await import("./cli/ui/components/App.js");
195
+ async function mainSolidUI(): Promise<SelectionResult | undefined> {
196
+ if (!("Bun" in globalThis)) {
197
+ throw new Error(
198
+ "OpenTUI requires the Bun runtime. Run with Bun (e.g. bunx @akiojin/gwt@latest).",
199
+ );
200
+ }
201
+ const { renderSolidApp } = await import("./opentui/index.solid.js");
250
202
  const terminal = getTerminalStreams();
251
203
 
204
+ // Register cleanup for signal handlers
205
+ registerExitCleanup(performTerminalCleanup);
252
206
  let selectionResult: SelectionResult | undefined;
207
+ // マウスキャプチャを有効にしてSelection APIで選択終了時にクリップボードへコピー
208
+ const useMouse = true;
209
+ const enableMouseMovement = false;
210
+ const altScreenPreference =
211
+ process.env.GWT_UI_ALT_SCREEN?.trim().toLowerCase();
212
+ // Ink.js版ではalternate screenを使用していなかったため、デフォルトをfalseに
213
+ // alternate screenを使用するとコーディングエージェント起動/終了ログが見えなくなる
214
+ const useAlternateScreen =
215
+ altScreenPreference === "true" || altScreenPreference === "1";
253
216
 
254
- // Resume stdin to ensure it's ready for Ink.js
255
217
  if (typeof terminal.stdin.resume === "function") {
256
218
  terminal.stdin.resume();
257
219
  }
220
+ if (typeof terminal.stdin.setRawMode === "function") {
221
+ try {
222
+ terminal.stdin.setRawMode(true);
223
+ } catch {
224
+ // Ignore raw mode errors and let OpenTUI handle setup.
225
+ }
226
+ }
258
227
 
259
- const { unmount, waitUntilExit } = render(
260
- React.createElement(App, {
261
- onExit: (result?: SelectionResult) => {
262
- selectionResult = result;
263
- },
264
- }),
265
- {
266
- stdin: terminal.stdin,
267
- stdout: terminal.stdout,
268
- stderr: terminal.stderr,
269
- patchConsole: false,
270
- },
271
- );
272
-
273
- // Wait for user to exit
274
228
  try {
275
- await waitUntilExit();
229
+ await renderSolidApp(
230
+ {
231
+ onExit: (result?: SelectionResult) => {
232
+ selectionResult = result;
233
+ },
234
+ },
235
+ {
236
+ stdin: terminal.stdin,
237
+ stdout: terminal.stdout,
238
+ exitOnCtrlC: true,
239
+ useAlternateScreen,
240
+ useMouse,
241
+ enableMouseMovement,
242
+ },
243
+ );
276
244
  } finally {
277
- terminal.exitRawMode();
245
+ performTerminalCleanup();
278
246
  if (typeof terminal.stdin.pause === "function") {
279
247
  terminal.stdin.pause();
280
248
  }
281
- // Inkが残した data リスナーが子プロセス入力を奪わないようクリーンアップ
282
249
  terminal.stdin.removeAllListeners?.("data");
283
250
  terminal.stdin.removeAllListeners?.("keypress");
284
251
  terminal.stdin.removeAllListeners?.("readable");
285
- unmount();
252
+ clearExitCleanup();
286
253
  }
287
254
 
288
255
  return selectionResult;
@@ -299,12 +266,15 @@ export async function handleAIToolWorkflow(
299
266
  displayName,
300
267
  branchType,
301
268
  remoteBranch,
269
+ baseBranch,
270
+ isNewBranch,
302
271
  tool,
303
272
  mode,
304
273
  skipPermissions,
305
274
  model,
306
275
  inferenceLevel,
307
276
  sessionId: selectedSessionId,
277
+ toolVersion,
308
278
  } = selectionResult;
309
279
 
310
280
  const branchLabel = displayName ?? branch;
@@ -330,7 +300,14 @@ export async function handleAIToolWorkflow(
330
300
  // Determine ensure options (local vs remote branch)
331
301
  const ensureOptions: EnsureWorktreeOptions = {};
332
302
 
333
- if (branchType === "remote") {
303
+ if (isNewBranch) {
304
+ ensureOptions.isNewBranch = true;
305
+ if (baseBranch) {
306
+ ensureOptions.baseBranch = baseBranch;
307
+ }
308
+ }
309
+
310
+ if (branchType === "remote" && !isNewBranch) {
334
311
  const remoteRef = remoteBranch ?? branch;
335
312
  const localExists = await branchExists(branch);
336
313
 
@@ -338,15 +315,37 @@ export async function handleAIToolWorkflow(
338
315
  ensureOptions.isNewBranch = !localExists;
339
316
  }
340
317
 
341
- const existingWorktreeResolution =
342
- await resolveWorktreePathForBranch(branch);
343
- const existingWorktree = existingWorktreeResolution.path;
318
+ let existingWorktreeResolution = await resolveWorktreePathForBranch(branch);
319
+ let existingWorktree = existingWorktreeResolution.path;
320
+
321
+ // mismatch検出時に自動修復を試みる (FR-009〜FR-013)
344
322
  if (!existingWorktree && existingWorktreeResolution.mismatch) {
345
323
  const actualBranch =
346
324
  existingWorktreeResolution.mismatch.actualBranch ?? "unknown";
347
325
  printWarning(
348
- `Worktree mismatch detected: ${existingWorktreeResolution.mismatch.path} is checked out to '${actualBranch}'. Creating or reusing the correct worktree for '${branch}'.`,
326
+ `Worktree mismatch detected: ${existingWorktreeResolution.mismatch.path} is checked out to '${actualBranch}'. Attempting to repair...`,
327
+ );
328
+
329
+ // 共通修復関数を使用してパス修復を試みる
330
+ const repairResult = await repairWorktreePath(
331
+ branch,
332
+ existingWorktreeResolution.mismatch.path,
333
+ repoRoot,
349
334
  );
335
+
336
+ if (repairResult.repaired) {
337
+ // FR-012: 修復成功時のメッセージ
338
+ printInfo(`Worktree path repaired: ${repairResult.newPath}`);
339
+
340
+ // 修復後に再度解決を試みる
341
+ existingWorktreeResolution = await resolveWorktreePathForBranch(branch);
342
+ existingWorktree = existingWorktreeResolution.path;
343
+ } else if (repairResult.removed) {
344
+ // FR-013: メタデータ削除成功時のメッセージ
345
+ printInfo(`Stale worktree metadata removed. Creating new worktree...`);
346
+ } else {
347
+ printWarning(`Failed to repair worktree for '${branch}'.`);
348
+ }
350
349
  }
351
350
 
352
351
  const isProtectedBranch =
@@ -496,16 +495,21 @@ export async function handleAIToolWorkflow(
496
495
  divergenceBranches.add(sanitizedRemoteBranch);
497
496
  }
498
497
 
499
- const divergenceResult = await runGitStep("check branch divergence", () =>
500
- getBranchDivergenceStatuses({
498
+ let divergenceStatuses: Awaited<
499
+ ReturnType<typeof getBranchDivergenceStatuses>
500
+ > = [];
501
+ try {
502
+ divergenceStatuses = await getBranchDivergenceStatuses({
501
503
  cwd: repoRoot,
502
504
  branches: Array.from(divergenceBranches),
503
- }),
504
- );
505
- if (!divergenceResult.ok) {
506
- return;
505
+ });
506
+ } catch (error) {
507
+ const details = error instanceof Error ? error.message : String(error);
508
+ printWarning(
509
+ `Failed to check branch divergence. Error: ${details}. Continuing without blocking.`,
510
+ );
511
+ divergenceStatuses = [];
507
512
  }
508
- const divergenceStatuses = divergenceResult.value;
509
513
  const divergedBranches = divergenceStatuses.filter(
510
514
  (status) => status.remoteAhead > 0 && status.localAhead > 0,
511
515
  );
@@ -519,24 +523,18 @@ export async function handleAIToolWorkflow(
519
523
  ({ branch: divergedBranch, remoteAhead, localAhead }) => {
520
524
  const highlight =
521
525
  divergedBranch === branch ? " (selected branch)" : "";
522
- console.warn(
526
+ writeTerminalLine(
523
527
  chalk.yellow(
524
528
  ` • ${divergedBranch}${highlight} remote:+${remoteAhead} local:+${localAhead}`,
525
529
  ),
530
+ "stderr",
526
531
  );
527
532
  },
528
533
  );
529
534
 
530
535
  printWarning(
531
- "Resolve these divergences (e.g., rebase or merge) before launching to avoid conflicts.",
532
- );
533
- await waitForEnter(
534
- "Press Enter to return to the main menu and resolve these issues manually.",
535
- );
536
- printWarning(
537
- "AI tool launch has been cancelled until divergences are resolved.",
536
+ "Resolve these divergences (e.g., rebase or merge) to avoid conflicts. Continuing without blocking.",
538
537
  );
539
- return;
540
538
  } else if (fastForwardError) {
541
539
  printWarning(
542
540
  `Fast-forward pull could not complete (${fastForwardError.message}). Continuing without blocking.`,
@@ -565,6 +563,7 @@ export async function handleAIToolWorkflow(
565
563
  model: normalizedModel ?? null,
566
564
  reasoningLevel: inferenceLevel ?? null,
567
565
  skipPermissions: skipPermissions ?? null,
566
+ toolVersion: toolVersion ?? null,
568
567
  timestamp: Date.now(),
569
568
  repositoryRoot: repoRoot,
570
569
  });
@@ -612,6 +611,7 @@ export async function handleAIToolWorkflow(
612
611
  model: normalizedModel ?? null,
613
612
  reasoningLevel: inferenceLevel ?? null,
614
613
  skipPermissions: skipPermissions ?? null,
614
+ toolVersion: toolVersion ?? null,
615
615
  timestamp: Date.now(),
616
616
  repositoryRoot: repoRoot,
617
617
  },
@@ -635,6 +635,8 @@ export async function handleAIToolWorkflow(
635
635
  model?: string;
636
636
  sessionId?: string | null;
637
637
  chrome?: boolean;
638
+ branch?: string | null;
639
+ version?: string | null;
638
640
  } = {
639
641
  mode:
640
642
  mode === "resume"
@@ -646,6 +648,8 @@ export async function handleAIToolWorkflow(
646
648
  envOverrides: sharedEnv,
647
649
  sessionId: resumeSessionId,
648
650
  chrome: true,
651
+ branch,
652
+ version: toolVersion ?? null,
649
653
  };
650
654
  if (normalizedModel) {
651
655
  launchOptions.model = normalizedModel;
@@ -659,6 +663,8 @@ export async function handleAIToolWorkflow(
659
663
  model?: string;
660
664
  reasoningEffort?: CodexReasoningEffort;
661
665
  sessionId?: string | null;
666
+ branch?: string | null;
667
+ version?: string | null;
662
668
  } = {
663
669
  mode:
664
670
  mode === "resume"
@@ -669,6 +675,8 @@ export async function handleAIToolWorkflow(
669
675
  bypassApprovals: skipPermissions,
670
676
  envOverrides: sharedEnv,
671
677
  sessionId: resumeSessionId,
678
+ branch,
679
+ version: toolVersion ?? null,
672
680
  };
673
681
  if (normalizedModel) {
674
682
  launchOptions.model = normalizedModel;
@@ -685,6 +693,8 @@ export async function handleAIToolWorkflow(
685
693
  envOverrides?: Record<string, string>;
686
694
  model?: string;
687
695
  sessionId?: string | null;
696
+ branch?: string | null;
697
+ version?: string | null;
688
698
  } = {
689
699
  mode:
690
700
  mode === "resume"
@@ -695,25 +705,35 @@ export async function handleAIToolWorkflow(
695
705
  skipPermissions,
696
706
  envOverrides: sharedEnv,
697
707
  sessionId: resumeSessionId,
708
+ branch,
709
+ version: toolVersion ?? null,
698
710
  };
699
711
  if (normalizedModel) {
700
712
  launchOptions.model = normalizedModel;
701
713
  }
702
714
  launchResult = await launchGeminiCLI(worktreePath, launchOptions);
703
715
  } else {
704
- // Custom coding agent
716
+ // Custom coding agent (including OpenCode)
705
717
  printInfo(`Launching custom agent: ${agentConfig.displayName}`);
706
- launchResult = await launchCodingAgent(agentConfig, {
707
- mode:
708
- mode === "resume"
709
- ? "resume"
710
- : mode === "continue"
711
- ? "continue"
712
- : "normal",
713
- skipPermissions,
714
- cwd: worktreePath,
715
- sharedEnv,
716
- });
718
+ const customLaunchOptions: import("./types/tools.js").CodingAgentLaunchOptions =
719
+ {
720
+ mode:
721
+ mode === "resume"
722
+ ? "resume"
723
+ : mode === "continue"
724
+ ? "continue"
725
+ : "normal",
726
+ skipPermissions,
727
+ cwd: worktreePath,
728
+ sharedEnv,
729
+ };
730
+ if (toolVersion) {
731
+ customLaunchOptions.version = toolVersion;
732
+ }
733
+ launchResult = await launchCodingAgent(
734
+ agentConfig,
735
+ customLaunchOptions,
736
+ );
717
737
  }
718
738
  } finally {
719
739
  // FR-043: Clear the periodic timestamp update timer
@@ -726,10 +746,29 @@ export async function handleAIToolWorkflow(
726
746
  resumeSessionId ??
727
747
  null;
728
748
 
749
+ let resolvedWorktrees: { path: string; branch: string }[] | null = null;
750
+ if (branch) {
751
+ try {
752
+ const allWorktrees = await listAllWorktrees();
753
+ resolvedWorktrees = allWorktrees
754
+ .filter((entry) => entry?.path && entry?.branch)
755
+ .map((entry) => ({ path: entry.path, branch: entry.branch }));
756
+ } catch {
757
+ resolvedWorktrees = null;
758
+ }
759
+ }
760
+ const worktreeLookupOptions =
761
+ resolvedWorktrees && resolvedWorktrees.length > 0
762
+ ? { worktrees: resolvedWorktrees }
763
+ : {};
764
+
729
765
  if (!finalSessionId && tool === "claude-code") {
730
766
  try {
731
767
  finalSessionId =
732
- (await findLatestClaudeSessionId(worktreePath)) ?? null;
768
+ (await findLatestClaudeSessionId(worktreePath, {
769
+ branch,
770
+ ...worktreeLookupOptions,
771
+ })) ?? null;
733
772
  } catch {
734
773
  finalSessionId = null;
735
774
  }
@@ -744,6 +783,8 @@ export async function handleAIToolWorkflow(
744
783
  preferClosestTo: finishedAt,
745
784
  windowMs: 60 * 60 * 1000,
746
785
  cwd: worktreePath,
786
+ branch,
787
+ ...worktreeLookupOptions,
747
788
  });
748
789
  if (latest) {
749
790
  finalSessionId = latest.id;
@@ -758,6 +799,8 @@ export async function handleAIToolWorkflow(
758
799
  until: finishedAt + 60_000,
759
800
  preferClosestTo: finishedAt,
760
801
  windowMs: 60 * 60 * 1000,
802
+ branch,
803
+ ...worktreeLookupOptions,
761
804
  });
762
805
  if (latestClaude) {
763
806
  finalSessionId = latestClaude.id;
@@ -773,6 +816,8 @@ export async function handleAIToolWorkflow(
773
816
  preferClosestTo: finishedAt,
774
817
  windowMs: 60 * 60 * 1000,
775
818
  cwd: worktreePath,
819
+ branch,
820
+ ...worktreeLookupOptions,
776
821
  });
777
822
  if (latestGemini) {
778
823
  finalSessionId = latestGemini.id;
@@ -791,6 +836,7 @@ export async function handleAIToolWorkflow(
791
836
  model: normalizedModel ?? null,
792
837
  reasoningLevel: inferenceLevel ?? null,
793
838
  skipPermissions: skipPermissions ?? null,
839
+ toolVersion: toolVersion ?? null,
794
840
  timestamp: Date.now(),
795
841
  repositoryRoot: repoRoot,
796
842
  lastSessionId: finalSessionId,
@@ -833,7 +879,8 @@ export async function handleAIToolWorkflow(
833
879
 
834
880
  // Small buffer before returning to branch list to avoid abrupt screen swap
835
881
  await new Promise((resolve) => setTimeout(resolve, POST_SESSION_DELAY_MS));
836
- printInfo("Session completed successfully. Returning to main menu...");
882
+ printInfo("Session completed successfully.");
883
+ await waitForUserAcknowledgement(SUCCESS_PROMPT);
837
884
  return;
838
885
  } catch (error) {
839
886
  // Handle recoverable errors (Git, Worktree, Codex errors)
@@ -851,6 +898,10 @@ export async function handleAIToolWorkflow(
851
898
  type UIHandler = () => Promise<SelectionResult | undefined>;
852
899
  type WorkflowHandler = (selection: SelectionResult) => Promise<void>;
853
900
 
901
+ function resolveUIHandler(): UIHandler {
902
+ return mainSolidUI;
903
+ }
904
+
854
905
  function logLoopError(error: unknown, context: "ui" | "workflow"): void {
855
906
  const label = context === "ui" ? "UI" : "workflow";
856
907
  if (error instanceof Error) {
@@ -861,10 +912,10 @@ function logLoopError(error: unknown, context: "ui" | "workflow"): void {
861
912
  }
862
913
 
863
914
  export async function runInteractiveLoop(
864
- uiHandler: UIHandler = mainInkUI,
915
+ uiHandler: UIHandler = resolveUIHandler(),
865
916
  workflowHandler: WorkflowHandler = handleAIToolWorkflow,
866
917
  ): Promise<void> {
867
- // Main loop: UI → AI Tool → back to UI
918
+ // Main loop: UI → Coding Agent → back to UI
868
919
  while (true) {
869
920
  let selectionResult: SelectionResult | undefined;
870
921
 
@@ -895,6 +946,9 @@ export async function runInteractiveLoop(
895
946
  * Main entry point
896
947
  */
897
948
  export async function main(): Promise<void> {
949
+ // Setup global signal handlers for clean exit
950
+ setupExitHandlers();
951
+
898
952
  // Parse command line arguments
899
953
  const args = process.argv.slice(2);
900
954
  const showVersionFlag = args.includes("-v") || args.includes("--version");
@@ -939,6 +993,9 @@ export async function main(): Promise<void> {
939
993
  }
940
994
 
941
995
  await runInteractiveLoop();
996
+
997
+ // Ensure clean exit with code 0
998
+ process.exit(0);
942
999
  }
943
1000
 
944
1001
  export function isEntryPoint(metaUrl: string, argv1?: string): boolean {
@@ -955,7 +1012,9 @@ export function isEntryPoint(metaUrl: string, argv1?: string): boolean {
955
1012
  // Run the application if this module is executed directly
956
1013
  if (isEntryPoint(import.meta.url, process.argv[1])) {
957
1014
  main().catch(async (error) => {
958
- console.error("Fatal error:", error);
1015
+ const details =
1016
+ error instanceof Error ? (error.stack ?? error.message) : String(error);
1017
+ writeTerminalLine(`Fatal error: ${details}`, "stderr");
959
1018
  await waitForErrorAcknowledgement();
960
1019
  process.exit(1);
961
1020
  });