@akiojin/gwt 4.10.0 → 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 (579) 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.js +4 -4
  156. package/dist/config/builtin-coding-agents.js.map +1 -1
  157. package/dist/config/index.d.ts +2 -0
  158. package/dist/config/index.d.ts.map +1 -1
  159. package/dist/config/index.js +2 -0
  160. package/dist/config/index.js.map +1 -1
  161. package/dist/gemini.d.ts +1 -0
  162. package/dist/gemini.d.ts.map +1 -1
  163. package/dist/gemini.js +42 -37
  164. package/dist/gemini.js.map +1 -1
  165. package/dist/index.d.ts +1 -1
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +122 -102
  168. package/dist/index.js.map +1 -1
  169. package/dist/launcher.d.ts.map +1 -1
  170. package/dist/launcher.js +18 -3
  171. package/dist/launcher.js.map +1 -1
  172. package/dist/logging/logger.d.ts.map +1 -1
  173. package/dist/logging/logger.js +26 -9
  174. package/dist/logging/logger.js.map +1 -1
  175. package/dist/opentui/highlights-eq9cgrbb.scm +604 -0
  176. package/dist/opentui/highlights-ghv9g403.scm +205 -0
  177. package/dist/opentui/highlights-hk7bwhj4.scm +284 -0
  178. package/dist/opentui/highlights-r812a2qc.scm +150 -0
  179. package/dist/opentui/highlights-x6tmsnaa.scm +115 -0
  180. package/dist/opentui/index.solid.d.ts +2 -0
  181. package/dist/opentui/index.solid.d.ts.map +1 -0
  182. package/dist/opentui/index.solid.js +52034 -0
  183. package/dist/opentui/index.solid.js.map +1 -0
  184. package/dist/opentui/injections-73j83es3.scm +27 -0
  185. package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  186. package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
  187. package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  188. package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  189. package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
  190. package/dist/repositories/worktree.repository.d.ts +1 -0
  191. package/dist/repositories/worktree.repository.d.ts.map +1 -1
  192. package/dist/repositories/worktree.repository.js +7 -0
  193. package/dist/repositories/worktree.repository.js.map +1 -1
  194. package/dist/services/codingAgentResolver.d.ts +2 -0
  195. package/dist/services/codingAgentResolver.d.ts.map +1 -1
  196. package/dist/services/codingAgentResolver.js +30 -4
  197. package/dist/services/codingAgentResolver.js.map +1 -1
  198. package/dist/services/dependency-installer.d.ts.map +1 -1
  199. package/dist/services/dependency-installer.js +0 -5
  200. package/dist/services/dependency-installer.js.map +1 -1
  201. package/dist/types/api.d.ts +3 -0
  202. package/dist/types/api.d.ts.map +1 -1
  203. package/dist/types/coding-agent.d.ts +62 -0
  204. package/dist/types/coding-agent.d.ts.map +1 -0
  205. package/dist/types/coding-agent.js +29 -0
  206. package/dist/types/coding-agent.js.map +1 -0
  207. package/dist/types/tools.d.ts +17 -0
  208. package/dist/types/tools.d.ts.map +1 -1
  209. package/dist/utils/coding-agent-colors.d.ts +88 -0
  210. package/dist/utils/coding-agent-colors.d.ts.map +1 -0
  211. package/dist/utils/coding-agent-colors.js +137 -0
  212. package/dist/utils/coding-agent-colors.js.map +1 -0
  213. package/dist/utils/command.d.ts +1 -1
  214. package/dist/utils/command.js +1 -1
  215. package/dist/utils/error-utils.d.ts +27 -0
  216. package/dist/utils/error-utils.d.ts.map +1 -0
  217. package/dist/utils/error-utils.js +98 -0
  218. package/dist/utils/error-utils.js.map +1 -0
  219. package/dist/utils/npmRegistry.d.ts +61 -0
  220. package/dist/utils/npmRegistry.d.ts.map +1 -0
  221. package/dist/utils/npmRegistry.js +180 -0
  222. package/dist/utils/npmRegistry.js.map +1 -0
  223. package/dist/utils/prompt.d.ts +1 -1
  224. package/dist/utils/prompt.js +1 -1
  225. package/dist/utils/session/parsers/codex.d.ts.map +1 -1
  226. package/dist/utils/session/parsers/codex.js +8 -1
  227. package/dist/utils/session/parsers/codex.js.map +1 -1
  228. package/dist/utils/terminal.d.ts +1 -0
  229. package/dist/utils/terminal.d.ts.map +1 -1
  230. package/dist/utils/terminal.js +20 -0
  231. package/dist/utils/terminal.js.map +1 -1
  232. package/dist/utils.d.ts +9 -0
  233. package/dist/utils.d.ts.map +1 -1
  234. package/dist/utils.js +33 -2
  235. package/dist/utils.js.map +1 -1
  236. package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +1 -1
  237. package/dist/web/client/src/components/CodingAgentLaunchModal.js +7 -16
  238. package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +1 -1
  239. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
  240. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +7 -2
  241. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
  242. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -1
  243. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +2 -1
  244. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -1
  245. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +2 -2
  246. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -1
  247. package/dist/web/client/src/components/branch-detail/ToolLauncher.js +5 -5
  248. package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -1
  249. package/dist/web/client/src/lib/coding-agent-colors.d.ts +86 -0
  250. package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +1 -0
  251. package/dist/web/client/src/lib/coding-agent-colors.js +135 -0
  252. package/dist/web/client/src/lib/coding-agent-colors.js.map +1 -0
  253. package/dist/web/client/src/pages/BranchDetailPage.js +10 -10
  254. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
  255. package/dist/web/server/pty/manager.d.ts +2 -0
  256. package/dist/web/server/pty/manager.d.ts.map +1 -1
  257. package/dist/web/server/pty/manager.js +104 -0
  258. package/dist/web/server/pty/manager.js.map +1 -1
  259. package/dist/web/server/routes/sessions.d.ts.map +1 -1
  260. package/dist/web/server/routes/sessions.js +5 -1
  261. package/dist/web/server/routes/sessions.js.map +1 -1
  262. package/dist/web/server/services/branches.d.ts.map +1 -1
  263. package/dist/web/server/services/branches.js +10 -8
  264. package/dist/web/server/services/branches.js.map +1 -1
  265. package/dist/web/server/services/worktrees.js +2 -2
  266. package/dist/web/server/services/worktrees.js.map +1 -1
  267. package/dist/worktree.d.ts +47 -1
  268. package/dist/worktree.d.ts.map +1 -1
  269. package/dist/worktree.js +280 -94
  270. package/dist/worktree.js.map +1 -1
  271. package/package.json +12 -14
  272. package/src/claude.ts +68 -70
  273. package/src/cli/ui/App.solid.tsx +1823 -0
  274. package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +255 -0
  275. package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +243 -0
  276. package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +237 -0
  277. package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +231 -0
  278. package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +238 -0
  279. package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +7 -289
  280. package/src/cli/ui/__tests__/utils/clipboard.test.ts +3 -3
  281. package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +1 -1
  282. package/src/cli/ui/components/solid/Footer.tsx +36 -0
  283. package/src/cli/ui/components/{parts → solid}/Header.tsx +17 -28
  284. package/src/cli/ui/components/solid/HelpOverlay.tsx +194 -0
  285. package/src/cli/ui/components/solid/QuickStartStep.tsx +197 -0
  286. package/src/cli/ui/components/{parts → solid}/ScrollableList.tsx +7 -8
  287. package/src/cli/ui/components/solid/SearchInput.tsx +42 -0
  288. package/src/cli/ui/components/solid/SelectInput.tsx +84 -0
  289. package/src/cli/ui/components/solid/Stats.tsx +92 -0
  290. package/src/cli/ui/components/solid/TextInput.tsx +49 -0
  291. package/src/cli/ui/components/solid/WizardController.tsx +384 -0
  292. package/src/cli/ui/components/solid/WizardPopup.tsx +135 -0
  293. package/src/cli/ui/components/solid/WizardSteps.tsx +793 -0
  294. package/src/cli/ui/core/index.ts +17 -0
  295. package/src/cli/ui/core/keybindings.ts +367 -0
  296. package/src/cli/ui/core/theme.ts +234 -0
  297. package/src/cli/ui/core/types.ts +235 -0
  298. package/src/cli/ui/hooks/solid/useAsyncOperation.ts +76 -0
  299. package/src/cli/ui/hooks/solid/useFilter.ts +86 -0
  300. package/src/cli/ui/hooks/solid/useGitOperations.ts +80 -0
  301. package/src/cli/ui/hooks/solid/useKeyHandler.ts +103 -0
  302. package/src/cli/ui/hooks/solid/useScrollableList.ts +149 -0
  303. package/src/cli/ui/hooks/solid/useSelection.ts +77 -0
  304. package/src/cli/ui/hooks/solid/useTerminalSize.ts +22 -0
  305. package/src/cli/ui/index.solid.ts +28 -0
  306. package/src/cli/ui/screens/solid/BranchListScreen.tsx +1050 -0
  307. package/src/cli/ui/screens/solid/ConfirmScreen.tsx +74 -0
  308. package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +159 -0
  309. package/src/cli/ui/screens/solid/ErrorScreen.tsx +42 -0
  310. package/src/cli/ui/screens/solid/InputScreen.tsx +55 -0
  311. package/src/cli/ui/screens/solid/LoadingIndicator.tsx +77 -0
  312. package/src/cli/ui/screens/solid/LogDetailScreen.tsx +75 -0
  313. package/src/cli/ui/screens/solid/LogScreen.tsx +175 -0
  314. package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +192 -0
  315. package/src/cli/ui/screens/solid/ProfileScreen.tsx +98 -0
  316. package/src/cli/ui/screens/solid/SelectorScreen.tsx +170 -0
  317. package/src/cli/ui/screens/solid/SettingsScreen.tsx +50 -0
  318. package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +136 -0
  319. package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +40 -0
  320. package/src/cli/ui/stores/appStore.ts +208 -0
  321. package/src/cli/ui/stores/branchStore.ts +357 -0
  322. package/src/cli/ui/stores/index.ts +31 -0
  323. package/src/cli/ui/stores/uiStore.ts +226 -0
  324. package/src/cli/ui/types.ts +20 -3
  325. package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +180 -0
  326. package/src/cli/ui/utils/branchFormatter.ts +8 -215
  327. package/src/cli/ui/utils/continueSession.ts +44 -0
  328. package/src/cli/ui/utils/modelOptions.test.ts +1 -1
  329. package/src/codex.ts +100 -43
  330. package/src/config/__tests__/saveSession.test.ts +143 -0
  331. package/src/config/builtin-coding-agents.ts +4 -4
  332. package/src/config/index.ts +4 -0
  333. package/src/gemini.ts +58 -43
  334. package/src/index.test.ts +12 -12
  335. package/src/index.ts +164 -142
  336. package/src/launcher.ts +22 -3
  337. package/src/logging/logger.ts +32 -10
  338. package/src/opentui/index.solid.ts +1 -0
  339. package/src/repositories/worktree.repository.ts +8 -0
  340. package/src/services/__tests__/BatchMergeService.test.ts +62 -66
  341. package/src/services/__tests__/WorktreeOrchestrator.test.ts +8 -7
  342. package/src/services/codingAgentResolver.ts +30 -4
  343. package/src/services/dependency-installer.ts +0 -7
  344. package/src/types/api.ts +3 -0
  345. package/src/types/coding-agent.ts +85 -0
  346. package/src/types/tools.ts +19 -0
  347. package/src/utils/__tests__/npmRegistry.test.ts +250 -0
  348. package/src/utils/__tests__/prompt.test.ts +4 -5
  349. package/src/utils/coding-agent-colors.ts +165 -0
  350. package/src/utils/command.ts +1 -1
  351. package/src/utils/error-utils.ts +133 -0
  352. package/src/utils/npmRegistry.ts +249 -0
  353. package/src/utils/prompt.ts +1 -1
  354. package/src/utils/session/parsers/codex.ts +9 -1
  355. package/src/utils/terminal.ts +24 -0
  356. package/src/utils.test.ts +1 -1
  357. package/src/utils.ts +37 -4
  358. package/src/web/client/src/components/CodingAgentLaunchModal.tsx +12 -21
  359. package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +16 -1
  360. package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +7 -1
  361. package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +11 -6
  362. package/src/web/client/src/lib/coding-agent-colors.ts +149 -0
  363. package/src/web/client/src/pages/BranchDetailPage.tsx +11 -11
  364. package/src/web/server/pty/manager.ts +139 -0
  365. package/src/web/server/routes/sessions.ts +6 -0
  366. package/src/web/server/services/branches.ts +11 -8
  367. package/src/web/server/services/worktrees.ts +2 -2
  368. package/src/worktree.ts +366 -107
  369. package/dist/cli/ui/components/App.d.ts +0 -25
  370. package/dist/cli/ui/components/App.d.ts.map +0 -1
  371. package/dist/cli/ui/components/App.js +0 -1006
  372. package/dist/cli/ui/components/App.js.map +0 -1
  373. package/dist/cli/ui/components/common/Confirm.d.ts +0 -13
  374. package/dist/cli/ui/components/common/Confirm.d.ts.map +0 -1
  375. package/dist/cli/ui/components/common/Confirm.js +0 -20
  376. package/dist/cli/ui/components/common/Confirm.js.map +0 -1
  377. package/dist/cli/ui/components/common/ErrorBoundary.d.ts +0 -23
  378. package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +0 -1
  379. package/dist/cli/ui/components/common/ErrorBoundary.js +0 -37
  380. package/dist/cli/ui/components/common/ErrorBoundary.js.map +0 -1
  381. package/dist/cli/ui/components/common/Input.d.ts +0 -19
  382. package/dist/cli/ui/components/common/Input.d.ts.map +0 -1
  383. package/dist/cli/ui/components/common/Input.js +0 -22
  384. package/dist/cli/ui/components/common/Input.js.map +0 -1
  385. package/dist/cli/ui/components/common/LoadingIndicator.d.ts +0 -19
  386. package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +0 -1
  387. package/dist/cli/ui/components/common/LoadingIndicator.js +0 -61
  388. package/dist/cli/ui/components/common/LoadingIndicator.js.map +0 -1
  389. package/dist/cli/ui/components/common/Select.d.ts +0 -38
  390. package/dist/cli/ui/components/common/Select.d.ts.map +0 -1
  391. package/dist/cli/ui/components/common/Select.js +0 -151
  392. package/dist/cli/ui/components/common/Select.js.map +0 -1
  393. package/dist/cli/ui/components/common/SpinnerIcon.d.ts +0 -20
  394. package/dist/cli/ui/components/common/SpinnerIcon.d.ts.map +0 -1
  395. package/dist/cli/ui/components/common/SpinnerIcon.js +0 -61
  396. package/dist/cli/ui/components/common/SpinnerIcon.js.map +0 -1
  397. package/dist/cli/ui/components/parts/Footer.d.ts +0 -15
  398. package/dist/cli/ui/components/parts/Footer.d.ts.map +0 -1
  399. package/dist/cli/ui/components/parts/Footer.js +0 -20
  400. package/dist/cli/ui/components/parts/Footer.js.map +0 -1
  401. package/dist/cli/ui/components/parts/Header.d.ts.map +0 -1
  402. package/dist/cli/ui/components/parts/Header.js +0 -24
  403. package/dist/cli/ui/components/parts/Header.js.map +0 -1
  404. package/dist/cli/ui/components/parts/MergeStatusList.d.ts +0 -13
  405. package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +0 -1
  406. package/dist/cli/ui/components/parts/MergeStatusList.js +0 -52
  407. package/dist/cli/ui/components/parts/MergeStatusList.js.map +0 -1
  408. package/dist/cli/ui/components/parts/ProgressBar.d.ts +0 -13
  409. package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +0 -1
  410. package/dist/cli/ui/components/parts/ProgressBar.js +0 -53
  411. package/dist/cli/ui/components/parts/ProgressBar.js.map +0 -1
  412. package/dist/cli/ui/components/parts/ScrollableList.d.ts +0 -12
  413. package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +0 -1
  414. package/dist/cli/ui/components/parts/ScrollableList.js +0 -11
  415. package/dist/cli/ui/components/parts/ScrollableList.js.map +0 -1
  416. package/dist/cli/ui/components/parts/Stats.d.ts +0 -10
  417. package/dist/cli/ui/components/parts/Stats.d.ts.map +0 -1
  418. package/dist/cli/ui/components/parts/Stats.js +0 -55
  419. package/dist/cli/ui/components/parts/Stats.js.map +0 -1
  420. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +0 -17
  421. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +0 -1
  422. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +0 -42
  423. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +0 -1
  424. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +0 -17
  425. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +0 -1
  426. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +0 -72
  427. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +0 -1
  428. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +0 -18
  429. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +0 -1
  430. package/dist/cli/ui/components/screens/BranchCreatorScreen.js +0 -151
  431. package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +0 -1
  432. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +0 -1
  433. package/dist/cli/ui/components/screens/BranchListScreen.js +0 -476
  434. package/dist/cli/ui/components/screens/BranchListScreen.js.map +0 -1
  435. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +0 -30
  436. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +0 -1
  437. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +0 -148
  438. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +0 -1
  439. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts +0 -27
  440. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts.map +0 -1
  441. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js +0 -93
  442. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js.map +0 -1
  443. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +0 -19
  444. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +0 -1
  445. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +0 -577
  446. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +0 -1
  447. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +0 -45
  448. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +0 -1
  449. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +0 -95
  450. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +0 -1
  451. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +0 -10
  452. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +0 -1
  453. package/dist/cli/ui/components/screens/LogDatePickerScreen.js +0 -44
  454. package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +0 -1
  455. package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +0 -1
  456. package/dist/cli/ui/components/screens/LogDetailScreen.js +0 -34
  457. package/dist/cli/ui/components/screens/LogDetailScreen.js.map +0 -1
  458. package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +0 -1
  459. package/dist/cli/ui/components/screens/LogListScreen.js +0 -107
  460. package/dist/cli/ui/components/screens/LogListScreen.js.map +0 -1
  461. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +0 -24
  462. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +0 -1
  463. package/dist/cli/ui/components/screens/ModelSelectorScreen.js +0 -197
  464. package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +0 -1
  465. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +0 -29
  466. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +0 -1
  467. package/dist/cli/ui/components/screens/PRCleanupScreen.js +0 -92
  468. package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +0 -1
  469. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +0 -31
  470. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +0 -1
  471. package/dist/cli/ui/components/screens/SessionSelectorScreen.js +0 -67
  472. package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +0 -1
  473. package/dist/cli/ui/hooks/useAppInput.d.ts +0 -21
  474. package/dist/cli/ui/hooks/useAppInput.d.ts.map +0 -1
  475. package/dist/cli/ui/hooks/useAppInput.js +0 -138
  476. package/dist/cli/ui/hooks/useAppInput.js.map +0 -1
  477. package/dist/cli/ui/hooks/useBatchMerge.d.ts +0 -17
  478. package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +0 -1
  479. package/dist/cli/ui/hooks/useBatchMerge.js +0 -77
  480. package/dist/cli/ui/hooks/useBatchMerge.js.map +0 -1
  481. package/dist/cli/ui/hooks/useGitData.d.ts +0 -21
  482. package/dist/cli/ui/hooks/useGitData.d.ts.map +0 -1
  483. package/dist/cli/ui/hooks/useGitData.js +0 -229
  484. package/dist/cli/ui/hooks/useGitData.js.map +0 -1
  485. package/dist/cli/ui/hooks/useProfiles.d.ts +0 -41
  486. package/dist/cli/ui/hooks/useProfiles.d.ts.map +0 -1
  487. package/dist/cli/ui/hooks/useProfiles.js +0 -136
  488. package/dist/cli/ui/hooks/useProfiles.js.map +0 -1
  489. package/dist/cli/ui/hooks/useScreenState.d.ts +0 -12
  490. package/dist/cli/ui/hooks/useScreenState.d.ts.map +0 -1
  491. package/dist/cli/ui/hooks/useScreenState.js +0 -30
  492. package/dist/cli/ui/hooks/useScreenState.js.map +0 -1
  493. package/dist/cli/ui/hooks/useTerminalSize.d.ts +0 -9
  494. package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +0 -1
  495. package/dist/cli/ui/hooks/useTerminalSize.js +0 -24
  496. package/dist/cli/ui/hooks/useTerminalSize.js.map +0 -1
  497. package/dist/cli/ui/hooks/useToolStatus.d.ts +0 -30
  498. package/dist/cli/ui/hooks/useToolStatus.d.ts.map +0 -1
  499. package/dist/cli/ui/hooks/useToolStatus.js +0 -49
  500. package/dist/cli/ui/hooks/useToolStatus.js.map +0 -1
  501. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +0 -24
  502. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +0 -1
  503. package/dist/cli/ui/screens/BranchActionSelectorScreen.js +0 -65
  504. package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +0 -1
  505. package/dist/client/assets/index-LNPtOrn3.js +0 -78
  506. package/src/cli/ui/__tests__/SKIPPED_TESTS.md +0 -119
  507. package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +0 -239
  508. package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +0 -225
  509. package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +0 -219
  510. package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +0 -212
  511. package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +0 -440
  512. package/src/cli/ui/__tests__/components/App.test.tsx +0 -365
  513. package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +0 -91
  514. package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +0 -80
  515. package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +0 -104
  516. package/src/cli/ui/__tests__/components/common/Input.test.tsx +0 -100
  517. package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +0 -148
  518. package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +0 -255
  519. package/src/cli/ui/__tests__/components/common/Select.test.tsx +0 -335
  520. package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +0 -65
  521. package/src/cli/ui/__tests__/components/parts/Header.test.tsx +0 -55
  522. package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +0 -69
  523. package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +0 -148
  524. package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +0 -253
  525. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +0 -1070
  526. package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +0 -142
  527. package/src/cli/ui/__tests__/components/screens/CodingAgentSelectorScreen.test.tsx +0 -174
  528. package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +0 -182
  529. package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +0 -57
  530. package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +0 -102
  531. package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +0 -216
  532. package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +0 -147
  533. package/src/cli/ui/__tests__/hooks/useGitData.nonblocking.test.tsx +0 -206
  534. package/src/cli/ui/__tests__/hooks/useGitData.test.ts +0 -197
  535. package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +0 -228
  536. package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +0 -147
  537. package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +0 -99
  538. package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +0 -253
  539. package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +0 -436
  540. package/src/cli/ui/__tests__/integration/navigation.test.tsx +0 -514
  541. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +0 -509
  542. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +0 -216
  543. package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +0 -193
  544. package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +0 -234
  545. package/src/cli/ui/components/App.tsx +0 -1478
  546. package/src/cli/ui/components/common/Confirm.tsx +0 -44
  547. package/src/cli/ui/components/common/ErrorBoundary.tsx +0 -60
  548. package/src/cli/ui/components/common/Input.tsx +0 -58
  549. package/src/cli/ui/components/common/LoadingIndicator.tsx +0 -98
  550. package/src/cli/ui/components/common/Select.tsx +0 -247
  551. package/src/cli/ui/components/common/SpinnerIcon.tsx +0 -86
  552. package/src/cli/ui/components/parts/Footer.tsx +0 -41
  553. package/src/cli/ui/components/parts/Header.test.tsx +0 -75
  554. package/src/cli/ui/components/parts/MergeStatusList.tsx +0 -75
  555. package/src/cli/ui/components/parts/ProgressBar.tsx +0 -73
  556. package/src/cli/ui/components/parts/Stats.tsx +0 -88
  557. package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +0 -74
  558. package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +0 -108
  559. package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +0 -242
  560. package/src/cli/ui/components/screens/BranchListScreen.tsx +0 -744
  561. package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +0 -244
  562. package/src/cli/ui/components/screens/CodingAgentSelectorScreen.tsx +0 -159
  563. package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +0 -928
  564. package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +0 -176
  565. package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +0 -83
  566. package/src/cli/ui/components/screens/LogDetailScreen.tsx +0 -67
  567. package/src/cli/ui/components/screens/LogListScreen.tsx +0 -192
  568. package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +0 -320
  569. package/src/cli/ui/components/screens/PRCleanupScreen.tsx +0 -171
  570. package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +0 -135
  571. package/src/cli/ui/hooks/useAppInput.ts +0 -172
  572. package/src/cli/ui/hooks/useBatchMerge.ts +0 -96
  573. package/src/cli/ui/hooks/useGitData.ts +0 -347
  574. package/src/cli/ui/hooks/useProfiles.ts +0 -211
  575. package/src/cli/ui/hooks/useScreenState.ts +0 -44
  576. package/src/cli/ui/hooks/useTerminalSize.ts +0 -33
  577. package/src/cli/ui/hooks/useToolStatus.ts +0 -68
  578. package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +0 -111
  579. package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +0 -264
package/src/worktree.ts CHANGED
@@ -2,11 +2,15 @@ import { execa } from "execa";
2
2
  import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import chalk from "chalk";
5
+ import { createLogger } from "./logging/logger.js";
6
+
7
+ const logger = createLogger({ category: "worktree" });
5
8
  import {
6
9
  WorktreeConfig,
7
10
  WorktreeWithPR,
8
11
  CleanupTarget,
9
12
  CleanupReason,
13
+ CleanupStatus,
10
14
  } from "./cli/ui/types.js";
11
15
  import { getPullRequestByBranch } from "./github.js";
12
16
  import {
@@ -44,6 +48,65 @@ async function getUpstreamBranch(branch: string): Promise<string | null> {
44
48
  }
45
49
  }
46
50
 
51
+ const parseRemoteRef = (
52
+ ref: string,
53
+ ): { remote: string; branch: string } | null => {
54
+ const segments = ref.split("/");
55
+ if (segments.length < 2) {
56
+ return null;
57
+ }
58
+ const [remote, ...rest] = segments;
59
+ const branch = rest.join("/");
60
+ if (!remote || !branch) {
61
+ return null;
62
+ }
63
+ return { remote, branch };
64
+ };
65
+
66
+ async function resolveUpstreamStatus(
67
+ branch: string,
68
+ repoRoot: string,
69
+ ): Promise<{ upstream: string | null; hasUpstream: boolean }> {
70
+ const upstream = await getUpstreamBranch(branch);
71
+ if (!upstream) {
72
+ return { upstream: null, hasUpstream: false };
73
+ }
74
+ const parsed = parseRemoteRef(upstream);
75
+ if (!parsed) {
76
+ return { upstream, hasUpstream: false };
77
+ }
78
+ if (parsed.branch !== branch) {
79
+ return { upstream, hasUpstream: false };
80
+ }
81
+ const exists = await checkRemoteBranchExists(parsed.branch, parsed.remote, {
82
+ cwd: repoRoot,
83
+ });
84
+ return { upstream, hasUpstream: exists };
85
+ }
86
+
87
+ const buildCleanupReasons = ({
88
+ hasUniqueCommits,
89
+ hasUncommitted,
90
+ hasUnpushed,
91
+ hasUpstream,
92
+ }: {
93
+ hasUniqueCommits: boolean;
94
+ hasUncommitted: boolean;
95
+ hasUnpushed: boolean;
96
+ hasUpstream: boolean;
97
+ }): CleanupReason[] => {
98
+ if (!hasUpstream) {
99
+ return [];
100
+ }
101
+ if (!hasUniqueCommits && !hasUncommitted && !hasUnpushed) {
102
+ return ["no-diff-with-base"];
103
+ }
104
+ if (hasUniqueCommits && !hasUncommitted && !hasUnpushed) {
105
+ return ["remote-synced"];
106
+ }
107
+ return [];
108
+ };
109
+
47
110
  // Re-export WorktreeConfig for external use
48
111
  export type { WorktreeConfig };
49
112
 
@@ -109,9 +172,13 @@ export interface WorktreeInfo {
109
172
  path: string;
110
173
  branch: string;
111
174
  head: string;
175
+ locked?: boolean;
176
+ prunable?: boolean;
112
177
  isAccessible?: boolean;
113
178
  invalidReason?: string;
114
179
  hasUncommittedChanges?: boolean;
180
+ isLocked?: boolean;
181
+ isPrunable?: boolean;
115
182
  }
116
183
 
117
184
  async function listWorktrees(): Promise<WorktreeInfo[]> {
@@ -131,11 +198,37 @@ async function listWorktrees(): Promise<WorktreeInfo[]> {
131
198
  if (currentWorktree.path) {
132
199
  worktrees.push(currentWorktree as WorktreeInfo);
133
200
  }
134
- currentWorktree = { path: line.substring(9) };
201
+ currentWorktree = {
202
+ path: line.substring(9),
203
+ locked: false,
204
+ prunable: false,
205
+ isLocked: false,
206
+ isPrunable: false,
207
+ };
135
208
  } else if (line.startsWith("HEAD ")) {
136
209
  currentWorktree.head = line.substring(5);
137
210
  } else if (line.startsWith("branch ")) {
138
211
  currentWorktree.branch = line.substring(7).replace("refs/heads/", "");
212
+ } else if (line === "locked" || line.startsWith("locked ")) {
213
+ currentWorktree.locked = true;
214
+ currentWorktree.isLocked = true;
215
+ if (line.startsWith("locked ")) {
216
+ const reason = line.substring(7).trim();
217
+ if (reason) {
218
+ currentWorktree.invalidReason ??= reason;
219
+ }
220
+ }
221
+ } else if (line === "prunable" || line.startsWith("prunable ")) {
222
+ currentWorktree.prunable = true;
223
+ currentWorktree.isPrunable = true;
224
+ if (line.startsWith("prunable ")) {
225
+ const reason = line.substring(9).trim();
226
+ if (reason) {
227
+ currentWorktree.invalidReason ??= reason;
228
+ }
229
+ }
230
+ } else if (line.startsWith("reason ")) {
231
+ currentWorktree.invalidReason = line.substring(7);
139
232
  } else if (line === "") {
140
233
  if (currentWorktree.path) {
141
234
  worktrees.push(currentWorktree as WorktreeInfo);
@@ -173,7 +266,8 @@ export async function listAdditionalWorktrees(): Promise<WorktreeInfo[]> {
173
266
  .filter((worktree) => worktree.path !== repoRoot)
174
267
  .map((worktree) => {
175
268
  // パスの存在を確認
176
- const isAccessible = fs.existsSync(worktree.path);
269
+ const exists = fs.existsSync(worktree.path);
270
+ const isAccessible = exists && !worktree.prunable;
177
271
 
178
272
  const result: WorktreeInfo = {
179
273
  ...worktree,
@@ -181,7 +275,11 @@ export async function listAdditionalWorktrees(): Promise<WorktreeInfo[]> {
181
275
  };
182
276
 
183
277
  if (!isAccessible) {
184
- result.invalidReason = "Path not accessible in current environment";
278
+ if (!exists) {
279
+ result.invalidReason = "Path not accessible in current environment";
280
+ } else if (worktree.prunable && !result.invalidReason) {
281
+ result.invalidReason = "Worktree is marked prunable";
282
+ }
185
283
  }
186
284
 
187
285
  return result;
@@ -536,6 +634,174 @@ export async function removeWorktree(
536
634
  }
537
635
  }
538
636
 
637
+ export interface RepairResult {
638
+ repairedCount: number;
639
+ failedCount: number;
640
+ failures: Array<{ path: string; error: string }>;
641
+ }
642
+
643
+ /**
644
+ * Worktreeパス修復の結果
645
+ */
646
+ export interface RepairPathResult {
647
+ /** 修復成功 (git worktree repair) */
648
+ repaired: boolean;
649
+ /** 古いメタデータ削除成功 (git worktree remove --force) */
650
+ removed: boolean;
651
+ /** 修復後の新しいパス (repaired=trueの場合のみ) */
652
+ newPath?: string;
653
+ }
654
+
655
+ /**
656
+ * 単一のworktreeパスを修復する共通関数
657
+ *
658
+ * パターンA: 期待されるパスにディレクトリが存在する
659
+ * → git worktree repair <expectedPath> で修復
660
+ *
661
+ * パターンB: ディレクトリが存在しない(リモート環境で作成されたメタデータのみ残っている)
662
+ * → git worktree remove --force <currentPath> でメタデータを削除
663
+ *
664
+ * @param branch ブランチ名
665
+ * @param currentPath 現在gitメタデータに記録されているパス
666
+ * @param repoRoot リポジトリルートパス
667
+ * @returns 修復結果
668
+ */
669
+ export async function repairWorktreePath(
670
+ branch: string,
671
+ currentPath: string,
672
+ repoRoot: string,
673
+ ): Promise<RepairPathResult> {
674
+ const expectedPath = await generateWorktreePath(repoRoot, branch);
675
+ const fsSync = await import("node:fs");
676
+
677
+ if (fsSync.existsSync(expectedPath)) {
678
+ // パターンA: ディレクトリが存在する → repair
679
+ logger.info(
680
+ { branch, expectedPath, currentPath },
681
+ "repairWorktreePath: directory exists, attempting repair",
682
+ );
683
+ try {
684
+ await execa("git", ["worktree", "repair", expectedPath], {
685
+ cwd: repoRoot,
686
+ });
687
+ return { repaired: true, removed: false, newPath: expectedPath };
688
+ } catch (error) {
689
+ logger.warn(
690
+ { branch, expectedPath, error },
691
+ "repairWorktreePath: repair failed",
692
+ );
693
+ return { repaired: false, removed: false };
694
+ }
695
+ } else {
696
+ // パターンB: ディレクトリが存在しない → 古いメタデータを削除
697
+ logger.info(
698
+ { branch, currentPath, expectedPath },
699
+ "repairWorktreePath: directory not found, removing stale metadata",
700
+ );
701
+ try {
702
+ await execa("git", ["worktree", "remove", "--force", currentPath], {
703
+ cwd: repoRoot,
704
+ });
705
+ return { repaired: false, removed: true };
706
+ } catch (error) {
707
+ logger.warn(
708
+ { branch, currentPath, error },
709
+ "repairWorktreePath: remove failed",
710
+ );
711
+ return { repaired: false, removed: false };
712
+ }
713
+ }
714
+ }
715
+
716
+ /**
717
+ * Worktreeのパス不整合を修復
718
+ * 共通関数repairWorktreePathを使用して各ブランチを修復
719
+ * @param targetBranches 修復対象のブランチ名配列
720
+ * @returns 修復結果(成功数、失敗数、失敗詳細)
721
+ */
722
+ export async function repairWorktrees(
723
+ targetBranches: string[],
724
+ ): Promise<RepairResult> {
725
+ const result: RepairResult = {
726
+ repairedCount: 0,
727
+ failedCount: 0,
728
+ failures: [],
729
+ };
730
+
731
+ if (targetBranches.length === 0) {
732
+ return result;
733
+ }
734
+
735
+ // 修復前のworktree一覧を取得(現在のパスを知るため)
736
+ const beforeWorktrees = await listAdditionalWorktrees();
737
+ const worktreePathMap = new Map(
738
+ beforeWorktrees.map((w) => [w.branch, w.path]),
739
+ );
740
+
741
+ // デバッグログ: worktreeリストのブランチ名を出力
742
+ logger.info(
743
+ {
744
+ targetBranches,
745
+ worktreeBranches: beforeWorktrees.map((w) => ({
746
+ branch: w.branch,
747
+ path: w.path,
748
+ isAccessible: w.isAccessible,
749
+ })),
750
+ },
751
+ "repairWorktrees: before state",
752
+ );
753
+
754
+ const repoRoot = await getRepositoryRoot();
755
+
756
+ // 対象ブランチごとに共通関数を使用して修復
757
+ for (const branch of targetBranches) {
758
+ const currentPath = worktreePathMap.get(branch);
759
+ if (!currentPath) {
760
+ logger.warn({ branch }, "repairWorktrees: branch not found in worktrees");
761
+ result.failedCount++;
762
+ result.failures.push({
763
+ path: branch,
764
+ error: "Branch not found in worktrees",
765
+ });
766
+ continue;
767
+ }
768
+
769
+ const repairResult = await repairWorktreePath(
770
+ branch,
771
+ currentPath,
772
+ repoRoot,
773
+ );
774
+
775
+ if (repairResult.repaired) {
776
+ result.repairedCount++;
777
+ } else if (repairResult.removed) {
778
+ // メタデータ削除は「修復」としてカウント(新規作成が可能になるため)
779
+ result.repairedCount++;
780
+ } else {
781
+ result.failedCount++;
782
+ result.failures.push({
783
+ path: branch,
784
+ error: "Worktree repair failed",
785
+ });
786
+ }
787
+ }
788
+
789
+ // 修復後のアクセス可能性を確認(デバッグログ用)
790
+ const afterWorktrees = await listAdditionalWorktrees();
791
+ logger.info(
792
+ {
793
+ afterWorktrees: afterWorktrees.map((w) => ({
794
+ branch: w.branch,
795
+ path: w.path,
796
+ isAccessible: w.isAccessible,
797
+ })),
798
+ },
799
+ "repairWorktrees: after state",
800
+ );
801
+
802
+ return result;
803
+ }
804
+
539
805
  async function getWorktreesWithPRStatus(): Promise<WorktreeWithPR[]> {
540
806
  const worktrees = await listAdditionalWorktrees();
541
807
  const worktreesWithPR: WorktreeWithPR[] = [];
@@ -558,13 +824,13 @@ async function getWorktreesWithPRStatus(): Promise<WorktreeWithPR[]> {
558
824
  * worktreeに存在しないローカルブランチのクリーンアップ候補を取得
559
825
  * @returns {Promise<CleanupTarget[]>} クリーンアップ候補の配列
560
826
  */
561
- async function getOrphanedLocalBranches({
827
+ async function getOrphanedLocalBranchStatuses({
562
828
  baseBranch,
563
829
  repoRoot,
564
830
  }: {
565
831
  baseBranch: string;
566
832
  repoRoot: string;
567
- }): Promise<CleanupTarget[]> {
833
+ }): Promise<CleanupStatus[]> {
568
834
  try {
569
835
  // 並列実行で高速化
570
836
  const [localBranches, worktrees] = await Promise.all([
@@ -572,7 +838,7 @@ async function getOrphanedLocalBranches({
572
838
  listAdditionalWorktrees(),
573
839
  ]);
574
840
 
575
- const cleanupTargets: CleanupTarget[] = [];
841
+ const statuses: CleanupStatus[] = [];
576
842
  const worktreeBranches = new Set(
577
843
  worktrees.map((w) => w.branch).filter(Boolean),
578
844
  );
@@ -616,10 +882,11 @@ async function getOrphanedLocalBranches({
616
882
  hasUnpushed = true;
617
883
  }
618
884
 
619
- const reasons: CleanupReason[] = [];
620
-
621
- const upstreamBranch = await getUpstreamBranch(localBranch.name);
622
- const comparisonBase = upstreamBranch ?? baseBranch;
885
+ const { upstream, hasUpstream } = await resolveUpstreamStatus(
886
+ localBranch.name,
887
+ repoRoot,
888
+ );
889
+ const comparisonBase = upstream ?? baseBranch;
623
890
 
624
891
  const hasUniqueCommits = await branchHasUniqueCommitsComparedToBase(
625
892
  localBranch.name,
@@ -627,9 +894,12 @@ async function getOrphanedLocalBranches({
627
894
  repoRoot,
628
895
  );
629
896
 
630
- if (!hasUniqueCommits) {
631
- reasons.push("no-diff-with-base");
632
- }
897
+ const reasons = buildCleanupReasons({
898
+ hasUniqueCommits,
899
+ hasUncommitted: false,
900
+ hasUnpushed,
901
+ hasUpstream,
902
+ });
633
903
 
634
904
  if (process.env.DEBUG_CLEANUP) {
635
905
  console.log(
@@ -639,41 +909,28 @@ async function getOrphanedLocalBranches({
639
909
  );
640
910
  }
641
911
 
642
- let hasRemoteBranch = false;
643
- try {
644
- hasRemoteBranch = await checkRemoteBranchExists(localBranch.name);
645
- } catch {
646
- hasRemoteBranch = false;
647
- }
648
-
649
- if (!hasUnpushed && hasRemoteBranch && hasUniqueCommits) {
650
- reasons.push("remote-synced");
651
- }
652
-
653
- if (reasons.length > 0) {
654
- cleanupTargets.push({
655
- worktreePath: null, // worktreeは存在しない
656
- branch: localBranch.name,
657
- pullRequest: null,
658
- hasUncommittedChanges: false, // worktreeが存在しないため常にfalse
659
- hasUnpushedCommits: hasUnpushed,
660
- cleanupType: "branch-only",
661
- hasRemoteBranch,
662
- reasons,
663
- });
664
- }
912
+ statuses.push({
913
+ worktreePath: null, // worktreeは存在しない
914
+ branch: localBranch.name,
915
+ hasUncommittedChanges: false, // worktreeが存在しないため常にfalse
916
+ hasUnpushedCommits: hasUnpushed,
917
+ cleanupType: "branch-only",
918
+ hasRemoteBranch: hasUpstream,
919
+ hasUniqueCommits,
920
+ hasUpstream,
921
+ upstream,
922
+ reasons,
923
+ });
665
924
  }
666
925
  }
667
926
 
668
927
  if (process.env.DEBUG_CLEANUP) {
669
928
  console.log(
670
- chalk.cyan(
671
- `Debug: Found ${cleanupTargets.length} orphaned branch cleanup targets`,
672
- ),
929
+ chalk.cyan(`Debug: Found ${statuses.length} orphaned branch statuses`),
673
930
  );
674
931
  }
675
932
 
676
- return cleanupTargets;
933
+ return statuses;
677
934
  } catch (error) {
678
935
  console.error(chalk.red("Error: Failed to get orphaned local branches"));
679
936
  if (process.env.DEBUG_CLEANUP) {
@@ -683,11 +940,7 @@ async function getOrphanedLocalBranches({
683
940
  }
684
941
  }
685
942
 
686
- /**
687
- * マージ済みPRに関連するworktreeおよびローカルブランチのクリーンアップ候補を取得
688
- * @returns {Promise<CleanupTarget[]>} クリーンアップ候補の配列
689
- */
690
- export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
943
+ export async function getCleanupStatus(): Promise<CleanupStatus[]> {
691
944
  const [config, repoRoot, worktreesWithPR] = await Promise.all([
692
945
  getConfig(),
693
946
  getRepositoryRoot(),
@@ -695,11 +948,11 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
695
948
  ]);
696
949
  const baseBranch = config.defaultBaseBranch || GIT_CONFIG.DEFAULT_BASE_BRANCH;
697
950
 
698
- const orphanedBranches = await getOrphanedLocalBranches({
951
+ const orphanedStatuses = await getOrphanedLocalBranchStatuses({
699
952
  baseBranch,
700
953
  repoRoot,
701
954
  });
702
- const cleanupTargets: CleanupTarget[] = [];
955
+ const statuses: CleanupStatus[] = [];
703
956
 
704
957
  if (process.env.DEBUG_CLEANUP) {
705
958
  console.log(chalk.cyan("Debug: Available worktrees:"));
@@ -709,32 +962,19 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
709
962
  }
710
963
 
711
964
  for (const worktree of worktreesWithPR) {
712
- // 保護対象ブランチはスキップ
713
- if (isProtectedBranchName(worktree.branch)) {
714
- if (process.env.DEBUG_CLEANUP) {
715
- console.log(
716
- chalk.yellow(`Debug: Skipping protected branch ${worktree.branch}`),
717
- );
718
- }
719
- continue;
720
- }
721
-
722
965
  if (process.env.DEBUG_CLEANUP) {
723
966
  console.log(chalk.gray(`Debug: Checking worktree ${worktree.branch}`));
724
967
  }
725
968
 
726
- const cleanupReasons: CleanupReason[] = [];
727
-
728
969
  // worktreeパスの存在を確認
729
- const fs = await import("node:fs");
730
- // Some test environments mock node:fs without existsSync on the module root.
970
+ const fsSync = await import("node:fs");
731
971
  const existsSync =
732
- typeof fs.existsSync === "function"
733
- ? fs.existsSync
734
- : typeof (fs as { default?: { existsSync?: unknown } }).default
972
+ typeof fsSync.existsSync === "function"
973
+ ? fsSync.existsSync
974
+ : typeof (fsSync as { default?: { existsSync?: unknown } }).default
735
975
  ?.existsSync === "function"
736
- ? (fs as { default: { existsSync: (p: string) => boolean } }).default
737
- .existsSync
976
+ ? (fsSync as { default: { existsSync: (p: string) => boolean } })
977
+ .default.existsSync
738
978
  : null;
739
979
 
740
980
  const isAccessible = existsSync ? existsSync(worktree.worktreePath) : false;
@@ -743,14 +983,12 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
743
983
  let hasUnpushed = false;
744
984
 
745
985
  if (isAccessible) {
746
- // worktreeが存在する場合のみ状態をチェック
747
986
  try {
748
987
  [hasUncommitted, hasUnpushed] = await Promise.all([
749
988
  hasUncommittedChanges(worktree.worktreePath),
750
989
  hasUnpushedCommits(worktree.worktreePath, worktree.branch),
751
990
  ]);
752
991
  } catch (error) {
753
- // エラーが発生した場合はデフォルト値を使用
754
992
  if (process.env.DEBUG_CLEANUP) {
755
993
  console.log(
756
994
  chalk.yellow(
@@ -761,15 +999,11 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
761
999
  }
762
1000
  }
763
1001
 
764
- let hasRemoteBranch = false;
765
- try {
766
- hasRemoteBranch = await checkRemoteBranchExists(worktree.branch);
767
- } catch {
768
- hasRemoteBranch = false;
769
- }
770
-
771
- const upstreamBranch = await getUpstreamBranch(worktree.branch);
772
- const comparisonBase = upstreamBranch ?? baseBranch;
1002
+ const { upstream, hasUpstream } = await resolveUpstreamStatus(
1003
+ worktree.branch,
1004
+ repoRoot,
1005
+ );
1006
+ const comparisonBase = upstream ?? baseBranch;
773
1007
 
774
1008
  const hasUniqueCommits = await branchHasUniqueCommitsComparedToBase(
775
1009
  worktree.branch,
@@ -777,61 +1011,86 @@ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
777
1011
  repoRoot,
778
1012
  );
779
1013
 
780
- // 差分がない場合はベース同等としてクリーンアップ候補
781
- if (!hasUniqueCommits) {
782
- cleanupReasons.push("no-diff-with-base");
783
- } else if (!hasUncommitted && !hasUnpushed && hasRemoteBranch) {
784
- // 未マージでも、ローカルに未コミット/未プッシュがなくリモートが最新ならローカルのみクリーンアップ許可
785
- cleanupReasons.push("remote-synced");
786
- }
1014
+ const reasons = buildCleanupReasons({
1015
+ hasUniqueCommits,
1016
+ hasUncommitted,
1017
+ hasUnpushed,
1018
+ hasUpstream,
1019
+ });
787
1020
 
788
1021
  if (process.env.DEBUG_CLEANUP) {
789
1022
  console.log(
790
1023
  chalk.gray(
791
- `Debug: Cleanup reasons for ${worktree.branch}: ${cleanupReasons.length > 0 ? cleanupReasons.join(", ") : "none"}`,
1024
+ `Debug: Cleanup reasons for ${worktree.branch}: ${reasons.length > 0 ? reasons.join(", ") : "none"}`,
792
1025
  ),
793
1026
  );
794
1027
  }
795
1028
 
796
- if (cleanupReasons.length === 0) {
797
- continue;
798
- }
799
-
800
- const target: CleanupTarget = {
1029
+ statuses.push({
801
1030
  worktreePath: worktree.worktreePath,
802
1031
  branch: worktree.branch,
803
- pullRequest: null,
804
1032
  hasUncommittedChanges: hasUncommitted,
805
1033
  hasUnpushedCommits: hasUnpushed,
806
1034
  cleanupType: "worktree-and-branch",
807
- hasRemoteBranch,
1035
+ hasRemoteBranch: hasUpstream,
1036
+ hasUniqueCommits,
1037
+ hasUpstream,
1038
+ upstream,
808
1039
  isAccessible,
809
- reasons: cleanupReasons,
810
- };
811
-
812
- if (!isAccessible) {
813
- target.invalidReason = "Path not accessible in current environment";
814
- }
815
-
816
- cleanupTargets.push(target);
1040
+ reasons,
1041
+ ...(isAccessible
1042
+ ? {}
1043
+ : { invalidReason: "Path not accessible in current environment" }),
1044
+ });
817
1045
  }
818
1046
 
819
- // orphanedBranches (ローカルブランチのみの削除対象) を追加
820
- cleanupTargets.push(...orphanedBranches);
1047
+ statuses.push(...orphanedStatuses);
821
1048
 
822
1049
  if (process.env.DEBUG_CLEANUP) {
823
- const worktreeTargets = cleanupTargets.filter(
824
- (t) => t.cleanupType === "worktree-and-branch",
1050
+ const worktreeTargets = statuses.filter(
1051
+ (t) => t.cleanupType === "worktree-and-branch" && t.reasons.length > 0,
825
1052
  ).length;
826
- const branchOnlyTargets = cleanupTargets.filter(
827
- (t) => t.cleanupType === "branch-only",
1053
+ const branchOnlyTargets = statuses.filter(
1054
+ (t) => t.cleanupType === "branch-only" && t.reasons.length > 0,
828
1055
  ).length;
829
1056
  console.log(
830
1057
  chalk.cyan(
831
- `Debug: Found ${cleanupTargets.length} cleanup targets (${worktreeTargets} worktree+branch, ${branchOnlyTargets} branch-only)`,
1058
+ `Debug: Found ${worktreeTargets + branchOnlyTargets} cleanup targets (${worktreeTargets} worktree+branch, ${branchOnlyTargets} branch-only)`,
832
1059
  ),
833
1060
  );
834
1061
  }
835
1062
 
1063
+ return statuses;
1064
+ }
1065
+
1066
+ /**
1067
+ * マージ済みPRに関連するworktreeおよびローカルブランチのクリーンアップ候補を取得
1068
+ * @returns {Promise<CleanupTarget[]>} クリーンアップ候補の配列
1069
+ */
1070
+ export async function getMergedPRWorktrees(): Promise<CleanupTarget[]> {
1071
+ const statuses = await getCleanupStatus();
1072
+ const cleanupTargets = statuses
1073
+ .filter((status) => status.reasons.length > 0)
1074
+ .filter((status) => !isProtectedBranchName(status.branch))
1075
+ .map((status) => {
1076
+ const target: CleanupTarget = {
1077
+ worktreePath: status.worktreePath,
1078
+ branch: status.branch,
1079
+ pullRequest: null,
1080
+ hasUncommittedChanges: status.hasUncommittedChanges,
1081
+ hasUnpushedCommits: status.hasUnpushedCommits,
1082
+ cleanupType: status.cleanupType,
1083
+ hasRemoteBranch: status.hasRemoteBranch,
1084
+ reasons: status.reasons,
1085
+ };
1086
+ if (status.isAccessible !== undefined) {
1087
+ target.isAccessible = status.isAccessible;
1088
+ }
1089
+ if (status.invalidReason) {
1090
+ target.invalidReason = status.invalidReason;
1091
+ }
1092
+ return target;
1093
+ });
1094
+
836
1095
  return cleanupTargets;
837
1096
  }
@@ -1,25 +0,0 @@
1
- import React from "react";
2
- import type { ExecutionMode } from "./screens/ExecutionModeSelectorScreen.js";
3
- import type { CodingAgentId, InferenceLevel } from "../types.js";
4
- export interface SelectionResult {
5
- branch: string;
6
- displayName: string;
7
- branchType: "local" | "remote";
8
- remoteBranch?: string;
9
- tool: CodingAgentId;
10
- mode: ExecutionMode;
11
- skipPermissions: boolean;
12
- model?: string | null;
13
- inferenceLevel?: InferenceLevel;
14
- sessionId?: string | null;
15
- }
16
- export interface AppProps {
17
- onExit: (result?: SelectionResult) => void;
18
- loadingIndicatorDelay?: number;
19
- }
20
- /**
21
- * App - Top-level component for Ink.js UI
22
- * Integrates ErrorBoundary, data fetching, screen navigation, and all screens
23
- */
24
- export declare function App({ onExit, loadingIndicatorDelay }: AppProps): React.JSX.Element;
25
- //# sourceMappingURL=App.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../src/cli/ui/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAcf,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AA2B9E,OAAO,KAAK,EACV,aAAa,EAIb,cAAc,EAEf,MAAM,aAAa,CAAC;AAqCrB,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,qBAA2B,EAAE,EAAE,QAAQ,qBAo1CpE"}