@akiojin/gwt 4.9.1 → 4.11.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (605) hide show
  1. package/README.ja.md +4 -4
  2. package/README.md +4 -4
  3. package/dist/claude.d.ts +1 -0
  4. package/dist/claude.d.ts.map +1 -1
  5. package/dist/claude.js +52 -49
  6. package/dist/claude.js.map +1 -1
  7. package/dist/cli/ui/App.solid.d.ts +29 -0
  8. package/dist/cli/ui/App.solid.d.ts.map +1 -0
  9. package/dist/cli/ui/App.solid.js +1197 -0
  10. package/dist/cli/ui/App.solid.js.map +1 -0
  11. package/dist/cli/ui/components/solid/Footer.d.ts +10 -0
  12. package/dist/cli/ui/components/solid/Footer.d.ts.map +1 -0
  13. package/dist/cli/ui/components/solid/Footer.js +10 -0
  14. package/dist/cli/ui/components/solid/Footer.js.map +1 -0
  15. package/dist/cli/ui/components/{parts → solid}/Header.d.ts +1 -6
  16. package/dist/cli/ui/components/solid/Header.d.ts.map +1 -0
  17. package/dist/cli/ui/components/solid/Header.js +13 -0
  18. package/dist/cli/ui/components/solid/Header.js.map +1 -0
  19. package/dist/cli/ui/components/solid/HelpOverlay.d.ts +8 -0
  20. package/dist/cli/ui/components/solid/HelpOverlay.d.ts.map +1 -0
  21. package/dist/cli/ui/components/solid/HelpOverlay.js +118 -0
  22. package/dist/cli/ui/components/solid/HelpOverlay.js.map +1 -0
  23. package/dist/cli/ui/components/solid/QuickStartStep.d.ts +17 -0
  24. package/dist/cli/ui/components/solid/QuickStartStep.d.ts.map +1 -0
  25. package/dist/cli/ui/components/solid/QuickStartStep.js +139 -0
  26. package/dist/cli/ui/components/solid/QuickStartStep.js.map +1 -0
  27. package/dist/cli/ui/components/solid/SelectInput.d.ts +22 -0
  28. package/dist/cli/ui/components/solid/SelectInput.d.ts.map +1 -0
  29. package/dist/cli/ui/components/solid/SelectInput.js +44 -0
  30. package/dist/cli/ui/components/solid/SelectInput.js.map +1 -0
  31. package/dist/cli/ui/components/solid/TextInput.d.ts +12 -0
  32. package/dist/cli/ui/components/solid/TextInput.d.ts.map +1 -0
  33. package/dist/cli/ui/components/solid/TextInput.js +9 -0
  34. package/dist/cli/ui/components/solid/TextInput.js.map +1 -0
  35. package/dist/cli/ui/components/solid/WizardController.d.ts +34 -0
  36. package/dist/cli/ui/components/solid/WizardController.d.ts.map +1 -0
  37. package/dist/cli/ui/components/solid/WizardController.js +215 -0
  38. package/dist/cli/ui/components/solid/WizardController.js.map +1 -0
  39. package/dist/cli/ui/components/solid/WizardPopup.d.ts +26 -0
  40. package/dist/cli/ui/components/solid/WizardPopup.d.ts.map +1 -0
  41. package/dist/cli/ui/components/solid/WizardPopup.js +68 -0
  42. package/dist/cli/ui/components/solid/WizardPopup.js.map +1 -0
  43. package/dist/cli/ui/components/solid/WizardSteps.d.ts +52 -0
  44. package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +1 -0
  45. package/dist/cli/ui/components/solid/WizardSteps.js +462 -0
  46. package/dist/cli/ui/components/solid/WizardSteps.js.map +1 -0
  47. package/dist/cli/ui/core/index.d.ts +12 -0
  48. package/dist/cli/ui/core/index.d.ts.map +1 -0
  49. package/dist/cli/ui/core/index.js +15 -0
  50. package/dist/cli/ui/core/index.js.map +1 -0
  51. package/dist/cli/ui/core/keybindings.d.ts +106 -0
  52. package/dist/cli/ui/core/keybindings.d.ts.map +1 -0
  53. package/dist/cli/ui/core/keybindings.js +270 -0
  54. package/dist/cli/ui/core/keybindings.js.map +1 -0
  55. package/dist/cli/ui/core/theme.d.ts +114 -0
  56. package/dist/cli/ui/core/theme.d.ts.map +1 -0
  57. package/dist/cli/ui/core/theme.js +170 -0
  58. package/dist/cli/ui/core/theme.js.map +1 -0
  59. package/dist/cli/ui/core/types.d.ts +156 -0
  60. package/dist/cli/ui/core/types.d.ts.map +1 -0
  61. package/dist/cli/ui/core/types.js +10 -0
  62. package/dist/cli/ui/core/types.js.map +1 -0
  63. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts +26 -0
  64. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts.map +1 -0
  65. package/dist/cli/ui/hooks/solid/useScrollableList.js +89 -0
  66. package/dist/cli/ui/hooks/solid/useScrollableList.js.map +1 -0
  67. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts +10 -0
  68. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts.map +1 -0
  69. package/dist/cli/ui/hooks/solid/useTerminalSize.js +16 -0
  70. package/dist/cli/ui/hooks/solid/useTerminalSize.js.map +1 -0
  71. package/dist/cli/ui/index.solid.d.ts +5 -0
  72. package/dist/cli/ui/index.solid.d.ts.map +1 -0
  73. package/dist/cli/ui/index.solid.js +21 -0
  74. package/dist/cli/ui/index.solid.js.map +1 -0
  75. package/dist/cli/ui/{components/screens → screens/solid}/BranchListScreen.d.ts +8 -22
  76. package/dist/cli/ui/screens/solid/BranchListScreen.d.ts.map +1 -0
  77. package/dist/cli/ui/screens/solid/BranchListScreen.js +756 -0
  78. package/dist/cli/ui/screens/solid/BranchListScreen.js.map +1 -0
  79. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts +10 -0
  80. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts.map +1 -0
  81. package/dist/cli/ui/screens/solid/ConfirmScreen.js +37 -0
  82. package/dist/cli/ui/screens/solid/ConfirmScreen.js.map +1 -0
  83. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts +14 -0
  84. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts.map +1 -0
  85. package/dist/cli/ui/screens/solid/EnvironmentScreen.js +91 -0
  86. package/dist/cli/ui/screens/solid/EnvironmentScreen.js.map +1 -0
  87. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts +8 -0
  88. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts.map +1 -0
  89. package/dist/cli/ui/screens/solid/ErrorScreen.js +18 -0
  90. package/dist/cli/ui/screens/solid/ErrorScreen.js.map +1 -0
  91. package/dist/cli/ui/screens/solid/InputScreen.d.ts +13 -0
  92. package/dist/cli/ui/screens/solid/InputScreen.d.ts.map +1 -0
  93. package/dist/cli/ui/screens/solid/InputScreen.js +17 -0
  94. package/dist/cli/ui/screens/solid/InputScreen.js.map +1 -0
  95. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts +9 -0
  96. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts.map +1 -0
  97. package/dist/cli/ui/screens/solid/LoadingIndicator.js +43 -0
  98. package/dist/cli/ui/screens/solid/LoadingIndicator.js.map +1 -0
  99. package/dist/cli/ui/{components/screens → screens/solid}/LogDetailScreen.d.ts +2 -2
  100. package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts.map +1 -0
  101. package/dist/cli/ui/screens/solid/LogDetailScreen.js +34 -0
  102. package/dist/cli/ui/screens/solid/LogDetailScreen.js.map +1 -0
  103. package/dist/cli/ui/{components/screens/LogListScreen.d.ts → screens/solid/LogScreen.d.ts} +4 -4
  104. package/dist/cli/ui/screens/solid/LogScreen.d.ts.map +1 -0
  105. package/dist/cli/ui/screens/solid/LogScreen.js +95 -0
  106. package/dist/cli/ui/screens/solid/LogScreen.js.map +1 -0
  107. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts +17 -0
  108. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts.map +1 -0
  109. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js +112 -0
  110. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js.map +1 -0
  111. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts +17 -0
  112. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts.map +1 -0
  113. package/dist/cli/ui/screens/solid/ProfileScreen.js +50 -0
  114. package/dist/cli/ui/screens/solid/ProfileScreen.js.map +1 -0
  115. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts +20 -0
  116. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts.map +1 -0
  117. package/dist/cli/ui/screens/solid/SelectorScreen.js +90 -0
  118. package/dist/cli/ui/screens/solid/SelectorScreen.js.map +1 -0
  119. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts +13 -0
  120. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts.map +1 -0
  121. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js +59 -0
  122. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js.map +1 -0
  123. package/dist/cli/ui/stores/appStore.d.ts +143 -0
  124. package/dist/cli/ui/stores/appStore.d.ts.map +1 -0
  125. package/dist/cli/ui/stores/appStore.js +158 -0
  126. package/dist/cli/ui/stores/appStore.js.map +1 -0
  127. package/dist/cli/ui/stores/branchStore.d.ts +159 -0
  128. package/dist/cli/ui/stores/branchStore.d.ts.map +1 -0
  129. package/dist/cli/ui/stores/branchStore.js +275 -0
  130. package/dist/cli/ui/stores/branchStore.js.map +1 -0
  131. package/dist/cli/ui/stores/index.d.ts +11 -0
  132. package/dist/cli/ui/stores/index.d.ts.map +1 -0
  133. package/dist/cli/ui/stores/index.js +14 -0
  134. package/dist/cli/ui/stores/index.js.map +1 -0
  135. package/dist/cli/ui/stores/uiStore.d.ts +146 -0
  136. package/dist/cli/ui/stores/uiStore.d.ts.map +1 -0
  137. package/dist/cli/ui/stores/uiStore.js +166 -0
  138. package/dist/cli/ui/stores/uiStore.js.map +1 -0
  139. package/dist/cli/ui/types.d.ts +16 -1
  140. package/dist/cli/ui/types.d.ts.map +1 -1
  141. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
  142. package/dist/cli/ui/utils/branchFormatter.js +7 -210
  143. package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
  144. package/dist/cli/ui/utils/continueSession.d.ts +4 -0
  145. package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
  146. package/dist/cli/ui/utils/continueSession.js +30 -0
  147. package/dist/cli/ui/utils/continueSession.js.map +1 -1
  148. package/dist/client/assets/{index-ChHC-Puh.css → index-BbfV7Wuj.css} +1 -1
  149. package/dist/client/assets/index-CoAyq5x1.js +78 -0
  150. package/dist/client/index.html +2 -2
  151. package/dist/codex.d.ts +1 -0
  152. package/dist/codex.d.ts.map +1 -1
  153. package/dist/codex.js +86 -45
  154. package/dist/codex.js.map +1 -1
  155. package/dist/config/builtin-coding-agents.d.ts +4 -0
  156. package/dist/config/builtin-coding-agents.d.ts.map +1 -1
  157. package/dist/config/builtin-coding-agents.js +18 -3
  158. package/dist/config/builtin-coding-agents.js.map +1 -1
  159. package/dist/config/index.d.ts +2 -0
  160. package/dist/config/index.d.ts.map +1 -1
  161. package/dist/config/index.js +2 -0
  162. package/dist/config/index.js.map +1 -1
  163. package/dist/config/tools.d.ts.map +1 -1
  164. package/dist/config/tools.js +11 -0
  165. package/dist/config/tools.js.map +1 -1
  166. package/dist/gemini.d.ts +1 -0
  167. package/dist/gemini.d.ts.map +1 -1
  168. package/dist/gemini.js +42 -37
  169. package/dist/gemini.js.map +1 -1
  170. package/dist/index.d.ts +1 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +122 -102
  173. package/dist/index.js.map +1 -1
  174. package/dist/launcher.d.ts.map +1 -1
  175. package/dist/launcher.js +18 -3
  176. package/dist/launcher.js.map +1 -1
  177. package/dist/logging/logger.d.ts.map +1 -1
  178. package/dist/logging/logger.js +26 -9
  179. package/dist/logging/logger.js.map +1 -1
  180. package/dist/opentui/highlights-eq9cgrbb.scm +604 -0
  181. package/dist/opentui/highlights-ghv9g403.scm +205 -0
  182. package/dist/opentui/highlights-hk7bwhj4.scm +284 -0
  183. package/dist/opentui/highlights-r812a2qc.scm +150 -0
  184. package/dist/opentui/highlights-x6tmsnaa.scm +115 -0
  185. package/dist/opentui/index.solid.d.ts +2 -0
  186. package/dist/opentui/index.solid.d.ts.map +1 -0
  187. package/dist/opentui/index.solid.js +52034 -0
  188. package/dist/opentui/index.solid.js.map +1 -0
  189. package/dist/opentui/injections-73j83es3.scm +27 -0
  190. package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  191. package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
  192. package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  193. package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  194. package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
  195. package/dist/repositories/worktree.repository.d.ts +1 -0
  196. package/dist/repositories/worktree.repository.d.ts.map +1 -1
  197. package/dist/repositories/worktree.repository.js +7 -0
  198. package/dist/repositories/worktree.repository.js.map +1 -1
  199. package/dist/services/codingAgentResolver.d.ts +2 -0
  200. package/dist/services/codingAgentResolver.d.ts.map +1 -1
  201. package/dist/services/codingAgentResolver.js +30 -4
  202. package/dist/services/codingAgentResolver.js.map +1 -1
  203. package/dist/services/dependency-installer.d.ts.map +1 -1
  204. package/dist/services/dependency-installer.js +0 -5
  205. package/dist/services/dependency-installer.js.map +1 -1
  206. package/dist/types/api.d.ts +3 -0
  207. package/dist/types/api.d.ts.map +1 -1
  208. package/dist/types/coding-agent.d.ts +62 -0
  209. package/dist/types/coding-agent.d.ts.map +1 -0
  210. package/dist/types/coding-agent.js +29 -0
  211. package/dist/types/coding-agent.js.map +1 -0
  212. package/dist/types/tools.d.ts +17 -0
  213. package/dist/types/tools.d.ts.map +1 -1
  214. package/dist/utils/coding-agent-colors.d.ts +88 -0
  215. package/dist/utils/coding-agent-colors.d.ts.map +1 -0
  216. package/dist/utils/coding-agent-colors.js +137 -0
  217. package/dist/utils/coding-agent-colors.js.map +1 -0
  218. package/dist/utils/command.d.ts +1 -1
  219. package/dist/utils/command.d.ts.map +1 -1
  220. package/dist/utils/command.js +10 -1
  221. package/dist/utils/command.js.map +1 -1
  222. package/dist/utils/error-utils.d.ts +27 -0
  223. package/dist/utils/error-utils.d.ts.map +1 -0
  224. package/dist/utils/error-utils.js +98 -0
  225. package/dist/utils/error-utils.js.map +1 -0
  226. package/dist/utils/npmRegistry.d.ts +61 -0
  227. package/dist/utils/npmRegistry.d.ts.map +1 -0
  228. package/dist/utils/npmRegistry.js +180 -0
  229. package/dist/utils/npmRegistry.js.map +1 -0
  230. package/dist/utils/prompt.d.ts +1 -1
  231. package/dist/utils/prompt.js +1 -1
  232. package/dist/utils/session/index.d.ts +5 -3
  233. package/dist/utils/session/index.d.ts.map +1 -1
  234. package/dist/utils/session/index.js +5 -2
  235. package/dist/utils/session/index.js.map +1 -1
  236. package/dist/utils/session/parsers/codex.d.ts.map +1 -1
  237. package/dist/utils/session/parsers/codex.js +8 -1
  238. package/dist/utils/session/parsers/codex.js.map +1 -1
  239. package/dist/utils/session/parsers/index.d.ts +1 -0
  240. package/dist/utils/session/parsers/index.d.ts.map +1 -1
  241. package/dist/utils/session/parsers/index.js +2 -0
  242. package/dist/utils/session/parsers/index.js.map +1 -1
  243. package/dist/utils/session/parsers/opencode.d.ts +23 -0
  244. package/dist/utils/session/parsers/opencode.d.ts.map +1 -0
  245. package/dist/utils/session/parsers/opencode.js +89 -0
  246. package/dist/utils/session/parsers/opencode.js.map +1 -0
  247. package/dist/utils/session/types.d.ts +4 -0
  248. package/dist/utils/session/types.d.ts.map +1 -1
  249. package/dist/utils/terminal.d.ts +1 -0
  250. package/dist/utils/terminal.d.ts.map +1 -1
  251. package/dist/utils/terminal.js +20 -0
  252. package/dist/utils/terminal.js.map +1 -1
  253. package/dist/utils.d.ts +9 -0
  254. package/dist/utils.d.ts.map +1 -1
  255. package/dist/utils.js +33 -2
  256. package/dist/utils.js.map +1 -1
  257. package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +1 -1
  258. package/dist/web/client/src/components/CodingAgentLaunchModal.js +7 -16
  259. package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +1 -1
  260. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
  261. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +7 -2
  262. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
  263. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -1
  264. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +2 -1
  265. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -1
  266. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +2 -2
  267. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -1
  268. package/dist/web/client/src/components/branch-detail/ToolLauncher.js +5 -5
  269. package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -1
  270. package/dist/web/client/src/lib/coding-agent-colors.d.ts +86 -0
  271. package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +1 -0
  272. package/dist/web/client/src/lib/coding-agent-colors.js +135 -0
  273. package/dist/web/client/src/lib/coding-agent-colors.js.map +1 -0
  274. package/dist/web/client/src/pages/BranchDetailPage.js +10 -10
  275. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
  276. package/dist/web/server/pty/manager.d.ts +2 -0
  277. package/dist/web/server/pty/manager.d.ts.map +1 -1
  278. package/dist/web/server/pty/manager.js +104 -0
  279. package/dist/web/server/pty/manager.js.map +1 -1
  280. package/dist/web/server/routes/sessions.d.ts.map +1 -1
  281. package/dist/web/server/routes/sessions.js +5 -1
  282. package/dist/web/server/routes/sessions.js.map +1 -1
  283. package/dist/web/server/services/branches.d.ts.map +1 -1
  284. package/dist/web/server/services/branches.js +10 -8
  285. package/dist/web/server/services/branches.js.map +1 -1
  286. package/dist/web/server/services/worktrees.js +2 -2
  287. package/dist/web/server/services/worktrees.js.map +1 -1
  288. package/dist/worktree.d.ts +47 -1
  289. package/dist/worktree.d.ts.map +1 -1
  290. package/dist/worktree.js +280 -94
  291. package/dist/worktree.js.map +1 -1
  292. package/package.json +12 -14
  293. package/src/claude.ts +68 -70
  294. package/src/cli/ui/App.solid.tsx +1823 -0
  295. package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +255 -0
  296. package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +243 -0
  297. package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +237 -0
  298. package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +231 -0
  299. package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +238 -0
  300. package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +7 -289
  301. package/src/cli/ui/__tests__/utils/clipboard.test.ts +3 -3
  302. package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +1 -1
  303. package/src/cli/ui/components/solid/Footer.tsx +36 -0
  304. package/src/cli/ui/components/{parts → solid}/Header.tsx +17 -28
  305. package/src/cli/ui/components/solid/HelpOverlay.tsx +194 -0
  306. package/src/cli/ui/components/solid/QuickStartStep.tsx +197 -0
  307. package/src/cli/ui/components/{parts → solid}/ScrollableList.tsx +7 -8
  308. package/src/cli/ui/components/solid/SearchInput.tsx +42 -0
  309. package/src/cli/ui/components/solid/SelectInput.tsx +84 -0
  310. package/src/cli/ui/components/solid/Stats.tsx +92 -0
  311. package/src/cli/ui/components/solid/TextInput.tsx +49 -0
  312. package/src/cli/ui/components/solid/WizardController.tsx +384 -0
  313. package/src/cli/ui/components/solid/WizardPopup.tsx +135 -0
  314. package/src/cli/ui/components/solid/WizardSteps.tsx +793 -0
  315. package/src/cli/ui/core/index.ts +17 -0
  316. package/src/cli/ui/core/keybindings.ts +367 -0
  317. package/src/cli/ui/core/theme.ts +234 -0
  318. package/src/cli/ui/core/types.ts +235 -0
  319. package/src/cli/ui/hooks/solid/useAsyncOperation.ts +76 -0
  320. package/src/cli/ui/hooks/solid/useFilter.ts +86 -0
  321. package/src/cli/ui/hooks/solid/useGitOperations.ts +80 -0
  322. package/src/cli/ui/hooks/solid/useKeyHandler.ts +103 -0
  323. package/src/cli/ui/hooks/solid/useScrollableList.ts +149 -0
  324. package/src/cli/ui/hooks/solid/useSelection.ts +77 -0
  325. package/src/cli/ui/hooks/solid/useTerminalSize.ts +22 -0
  326. package/src/cli/ui/index.solid.ts +28 -0
  327. package/src/cli/ui/screens/solid/BranchListScreen.tsx +1050 -0
  328. package/src/cli/ui/screens/solid/ConfirmScreen.tsx +74 -0
  329. package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +159 -0
  330. package/src/cli/ui/screens/solid/ErrorScreen.tsx +42 -0
  331. package/src/cli/ui/screens/solid/InputScreen.tsx +55 -0
  332. package/src/cli/ui/screens/solid/LoadingIndicator.tsx +77 -0
  333. package/src/cli/ui/screens/solid/LogDetailScreen.tsx +75 -0
  334. package/src/cli/ui/screens/solid/LogScreen.tsx +175 -0
  335. package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +192 -0
  336. package/src/cli/ui/screens/solid/ProfileScreen.tsx +98 -0
  337. package/src/cli/ui/screens/solid/SelectorScreen.tsx +170 -0
  338. package/src/cli/ui/screens/solid/SettingsScreen.tsx +50 -0
  339. package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +136 -0
  340. package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +40 -0
  341. package/src/cli/ui/stores/appStore.ts +208 -0
  342. package/src/cli/ui/stores/branchStore.ts +357 -0
  343. package/src/cli/ui/stores/index.ts +31 -0
  344. package/src/cli/ui/stores/uiStore.ts +226 -0
  345. package/src/cli/ui/types.ts +20 -3
  346. package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +180 -0
  347. package/src/cli/ui/utils/branchFormatter.ts +8 -215
  348. package/src/cli/ui/utils/continueSession.ts +44 -0
  349. package/src/cli/ui/utils/modelOptions.test.ts +1 -1
  350. package/src/codex.ts +100 -43
  351. package/src/config/__tests__/saveSession.test.ts +143 -0
  352. package/src/config/builtin-coding-agents.ts +19 -3
  353. package/src/config/index.ts +4 -0
  354. package/src/config/tools.ts +16 -0
  355. package/src/gemini.ts +58 -43
  356. package/src/index.test.ts +12 -12
  357. package/src/index.ts +164 -142
  358. package/src/launcher.ts +22 -3
  359. package/src/logging/logger.ts +32 -10
  360. package/src/opentui/index.solid.ts +1 -0
  361. package/src/repositories/worktree.repository.ts +8 -0
  362. package/src/services/__tests__/BatchMergeService.test.ts +62 -66
  363. package/src/services/__tests__/WorktreeOrchestrator.test.ts +8 -7
  364. package/src/services/codingAgentResolver.ts +30 -4
  365. package/src/services/dependency-installer.ts +0 -7
  366. package/src/types/api.ts +3 -0
  367. package/src/types/coding-agent.ts +85 -0
  368. package/src/types/tools.ts +19 -0
  369. package/src/utils/__tests__/npmRegistry.test.ts +250 -0
  370. package/src/utils/__tests__/prompt.test.ts +4 -5
  371. package/src/utils/coding-agent-colors.ts +165 -0
  372. package/src/utils/command.ts +10 -1
  373. package/src/utils/error-utils.ts +133 -0
  374. package/src/utils/npmRegistry.ts +249 -0
  375. package/src/utils/prompt.ts +1 -1
  376. package/src/utils/session/index.ts +10 -2
  377. package/src/utils/session/parsers/codex.ts +9 -1
  378. package/src/utils/session/parsers/index.ts +6 -0
  379. package/src/utils/session/parsers/opencode.ts +110 -0
  380. package/src/utils/session/types.ts +5 -0
  381. package/src/utils/terminal.ts +24 -0
  382. package/src/utils.test.ts +1 -1
  383. package/src/utils.ts +37 -4
  384. package/src/web/client/src/components/CodingAgentLaunchModal.tsx +12 -21
  385. package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +16 -1
  386. package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +7 -1
  387. package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +11 -6
  388. package/src/web/client/src/lib/coding-agent-colors.ts +149 -0
  389. package/src/web/client/src/pages/BranchDetailPage.tsx +11 -11
  390. package/src/web/server/pty/manager.ts +139 -0
  391. package/src/web/server/routes/sessions.ts +6 -0
  392. package/src/web/server/services/branches.ts +11 -8
  393. package/src/web/server/services/worktrees.ts +2 -2
  394. package/src/worktree.ts +366 -107
  395. package/dist/cli/ui/components/App.d.ts +0 -25
  396. package/dist/cli/ui/components/App.d.ts.map +0 -1
  397. package/dist/cli/ui/components/App.js +0 -988
  398. package/dist/cli/ui/components/App.js.map +0 -1
  399. package/dist/cli/ui/components/common/Confirm.d.ts +0 -13
  400. package/dist/cli/ui/components/common/Confirm.d.ts.map +0 -1
  401. package/dist/cli/ui/components/common/Confirm.js +0 -20
  402. package/dist/cli/ui/components/common/Confirm.js.map +0 -1
  403. package/dist/cli/ui/components/common/ErrorBoundary.d.ts +0 -23
  404. package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +0 -1
  405. package/dist/cli/ui/components/common/ErrorBoundary.js +0 -37
  406. package/dist/cli/ui/components/common/ErrorBoundary.js.map +0 -1
  407. package/dist/cli/ui/components/common/Input.d.ts +0 -19
  408. package/dist/cli/ui/components/common/Input.d.ts.map +0 -1
  409. package/dist/cli/ui/components/common/Input.js +0 -22
  410. package/dist/cli/ui/components/common/Input.js.map +0 -1
  411. package/dist/cli/ui/components/common/LoadingIndicator.d.ts +0 -19
  412. package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +0 -1
  413. package/dist/cli/ui/components/common/LoadingIndicator.js +0 -61
  414. package/dist/cli/ui/components/common/LoadingIndicator.js.map +0 -1
  415. package/dist/cli/ui/components/common/Select.d.ts +0 -38
  416. package/dist/cli/ui/components/common/Select.d.ts.map +0 -1
  417. package/dist/cli/ui/components/common/Select.js +0 -151
  418. package/dist/cli/ui/components/common/Select.js.map +0 -1
  419. package/dist/cli/ui/components/common/SpinnerIcon.d.ts +0 -20
  420. package/dist/cli/ui/components/common/SpinnerIcon.d.ts.map +0 -1
  421. package/dist/cli/ui/components/common/SpinnerIcon.js +0 -61
  422. package/dist/cli/ui/components/common/SpinnerIcon.js.map +0 -1
  423. package/dist/cli/ui/components/parts/Footer.d.ts +0 -15
  424. package/dist/cli/ui/components/parts/Footer.d.ts.map +0 -1
  425. package/dist/cli/ui/components/parts/Footer.js +0 -20
  426. package/dist/cli/ui/components/parts/Footer.js.map +0 -1
  427. package/dist/cli/ui/components/parts/Header.d.ts.map +0 -1
  428. package/dist/cli/ui/components/parts/Header.js +0 -24
  429. package/dist/cli/ui/components/parts/Header.js.map +0 -1
  430. package/dist/cli/ui/components/parts/MergeStatusList.d.ts +0 -13
  431. package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +0 -1
  432. package/dist/cli/ui/components/parts/MergeStatusList.js +0 -52
  433. package/dist/cli/ui/components/parts/MergeStatusList.js.map +0 -1
  434. package/dist/cli/ui/components/parts/ProgressBar.d.ts +0 -13
  435. package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +0 -1
  436. package/dist/cli/ui/components/parts/ProgressBar.js +0 -53
  437. package/dist/cli/ui/components/parts/ProgressBar.js.map +0 -1
  438. package/dist/cli/ui/components/parts/ScrollableList.d.ts +0 -12
  439. package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +0 -1
  440. package/dist/cli/ui/components/parts/ScrollableList.js +0 -11
  441. package/dist/cli/ui/components/parts/ScrollableList.js.map +0 -1
  442. package/dist/cli/ui/components/parts/Stats.d.ts +0 -10
  443. package/dist/cli/ui/components/parts/Stats.d.ts.map +0 -1
  444. package/dist/cli/ui/components/parts/Stats.js +0 -55
  445. package/dist/cli/ui/components/parts/Stats.js.map +0 -1
  446. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +0 -17
  447. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +0 -1
  448. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +0 -42
  449. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +0 -1
  450. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +0 -17
  451. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +0 -1
  452. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +0 -72
  453. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +0 -1
  454. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +0 -18
  455. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +0 -1
  456. package/dist/cli/ui/components/screens/BranchCreatorScreen.js +0 -151
  457. package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +0 -1
  458. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +0 -1
  459. package/dist/cli/ui/components/screens/BranchListScreen.js +0 -476
  460. package/dist/cli/ui/components/screens/BranchListScreen.js.map +0 -1
  461. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +0 -30
  462. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +0 -1
  463. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +0 -145
  464. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +0 -1
  465. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts +0 -27
  466. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts.map +0 -1
  467. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js +0 -93
  468. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js.map +0 -1
  469. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +0 -19
  470. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +0 -1
  471. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +0 -577
  472. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +0 -1
  473. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +0 -45
  474. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +0 -1
  475. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +0 -95
  476. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +0 -1
  477. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +0 -10
  478. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +0 -1
  479. package/dist/cli/ui/components/screens/LogDatePickerScreen.js +0 -44
  480. package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +0 -1
  481. package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +0 -1
  482. package/dist/cli/ui/components/screens/LogDetailScreen.js +0 -34
  483. package/dist/cli/ui/components/screens/LogDetailScreen.js.map +0 -1
  484. package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +0 -1
  485. package/dist/cli/ui/components/screens/LogListScreen.js +0 -107
  486. package/dist/cli/ui/components/screens/LogListScreen.js.map +0 -1
  487. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +0 -24
  488. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +0 -1
  489. package/dist/cli/ui/components/screens/ModelSelectorScreen.js +0 -197
  490. package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +0 -1
  491. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +0 -29
  492. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +0 -1
  493. package/dist/cli/ui/components/screens/PRCleanupScreen.js +0 -92
  494. package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +0 -1
  495. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +0 -31
  496. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +0 -1
  497. package/dist/cli/ui/components/screens/SessionSelectorScreen.js +0 -67
  498. package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +0 -1
  499. package/dist/cli/ui/hooks/useAppInput.d.ts +0 -21
  500. package/dist/cli/ui/hooks/useAppInput.d.ts.map +0 -1
  501. package/dist/cli/ui/hooks/useAppInput.js +0 -138
  502. package/dist/cli/ui/hooks/useAppInput.js.map +0 -1
  503. package/dist/cli/ui/hooks/useBatchMerge.d.ts +0 -17
  504. package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +0 -1
  505. package/dist/cli/ui/hooks/useBatchMerge.js +0 -77
  506. package/dist/cli/ui/hooks/useBatchMerge.js.map +0 -1
  507. package/dist/cli/ui/hooks/useGitData.d.ts +0 -21
  508. package/dist/cli/ui/hooks/useGitData.d.ts.map +0 -1
  509. package/dist/cli/ui/hooks/useGitData.js +0 -229
  510. package/dist/cli/ui/hooks/useGitData.js.map +0 -1
  511. package/dist/cli/ui/hooks/useProfiles.d.ts +0 -41
  512. package/dist/cli/ui/hooks/useProfiles.d.ts.map +0 -1
  513. package/dist/cli/ui/hooks/useProfiles.js +0 -136
  514. package/dist/cli/ui/hooks/useProfiles.js.map +0 -1
  515. package/dist/cli/ui/hooks/useScreenState.d.ts +0 -12
  516. package/dist/cli/ui/hooks/useScreenState.d.ts.map +0 -1
  517. package/dist/cli/ui/hooks/useScreenState.js +0 -30
  518. package/dist/cli/ui/hooks/useScreenState.js.map +0 -1
  519. package/dist/cli/ui/hooks/useTerminalSize.d.ts +0 -9
  520. package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +0 -1
  521. package/dist/cli/ui/hooks/useTerminalSize.js +0 -24
  522. package/dist/cli/ui/hooks/useTerminalSize.js.map +0 -1
  523. package/dist/cli/ui/hooks/useToolStatus.d.ts +0 -30
  524. package/dist/cli/ui/hooks/useToolStatus.d.ts.map +0 -1
  525. package/dist/cli/ui/hooks/useToolStatus.js +0 -49
  526. package/dist/cli/ui/hooks/useToolStatus.js.map +0 -1
  527. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +0 -24
  528. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +0 -1
  529. package/dist/cli/ui/screens/BranchActionSelectorScreen.js +0 -65
  530. package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +0 -1
  531. package/dist/client/assets/index-LNPtOrn3.js +0 -78
  532. package/src/cli/ui/__tests__/SKIPPED_TESTS.md +0 -119
  533. package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +0 -239
  534. package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +0 -225
  535. package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +0 -219
  536. package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +0 -212
  537. package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +0 -440
  538. package/src/cli/ui/__tests__/components/App.test.tsx +0 -365
  539. package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +0 -91
  540. package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +0 -80
  541. package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +0 -104
  542. package/src/cli/ui/__tests__/components/common/Input.test.tsx +0 -100
  543. package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +0 -148
  544. package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +0 -255
  545. package/src/cli/ui/__tests__/components/common/Select.test.tsx +0 -335
  546. package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +0 -65
  547. package/src/cli/ui/__tests__/components/parts/Header.test.tsx +0 -55
  548. package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +0 -69
  549. package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +0 -148
  550. package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +0 -253
  551. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +0 -1070
  552. package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +0 -142
  553. package/src/cli/ui/__tests__/components/screens/CodingAgentSelectorScreen.test.tsx +0 -174
  554. package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +0 -182
  555. package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +0 -57
  556. package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +0 -102
  557. package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +0 -216
  558. package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +0 -147
  559. package/src/cli/ui/__tests__/hooks/useGitData.nonblocking.test.tsx +0 -206
  560. package/src/cli/ui/__tests__/hooks/useGitData.test.ts +0 -197
  561. package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +0 -228
  562. package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +0 -147
  563. package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +0 -99
  564. package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +0 -253
  565. package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +0 -436
  566. package/src/cli/ui/__tests__/integration/navigation.test.tsx +0 -514
  567. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +0 -509
  568. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +0 -216
  569. package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +0 -193
  570. package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +0 -234
  571. package/src/cli/ui/components/App.tsx +0 -1456
  572. package/src/cli/ui/components/common/Confirm.tsx +0 -44
  573. package/src/cli/ui/components/common/ErrorBoundary.tsx +0 -60
  574. package/src/cli/ui/components/common/Input.tsx +0 -58
  575. package/src/cli/ui/components/common/LoadingIndicator.tsx +0 -98
  576. package/src/cli/ui/components/common/Select.tsx +0 -247
  577. package/src/cli/ui/components/common/SpinnerIcon.tsx +0 -86
  578. package/src/cli/ui/components/parts/Footer.tsx +0 -41
  579. package/src/cli/ui/components/parts/Header.test.tsx +0 -75
  580. package/src/cli/ui/components/parts/MergeStatusList.tsx +0 -75
  581. package/src/cli/ui/components/parts/ProgressBar.tsx +0 -73
  582. package/src/cli/ui/components/parts/Stats.tsx +0 -88
  583. package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +0 -74
  584. package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +0 -108
  585. package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +0 -242
  586. package/src/cli/ui/components/screens/BranchListScreen.tsx +0 -744
  587. package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +0 -241
  588. package/src/cli/ui/components/screens/CodingAgentSelectorScreen.tsx +0 -159
  589. package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +0 -928
  590. package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +0 -176
  591. package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +0 -83
  592. package/src/cli/ui/components/screens/LogDetailScreen.tsx +0 -67
  593. package/src/cli/ui/components/screens/LogListScreen.tsx +0 -192
  594. package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +0 -320
  595. package/src/cli/ui/components/screens/PRCleanupScreen.tsx +0 -171
  596. package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +0 -135
  597. package/src/cli/ui/hooks/useAppInput.ts +0 -172
  598. package/src/cli/ui/hooks/useBatchMerge.ts +0 -96
  599. package/src/cli/ui/hooks/useGitData.ts +0 -347
  600. package/src/cli/ui/hooks/useProfiles.ts +0 -211
  601. package/src/cli/ui/hooks/useScreenState.ts +0 -44
  602. package/src/cli/ui/hooks/useTerminalSize.ts +0 -33
  603. package/src/cli/ui/hooks/useToolStatus.ts +0 -68
  604. package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +0 -111
  605. package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +0 -264
package/src/index.ts CHANGED
@@ -13,30 +13,27 @@ 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
+ repairWorktreePath,
36
31
  } from "./worktree.js";
37
32
  import {
38
33
  getTerminalStreams,
34
+ resetTerminalModes,
39
35
  waitForUserAcknowledgement,
36
+ writeTerminalLine,
40
37
  } from "./utils/terminal.js";
41
38
  import { createLogger } from "./logging/logger.js";
42
39
  import { getCodingAgentById, getSharedEnvironment } from "./config/tools.js";
@@ -47,7 +44,12 @@ import {
47
44
  findLatestClaudeSession,
48
45
  findLatestGeminiSession,
49
46
  } from "./utils/session.js";
50
- import { getPackageVersion } from "./utils.js";
47
+ import {
48
+ getPackageVersion,
49
+ setupExitHandlers,
50
+ registerExitCleanup,
51
+ clearExitCleanup,
52
+ } from "./utils.js";
51
53
  import { findLatestClaudeSessionId } from "./utils/session.js";
52
54
  import { resolveContinueSessionId } from "./cli/ui/utils/continueSession.js";
53
55
  import { normalizeModelId } from "./cli/ui/utils/modelOptions.js";
@@ -56,12 +58,13 @@ import {
56
58
  DependencyInstallError,
57
59
  type DependencyInstallResult,
58
60
  } from "./services/dependency-installer.js";
59
- import { waitForEnter } from "./utils/prompt.js";
61
+ import { isGitRelatedError, isRecoverableError } from "./utils/error-utils.js";
60
62
 
61
63
  const ERROR_PROMPT = chalk.yellow(
62
64
  "Review the error details, then press Enter to continue.",
63
65
  );
64
- const POST_SESSION_DELAY_MS = 3000;
66
+ const SUCCESS_PROMPT = chalk.green("Press Enter to return to main menu...");
67
+ const POST_SESSION_DELAY_MS = 500;
65
68
 
66
69
  // Category: cli
67
70
  const appLogger = createLogger({ category: "cli" });
@@ -74,87 +77,23 @@ async function waitForErrorAcknowledgement(): Promise<void> {
74
77
  * Simple print functions (replacing legacy UI display functions)
75
78
  */
76
79
  function printError(message: string): void {
77
- console.error(chalk.red(`❌ ${message}`));
80
+ writeTerminalLine(chalk.red(`❌ ${message}`), "stderr");
78
81
  appLogger.error({ message });
79
82
  }
80
83
 
81
84
  function printInfo(message: string): void {
82
- console.log(chalk.blue(`ℹ️ ${message}`));
85
+ writeTerminalLine(chalk.blue(`ℹ️ ${message}`));
83
86
  appLogger.info({ message });
84
87
  }
85
88
 
86
89
  function printWarning(message: string): void {
87
- console.warn(chalk.yellow(`⚠️ ${message}`));
90
+ writeTerminalLine(chalk.yellow(`⚠️ ${message}`), "stderr");
88
91
  appLogger.warn({ message });
89
92
  }
90
93
 
91
94
  type GitStepResult<T> = { ok: true; value: T } | { ok: false };
92
95
 
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
- }
96
+ // Note: isGitRelatedError and isRecoverableError are now imported from ./utils/error-utils.js
158
97
 
159
98
  async function runGitStep<T>(
160
99
  description: string,
@@ -240,49 +179,71 @@ async function showVersion(): Promise<void> {
240
179
  }
241
180
 
242
181
  /**
243
- * Main function for Ink.js UI
182
+ * Performs terminal cleanup when exiting.
183
+ */
184
+ function performTerminalCleanup(): void {
185
+ const terminal = getTerminalStreams();
186
+ terminal.exitRawMode();
187
+ resetTerminalModes(terminal.stdout);
188
+ }
189
+
190
+ /**
191
+ * Main function for OpenTUI UI
244
192
  * Returns SelectionResult if user made selections, undefined if user quit
245
193
  */
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");
194
+ async function mainSolidUI(): Promise<SelectionResult | undefined> {
195
+ const { renderSolidApp } = await import("./opentui/index.solid.js");
250
196
  const terminal = getTerminalStreams();
251
197
 
198
+ // Register cleanup for signal handlers
199
+ registerExitCleanup(performTerminalCleanup);
252
200
  let selectionResult: SelectionResult | undefined;
201
+ // マウスキャプチャを有効にしてSelection APIで選択終了時にクリップボードへコピー
202
+ const useMouse = true;
203
+ const enableMouseMovement = false;
204
+ const altScreenPreference =
205
+ process.env.GWT_UI_ALT_SCREEN?.trim().toLowerCase();
206
+ // Ink.js版ではalternate screenを使用していなかったため、デフォルトをfalseに
207
+ // alternate screenを使用するとコーディングエージェント起動/終了ログが見えなくなる
208
+ const useAlternateScreen =
209
+ altScreenPreference === "true" || altScreenPreference === "1";
253
210
 
254
- // Resume stdin to ensure it's ready for Ink.js
255
211
  if (typeof terminal.stdin.resume === "function") {
256
212
  terminal.stdin.resume();
257
213
  }
214
+ if (typeof terminal.stdin.setRawMode === "function") {
215
+ try {
216
+ terminal.stdin.setRawMode(true);
217
+ } catch {
218
+ // Ignore raw mode errors and let OpenTUI handle setup.
219
+ }
220
+ }
258
221
 
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
222
  try {
275
- await waitUntilExit();
223
+ await renderSolidApp(
224
+ {
225
+ onExit: (result?: SelectionResult) => {
226
+ selectionResult = result;
227
+ },
228
+ },
229
+ {
230
+ stdin: terminal.stdin,
231
+ stdout: terminal.stdout,
232
+ exitOnCtrlC: true,
233
+ useAlternateScreen,
234
+ useMouse,
235
+ enableMouseMovement,
236
+ },
237
+ );
276
238
  } finally {
277
- terminal.exitRawMode();
239
+ performTerminalCleanup();
278
240
  if (typeof terminal.stdin.pause === "function") {
279
241
  terminal.stdin.pause();
280
242
  }
281
- // Inkが残した data リスナーが子プロセス入力を奪わないようクリーンアップ
282
243
  terminal.stdin.removeAllListeners?.("data");
283
244
  terminal.stdin.removeAllListeners?.("keypress");
284
245
  terminal.stdin.removeAllListeners?.("readable");
285
- unmount();
246
+ clearExitCleanup();
286
247
  }
287
248
 
288
249
  return selectionResult;
@@ -299,12 +260,15 @@ export async function handleAIToolWorkflow(
299
260
  displayName,
300
261
  branchType,
301
262
  remoteBranch,
263
+ baseBranch,
264
+ isNewBranch,
302
265
  tool,
303
266
  mode,
304
267
  skipPermissions,
305
268
  model,
306
269
  inferenceLevel,
307
270
  sessionId: selectedSessionId,
271
+ toolVersion,
308
272
  } = selectionResult;
309
273
 
310
274
  const branchLabel = displayName ?? branch;
@@ -330,7 +294,14 @@ export async function handleAIToolWorkflow(
330
294
  // Determine ensure options (local vs remote branch)
331
295
  const ensureOptions: EnsureWorktreeOptions = {};
332
296
 
333
- if (branchType === "remote") {
297
+ if (isNewBranch) {
298
+ ensureOptions.isNewBranch = true;
299
+ if (baseBranch) {
300
+ ensureOptions.baseBranch = baseBranch;
301
+ }
302
+ }
303
+
304
+ if (branchType === "remote" && !isNewBranch) {
334
305
  const remoteRef = remoteBranch ?? branch;
335
306
  const localExists = await branchExists(branch);
336
307
 
@@ -338,15 +309,37 @@ export async function handleAIToolWorkflow(
338
309
  ensureOptions.isNewBranch = !localExists;
339
310
  }
340
311
 
341
- const existingWorktreeResolution =
342
- await resolveWorktreePathForBranch(branch);
343
- const existingWorktree = existingWorktreeResolution.path;
312
+ let existingWorktreeResolution = await resolveWorktreePathForBranch(branch);
313
+ let existingWorktree = existingWorktreeResolution.path;
314
+
315
+ // mismatch検出時に自動修復を試みる (FR-009〜FR-013)
344
316
  if (!existingWorktree && existingWorktreeResolution.mismatch) {
345
317
  const actualBranch =
346
318
  existingWorktreeResolution.mismatch.actualBranch ?? "unknown";
347
319
  printWarning(
348
- `Worktree mismatch detected: ${existingWorktreeResolution.mismatch.path} is checked out to '${actualBranch}'. Creating or reusing the correct worktree for '${branch}'.`,
320
+ `Worktree mismatch detected: ${existingWorktreeResolution.mismatch.path} is checked out to '${actualBranch}'. Attempting to repair...`,
321
+ );
322
+
323
+ // 共通修復関数を使用してパス修復を試みる
324
+ const repairResult = await repairWorktreePath(
325
+ branch,
326
+ existingWorktreeResolution.mismatch.path,
327
+ repoRoot,
349
328
  );
329
+
330
+ if (repairResult.repaired) {
331
+ // FR-012: 修復成功時のメッセージ
332
+ printInfo(`Worktree path repaired: ${repairResult.newPath}`);
333
+
334
+ // 修復後に再度解決を試みる
335
+ existingWorktreeResolution = await resolveWorktreePathForBranch(branch);
336
+ existingWorktree = existingWorktreeResolution.path;
337
+ } else if (repairResult.removed) {
338
+ // FR-013: メタデータ削除成功時のメッセージ
339
+ printInfo(`Stale worktree metadata removed. Creating new worktree...`);
340
+ } else {
341
+ printWarning(`Failed to repair worktree for '${branch}'.`);
342
+ }
350
343
  }
351
344
 
352
345
  const isProtectedBranch =
@@ -496,16 +489,21 @@ export async function handleAIToolWorkflow(
496
489
  divergenceBranches.add(sanitizedRemoteBranch);
497
490
  }
498
491
 
499
- const divergenceResult = await runGitStep("check branch divergence", () =>
500
- getBranchDivergenceStatuses({
492
+ let divergenceStatuses: Awaited<
493
+ ReturnType<typeof getBranchDivergenceStatuses>
494
+ > = [];
495
+ try {
496
+ divergenceStatuses = await getBranchDivergenceStatuses({
501
497
  cwd: repoRoot,
502
498
  branches: Array.from(divergenceBranches),
503
- }),
504
- );
505
- if (!divergenceResult.ok) {
506
- return;
499
+ });
500
+ } catch (error) {
501
+ const details = error instanceof Error ? error.message : String(error);
502
+ printWarning(
503
+ `Failed to check branch divergence. Error: ${details}. Continuing without blocking.`,
504
+ );
505
+ divergenceStatuses = [];
507
506
  }
508
- const divergenceStatuses = divergenceResult.value;
509
507
  const divergedBranches = divergenceStatuses.filter(
510
508
  (status) => status.remoteAhead > 0 && status.localAhead > 0,
511
509
  );
@@ -519,24 +517,18 @@ export async function handleAIToolWorkflow(
519
517
  ({ branch: divergedBranch, remoteAhead, localAhead }) => {
520
518
  const highlight =
521
519
  divergedBranch === branch ? " (selected branch)" : "";
522
- console.warn(
520
+ writeTerminalLine(
523
521
  chalk.yellow(
524
522
  ` • ${divergedBranch}${highlight} remote:+${remoteAhead} local:+${localAhead}`,
525
523
  ),
524
+ "stderr",
526
525
  );
527
526
  },
528
527
  );
529
528
 
530
529
  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.",
530
+ "Resolve these divergences (e.g., rebase or merge) to avoid conflicts. Continuing without blocking.",
535
531
  );
536
- printWarning(
537
- "AI tool launch has been cancelled until divergences are resolved.",
538
- );
539
- return;
540
532
  } else if (fastForwardError) {
541
533
  printWarning(
542
534
  `Fast-forward pull could not complete (${fastForwardError.message}). Continuing without blocking.`,
@@ -565,6 +557,7 @@ export async function handleAIToolWorkflow(
565
557
  model: normalizedModel ?? null,
566
558
  reasoningLevel: inferenceLevel ?? null,
567
559
  skipPermissions: skipPermissions ?? null,
560
+ toolVersion: toolVersion ?? null,
568
561
  timestamp: Date.now(),
569
562
  repositoryRoot: repoRoot,
570
563
  });
@@ -612,6 +605,7 @@ export async function handleAIToolWorkflow(
612
605
  model: normalizedModel ?? null,
613
606
  reasoningLevel: inferenceLevel ?? null,
614
607
  skipPermissions: skipPermissions ?? null,
608
+ toolVersion: toolVersion ?? null,
615
609
  timestamp: Date.now(),
616
610
  repositoryRoot: repoRoot,
617
611
  },
@@ -635,6 +629,7 @@ export async function handleAIToolWorkflow(
635
629
  model?: string;
636
630
  sessionId?: string | null;
637
631
  chrome?: boolean;
632
+ version?: string | null;
638
633
  } = {
639
634
  mode:
640
635
  mode === "resume"
@@ -646,6 +641,7 @@ export async function handleAIToolWorkflow(
646
641
  envOverrides: sharedEnv,
647
642
  sessionId: resumeSessionId,
648
643
  chrome: true,
644
+ version: toolVersion ?? null,
649
645
  };
650
646
  if (normalizedModel) {
651
647
  launchOptions.model = normalizedModel;
@@ -659,6 +655,7 @@ export async function handleAIToolWorkflow(
659
655
  model?: string;
660
656
  reasoningEffort?: CodexReasoningEffort;
661
657
  sessionId?: string | null;
658
+ version?: string | null;
662
659
  } = {
663
660
  mode:
664
661
  mode === "resume"
@@ -669,6 +666,7 @@ export async function handleAIToolWorkflow(
669
666
  bypassApprovals: skipPermissions,
670
667
  envOverrides: sharedEnv,
671
668
  sessionId: resumeSessionId,
669
+ version: toolVersion ?? null,
672
670
  };
673
671
  if (normalizedModel) {
674
672
  launchOptions.model = normalizedModel;
@@ -685,6 +683,7 @@ export async function handleAIToolWorkflow(
685
683
  envOverrides?: Record<string, string>;
686
684
  model?: string;
687
685
  sessionId?: string | null;
686
+ version?: string | null;
688
687
  } = {
689
688
  mode:
690
689
  mode === "resume"
@@ -695,25 +694,34 @@ export async function handleAIToolWorkflow(
695
694
  skipPermissions,
696
695
  envOverrides: sharedEnv,
697
696
  sessionId: resumeSessionId,
697
+ version: toolVersion ?? null,
698
698
  };
699
699
  if (normalizedModel) {
700
700
  launchOptions.model = normalizedModel;
701
701
  }
702
702
  launchResult = await launchGeminiCLI(worktreePath, launchOptions);
703
703
  } else {
704
- // Custom coding agent
704
+ // Custom coding agent (including OpenCode)
705
705
  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
- });
706
+ const customLaunchOptions: import("./types/tools.js").CodingAgentLaunchOptions =
707
+ {
708
+ mode:
709
+ mode === "resume"
710
+ ? "resume"
711
+ : mode === "continue"
712
+ ? "continue"
713
+ : "normal",
714
+ skipPermissions,
715
+ cwd: worktreePath,
716
+ sharedEnv,
717
+ };
718
+ if (toolVersion) {
719
+ customLaunchOptions.version = toolVersion;
720
+ }
721
+ launchResult = await launchCodingAgent(
722
+ agentConfig,
723
+ customLaunchOptions,
724
+ );
717
725
  }
718
726
  } finally {
719
727
  // FR-043: Clear the periodic timestamp update timer
@@ -791,6 +799,7 @@ export async function handleAIToolWorkflow(
791
799
  model: normalizedModel ?? null,
792
800
  reasoningLevel: inferenceLevel ?? null,
793
801
  skipPermissions: skipPermissions ?? null,
802
+ toolVersion: toolVersion ?? null,
794
803
  timestamp: Date.now(),
795
804
  repositoryRoot: repoRoot,
796
805
  lastSessionId: finalSessionId,
@@ -833,7 +842,8 @@ export async function handleAIToolWorkflow(
833
842
 
834
843
  // Small buffer before returning to branch list to avoid abrupt screen swap
835
844
  await new Promise((resolve) => setTimeout(resolve, POST_SESSION_DELAY_MS));
836
- printInfo("Session completed successfully. Returning to main menu...");
845
+ printInfo("Session completed successfully.");
846
+ await waitForUserAcknowledgement(SUCCESS_PROMPT);
837
847
  return;
838
848
  } catch (error) {
839
849
  // Handle recoverable errors (Git, Worktree, Codex errors)
@@ -851,6 +861,10 @@ export async function handleAIToolWorkflow(
851
861
  type UIHandler = () => Promise<SelectionResult | undefined>;
852
862
  type WorkflowHandler = (selection: SelectionResult) => Promise<void>;
853
863
 
864
+ function resolveUIHandler(): UIHandler {
865
+ return mainSolidUI;
866
+ }
867
+
854
868
  function logLoopError(error: unknown, context: "ui" | "workflow"): void {
855
869
  const label = context === "ui" ? "UI" : "workflow";
856
870
  if (error instanceof Error) {
@@ -861,10 +875,10 @@ function logLoopError(error: unknown, context: "ui" | "workflow"): void {
861
875
  }
862
876
 
863
877
  export async function runInteractiveLoop(
864
- uiHandler: UIHandler = mainInkUI,
878
+ uiHandler: UIHandler = resolveUIHandler(),
865
879
  workflowHandler: WorkflowHandler = handleAIToolWorkflow,
866
880
  ): Promise<void> {
867
- // Main loop: UI → AI Tool → back to UI
881
+ // Main loop: UI → Coding Agent → back to UI
868
882
  while (true) {
869
883
  let selectionResult: SelectionResult | undefined;
870
884
 
@@ -895,6 +909,9 @@ export async function runInteractiveLoop(
895
909
  * Main entry point
896
910
  */
897
911
  export async function main(): Promise<void> {
912
+ // Setup global signal handlers for clean exit
913
+ setupExitHandlers();
914
+
898
915
  // Parse command line arguments
899
916
  const args = process.argv.slice(2);
900
917
  const showVersionFlag = args.includes("-v") || args.includes("--version");
@@ -939,6 +956,9 @@ export async function main(): Promise<void> {
939
956
  }
940
957
 
941
958
  await runInteractiveLoop();
959
+
960
+ // Ensure clean exit with code 0
961
+ process.exit(0);
942
962
  }
943
963
 
944
964
  export function isEntryPoint(metaUrl: string, argv1?: string): boolean {
@@ -955,7 +975,9 @@ export function isEntryPoint(metaUrl: string, argv1?: string): boolean {
955
975
  // Run the application if this module is executed directly
956
976
  if (isEntryPoint(import.meta.url, process.argv[1])) {
957
977
  main().catch(async (error) => {
958
- console.error("Fatal error:", error);
978
+ const details =
979
+ error instanceof Error ? (error.stack ?? error.message) : String(error);
980
+ writeTerminalLine(`Fatal error: ${details}`, "stderr");
959
981
  await waitForErrorAcknowledgement();
960
982
  process.exit(1);
961
983
  });
package/src/launcher.ts CHANGED
@@ -6,8 +6,11 @@
6
6
  */
7
7
 
8
8
  import { execa } from "execa";
9
+ import chalk from "chalk";
9
10
  import type { CodingAgent, CodingAgentLaunchOptions } from "./types/tools.js";
10
11
  import { createLogger } from "./logging/logger.js";
12
+ import { resolveVersionSuffix } from "./utils/npmRegistry.js";
13
+ import { writeTerminalLine } from "./utils/terminal.js";
11
14
 
12
15
  const logger = createLogger({ category: "launcher" });
13
16
 
@@ -150,9 +153,25 @@ export async function launchCodingAgent(
150
153
 
151
154
  case "bunx": {
152
155
  // bunx経由でパッケージ実行
153
- // bunx [package] [args...]
154
- await execa("bunx", [agent.command, ...args], execaOptions);
155
- logger.info({ agentId: agent.id }, "Coding agent completed (bunx)");
156
+ // バージョン指定がある場合はパッケージ名に付与
157
+ const selectedVersion = options.version ?? "installed";
158
+ const versionSuffix = resolveVersionSuffix(options.version);
159
+ const packageWithVersion = `${agent.command}${versionSuffix}`;
160
+
161
+ // FR-072: Log version information
162
+ if (selectedVersion === "installed") {
163
+ writeTerminalLine(chalk.green(` 📦 Version: installed`));
164
+ } else {
165
+ writeTerminalLine(chalk.green(` 📦 Version: @${selectedVersion}`));
166
+ }
167
+ writeTerminalLine(chalk.cyan(` 🔄 Using bunx ${packageWithVersion}`));
168
+
169
+ // bunx [package@version] [args...]
170
+ await execa("bunx", [packageWithVersion, ...args], execaOptions);
171
+ logger.info(
172
+ { agentId: agent.id, version: selectedVersion },
173
+ "Coding agent completed (bunx)",
174
+ );
156
175
  break;
157
176
  }
158
177
 
@@ -31,6 +31,11 @@ export function createLogger(config: LoggerConfig = {}): Logger {
31
31
  const filename = config.filename ?? `${formatDate(new Date())}.jsonl`;
32
32
  const category = config.category ?? "default";
33
33
  const keepDays = config.keepDays ?? 7;
34
+ const platform = os.platform();
35
+ const isWSL =
36
+ platform === "linux" && os.release().toLowerCase().includes("microsoft");
37
+ const preferDirectDestination =
38
+ platform === "win32" || isWSL || process.env.GWT_LOGGER_TRANSPORT === "0";
34
39
 
35
40
  if (!fs.existsSync(logDir)) {
36
41
  fs.mkdirSync(logDir, { recursive: true });
@@ -58,17 +63,34 @@ export function createLogger(config: LoggerConfig = {}): Logger {
58
63
  return pino(options, destinationStream);
59
64
  }
60
65
 
61
- const transport = pino.transport({
62
- targets: [
63
- {
64
- target: "pino/file",
65
- options: { destination, mkdir: true, append: true },
66
- level,
67
- },
68
- ],
69
- });
66
+ if (!preferDirectDestination) {
67
+ try {
68
+ const transport = pino.transport({
69
+ targets: [
70
+ {
71
+ target: "pino/file",
72
+ options: { destination, mkdir: true, append: true },
73
+ level,
74
+ },
75
+ ],
76
+ });
77
+
78
+ return pino(options, transport);
79
+ } catch (error) {
80
+ if (process.env.DEBUG_LOGGER) {
81
+ console.error(
82
+ "Logger transport disabled; falling back to direct file destination.",
83
+ error instanceof Error ? error.message : String(error),
84
+ );
85
+ }
86
+ }
87
+ }
70
88
 
71
- return pino(options, transport);
89
+ const destinationStream = pino.destination({
90
+ dest: destination,
91
+ sync: false,
92
+ });
93
+ return pino(options, destinationStream);
72
94
  }
73
95
 
74
96
  /** Convenience logger for quick use (category defaults to "default"). */
@@ -0,0 +1 @@
1
+ export { renderSolidApp } from "../cli/ui/index.solid.js";
@@ -66,4 +66,12 @@ export class WorktreeRepository {
66
66
  async prune(): Promise<void> {
67
67
  await this.execute(["prune"]);
68
68
  }
69
+
70
+ async repair(worktreePaths?: string[]): Promise<void> {
71
+ const args = ["repair"];
72
+ if (worktreePaths && worktreePaths.length > 0) {
73
+ args.push(...worktreePaths);
74
+ }
75
+ await this.execute(args);
76
+ }
69
77
  }