@akiojin/gwt 4.10.0 → 4.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/README.ja.md +4 -4
  2. package/README.md +4 -4
  3. package/bin/gwt.js +1 -1
  4. package/dist/claude.d.ts +2 -0
  5. package/dist/claude.d.ts.map +1 -1
  6. package/dist/claude.js +97 -68
  7. package/dist/claude.js.map +1 -1
  8. package/dist/cli/ui/App.solid.d.ts +29 -0
  9. package/dist/cli/ui/App.solid.d.ts.map +1 -0
  10. package/dist/cli/ui/App.solid.js +1395 -0
  11. package/dist/cli/ui/App.solid.js.map +1 -0
  12. package/dist/cli/ui/components/solid/Footer.d.ts +10 -0
  13. package/dist/cli/ui/components/solid/Footer.d.ts.map +1 -0
  14. package/dist/cli/ui/components/solid/Footer.js +10 -0
  15. package/dist/cli/ui/components/solid/Footer.js.map +1 -0
  16. package/dist/cli/ui/components/{parts → solid}/Header.d.ts +1 -6
  17. package/dist/cli/ui/components/solid/Header.d.ts.map +1 -0
  18. package/dist/cli/ui/components/solid/Header.js +13 -0
  19. package/dist/cli/ui/components/solid/Header.js.map +1 -0
  20. package/dist/cli/ui/components/solid/HelpOverlay.d.ts +8 -0
  21. package/dist/cli/ui/components/solid/HelpOverlay.d.ts.map +1 -0
  22. package/dist/cli/ui/components/solid/HelpOverlay.js +118 -0
  23. package/dist/cli/ui/components/solid/HelpOverlay.js.map +1 -0
  24. package/dist/cli/ui/components/solid/QuickStartStep.d.ts +17 -0
  25. package/dist/cli/ui/components/solid/QuickStartStep.d.ts.map +1 -0
  26. package/dist/cli/ui/components/solid/QuickStartStep.js +152 -0
  27. package/dist/cli/ui/components/solid/QuickStartStep.js.map +1 -0
  28. package/dist/cli/ui/components/solid/SelectInput.d.ts +22 -0
  29. package/dist/cli/ui/components/solid/SelectInput.d.ts.map +1 -0
  30. package/dist/cli/ui/components/solid/SelectInput.js +45 -0
  31. package/dist/cli/ui/components/solid/SelectInput.js.map +1 -0
  32. package/dist/cli/ui/components/solid/TextInput.d.ts +12 -0
  33. package/dist/cli/ui/components/solid/TextInput.d.ts.map +1 -0
  34. package/dist/cli/ui/components/solid/TextInput.js +9 -0
  35. package/dist/cli/ui/components/solid/TextInput.js.map +1 -0
  36. package/dist/cli/ui/components/solid/WizardController.d.ts +34 -0
  37. package/dist/cli/ui/components/solid/WizardController.d.ts.map +1 -0
  38. package/dist/cli/ui/components/solid/WizardController.js +223 -0
  39. package/dist/cli/ui/components/solid/WizardController.js.map +1 -0
  40. package/dist/cli/ui/components/solid/WizardPopup.d.ts +26 -0
  41. package/dist/cli/ui/components/solid/WizardPopup.d.ts.map +1 -0
  42. package/dist/cli/ui/components/solid/WizardPopup.js +68 -0
  43. package/dist/cli/ui/components/solid/WizardPopup.js.map +1 -0
  44. package/dist/cli/ui/components/solid/WizardSteps.d.ts +52 -0
  45. package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +1 -0
  46. package/dist/cli/ui/components/solid/WizardSteps.js +419 -0
  47. package/dist/cli/ui/components/solid/WizardSteps.js.map +1 -0
  48. package/dist/cli/ui/core/index.d.ts +12 -0
  49. package/dist/cli/ui/core/index.d.ts.map +1 -0
  50. package/dist/cli/ui/core/index.js +15 -0
  51. package/dist/cli/ui/core/index.js.map +1 -0
  52. package/dist/cli/ui/core/keybindings.d.ts +106 -0
  53. package/dist/cli/ui/core/keybindings.d.ts.map +1 -0
  54. package/dist/cli/ui/core/keybindings.js +270 -0
  55. package/dist/cli/ui/core/keybindings.js.map +1 -0
  56. package/dist/cli/ui/core/theme.d.ts +123 -0
  57. package/dist/cli/ui/core/theme.d.ts.map +1 -0
  58. package/dist/cli/ui/core/theme.js +191 -0
  59. package/dist/cli/ui/core/theme.js.map +1 -0
  60. package/dist/cli/ui/core/types.d.ts +156 -0
  61. package/dist/cli/ui/core/types.d.ts.map +1 -0
  62. package/dist/cli/ui/core/types.js +10 -0
  63. package/dist/cli/ui/core/types.js.map +1 -0
  64. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts +26 -0
  65. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts.map +1 -0
  66. package/dist/cli/ui/hooks/solid/useScrollableList.js +89 -0
  67. package/dist/cli/ui/hooks/solid/useScrollableList.js.map +1 -0
  68. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts +10 -0
  69. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts.map +1 -0
  70. package/dist/cli/ui/hooks/solid/useTerminalSize.js +16 -0
  71. package/dist/cli/ui/hooks/solid/useTerminalSize.js.map +1 -0
  72. package/dist/cli/ui/index.solid.d.ts +5 -0
  73. package/dist/cli/ui/index.solid.d.ts.map +1 -0
  74. package/dist/cli/ui/index.solid.js +21 -0
  75. package/dist/cli/ui/index.solid.js.map +1 -0
  76. package/dist/cli/ui/screens/solid/BranchListScreen.d.ts +53 -0
  77. package/dist/cli/ui/screens/solid/BranchListScreen.d.ts.map +1 -0
  78. package/dist/cli/ui/screens/solid/BranchListScreen.js +829 -0
  79. package/dist/cli/ui/screens/solid/BranchListScreen.js.map +1 -0
  80. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts +11 -0
  81. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts.map +1 -0
  82. package/dist/cli/ui/screens/solid/ConfirmScreen.js +45 -0
  83. package/dist/cli/ui/screens/solid/ConfirmScreen.js.map +1 -0
  84. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts +14 -0
  85. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts.map +1 -0
  86. package/dist/cli/ui/screens/solid/EnvironmentScreen.js +90 -0
  87. package/dist/cli/ui/screens/solid/EnvironmentScreen.js.map +1 -0
  88. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts +8 -0
  89. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts.map +1 -0
  90. package/dist/cli/ui/screens/solid/ErrorScreen.js +18 -0
  91. package/dist/cli/ui/screens/solid/ErrorScreen.js.map +1 -0
  92. package/dist/cli/ui/screens/solid/InputScreen.d.ts +13 -0
  93. package/dist/cli/ui/screens/solid/InputScreen.d.ts.map +1 -0
  94. package/dist/cli/ui/screens/solid/InputScreen.js +17 -0
  95. package/dist/cli/ui/screens/solid/InputScreen.js.map +1 -0
  96. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts +9 -0
  97. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts.map +1 -0
  98. package/dist/cli/ui/screens/solid/LoadingIndicator.js +43 -0
  99. package/dist/cli/ui/screens/solid/LoadingIndicator.js.map +1 -0
  100. package/dist/cli/ui/{components/screens → screens/solid}/LogDetailScreen.d.ts +2 -2
  101. package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts.map +1 -0
  102. package/dist/cli/ui/screens/solid/LogDetailScreen.js +34 -0
  103. package/dist/cli/ui/screens/solid/LogDetailScreen.js.map +1 -0
  104. package/dist/cli/ui/{components/screens/LogListScreen.d.ts → screens/solid/LogScreen.d.ts} +10 -4
  105. package/dist/cli/ui/screens/solid/LogScreen.d.ts.map +1 -0
  106. package/dist/cli/ui/screens/solid/LogScreen.js +333 -0
  107. package/dist/cli/ui/screens/solid/LogScreen.js.map +1 -0
  108. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts +17 -0
  109. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts.map +1 -0
  110. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js +115 -0
  111. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js.map +1 -0
  112. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts +17 -0
  113. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts.map +1 -0
  114. package/dist/cli/ui/screens/solid/ProfileScreen.js +50 -0
  115. package/dist/cli/ui/screens/solid/ProfileScreen.js.map +1 -0
  116. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts +20 -0
  117. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts.map +1 -0
  118. package/dist/cli/ui/screens/solid/SelectorScreen.js +98 -0
  119. package/dist/cli/ui/screens/solid/SelectorScreen.js.map +1 -0
  120. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts +13 -0
  121. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts.map +1 -0
  122. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js +59 -0
  123. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js.map +1 -0
  124. package/dist/cli/ui/stores/appStore.d.ts +143 -0
  125. package/dist/cli/ui/stores/appStore.d.ts.map +1 -0
  126. package/dist/cli/ui/stores/appStore.js +158 -0
  127. package/dist/cli/ui/stores/appStore.js.map +1 -0
  128. package/dist/cli/ui/stores/branchStore.d.ts +159 -0
  129. package/dist/cli/ui/stores/branchStore.d.ts.map +1 -0
  130. package/dist/cli/ui/stores/branchStore.js +275 -0
  131. package/dist/cli/ui/stores/branchStore.js.map +1 -0
  132. package/dist/cli/ui/stores/index.d.ts +11 -0
  133. package/dist/cli/ui/stores/index.d.ts.map +1 -0
  134. package/dist/cli/ui/stores/index.js +14 -0
  135. package/dist/cli/ui/stores/index.js.map +1 -0
  136. package/dist/cli/ui/stores/uiStore.d.ts +146 -0
  137. package/dist/cli/ui/stores/uiStore.d.ts.map +1 -0
  138. package/dist/cli/ui/stores/uiStore.js +166 -0
  139. package/dist/cli/ui/stores/uiStore.js.map +1 -0
  140. package/dist/cli/ui/types.d.ts +17 -1
  141. package/dist/cli/ui/types.d.ts.map +1 -1
  142. package/dist/cli/ui/utils/branchFormatter.d.ts +1 -0
  143. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
  144. package/dist/cli/ui/utils/branchFormatter.js +36 -217
  145. package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
  146. package/dist/cli/ui/utils/continueSession.d.ts +18 -0
  147. package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
  148. package/dist/cli/ui/utils/continueSession.js +90 -2
  149. package/dist/cli/ui/utils/continueSession.js.map +1 -1
  150. package/dist/cli/ui/utils/versionCache.d.ts +37 -0
  151. package/dist/cli/ui/utils/versionCache.d.ts.map +1 -0
  152. package/dist/cli/ui/utils/versionCache.js +70 -0
  153. package/dist/cli/ui/utils/versionCache.js.map +1 -0
  154. package/dist/cli/ui/utils/versionFetcher.d.ts +41 -0
  155. package/dist/cli/ui/utils/versionFetcher.d.ts.map +1 -0
  156. package/dist/cli/ui/utils/versionFetcher.js +89 -0
  157. package/dist/cli/ui/utils/versionFetcher.js.map +1 -0
  158. package/dist/client/assets/{index-ChHC-Puh.css → index-BbfV7Wuj.css} +1 -1
  159. package/dist/client/assets/index-CoAyq5x1.js +78 -0
  160. package/dist/client/index.html +2 -2
  161. package/dist/codex.d.ts +2 -0
  162. package/dist/codex.d.ts.map +1 -1
  163. package/dist/codex.js +109 -39
  164. package/dist/codex.js.map +1 -1
  165. package/dist/config/builtin-coding-agents.js +4 -4
  166. package/dist/config/builtin-coding-agents.js.map +1 -1
  167. package/dist/config/index.d.ts +2 -0
  168. package/dist/config/index.d.ts.map +1 -1
  169. package/dist/config/index.js +11 -0
  170. package/dist/config/index.js.map +1 -1
  171. package/dist/gemini.d.ts +2 -0
  172. package/dist/gemini.d.ts.map +1 -1
  173. package/dist/gemini.js +77 -39
  174. package/dist/gemini.js.map +1 -1
  175. package/dist/index.d.ts +1 -1
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +153 -103
  178. package/dist/index.js.map +1 -1
  179. package/dist/launcher.d.ts.map +1 -1
  180. package/dist/launcher.js +56 -6
  181. package/dist/launcher.js.map +1 -1
  182. package/dist/logging/agentOutput.d.ts +21 -0
  183. package/dist/logging/agentOutput.d.ts.map +1 -0
  184. package/dist/logging/agentOutput.js +164 -0
  185. package/dist/logging/agentOutput.js.map +1 -0
  186. package/dist/logging/formatter.d.ts.map +1 -1
  187. package/dist/logging/formatter.js +18 -4
  188. package/dist/logging/formatter.js.map +1 -1
  189. package/dist/logging/logger.d.ts.map +1 -1
  190. package/dist/logging/logger.js +28 -9
  191. package/dist/logging/logger.js.map +1 -1
  192. package/dist/logging/reader.d.ts +21 -0
  193. package/dist/logging/reader.d.ts.map +1 -1
  194. package/dist/logging/reader.js +79 -0
  195. package/dist/logging/reader.js.map +1 -1
  196. package/dist/opentui/highlights-eq9cgrbb.scm +604 -0
  197. package/dist/opentui/highlights-ghv9g403.scm +205 -0
  198. package/dist/opentui/highlights-hk7bwhj4.scm +284 -0
  199. package/dist/opentui/highlights-r812a2qc.scm +150 -0
  200. package/dist/opentui/highlights-x6tmsnaa.scm +115 -0
  201. package/dist/opentui/index.solid.d.ts +2 -0
  202. package/dist/opentui/index.solid.d.ts.map +1 -0
  203. package/dist/opentui/index.solid.js +53687 -0
  204. package/dist/opentui/index.solid.js.map +1 -0
  205. package/dist/opentui/injections-73j83es3.scm +27 -0
  206. package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  207. package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
  208. package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  209. package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  210. package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
  211. package/dist/repositories/worktree.repository.d.ts +1 -0
  212. package/dist/repositories/worktree.repository.d.ts.map +1 -1
  213. package/dist/repositories/worktree.repository.js +7 -0
  214. package/dist/repositories/worktree.repository.js.map +1 -1
  215. package/dist/services/codingAgentResolver.d.ts +2 -0
  216. package/dist/services/codingAgentResolver.d.ts.map +1 -1
  217. package/dist/services/codingAgentResolver.js +30 -4
  218. package/dist/services/codingAgentResolver.js.map +1 -1
  219. package/dist/services/dependency-installer.d.ts.map +1 -1
  220. package/dist/services/dependency-installer.js +2 -7
  221. package/dist/services/dependency-installer.js.map +1 -1
  222. package/dist/types/api.d.ts +3 -0
  223. package/dist/types/api.d.ts.map +1 -1
  224. package/dist/types/coding-agent.d.ts +62 -0
  225. package/dist/types/coding-agent.d.ts.map +1 -0
  226. package/dist/types/coding-agent.js +29 -0
  227. package/dist/types/coding-agent.js.map +1 -0
  228. package/dist/types/tools.d.ts +17 -0
  229. package/dist/types/tools.d.ts.map +1 -1
  230. package/dist/utils/coding-agent-colors.d.ts +88 -0
  231. package/dist/utils/coding-agent-colors.d.ts.map +1 -0
  232. package/dist/utils/coding-agent-colors.js +137 -0
  233. package/dist/utils/coding-agent-colors.js.map +1 -0
  234. package/dist/utils/command.d.ts +1 -1
  235. package/dist/utils/command.js +1 -1
  236. package/dist/utils/error-utils.d.ts +27 -0
  237. package/dist/utils/error-utils.d.ts.map +1 -0
  238. package/dist/utils/error-utils.js +98 -0
  239. package/dist/utils/error-utils.js.map +1 -0
  240. package/dist/utils/npmRegistry.d.ts +61 -0
  241. package/dist/utils/npmRegistry.d.ts.map +1 -0
  242. package/dist/utils/npmRegistry.js +180 -0
  243. package/dist/utils/npmRegistry.js.map +1 -0
  244. package/dist/utils/prompt.d.ts +1 -1
  245. package/dist/utils/prompt.js +1 -1
  246. package/dist/utils/session/common.d.ts +8 -0
  247. package/dist/utils/session/common.d.ts.map +1 -1
  248. package/dist/utils/session/common.js +22 -0
  249. package/dist/utils/session/common.js.map +1 -1
  250. package/dist/utils/session/parsers/claude.d.ts +10 -4
  251. package/dist/utils/session/parsers/claude.d.ts.map +1 -1
  252. package/dist/utils/session/parsers/claude.js +64 -18
  253. package/dist/utils/session/parsers/claude.js.map +1 -1
  254. package/dist/utils/session/parsers/codex.d.ts.map +1 -1
  255. package/dist/utils/session/parsers/codex.js +47 -20
  256. package/dist/utils/session/parsers/codex.js.map +1 -1
  257. package/dist/utils/session/parsers/gemini.d.ts.map +1 -1
  258. package/dist/utils/session/parsers/gemini.js +43 -6
  259. package/dist/utils/session/parsers/gemini.js.map +1 -1
  260. package/dist/utils/session/parsers/opencode.d.ts.map +1 -1
  261. package/dist/utils/session/parsers/opencode.js +43 -6
  262. package/dist/utils/session/parsers/opencode.js.map +1 -1
  263. package/dist/utils/session/types.d.ts +7 -0
  264. package/dist/utils/session/types.d.ts.map +1 -1
  265. package/dist/utils/terminal.d.ts +1 -0
  266. package/dist/utils/terminal.d.ts.map +1 -1
  267. package/dist/utils/terminal.js +20 -0
  268. package/dist/utils/terminal.js.map +1 -1
  269. package/dist/utils.d.ts +9 -0
  270. package/dist/utils.d.ts.map +1 -1
  271. package/dist/utils.js +33 -2
  272. package/dist/utils.js.map +1 -1
  273. package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +1 -1
  274. package/dist/web/client/src/components/CodingAgentLaunchModal.js +7 -16
  275. package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +1 -1
  276. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
  277. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +7 -2
  278. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
  279. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -1
  280. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +2 -1
  281. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -1
  282. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +2 -2
  283. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -1
  284. package/dist/web/client/src/components/branch-detail/ToolLauncher.js +5 -5
  285. package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -1
  286. package/dist/web/client/src/components/ui/alert.d.ts +1 -1
  287. package/dist/web/client/src/lib/coding-agent-colors.d.ts +86 -0
  288. package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +1 -0
  289. package/dist/web/client/src/lib/coding-agent-colors.js +135 -0
  290. package/dist/web/client/src/lib/coding-agent-colors.js.map +1 -0
  291. package/dist/web/client/src/pages/BranchDetailPage.js +10 -10
  292. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
  293. package/dist/web/server/pty/manager.d.ts +2 -0
  294. package/dist/web/server/pty/manager.d.ts.map +1 -1
  295. package/dist/web/server/pty/manager.js +104 -0
  296. package/dist/web/server/pty/manager.js.map +1 -1
  297. package/dist/web/server/routes/sessions.d.ts.map +1 -1
  298. package/dist/web/server/routes/sessions.js +5 -1
  299. package/dist/web/server/routes/sessions.js.map +1 -1
  300. package/dist/web/server/services/branches.d.ts.map +1 -1
  301. package/dist/web/server/services/branches.js +10 -8
  302. package/dist/web/server/services/branches.js.map +1 -1
  303. package/dist/web/server/services/worktrees.js +2 -2
  304. package/dist/web/server/services/worktrees.js.map +1 -1
  305. package/dist/worktree.d.ts +50 -1
  306. package/dist/worktree.d.ts.map +1 -1
  307. package/dist/worktree.js +292 -100
  308. package/dist/worktree.js.map +1 -1
  309. package/package.json +13 -14
  310. package/src/claude.ts +129 -95
  311. package/src/cli/ui/App.solid.tsx +2096 -0
  312. package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +1084 -0
  313. package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +343 -0
  314. package/src/cli/ui/__tests__/solid/ConfirmScreen.test.tsx +77 -0
  315. package/src/cli/ui/__tests__/solid/LogScreen.test.tsx +351 -0
  316. package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +308 -0
  317. package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +231 -0
  318. package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +241 -0
  319. package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +79 -334
  320. package/src/cli/ui/__tests__/utils/clipboard.test.ts +3 -3
  321. package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +1 -1
  322. package/src/cli/ui/components/solid/Footer.tsx +36 -0
  323. package/src/cli/ui/components/{parts → solid}/Header.tsx +17 -28
  324. package/src/cli/ui/components/solid/HelpOverlay.tsx +194 -0
  325. package/src/cli/ui/components/solid/QuickStartStep.tsx +209 -0
  326. package/src/cli/ui/components/{parts → solid}/ScrollableList.tsx +7 -8
  327. package/src/cli/ui/components/solid/SearchInput.tsx +42 -0
  328. package/src/cli/ui/components/solid/SelectInput.tsx +88 -0
  329. package/src/cli/ui/components/solid/Stats.tsx +92 -0
  330. package/src/cli/ui/components/solid/TextInput.tsx +49 -0
  331. package/src/cli/ui/components/solid/WizardController.tsx +393 -0
  332. package/src/cli/ui/components/solid/WizardPopup.tsx +135 -0
  333. package/src/cli/ui/components/solid/WizardSteps.tsx +736 -0
  334. package/src/cli/ui/core/index.ts +17 -0
  335. package/src/cli/ui/core/keybindings.ts +367 -0
  336. package/src/cli/ui/core/theme.ts +266 -0
  337. package/src/cli/ui/core/types.ts +235 -0
  338. package/src/cli/ui/hooks/solid/useAsyncOperation.ts +78 -0
  339. package/src/cli/ui/hooks/solid/useFilter.ts +86 -0
  340. package/src/cli/ui/hooks/solid/useGitOperations.ts +81 -0
  341. package/src/cli/ui/hooks/solid/useKeyHandler.ts +103 -0
  342. package/src/cli/ui/hooks/solid/useScrollableList.ts +149 -0
  343. package/src/cli/ui/hooks/solid/useSelection.ts +77 -0
  344. package/src/cli/ui/hooks/solid/useTerminalSize.ts +22 -0
  345. package/src/cli/ui/index.solid.ts +28 -0
  346. package/src/cli/ui/screens/solid/BranchListScreen.tsx +1153 -0
  347. package/src/cli/ui/screens/solid/ConfirmScreen.tsx +86 -0
  348. package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +161 -0
  349. package/src/cli/ui/screens/solid/ErrorScreen.tsx +42 -0
  350. package/src/cli/ui/screens/solid/InputScreen.tsx +55 -0
  351. package/src/cli/ui/screens/solid/LoadingIndicator.tsx +77 -0
  352. package/src/cli/ui/screens/solid/LogDetailScreen.tsx +75 -0
  353. package/src/cli/ui/screens/solid/LogScreen.tsx +504 -0
  354. package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +196 -0
  355. package/src/cli/ui/screens/solid/ProfileScreen.tsx +98 -0
  356. package/src/cli/ui/screens/solid/SelectorScreen.tsx +181 -0
  357. package/src/cli/ui/screens/solid/SettingsScreen.tsx +52 -0
  358. package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +136 -0
  359. package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +40 -0
  360. package/src/cli/ui/stores/appStore.ts +208 -0
  361. package/src/cli/ui/stores/branchStore.ts +357 -0
  362. package/src/cli/ui/stores/index.ts +31 -0
  363. package/src/cli/ui/stores/uiStore.ts +226 -0
  364. package/src/cli/ui/types.ts +21 -3
  365. package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +227 -0
  366. package/src/cli/ui/utils/branchFormatter.ts +43 -222
  367. package/src/cli/ui/utils/continueSession.ts +133 -2
  368. package/src/cli/ui/utils/modelOptions.test.ts +1 -1
  369. package/src/cli/ui/utils/versionCache.ts +93 -0
  370. package/src/cli/ui/utils/versionFetcher.ts +120 -0
  371. package/src/codex.ts +138 -39
  372. package/src/config/__tests__/saveSession.test.ts +143 -0
  373. package/src/config/builtin-coding-agents.ts +4 -4
  374. package/src/config/index.ts +14 -0
  375. package/src/gemini.ts +107 -46
  376. package/src/index.test.ts +25 -19
  377. package/src/index.ts +202 -143
  378. package/src/launcher.ts +66 -6
  379. package/src/logging/agentOutput.ts +216 -0
  380. package/src/logging/formatter.ts +23 -4
  381. package/src/logging/logger.ts +34 -10
  382. package/src/logging/reader.ts +117 -0
  383. package/src/opentui/index.solid.ts +1 -0
  384. package/src/repositories/worktree.repository.ts +8 -0
  385. package/src/services/__tests__/BatchMergeService.test.ts +83 -67
  386. package/src/services/__tests__/WorktreeOrchestrator.test.ts +8 -7
  387. package/src/services/codingAgentResolver.ts +30 -4
  388. package/src/services/dependency-installer.ts +2 -9
  389. package/src/types/api.ts +3 -0
  390. package/src/types/coding-agent.ts +85 -0
  391. package/src/types/tools.ts +19 -0
  392. package/src/utils/__tests__/npmRegistry.test.ts +250 -0
  393. package/src/utils/__tests__/prompt.test.ts +4 -5
  394. package/src/utils/coding-agent-colors.ts +165 -0
  395. package/src/utils/command.ts +1 -1
  396. package/src/utils/error-utils.ts +133 -0
  397. package/src/utils/npmRegistry.ts +249 -0
  398. package/src/utils/prompt.ts +1 -1
  399. package/src/utils/session/common.ts +28 -0
  400. package/src/utils/session/parsers/claude.ts +79 -29
  401. package/src/utils/session/parsers/codex.ts +50 -18
  402. package/src/utils/session/parsers/gemini.ts +46 -5
  403. package/src/utils/session/parsers/opencode.ts +46 -5
  404. package/src/utils/session/types.ts +4 -0
  405. package/src/utils/terminal.ts +24 -0
  406. package/src/utils.test.ts +1 -1
  407. package/src/utils.ts +37 -4
  408. package/src/web/client/src/components/CodingAgentLaunchModal.tsx +12 -21
  409. package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +16 -1
  410. package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +7 -1
  411. package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +11 -6
  412. package/src/web/client/src/lib/coding-agent-colors.ts +149 -0
  413. package/src/web/client/src/pages/BranchDetailPage.tsx +11 -11
  414. package/src/web/server/pty/manager.ts +139 -0
  415. package/src/web/server/routes/sessions.ts +6 -0
  416. package/src/web/server/services/branches.ts +11 -8
  417. package/src/web/server/services/worktrees.ts +2 -2
  418. package/src/worktree.ts +386 -114
  419. package/dist/cli/ui/components/App.d.ts +0 -25
  420. package/dist/cli/ui/components/App.d.ts.map +0 -1
  421. package/dist/cli/ui/components/App.js +0 -1006
  422. package/dist/cli/ui/components/App.js.map +0 -1
  423. package/dist/cli/ui/components/common/Confirm.d.ts +0 -13
  424. package/dist/cli/ui/components/common/Confirm.d.ts.map +0 -1
  425. package/dist/cli/ui/components/common/Confirm.js +0 -20
  426. package/dist/cli/ui/components/common/Confirm.js.map +0 -1
  427. package/dist/cli/ui/components/common/ErrorBoundary.d.ts +0 -23
  428. package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +0 -1
  429. package/dist/cli/ui/components/common/ErrorBoundary.js +0 -37
  430. package/dist/cli/ui/components/common/ErrorBoundary.js.map +0 -1
  431. package/dist/cli/ui/components/common/Input.d.ts +0 -19
  432. package/dist/cli/ui/components/common/Input.d.ts.map +0 -1
  433. package/dist/cli/ui/components/common/Input.js +0 -22
  434. package/dist/cli/ui/components/common/Input.js.map +0 -1
  435. package/dist/cli/ui/components/common/LoadingIndicator.d.ts +0 -19
  436. package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +0 -1
  437. package/dist/cli/ui/components/common/LoadingIndicator.js +0 -61
  438. package/dist/cli/ui/components/common/LoadingIndicator.js.map +0 -1
  439. package/dist/cli/ui/components/common/Select.d.ts +0 -38
  440. package/dist/cli/ui/components/common/Select.d.ts.map +0 -1
  441. package/dist/cli/ui/components/common/Select.js +0 -151
  442. package/dist/cli/ui/components/common/Select.js.map +0 -1
  443. package/dist/cli/ui/components/common/SpinnerIcon.d.ts +0 -20
  444. package/dist/cli/ui/components/common/SpinnerIcon.d.ts.map +0 -1
  445. package/dist/cli/ui/components/common/SpinnerIcon.js +0 -61
  446. package/dist/cli/ui/components/common/SpinnerIcon.js.map +0 -1
  447. package/dist/cli/ui/components/parts/Footer.d.ts +0 -15
  448. package/dist/cli/ui/components/parts/Footer.d.ts.map +0 -1
  449. package/dist/cli/ui/components/parts/Footer.js +0 -20
  450. package/dist/cli/ui/components/parts/Footer.js.map +0 -1
  451. package/dist/cli/ui/components/parts/Header.d.ts.map +0 -1
  452. package/dist/cli/ui/components/parts/Header.js +0 -24
  453. package/dist/cli/ui/components/parts/Header.js.map +0 -1
  454. package/dist/cli/ui/components/parts/MergeStatusList.d.ts +0 -13
  455. package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +0 -1
  456. package/dist/cli/ui/components/parts/MergeStatusList.js +0 -52
  457. package/dist/cli/ui/components/parts/MergeStatusList.js.map +0 -1
  458. package/dist/cli/ui/components/parts/ProgressBar.d.ts +0 -13
  459. package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +0 -1
  460. package/dist/cli/ui/components/parts/ProgressBar.js +0 -53
  461. package/dist/cli/ui/components/parts/ProgressBar.js.map +0 -1
  462. package/dist/cli/ui/components/parts/ScrollableList.d.ts +0 -12
  463. package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +0 -1
  464. package/dist/cli/ui/components/parts/ScrollableList.js +0 -11
  465. package/dist/cli/ui/components/parts/ScrollableList.js.map +0 -1
  466. package/dist/cli/ui/components/parts/Stats.d.ts +0 -10
  467. package/dist/cli/ui/components/parts/Stats.d.ts.map +0 -1
  468. package/dist/cli/ui/components/parts/Stats.js +0 -55
  469. package/dist/cli/ui/components/parts/Stats.js.map +0 -1
  470. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +0 -17
  471. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +0 -1
  472. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +0 -42
  473. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +0 -1
  474. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +0 -17
  475. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +0 -1
  476. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +0 -72
  477. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +0 -1
  478. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +0 -18
  479. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +0 -1
  480. package/dist/cli/ui/components/screens/BranchCreatorScreen.js +0 -151
  481. package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +0 -1
  482. package/dist/cli/ui/components/screens/BranchListScreen.d.ts +0 -60
  483. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +0 -1
  484. package/dist/cli/ui/components/screens/BranchListScreen.js +0 -476
  485. package/dist/cli/ui/components/screens/BranchListScreen.js.map +0 -1
  486. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +0 -30
  487. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +0 -1
  488. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +0 -148
  489. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +0 -1
  490. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts +0 -27
  491. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts.map +0 -1
  492. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js +0 -93
  493. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js.map +0 -1
  494. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +0 -19
  495. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +0 -1
  496. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +0 -577
  497. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +0 -1
  498. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +0 -45
  499. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +0 -1
  500. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +0 -95
  501. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +0 -1
  502. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +0 -10
  503. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +0 -1
  504. package/dist/cli/ui/components/screens/LogDatePickerScreen.js +0 -44
  505. package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +0 -1
  506. package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +0 -1
  507. package/dist/cli/ui/components/screens/LogDetailScreen.js +0 -34
  508. package/dist/cli/ui/components/screens/LogDetailScreen.js.map +0 -1
  509. package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +0 -1
  510. package/dist/cli/ui/components/screens/LogListScreen.js +0 -107
  511. package/dist/cli/ui/components/screens/LogListScreen.js.map +0 -1
  512. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +0 -24
  513. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +0 -1
  514. package/dist/cli/ui/components/screens/ModelSelectorScreen.js +0 -197
  515. package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +0 -1
  516. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +0 -29
  517. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +0 -1
  518. package/dist/cli/ui/components/screens/PRCleanupScreen.js +0 -92
  519. package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +0 -1
  520. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +0 -31
  521. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +0 -1
  522. package/dist/cli/ui/components/screens/SessionSelectorScreen.js +0 -67
  523. package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +0 -1
  524. package/dist/cli/ui/hooks/useAppInput.d.ts +0 -21
  525. package/dist/cli/ui/hooks/useAppInput.d.ts.map +0 -1
  526. package/dist/cli/ui/hooks/useAppInput.js +0 -138
  527. package/dist/cli/ui/hooks/useAppInput.js.map +0 -1
  528. package/dist/cli/ui/hooks/useBatchMerge.d.ts +0 -17
  529. package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +0 -1
  530. package/dist/cli/ui/hooks/useBatchMerge.js +0 -77
  531. package/dist/cli/ui/hooks/useBatchMerge.js.map +0 -1
  532. package/dist/cli/ui/hooks/useGitData.d.ts +0 -21
  533. package/dist/cli/ui/hooks/useGitData.d.ts.map +0 -1
  534. package/dist/cli/ui/hooks/useGitData.js +0 -229
  535. package/dist/cli/ui/hooks/useGitData.js.map +0 -1
  536. package/dist/cli/ui/hooks/useProfiles.d.ts +0 -41
  537. package/dist/cli/ui/hooks/useProfiles.d.ts.map +0 -1
  538. package/dist/cli/ui/hooks/useProfiles.js +0 -136
  539. package/dist/cli/ui/hooks/useProfiles.js.map +0 -1
  540. package/dist/cli/ui/hooks/useScreenState.d.ts +0 -12
  541. package/dist/cli/ui/hooks/useScreenState.d.ts.map +0 -1
  542. package/dist/cli/ui/hooks/useScreenState.js +0 -30
  543. package/dist/cli/ui/hooks/useScreenState.js.map +0 -1
  544. package/dist/cli/ui/hooks/useTerminalSize.d.ts +0 -9
  545. package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +0 -1
  546. package/dist/cli/ui/hooks/useTerminalSize.js +0 -24
  547. package/dist/cli/ui/hooks/useTerminalSize.js.map +0 -1
  548. package/dist/cli/ui/hooks/useToolStatus.d.ts +0 -30
  549. package/dist/cli/ui/hooks/useToolStatus.d.ts.map +0 -1
  550. package/dist/cli/ui/hooks/useToolStatus.js +0 -49
  551. package/dist/cli/ui/hooks/useToolStatus.js.map +0 -1
  552. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +0 -24
  553. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +0 -1
  554. package/dist/cli/ui/screens/BranchActionSelectorScreen.js +0 -65
  555. package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +0 -1
  556. package/dist/client/assets/index-LNPtOrn3.js +0 -78
  557. package/src/cli/ui/__tests__/SKIPPED_TESTS.md +0 -119
  558. package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +0 -239
  559. package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +0 -225
  560. package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +0 -219
  561. package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +0 -212
  562. package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +0 -440
  563. package/src/cli/ui/__tests__/components/App.test.tsx +0 -365
  564. package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +0 -91
  565. package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +0 -80
  566. package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +0 -104
  567. package/src/cli/ui/__tests__/components/common/Input.test.tsx +0 -100
  568. package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +0 -148
  569. package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +0 -255
  570. package/src/cli/ui/__tests__/components/common/Select.test.tsx +0 -335
  571. package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +0 -65
  572. package/src/cli/ui/__tests__/components/parts/Header.test.tsx +0 -55
  573. package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +0 -69
  574. package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +0 -148
  575. package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +0 -253
  576. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +0 -1070
  577. package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +0 -142
  578. package/src/cli/ui/__tests__/components/screens/CodingAgentSelectorScreen.test.tsx +0 -174
  579. package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +0 -182
  580. package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +0 -57
  581. package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +0 -102
  582. package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +0 -216
  583. package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +0 -147
  584. package/src/cli/ui/__tests__/hooks/useGitData.nonblocking.test.tsx +0 -206
  585. package/src/cli/ui/__tests__/hooks/useGitData.test.ts +0 -197
  586. package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +0 -228
  587. package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +0 -147
  588. package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +0 -99
  589. package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +0 -253
  590. package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +0 -436
  591. package/src/cli/ui/__tests__/integration/navigation.test.tsx +0 -514
  592. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +0 -509
  593. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +0 -216
  594. package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +0 -193
  595. package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +0 -234
  596. package/src/cli/ui/components/App.tsx +0 -1478
  597. package/src/cli/ui/components/common/Confirm.tsx +0 -44
  598. package/src/cli/ui/components/common/ErrorBoundary.tsx +0 -60
  599. package/src/cli/ui/components/common/Input.tsx +0 -58
  600. package/src/cli/ui/components/common/LoadingIndicator.tsx +0 -98
  601. package/src/cli/ui/components/common/Select.tsx +0 -247
  602. package/src/cli/ui/components/common/SpinnerIcon.tsx +0 -86
  603. package/src/cli/ui/components/parts/Footer.tsx +0 -41
  604. package/src/cli/ui/components/parts/Header.test.tsx +0 -75
  605. package/src/cli/ui/components/parts/MergeStatusList.tsx +0 -75
  606. package/src/cli/ui/components/parts/ProgressBar.tsx +0 -73
  607. package/src/cli/ui/components/parts/Stats.tsx +0 -88
  608. package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +0 -74
  609. package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +0 -108
  610. package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +0 -242
  611. package/src/cli/ui/components/screens/BranchListScreen.tsx +0 -744
  612. package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +0 -244
  613. package/src/cli/ui/components/screens/CodingAgentSelectorScreen.tsx +0 -159
  614. package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +0 -928
  615. package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +0 -176
  616. package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +0 -83
  617. package/src/cli/ui/components/screens/LogDetailScreen.tsx +0 -67
  618. package/src/cli/ui/components/screens/LogListScreen.tsx +0 -192
  619. package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +0 -320
  620. package/src/cli/ui/components/screens/PRCleanupScreen.tsx +0 -171
  621. package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +0 -135
  622. package/src/cli/ui/hooks/useAppInput.ts +0 -172
  623. package/src/cli/ui/hooks/useBatchMerge.ts +0 -96
  624. package/src/cli/ui/hooks/useGitData.ts +0 -347
  625. package/src/cli/ui/hooks/useProfiles.ts +0 -211
  626. package/src/cli/ui/hooks/useScreenState.ts +0 -44
  627. package/src/cli/ui/hooks/useTerminalSize.ts +0 -33
  628. package/src/cli/ui/hooks/useToolStatus.ts +0 -68
  629. package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +0 -111
  630. package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +0 -264
@@ -0,0 +1,250 @@
1
+ import { describe, expect, it, mock, beforeEach, afterEach } from "bun:test";
2
+
3
+ // TDD: テストを先に書き、実装は後から行う
4
+
5
+ describe("npmRegistry", () => {
6
+ describe("fetchPackageVersions", () => {
7
+ let originalFetch: typeof globalThis.fetch;
8
+
9
+ beforeEach(() => {
10
+ originalFetch = globalThis.fetch;
11
+ });
12
+
13
+ afterEach(() => {
14
+ globalThis.fetch = originalFetch;
15
+ });
16
+
17
+ it("should return latest 10 versions including prereleases", async () => {
18
+ // Mock npm registry response
19
+ globalThis.fetch = mock(async () => ({
20
+ ok: true,
21
+ json: async () => ({
22
+ "dist-tags": {
23
+ latest: "1.0.10",
24
+ next: "1.1.0-beta.1",
25
+ },
26
+ time: {
27
+ "1.0.1": "2024-01-01T00:00:00.000Z",
28
+ "1.0.2": "2024-01-02T00:00:00.000Z",
29
+ "1.0.3": "2024-01-03T00:00:00.000Z",
30
+ "1.0.4": "2024-01-04T00:00:00.000Z",
31
+ "1.0.5": "2024-01-05T00:00:00.000Z",
32
+ "1.0.6": "2024-01-06T00:00:00.000Z",
33
+ "1.0.7": "2024-01-07T00:00:00.000Z",
34
+ "1.0.8": "2024-01-08T00:00:00.000Z",
35
+ "1.0.9": "2024-01-09T00:00:00.000Z",
36
+ "1.0.10": "2024-01-10T00:00:00.000Z",
37
+ "1.1.0-alpha.1": "2024-01-11T00:00:00.000Z",
38
+ "1.1.0-beta.1": "2024-01-12T00:00:00.000Z",
39
+ },
40
+ versions: {
41
+ "1.0.1": {},
42
+ "1.0.2": {},
43
+ "1.0.3": {},
44
+ "1.0.4": {},
45
+ "1.0.5": {},
46
+ "1.0.6": {},
47
+ "1.0.7": {},
48
+ "1.0.8": {},
49
+ "1.0.9": {},
50
+ "1.0.10": {},
51
+ "1.1.0-alpha.1": {},
52
+ "1.1.0-beta.1": {},
53
+ },
54
+ }),
55
+ })) as typeof globalThis.fetch;
56
+
57
+ const { fetchPackageVersions } = await import("../npmRegistry.js");
58
+ const versions = await fetchPackageVersions("@anthropic-ai/claude-code");
59
+
60
+ expect(versions.length).toBe(10);
61
+ // Should be sorted by publish date, newest first
62
+ expect(versions[0].version).toBe("1.1.0-beta.1");
63
+ expect(versions[0].isPrerelease).toBe(true);
64
+ expect(versions[1].version).toBe("1.1.0-alpha.1");
65
+ expect(versions[1].isPrerelease).toBe(true);
66
+ expect(versions[2].version).toBe("1.0.10");
67
+ expect(versions[2].isPrerelease).toBe(false);
68
+ });
69
+
70
+ it("should return empty array on timeout", async () => {
71
+ // Mock fetch that respects AbortSignal
72
+ globalThis.fetch = mock(async (_url: string, options?: RequestInit) => {
73
+ const signal = options?.signal as AbortSignal | undefined;
74
+ return new Promise((resolve, reject) => {
75
+ const timer = setTimeout(() => {
76
+ resolve({ ok: true, json: async () => ({}) });
77
+ }, 5000);
78
+
79
+ if (signal) {
80
+ signal.addEventListener("abort", () => {
81
+ clearTimeout(timer);
82
+ reject(new DOMException("Aborted", "AbortError"));
83
+ });
84
+ }
85
+ });
86
+ }) as typeof globalThis.fetch;
87
+
88
+ const { fetchPackageVersions } = await import("../npmRegistry.js");
89
+ const versions = await fetchPackageVersions(
90
+ "@anthropic-ai/claude-code",
91
+ 10,
92
+ 100, // 100ms timeout
93
+ );
94
+
95
+ expect(versions).toEqual([]);
96
+ });
97
+
98
+ it("should return empty array on network error", async () => {
99
+ globalThis.fetch = mock(async () => {
100
+ throw new Error("Network error");
101
+ }) as typeof globalThis.fetch;
102
+
103
+ const { fetchPackageVersions } = await import("../npmRegistry.js");
104
+ const versions = await fetchPackageVersions("@anthropic-ai/claude-code");
105
+
106
+ expect(versions).toEqual([]);
107
+ });
108
+
109
+ it("should return empty array on non-ok response", async () => {
110
+ globalThis.fetch = mock(async () => ({
111
+ ok: false,
112
+ status: 404,
113
+ })) as typeof globalThis.fetch;
114
+
115
+ const { fetchPackageVersions } = await import("../npmRegistry.js");
116
+ const versions = await fetchPackageVersions("nonexistent-package");
117
+
118
+ expect(versions).toEqual([]);
119
+ });
120
+ });
121
+
122
+ describe("parsePackageCommand", () => {
123
+ it("should parse package name without version", async () => {
124
+ const { parsePackageCommand } = await import("../npmRegistry.js");
125
+ const result = parsePackageCommand("@anthropic-ai/claude-code");
126
+
127
+ expect(result.packageName).toBe("@anthropic-ai/claude-code");
128
+ expect(result.version).toBeNull();
129
+ });
130
+
131
+ it("should parse package name with @latest", async () => {
132
+ const { parsePackageCommand } = await import("../npmRegistry.js");
133
+ const result = parsePackageCommand("@anthropic-ai/claude-code@latest");
134
+
135
+ expect(result.packageName).toBe("@anthropic-ai/claude-code");
136
+ expect(result.version).toBe("latest");
137
+ });
138
+
139
+ it("should parse package name with specific version", async () => {
140
+ const { parsePackageCommand } = await import("../npmRegistry.js");
141
+ const result = parsePackageCommand("@anthropic-ai/claude-code@1.0.3");
142
+
143
+ expect(result.packageName).toBe("@anthropic-ai/claude-code");
144
+ expect(result.version).toBe("1.0.3");
145
+ });
146
+
147
+ it("should parse non-scoped package name", async () => {
148
+ const { parsePackageCommand } = await import("../npmRegistry.js");
149
+ const result = parsePackageCommand("opencode-ai@latest");
150
+
151
+ expect(result.packageName).toBe("opencode-ai");
152
+ expect(result.version).toBe("latest");
153
+ });
154
+ });
155
+
156
+ describe("resolveVersionSuffix", () => {
157
+ it("should return empty string for 'installed'", async () => {
158
+ const { resolveVersionSuffix } = await import("../npmRegistry.js");
159
+ expect(resolveVersionSuffix("installed")).toBe("");
160
+ });
161
+
162
+ it("should return empty string for undefined", async () => {
163
+ const { resolveVersionSuffix } = await import("../npmRegistry.js");
164
+ expect(resolveVersionSuffix(undefined)).toBe("");
165
+ });
166
+
167
+ it("should return '@latest' for 'latest'", async () => {
168
+ const { resolveVersionSuffix } = await import("../npmRegistry.js");
169
+ expect(resolveVersionSuffix("latest")).toBe("@latest");
170
+ });
171
+
172
+ it("should return '@X.Y.Z' for specific version", async () => {
173
+ const { resolveVersionSuffix } = await import("../npmRegistry.js");
174
+ expect(resolveVersionSuffix("1.0.3")).toBe("@1.0.3");
175
+ });
176
+
177
+ it("should return '@X.Y.Z-beta.1' for prerelease version", async () => {
178
+ const { resolveVersionSuffix } = await import("../npmRegistry.js");
179
+ expect(resolveVersionSuffix("1.1.0-beta.1")).toBe("@1.1.0-beta.1");
180
+ });
181
+ });
182
+
183
+ describe("parseGlobalPackagesOutput", () => {
184
+ it("should parse bun pm ls -g output correctly", async () => {
185
+ const { parseGlobalPackagesOutput } = await import("../npmRegistry.js");
186
+ const output = `/root/.bun/install/global node_modules (17)
187
+ ├── @anthropic-ai/claude-code@2.0.76
188
+ └── @openai/codex@0.77.0`;
189
+
190
+ const result = parseGlobalPackagesOutput(output);
191
+
192
+ expect(result.path).toBe("/root/.bun/install/global");
193
+ expect(result.packages).toHaveLength(2);
194
+ expect(result.packages[0]).toEqual({
195
+ name: "@anthropic-ai/claude-code",
196
+ version: "2.0.76",
197
+ });
198
+ expect(result.packages[1]).toEqual({
199
+ name: "@openai/codex",
200
+ version: "0.77.0",
201
+ });
202
+ });
203
+
204
+ it("should return empty packages for empty output", async () => {
205
+ const { parseGlobalPackagesOutput } = await import("../npmRegistry.js");
206
+ const result = parseGlobalPackagesOutput("");
207
+
208
+ expect(result.path).toBeNull();
209
+ expect(result.packages).toHaveLength(0);
210
+ });
211
+
212
+ it("should parse single package output", async () => {
213
+ const { parseGlobalPackagesOutput } = await import("../npmRegistry.js");
214
+ const output = `/home/user/.bun/install/global node_modules (1)
215
+ └── opencode-ai@1.0.0`;
216
+
217
+ const result = parseGlobalPackagesOutput(output);
218
+
219
+ expect(result.path).toBe("/home/user/.bun/install/global");
220
+ expect(result.packages).toHaveLength(1);
221
+ expect(result.packages[0]).toEqual({
222
+ name: "opencode-ai",
223
+ version: "1.0.0",
224
+ });
225
+ });
226
+ });
227
+
228
+ describe("getInstalledPackageInfo", () => {
229
+ it("should return package info when installed globally", async () => {
230
+ const { getInstalledPackageInfo } = await import("../npmRegistry.js");
231
+ // This test relies on actual global packages - may need adjustment
232
+ const result = await getInstalledPackageInfo("@anthropic-ai/claude-code");
233
+
234
+ // If claude-code is installed globally, it should return info
235
+ if (result) {
236
+ expect(result.version).toBeDefined();
237
+ expect(result.path).toBeDefined();
238
+ }
239
+ });
240
+
241
+ it("should return null when package is not installed", async () => {
242
+ const { getInstalledPackageInfo } = await import("../npmRegistry.js");
243
+ const result = await getInstalledPackageInfo(
244
+ "nonexistent-package-xyz-123",
245
+ );
246
+
247
+ expect(result).toBeNull();
248
+ });
249
+ });
250
+ });
@@ -1,10 +1,10 @@
1
1
  import { PassThrough } from "node:stream";
2
- import { describe, expect, it, vi, beforeEach } from "vitest";
2
+ import { describe, expect, it, mock, beforeEach } from "bun:test";
3
3
 
4
4
  // Shared mock target to avoid hoisting issues
5
5
  const terminalStreams: Record<string, unknown> = {};
6
6
 
7
- vi.mock("../terminal.js", () => ({
7
+ mock.module("../terminal.js", () => ({
8
8
  getTerminalStreams: () => terminalStreams,
9
9
  }));
10
10
 
@@ -17,7 +17,6 @@ const withTimeout = <T>(promise: Promise<T>, ms = 500): Promise<T> =>
17
17
  ]);
18
18
 
19
19
  const resetTerminalStreams = () => {
20
- vi.resetModules();
21
20
  for (const key of Object.keys(terminalStreams)) {
22
21
  delete terminalStreams[key];
23
22
  }
@@ -27,7 +26,7 @@ const setupTerminalStreams = (isTTY: boolean) => {
27
26
  const stdin = new PassThrough() as unknown as NodeJS.ReadStream;
28
27
  const stdout = new PassThrough() as unknown as NodeJS.WriteStream;
29
28
  Object.defineProperty(stdin, "isTTY", { value: isTTY, configurable: true });
30
- const exitRawMode = vi.fn();
29
+ const exitRawMode = mock();
31
30
  Object.assign(terminalStreams, {
32
31
  stdin,
33
32
  stdout,
@@ -82,7 +81,7 @@ describe("waitForEnter", () => {
82
81
 
83
82
  describe("confirmYesNo", () => {
84
83
  let stdin: NodeJS.ReadStream;
85
- let exitRawMode: ReturnType<typeof vi.fn>;
84
+ let exitRawMode: ReturnType<typeof mock>;
86
85
 
87
86
  beforeEach(() => {
88
87
  resetTerminalStreams();
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Coding Agent Color Definitions
3
+ *
4
+ * This module provides consistent color definitions for coding agents
5
+ * across CLI and Web UI (SPEC-3b0ed29b FR-024~FR-027).
6
+ */
7
+
8
+ /**
9
+ * Tool ID constants for coding agents
10
+ */
11
+ export const CODING_AGENT_TOOL_IDS = {
12
+ CLAUDE_CODE: "claude-code",
13
+ CODEX_CLI: "codex-cli",
14
+ GEMINI_CLI: "gemini-cli",
15
+ OPENCODE: "opencode",
16
+ } as const;
17
+
18
+ /**
19
+ * Terminal color names for CLI (OpenTUI/SolidJS)
20
+ */
21
+ export type TerminalColorName =
22
+ | "yellow"
23
+ | "cyan"
24
+ | "magenta"
25
+ | "green"
26
+ | "gray"
27
+ | "white";
28
+
29
+ /**
30
+ * Color definitions for coding agents
31
+ * - Terminal colors: Used in CLI UI (OpenTUI/SolidJS)
32
+ * - Hex colors: Used in Web UI (React/CSS)
33
+ */
34
+ export const CODING_AGENT_COLORS = {
35
+ [CODING_AGENT_TOOL_IDS.CLAUDE_CODE]: {
36
+ terminal: "yellow" as TerminalColorName,
37
+ hex: "#f6e05e",
38
+ tailwind: "text-yellow-400",
39
+ },
40
+ [CODING_AGENT_TOOL_IDS.CODEX_CLI]: {
41
+ terminal: "cyan" as TerminalColorName,
42
+ hex: "#4fd1c5",
43
+ tailwind: "text-cyan-400",
44
+ },
45
+ [CODING_AGENT_TOOL_IDS.GEMINI_CLI]: {
46
+ terminal: "magenta" as TerminalColorName,
47
+ hex: "#d53f8c",
48
+ tailwind: "text-pink-500",
49
+ },
50
+ [CODING_AGENT_TOOL_IDS.OPENCODE]: {
51
+ terminal: "green" as TerminalColorName,
52
+ hex: "#48bb78",
53
+ tailwind: "text-green-400",
54
+ },
55
+ } as const;
56
+
57
+ /**
58
+ * Default color for unknown/custom agents
59
+ */
60
+ export const DEFAULT_AGENT_COLOR = {
61
+ terminal: "gray" as TerminalColorName,
62
+ hex: "#a0aec0",
63
+ tailwind: "text-gray-400",
64
+ };
65
+
66
+ /**
67
+ * Get terminal color name for a coding agent
68
+ * Used in CLI UI (OpenTUI/SolidJS)
69
+ *
70
+ * @param toolId - The tool ID (e.g., "claude-code", "codex-cli")
71
+ * @param label - Optional label for fallback (used for unknown detection)
72
+ * @returns Terminal color name
73
+ */
74
+ export function getAgentTerminalColor(
75
+ toolId?: string | null,
76
+ label?: string,
77
+ ): TerminalColorName {
78
+ if (!toolId) {
79
+ const trimmed = label?.trim().toLowerCase();
80
+ if (!trimmed || trimmed === "unknown") {
81
+ return "gray";
82
+ }
83
+ return "white";
84
+ }
85
+
86
+ const color = CODING_AGENT_COLORS[toolId as keyof typeof CODING_AGENT_COLORS];
87
+ return color?.terminal ?? DEFAULT_AGENT_COLOR.terminal;
88
+ }
89
+
90
+ /**
91
+ * Get hex color for a coding agent
92
+ * Used in Web UI (React/CSS)
93
+ *
94
+ * @param toolId - The tool ID (e.g., "claude-code", "codex-cli")
95
+ * @returns Hex color string
96
+ */
97
+ export function getAgentHexColor(toolId?: string | null): string {
98
+ if (!toolId) {
99
+ return DEFAULT_AGENT_COLOR.hex;
100
+ }
101
+
102
+ const color = CODING_AGENT_COLORS[toolId as keyof typeof CODING_AGENT_COLORS];
103
+ return color?.hex ?? DEFAULT_AGENT_COLOR.hex;
104
+ }
105
+
106
+ /**
107
+ * Get Tailwind CSS class for a coding agent
108
+ * Used in Web UI (React/Tailwind)
109
+ *
110
+ * @param toolId - The tool ID (e.g., "claude-code", "codex-cli")
111
+ * @returns Tailwind CSS class name
112
+ */
113
+ export function getAgentTailwindClass(toolId?: string | null): string {
114
+ if (!toolId) {
115
+ return DEFAULT_AGENT_COLOR.tailwind;
116
+ }
117
+
118
+ const color = CODING_AGENT_COLORS[toolId as keyof typeof CODING_AGENT_COLORS];
119
+ return color?.tailwind ?? DEFAULT_AGENT_COLOR.tailwind;
120
+ }
121
+
122
+ /**
123
+ * Normalize agent type string to tool ID
124
+ * Handles various naming conventions used across the codebase
125
+ *
126
+ * @param agentType - Agent type string (e.g., "claude", "codex-cli", "Claude Code")
127
+ * @returns Normalized tool ID
128
+ */
129
+ export function normalizeAgentToToolId(
130
+ agentType?: string | null,
131
+ ): string | null {
132
+ if (!agentType) return null;
133
+
134
+ const normalized = agentType.toLowerCase().trim();
135
+
136
+ // Direct matches
137
+ if (normalized === "claude-code" || normalized === "claude") {
138
+ return CODING_AGENT_TOOL_IDS.CLAUDE_CODE;
139
+ }
140
+ if (normalized === "codex-cli" || normalized === "codex") {
141
+ return CODING_AGENT_TOOL_IDS.CODEX_CLI;
142
+ }
143
+ if (normalized === "gemini-cli" || normalized === "gemini") {
144
+ return CODING_AGENT_TOOL_IDS.GEMINI_CLI;
145
+ }
146
+ if (normalized === "opencode" || normalized === "open-code") {
147
+ return CODING_AGENT_TOOL_IDS.OPENCODE;
148
+ }
149
+
150
+ // Label-based matches
151
+ if (normalized.includes("claude")) {
152
+ return CODING_AGENT_TOOL_IDS.CLAUDE_CODE;
153
+ }
154
+ if (normalized.includes("codex")) {
155
+ return CODING_AGENT_TOOL_IDS.CODEX_CLI;
156
+ }
157
+ if (normalized.includes("gemini")) {
158
+ return CODING_AGENT_TOOL_IDS.GEMINI_CLI;
159
+ }
160
+ if (normalized.includes("opencode")) {
161
+ return CODING_AGENT_TOOL_IDS.OPENCODE;
162
+ }
163
+
164
+ return agentType; // Return as-is for custom agents
165
+ }
@@ -199,7 +199,7 @@ export async function findCommand(
199
199
  * If the standard lookup fails, checks known installation paths
200
200
  * as a fallback for common tools.
201
201
  *
202
- * @param commandName - Command name to look up (e.g. `claude`, `npx`, `gemini`)
202
+ * @param commandName - Command name to look up (e.g. `claude`, `gemini`)
203
203
  * @returns true if the command exists in PATH or known paths
204
204
  */
205
205
  export async function isCommandAvailable(
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Error Utilities
3
+ *
4
+ * 統一されたエラーハンドリングユーティリティ。
5
+ * カスタムエラークラスの型判定と分類を提供します。
6
+ */
7
+
8
+ import { GitError } from "../git.js";
9
+ import { WorktreeError } from "../worktree.js";
10
+ import { ClaudeError } from "../claude.js";
11
+ import { CodexError } from "../codex.js";
12
+ import { GeminiError } from "../gemini.js";
13
+ import { DependencyInstallError } from "../services/dependency-installer.js";
14
+
15
+ /**
16
+ * エラー名のリスト定義
17
+ */
18
+ const GIT_RELATED_ERROR_NAMES = ["GitError", "WorktreeError"] as const;
19
+ const RECOVERABLE_ERROR_NAMES = [
20
+ "GitError",
21
+ "WorktreeError",
22
+ "CodexError",
23
+ "GeminiError",
24
+ "DependencyInstallError",
25
+ ] as const;
26
+ const CODING_AGENT_ERROR_NAMES = [
27
+ "ClaudeError",
28
+ "CodexError",
29
+ "GeminiError",
30
+ ] as const;
31
+
32
+ /**
33
+ * 型ガード: エラー名で判定
34
+ */
35
+ function getErrorName(error: unknown): string | undefined {
36
+ if (!error) return undefined;
37
+
38
+ if (error instanceof Error) {
39
+ return error.name;
40
+ }
41
+
42
+ if (
43
+ typeof error === "object" &&
44
+ "name" in (error as Record<string, unknown>)
45
+ ) {
46
+ return (error as { name?: string }).name;
47
+ }
48
+
49
+ return undefined;
50
+ }
51
+
52
+ /**
53
+ * 型ガード: 指定のエラークラスまたはエラー名に該当するか判定
54
+ */
55
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
+ type ErrorConstructor = new (...args: any[]) => Error;
57
+
58
+ function isErrorOfType(
59
+ error: unknown,
60
+ constructors: ErrorConstructor[],
61
+ names: readonly string[],
62
+ ): boolean {
63
+ if (!error) return false;
64
+
65
+ // instanceof チェック
66
+ for (const ctor of constructors) {
67
+ if (error instanceof ctor) return true;
68
+ }
69
+
70
+ // 名前チェック(異なるモジュールからのインスタンス用)
71
+ const errorName = getErrorName(error);
72
+ if (errorName && names.includes(errorName)) {
73
+ return true;
74
+ }
75
+
76
+ return false;
77
+ }
78
+
79
+ /**
80
+ * Git関連エラー(GitError, WorktreeError)かどうかを判定
81
+ */
82
+ export function isGitRelatedError(error: unknown): boolean {
83
+ return isErrorOfType(
84
+ error,
85
+ [GitError, WorktreeError],
86
+ GIT_RELATED_ERROR_NAMES,
87
+ );
88
+ }
89
+
90
+ /**
91
+ * 回復可能なエラー(リトライ/続行可能)かどうかを判定
92
+ */
93
+ export function isRecoverableError(error: unknown): boolean {
94
+ return isErrorOfType(
95
+ error,
96
+ [GitError, WorktreeError, CodexError, GeminiError, DependencyInstallError],
97
+ RECOVERABLE_ERROR_NAMES,
98
+ );
99
+ }
100
+
101
+ /**
102
+ * コーディングエージェント関連エラー(Claude, Codex, Gemini)かどうかを判定
103
+ */
104
+ export function isCodingAgentError(error: unknown): boolean {
105
+ return isErrorOfType(
106
+ error,
107
+ [ClaudeError, CodexError, GeminiError],
108
+ CODING_AGENT_ERROR_NAMES,
109
+ );
110
+ }
111
+
112
+ /**
113
+ * エラーメッセージを安全に取得
114
+ */
115
+ export function getErrorMessage(error: unknown): string {
116
+ if (error instanceof Error) {
117
+ return error.message;
118
+ }
119
+ if (typeof error === "string") {
120
+ return error;
121
+ }
122
+ return String(error);
123
+ }
124
+
125
+ /**
126
+ * エラーの根本原因を取得
127
+ */
128
+ export function getErrorCause(error: unknown): unknown {
129
+ if (error instanceof Error && "cause" in error) {
130
+ return error.cause;
131
+ }
132
+ return undefined;
133
+ }