@akiojin/gwt 2.0.0 → 2.0.1

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 (336) hide show
  1. package/dist/claude-history.d.ts +60 -0
  2. package/dist/claude-history.d.ts.map +1 -0
  3. package/dist/claude-history.js +606 -0
  4. package/dist/claude-history.js.map +1 -0
  5. package/dist/claude.d.ts +12 -0
  6. package/dist/claude.d.ts.map +1 -0
  7. package/dist/claude.js +222 -0
  8. package/dist/claude.js.map +1 -0
  9. package/dist/cli/ui/components/App.d.ts +22 -0
  10. package/dist/cli/ui/components/App.d.ts.map +1 -0
  11. package/dist/cli/ui/components/App.js +557 -0
  12. package/dist/cli/ui/components/App.js.map +1 -0
  13. package/dist/cli/ui/components/common/Confirm.d.ts +13 -0
  14. package/dist/cli/ui/components/common/Confirm.d.ts.map +1 -0
  15. package/dist/cli/ui/components/common/Confirm.js +20 -0
  16. package/dist/cli/ui/components/common/Confirm.js.map +1 -0
  17. package/dist/cli/ui/components/common/ErrorBoundary.d.ts +23 -0
  18. package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +1 -0
  19. package/dist/cli/ui/components/common/ErrorBoundary.js +37 -0
  20. package/dist/cli/ui/components/common/ErrorBoundary.js.map +1 -0
  21. package/dist/cli/ui/components/common/Input.d.ts +14 -0
  22. package/dist/cli/ui/components/common/Input.d.ts.map +1 -0
  23. package/dist/cli/ui/components/common/Input.js +14 -0
  24. package/dist/cli/ui/components/common/Input.js.map +1 -0
  25. package/dist/cli/ui/components/common/LoadingIndicator.d.ts +19 -0
  26. package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +1 -0
  27. package/dist/cli/ui/components/common/LoadingIndicator.js +61 -0
  28. package/dist/cli/ui/components/common/LoadingIndicator.js.map +1 -0
  29. package/dist/cli/ui/components/common/Select.d.ts +30 -0
  30. package/dist/cli/ui/components/common/Select.d.ts.map +1 -0
  31. package/dist/cli/ui/components/common/Select.js +140 -0
  32. package/dist/cli/ui/components/common/Select.js.map +1 -0
  33. package/dist/cli/ui/components/parts/Footer.d.ts +15 -0
  34. package/dist/cli/ui/components/parts/Footer.d.ts.map +1 -0
  35. package/dist/cli/ui/components/parts/Footer.js +20 -0
  36. package/dist/cli/ui/components/parts/Footer.js.map +1 -0
  37. package/dist/cli/ui/components/parts/Header.d.ts +29 -0
  38. package/dist/cli/ui/components/parts/Header.d.ts.map +1 -0
  39. package/dist/cli/ui/components/parts/Header.js +19 -0
  40. package/dist/cli/ui/components/parts/Header.js.map +1 -0
  41. package/dist/cli/ui/components/parts/MergeStatusList.d.ts +13 -0
  42. package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +1 -0
  43. package/dist/cli/ui/components/parts/MergeStatusList.js +52 -0
  44. package/dist/cli/ui/components/parts/MergeStatusList.js.map +1 -0
  45. package/dist/cli/ui/components/parts/ProgressBar.d.ts +13 -0
  46. package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +1 -0
  47. package/dist/cli/ui/components/parts/ProgressBar.js +53 -0
  48. package/dist/cli/ui/components/parts/ProgressBar.js.map +1 -0
  49. package/dist/cli/ui/components/parts/ScrollableList.d.ts +12 -0
  50. package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +1 -0
  51. package/dist/cli/ui/components/parts/ScrollableList.js +11 -0
  52. package/dist/cli/ui/components/parts/ScrollableList.js.map +1 -0
  53. package/dist/cli/ui/components/parts/Stats.d.ts +13 -0
  54. package/dist/cli/ui/components/parts/Stats.d.ts.map +1 -0
  55. package/dist/cli/ui/components/parts/Stats.js +42 -0
  56. package/dist/cli/ui/components/parts/Stats.js.map +1 -0
  57. package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts +20 -0
  58. package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts.map +1 -0
  59. package/dist/cli/ui/components/screens/AIToolSelectorScreen.js +77 -0
  60. package/dist/cli/ui/components/screens/AIToolSelectorScreen.js.map +1 -0
  61. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +14 -0
  62. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +1 -0
  63. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +41 -0
  64. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +1 -0
  65. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +14 -0
  66. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +1 -0
  67. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +71 -0
  68. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +1 -0
  69. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +15 -0
  70. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +1 -0
  71. package/dist/cli/ui/components/screens/BranchCreatorScreen.js +142 -0
  72. package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +1 -0
  73. package/dist/cli/ui/components/screens/BranchListScreen.d.ts +39 -0
  74. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +1 -0
  75. package/dist/cli/ui/components/screens/BranchListScreen.js +172 -0
  76. package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -0
  77. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +29 -0
  78. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +1 -0
  79. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +92 -0
  80. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +1 -0
  81. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +23 -0
  82. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +1 -0
  83. package/dist/cli/ui/components/screens/PRCleanupScreen.js +94 -0
  84. package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +1 -0
  85. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +17 -0
  86. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +1 -0
  87. package/dist/cli/ui/components/screens/SessionSelectorScreen.js +55 -0
  88. package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +1 -0
  89. package/dist/cli/ui/components/screens/WorktreeManagerScreen.d.ts +20 -0
  90. package/dist/cli/ui/components/screens/WorktreeManagerScreen.d.ts.map +1 -0
  91. package/dist/cli/ui/components/screens/WorktreeManagerScreen.js +65 -0
  92. package/dist/cli/ui/components/screens/WorktreeManagerScreen.js.map +1 -0
  93. package/dist/cli/ui/hooks/useBatchMerge.d.ts +17 -0
  94. package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +1 -0
  95. package/dist/cli/ui/hooks/useBatchMerge.js +77 -0
  96. package/dist/cli/ui/hooks/useBatchMerge.js.map +1 -0
  97. package/dist/cli/ui/hooks/useGitData.d.ts +20 -0
  98. package/dist/cli/ui/hooks/useGitData.d.ts.map +1 -0
  99. package/dist/cli/ui/hooks/useGitData.js +116 -0
  100. package/dist/cli/ui/hooks/useGitData.js.map +1 -0
  101. package/dist/cli/ui/hooks/useScreenState.d.ts +12 -0
  102. package/dist/cli/ui/hooks/useScreenState.d.ts.map +1 -0
  103. package/dist/cli/ui/hooks/useScreenState.js +30 -0
  104. package/dist/cli/ui/hooks/useScreenState.js.map +1 -0
  105. package/dist/cli/ui/hooks/useTerminalSize.d.ts +9 -0
  106. package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +1 -0
  107. package/dist/cli/ui/hooks/useTerminalSize.js +24 -0
  108. package/dist/cli/ui/hooks/useTerminalSize.js.map +1 -0
  109. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +21 -0
  110. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +1 -0
  111. package/dist/cli/ui/screens/BranchActionSelectorScreen.js +61 -0
  112. package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +1 -0
  113. package/dist/cli/ui/types.d.ts +245 -0
  114. package/dist/cli/ui/types.d.ts.map +1 -0
  115. package/dist/cli/ui/types.js +2 -0
  116. package/dist/cli/ui/types.js.map +1 -0
  117. package/dist/cli/ui/utils/baseBranch.d.ts +4 -0
  118. package/dist/cli/ui/utils/baseBranch.d.ts.map +1 -0
  119. package/dist/cli/ui/utils/baseBranch.js +17 -0
  120. package/dist/cli/ui/utils/baseBranch.js.map +1 -0
  121. package/dist/cli/ui/utils/branchFormatter.d.ts +13 -0
  122. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -0
  123. package/dist/cli/ui/utils/branchFormatter.js +202 -0
  124. package/dist/cli/ui/utils/branchFormatter.js.map +1 -0
  125. package/dist/cli/ui/utils/statisticsCalculator.d.ts +9 -0
  126. package/dist/cli/ui/utils/statisticsCalculator.d.ts.map +1 -0
  127. package/dist/cli/ui/utils/statisticsCalculator.js +37 -0
  128. package/dist/cli/ui/utils/statisticsCalculator.js.map +1 -0
  129. package/dist/client/assets/index-CqaYsI0z.js +81 -0
  130. package/dist/client/assets/index-Dy3OxWpP.css +32 -0
  131. package/dist/client/index.html +13 -0
  132. package/dist/codex.d.ts +12 -0
  133. package/dist/codex.d.ts.map +1 -0
  134. package/dist/codex.js +106 -0
  135. package/dist/codex.js.map +1 -0
  136. package/dist/config/builtin-tools.d.ts +19 -0
  137. package/dist/config/builtin-tools.d.ts.map +1 -0
  138. package/dist/config/builtin-tools.js +40 -0
  139. package/dist/config/builtin-tools.js.map +1 -0
  140. package/dist/config/constants.d.ts +74 -0
  141. package/dist/config/constants.d.ts.map +1 -0
  142. package/dist/config/constants.js +90 -0
  143. package/dist/config/constants.js.map +1 -0
  144. package/dist/config/env-history.d.ts +4 -0
  145. package/dist/config/env-history.d.ts.map +1 -0
  146. package/dist/config/env-history.js +34 -0
  147. package/dist/config/env-history.js.map +1 -0
  148. package/dist/config/index.d.ts +24 -0
  149. package/dist/config/index.d.ts.map +1 -0
  150. package/dist/config/index.js +144 -0
  151. package/dist/config/index.js.map +1 -0
  152. package/dist/config/tools.d.ts +40 -0
  153. package/dist/config/tools.d.ts.map +1 -0
  154. package/dist/config/tools.js +238 -0
  155. package/dist/config/tools.js.map +1 -0
  156. package/dist/git.d.ts +145 -0
  157. package/dist/git.d.ts.map +1 -0
  158. package/dist/git.js +871 -0
  159. package/dist/git.js.map +1 -0
  160. package/dist/github.d.ts +14 -0
  161. package/dist/github.d.ts.map +1 -0
  162. package/dist/github.js +123 -0
  163. package/dist/github.js.map +1 -0
  164. package/dist/index.d.ts +15 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.js +510 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/launcher.d.ts +30 -0
  169. package/dist/launcher.d.ts.map +1 -0
  170. package/dist/launcher.js +116 -0
  171. package/dist/launcher.js.map +1 -0
  172. package/dist/repositories/git.repository.d.ts +38 -0
  173. package/dist/repositories/git.repository.d.ts.map +1 -0
  174. package/dist/repositories/git.repository.js +117 -0
  175. package/dist/repositories/git.repository.js.map +1 -0
  176. package/dist/repositories/github.repository.d.ts +16 -0
  177. package/dist/repositories/github.repository.d.ts.map +1 -0
  178. package/dist/repositories/github.repository.js +61 -0
  179. package/dist/repositories/github.repository.js.map +1 -0
  180. package/dist/repositories/worktree.repository.d.ts +18 -0
  181. package/dist/repositories/worktree.repository.d.ts.map +1 -0
  182. package/dist/repositories/worktree.repository.js +57 -0
  183. package/dist/repositories/worktree.repository.js.map +1 -0
  184. package/dist/services/BatchMergeService.d.ts +45 -0
  185. package/dist/services/BatchMergeService.d.ts.map +1 -0
  186. package/dist/services/BatchMergeService.js +197 -0
  187. package/dist/services/BatchMergeService.js.map +1 -0
  188. package/dist/services/WorktreeOrchestrator.d.ts +37 -0
  189. package/dist/services/WorktreeOrchestrator.d.ts.map +1 -0
  190. package/dist/services/WorktreeOrchestrator.js +74 -0
  191. package/dist/services/WorktreeOrchestrator.js.map +1 -0
  192. package/dist/services/dependency-installer.d.ts +26 -0
  193. package/dist/services/dependency-installer.d.ts.map +1 -0
  194. package/dist/services/dependency-installer.js +139 -0
  195. package/dist/services/dependency-installer.js.map +1 -0
  196. package/dist/services/git.service.d.ts +27 -0
  197. package/dist/services/git.service.d.ts.map +1 -0
  198. package/dist/services/git.service.js +95 -0
  199. package/dist/services/git.service.js.map +1 -0
  200. package/dist/services/github.service.d.ts +14 -0
  201. package/dist/services/github.service.d.ts.map +1 -0
  202. package/dist/services/github.service.js +52 -0
  203. package/dist/services/github.service.js.map +1 -0
  204. package/dist/services/worktree.service.d.ts +20 -0
  205. package/dist/services/worktree.service.d.ts.map +1 -0
  206. package/dist/services/worktree.service.js +52 -0
  207. package/dist/services/worktree.service.js.map +1 -0
  208. package/dist/types/api.d.ts +211 -0
  209. package/dist/types/api.d.ts.map +1 -0
  210. package/dist/types/api.js +8 -0
  211. package/dist/types/api.js.map +1 -0
  212. package/dist/types/tools.d.ts +201 -0
  213. package/dist/types/tools.d.ts.map +1 -0
  214. package/dist/types/tools.js +8 -0
  215. package/dist/types/tools.js.map +1 -0
  216. package/dist/utils/spinner.d.ts +6 -0
  217. package/dist/utils/spinner.d.ts.map +1 -0
  218. package/dist/utils/spinner.js +47 -0
  219. package/dist/utils/spinner.js.map +1 -0
  220. package/dist/utils/terminal.d.ts +20 -0
  221. package/dist/utils/terminal.d.ts.map +1 -0
  222. package/dist/utils/terminal.js +232 -0
  223. package/dist/utils/terminal.js.map +1 -0
  224. package/dist/utils.d.ts +9 -0
  225. package/dist/utils.d.ts.map +1 -0
  226. package/dist/utils.js +48 -0
  227. package/dist/utils.js.map +1 -0
  228. package/dist/web/client/src/components/BranchGraph.d.ts +8 -0
  229. package/dist/web/client/src/components/BranchGraph.d.ts.map +1 -0
  230. package/dist/web/client/src/components/BranchGraph.js +125 -0
  231. package/dist/web/client/src/components/BranchGraph.js.map +1 -0
  232. package/dist/web/client/src/components/EnvEditor.d.ts +20 -0
  233. package/dist/web/client/src/components/EnvEditor.d.ts.map +1 -0
  234. package/dist/web/client/src/components/EnvEditor.js +65 -0
  235. package/dist/web/client/src/components/EnvEditor.js.map +1 -0
  236. package/dist/web/client/src/components/Terminal.d.ts +15 -0
  237. package/dist/web/client/src/components/Terminal.d.ts.map +1 -0
  238. package/dist/web/client/src/components/Terminal.js +112 -0
  239. package/dist/web/client/src/components/Terminal.js.map +1 -0
  240. package/dist/web/client/src/hooks/useBranches.d.ts +16 -0
  241. package/dist/web/client/src/hooks/useBranches.d.ts.map +1 -0
  242. package/dist/web/client/src/hooks/useBranches.js +35 -0
  243. package/dist/web/client/src/hooks/useBranches.js.map +1 -0
  244. package/dist/web/client/src/hooks/useConfig.d.ts +13 -0
  245. package/dist/web/client/src/hooks/useConfig.d.ts.map +1 -0
  246. package/dist/web/client/src/hooks/useConfig.js +27 -0
  247. package/dist/web/client/src/hooks/useConfig.js.map +1 -0
  248. package/dist/web/client/src/hooks/useSessions.d.ts +21 -0
  249. package/dist/web/client/src/hooks/useSessions.d.ts.map +1 -0
  250. package/dist/web/client/src/hooks/useSessions.js +49 -0
  251. package/dist/web/client/src/hooks/useSessions.js.map +1 -0
  252. package/dist/web/client/src/hooks/useWorktrees.d.ts +17 -0
  253. package/dist/web/client/src/hooks/useWorktrees.d.ts.map +1 -0
  254. package/dist/web/client/src/hooks/useWorktrees.js +41 -0
  255. package/dist/web/client/src/hooks/useWorktrees.js.map +1 -0
  256. package/dist/web/client/src/lib/api.d.ts +82 -0
  257. package/dist/web/client/src/lib/api.d.ts.map +1 -0
  258. package/dist/web/client/src/lib/api.js +147 -0
  259. package/dist/web/client/src/lib/api.js.map +1 -0
  260. package/dist/web/client/src/lib/websocket.d.ts +52 -0
  261. package/dist/web/client/src/lib/websocket.d.ts.map +1 -0
  262. package/dist/web/client/src/lib/websocket.js +137 -0
  263. package/dist/web/client/src/lib/websocket.js.map +1 -0
  264. package/dist/web/client/src/main.d.ts +2 -0
  265. package/dist/web/client/src/main.d.ts.map +1 -0
  266. package/dist/web/client/src/main.js +23 -0
  267. package/dist/web/client/src/main.js.map +1 -0
  268. package/dist/web/client/src/pages/BranchDetailPage.d.ts +3 -0
  269. package/dist/web/client/src/pages/BranchDetailPage.d.ts.map +1 -0
  270. package/dist/web/client/src/pages/BranchDetailPage.js +519 -0
  271. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -0
  272. package/dist/web/client/src/pages/BranchListPage.d.ts +3 -0
  273. package/dist/web/client/src/pages/BranchListPage.d.ts.map +1 -0
  274. package/dist/web/client/src/pages/BranchListPage.js +150 -0
  275. package/dist/web/client/src/pages/BranchListPage.js.map +1 -0
  276. package/dist/web/client/src/pages/ConfigManagementPage.d.ts +3 -0
  277. package/dist/web/client/src/pages/ConfigManagementPage.d.ts.map +1 -0
  278. package/dist/web/client/src/pages/ConfigManagementPage.js +125 -0
  279. package/dist/web/client/src/pages/ConfigManagementPage.js.map +1 -0
  280. package/dist/web/client/src/router.d.ts +9 -0
  281. package/dist/web/client/src/router.d.ts.map +1 -0
  282. package/dist/web/client/src/router.js +27 -0
  283. package/dist/web/client/src/router.js.map +1 -0
  284. package/dist/web/client/vite.config.d.ts +3 -0
  285. package/dist/web/client/vite.config.d.ts.map +1 -0
  286. package/dist/web/client/vite.config.js +21 -0
  287. package/dist/web/client/vite.config.js.map +1 -0
  288. package/dist/web/server/env/importer.d.ts +3 -0
  289. package/dist/web/server/env/importer.d.ts.map +1 -0
  290. package/dist/web/server/env/importer.js +47 -0
  291. package/dist/web/server/env/importer.js.map +1 -0
  292. package/dist/web/server/index.d.ts +11 -0
  293. package/dist/web/server/index.d.ts.map +1 -0
  294. package/dist/web/server/index.js +62 -0
  295. package/dist/web/server/index.js.map +1 -0
  296. package/dist/web/server/pty/manager.d.ts +50 -0
  297. package/dist/web/server/pty/manager.d.ts.map +1 -0
  298. package/dist/web/server/pty/manager.js +143 -0
  299. package/dist/web/server/pty/manager.js.map +1 -0
  300. package/dist/web/server/routes/branches.d.ts +11 -0
  301. package/dist/web/server/routes/branches.d.ts.map +1 -0
  302. package/dist/web/server/routes/branches.js +97 -0
  303. package/dist/web/server/routes/branches.js.map +1 -0
  304. package/dist/web/server/routes/config.d.ts +6 -0
  305. package/dist/web/server/routes/config.d.ts.map +1 -0
  306. package/dist/web/server/routes/config.js +162 -0
  307. package/dist/web/server/routes/config.js.map +1 -0
  308. package/dist/web/server/routes/index.d.ts +13 -0
  309. package/dist/web/server/routes/index.d.ts.map +1 -0
  310. package/dist/web/server/routes/index.js +29 -0
  311. package/dist/web/server/routes/index.js.map +1 -0
  312. package/dist/web/server/routes/sessions.d.ts +12 -0
  313. package/dist/web/server/routes/sessions.d.ts.map +1 -0
  314. package/dist/web/server/routes/sessions.js +95 -0
  315. package/dist/web/server/routes/sessions.js.map +1 -0
  316. package/dist/web/server/routes/worktrees.d.ts +11 -0
  317. package/dist/web/server/routes/worktrees.d.ts.map +1 -0
  318. package/dist/web/server/routes/worktrees.js +80 -0
  319. package/dist/web/server/routes/worktrees.js.map +1 -0
  320. package/dist/web/server/services/branches.d.ts +17 -0
  321. package/dist/web/server/services/branches.d.ts.map +1 -0
  322. package/dist/web/server/services/branches.js +262 -0
  323. package/dist/web/server/services/branches.js.map +1 -0
  324. package/dist/web/server/services/worktrees.d.ts +24 -0
  325. package/dist/web/server/services/worktrees.d.ts.map +1 -0
  326. package/dist/web/server/services/worktrees.js +60 -0
  327. package/dist/web/server/services/worktrees.js.map +1 -0
  328. package/dist/web/server/websocket/handler.d.ts +41 -0
  329. package/dist/web/server/websocket/handler.d.ts.map +1 -0
  330. package/dist/web/server/websocket/handler.js +143 -0
  331. package/dist/web/server/websocket/handler.js.map +1 -0
  332. package/dist/worktree.d.ts +53 -0
  333. package/dist/worktree.d.ts.map +1 -0
  334. package/dist/worktree.js +489 -0
  335. package/dist/worktree.js.map +1 -0
  336. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ /**
4
+ * Format seconds to human-readable time (e.g., "1m 23s", "45s")
5
+ */
6
+ function formatTime(seconds) {
7
+ if (seconds < 60) {
8
+ return `${Math.floor(seconds)}s`;
9
+ }
10
+ const minutes = Math.floor(seconds / 60);
11
+ const remainingSeconds = Math.floor(seconds % 60);
12
+ return `${minutes}m ${remainingSeconds}s`;
13
+ }
14
+ /**
15
+ * ProgressBar component - displays batch merge progress
16
+ * Optimized with React.memo to prevent unnecessary re-renders
17
+ * @see specs/SPEC-ee33ca26/spec.md - FR-009
18
+ */
19
+ export const ProgressBar = React.memo(function ProgressBar({ progress, width = 40, }) {
20
+ const filledWidth = Math.floor((progress.percentage / 100) * width);
21
+ const emptyWidth = width - filledWidth;
22
+ const filledBar = "█".repeat(filledWidth);
23
+ const emptyBar = "░".repeat(emptyWidth);
24
+ return (React.createElement(Box, { flexDirection: "column" },
25
+ React.createElement(Box, null,
26
+ React.createElement(Text, { dimColor: true }, "Current: "),
27
+ React.createElement(Text, { bold: true, color: "cyan" }, progress.currentBranch),
28
+ React.createElement(Text, { dimColor: true },
29
+ " ",
30
+ "(",
31
+ progress.currentIndex + 1,
32
+ "/",
33
+ progress.totalBranches,
34
+ ")")),
35
+ React.createElement(Box, { marginTop: 1 },
36
+ React.createElement(Text, { color: "green" }, filledBar),
37
+ React.createElement(Text, { dimColor: true }, emptyBar),
38
+ React.createElement(Text, { dimColor: true },
39
+ " ",
40
+ progress.percentage,
41
+ "%")),
42
+ React.createElement(Box, { marginTop: 1 },
43
+ React.createElement(Text, { dimColor: true }, "Phase: "),
44
+ React.createElement(Text, { color: "yellow" }, progress.currentPhase),
45
+ React.createElement(Text, { dimColor: true }, " | Elapsed: "),
46
+ React.createElement(Text, { color: "magenta" }, formatTime(progress.elapsedSeconds)),
47
+ progress.estimatedRemainingSeconds !== undefined && (React.createElement(React.Fragment, null,
48
+ React.createElement(Text, { dimColor: true }, " | Remaining: "),
49
+ React.createElement(Text, { color: "gray" },
50
+ "~",
51
+ formatTime(progress.estimatedRemainingSeconds)))))));
52
+ });
53
+ //# sourceMappingURL=ProgressBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/ProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAQhC;;GAEG;AACH,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;IACnC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAClD,OAAO,GAAG,OAAO,KAAK,gBAAgB,GAAG,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,EACzD,QAAQ,EACR,KAAK,GAAG,EAAE,GACO;IACjB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,KAAK,GAAG,WAAW,CAAC;IAEvC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAExC,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,QAAQ,sBAAiB;YAC/B,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,IACpB,QAAQ,CAAC,aAAa,CAClB;YACP,oBAAC,IAAI,IAAC,QAAQ;gBACX,GAAG;;gBACF,QAAQ,CAAC,YAAY,GAAG,CAAC;;gBAAG,QAAQ,CAAC,aAAa;oBAC/C,CACH;QAEN,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;YACf,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,IAAE,SAAS,CAAQ;YACtC,oBAAC,IAAI,IAAC,QAAQ,UAAE,QAAQ,CAAQ;YAChC,oBAAC,IAAI,IAAC,QAAQ;;gBAAG,QAAQ,CAAC,UAAU;oBAAS,CACzC;QAEN,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;YACf,oBAAC,IAAI,IAAC,QAAQ,oBAAe;YAC7B,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,IAAE,QAAQ,CAAC,YAAY,CAAQ;YACnD,oBAAC,IAAI,IAAC,QAAQ,yBAAoB;YAClC,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS,IAAE,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAQ;YACjE,QAAQ,CAAC,yBAAyB,KAAK,SAAS,IAAI,CACnD;gBACE,oBAAC,IAAI,IAAC,QAAQ,2BAAsB;gBACpC,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;oBACd,UAAU,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAC3C,CACN,CACJ,CACG,CACF,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import React, { type ReactNode } from "react";
2
+ export interface ScrollableListProps {
3
+ children: ReactNode;
4
+ maxHeight?: number;
5
+ }
6
+ /**
7
+ * ScrollableList component - container for scrollable content
8
+ * Note: Actual scrolling is handled by ink-select-input's limit prop
9
+ * This component provides a consistent container for list content
10
+ */
11
+ export declare function ScrollableList({ children, maxHeight }: ScrollableListProps): React.JSX.Element;
12
+ //# sourceMappingURL=ScrollableList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollableList.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/ScrollableList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,mBAAmB,qBAU1E"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { Box } from "ink";
3
+ /**
4
+ * ScrollableList component - container for scrollable content
5
+ * Note: Actual scrolling is handled by ink-select-input's limit prop
6
+ * This component provides a consistent container for list content
7
+ */
8
+ export function ScrollableList({ children, maxHeight }) {
9
+ return (React.createElement(Box, { flexDirection: "column", ...(maxHeight !== undefined && { height: maxHeight }), overflow: "hidden" }, children));
10
+ }
11
+ //# sourceMappingURL=ScrollableList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollableList.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/ScrollableList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyB,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAO1B;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAuB;IACzE,OAAO,CACL,oBAAC,GAAG,IACF,aAAa,EAAC,QAAQ,KAClB,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EACtD,QAAQ,EAAC,QAAQ,IAEhB,QAAQ,CACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import type { Statistics } from "../../types.js";
3
+ export interface StatsProps {
4
+ stats: Statistics;
5
+ separator?: string;
6
+ lastUpdated?: Date | null;
7
+ }
8
+ /**
9
+ * Stats component - displays statistics in one line
10
+ * Optimized with React.memo to prevent unnecessary re-renders
11
+ */
12
+ export declare const Stats: React.NamedExoticComponent<StatsProps>;
13
+ //# sourceMappingURL=Stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stats.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/Stats.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AAuBD;;;GAGG;AACH,eAAO,MAAM,KAAK,wCA+BhB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ /**
4
+ * Format relative time (e.g., "5s ago", "2m ago", "1h ago")
5
+ */
6
+ function formatRelativeTime(date) {
7
+ const now = new Date();
8
+ const diffMs = now.getTime() - date.getTime();
9
+ const diffSec = Math.floor(diffMs / 1000);
10
+ if (diffSec < 60) {
11
+ return `${diffSec}s ago`;
12
+ }
13
+ const diffMin = Math.floor(diffSec / 60);
14
+ if (diffMin < 60) {
15
+ return `${diffMin}m ago`;
16
+ }
17
+ const diffHour = Math.floor(diffMin / 60);
18
+ return `${diffHour}h ago`;
19
+ }
20
+ /**
21
+ * Stats component - displays statistics in one line
22
+ * Optimized with React.memo to prevent unnecessary re-renders
23
+ */
24
+ export const Stats = React.memo(function Stats({ stats, separator = " ", lastUpdated = null, }) {
25
+ const items = [
26
+ { label: "Local", value: stats.localCount, color: "cyan" },
27
+ { label: "Remote", value: stats.remoteCount, color: "green" },
28
+ { label: "Worktrees", value: stats.worktreeCount, color: "yellow" },
29
+ { label: "Changes", value: stats.changesCount, color: "magenta" },
30
+ ];
31
+ return (React.createElement(Box, null,
32
+ items.map((item) => (React.createElement(Box, { key: item.label },
33
+ React.createElement(Text, { dimColor: true },
34
+ item.label,
35
+ ": "),
36
+ React.createElement(Text, { bold: true, color: item.color }, item.value),
37
+ React.createElement(Text, { dimColor: true }, separator)))),
38
+ lastUpdated && (React.createElement(Box, null,
39
+ React.createElement(Text, { dimColor: true }, "Updated: "),
40
+ React.createElement(Text, { color: "gray" }, formatRelativeTime(lastUpdated))))));
41
+ });
42
+ //# sourceMappingURL=Stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stats.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/parts/Stats.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAU;IACpC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1C,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAC1C,OAAO,GAAG,QAAQ,OAAO,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,EAC7C,KAAK,EACL,SAAS,GAAG,IAAI,EAChB,WAAW,GAAG,IAAI,GACP;IACX,MAAM,KAAK,GAAG;QACZ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1D,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;QAC7D,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;QACnE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;KAClE,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG;QACD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,oBAAC,GAAG,IAAC,GAAG,EAAE,IAAI,CAAC,KAAK;YAClB,oBAAC,IAAI,IAAC,QAAQ;gBAAE,IAAI,CAAC,KAAK;qBAAU;YACpC,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IACzB,IAAI,CAAC,KAAK,CACN;YACP,oBAAC,IAAI,IAAC,QAAQ,UAAE,SAAS,CAAQ,CAC7B,CACP,CAAC;QACD,WAAW,IAAI,CACd,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,QAAQ,sBAAiB;YAC/B,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,IAAE,kBAAkB,CAAC,WAAW,CAAC,CAAQ,CACvD,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ export type AITool = string;
3
+ export interface AIToolItem {
4
+ label: string;
5
+ value: AITool;
6
+ description: string;
7
+ }
8
+ export interface AIToolSelectorScreenProps {
9
+ onBack: () => void;
10
+ onSelect: (tool: AITool) => void;
11
+ version?: string | null;
12
+ }
13
+ /**
14
+ * AIToolSelectorScreen - Screen for selecting AI tool (Claude Code, Codex CLI, or custom tools)
15
+ * Layout: Header + Tool Selection + Footer
16
+ *
17
+ * This screen dynamically loads available tools from the configuration (builtin + custom).
18
+ */
19
+ export declare function AIToolSelectorScreen({ onBack, onSelect, version }: AIToolSelectorScreenProps): React.JSX.Element;
20
+ //# sourceMappingURL=AIToolSelectorScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIToolSelectorScreen.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/screens/AIToolSelectorScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AASnD,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,yBAAyB,qBAsF5F"}
@@ -0,0 +1,77 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Box, Text, useInput } from 'ink';
3
+ import { Header } from '../parts/Header.js';
4
+ import { Footer } from '../parts/Footer.js';
5
+ import { Select } from '../common/Select.js';
6
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js';
7
+ import { getAllTools } from '../../../../config/tools.js';
8
+ /**
9
+ * AIToolSelectorScreen - Screen for selecting AI tool (Claude Code, Codex CLI, or custom tools)
10
+ * Layout: Header + Tool Selection + Footer
11
+ *
12
+ * This screen dynamically loads available tools from the configuration (builtin + custom).
13
+ */
14
+ export function AIToolSelectorScreen({ onBack, onSelect, version }) {
15
+ const { rows } = useTerminalSize();
16
+ const [toolItems, setToolItems] = useState([]);
17
+ const [isLoading, setIsLoading] = useState(true);
18
+ // Load tools from getAllTools()
19
+ useEffect(() => {
20
+ const loadTools = async () => {
21
+ try {
22
+ const tools = await getAllTools();
23
+ // Convert AIToolConfig[] to AIToolItem[]
24
+ const items = tools.map((tool) => {
25
+ // Generate description based on whether it's builtin or custom
26
+ const description = tool.isBuiltin
27
+ ? `Official ${tool.displayName} tool`
28
+ : `Custom AI tool`;
29
+ // Add icon to label if present
30
+ const label = tool.icon
31
+ ? `${tool.icon} ${tool.displayName}`
32
+ : tool.displayName;
33
+ return {
34
+ label,
35
+ value: tool.id,
36
+ description,
37
+ };
38
+ });
39
+ setToolItems(items);
40
+ }
41
+ catch (error) {
42
+ // If loading fails, show error in console but don't crash
43
+ console.error('Failed to load tools:', error);
44
+ // Fall back to empty array
45
+ setToolItems([]);
46
+ }
47
+ finally {
48
+ setIsLoading(false);
49
+ }
50
+ };
51
+ loadTools();
52
+ }, []);
53
+ // Handle keyboard input
54
+ // Note: Select component handles Enter and arrow keys
55
+ useInput((input, key) => {
56
+ if (key.escape) {
57
+ onBack();
58
+ }
59
+ });
60
+ // Handle tool selection
61
+ const handleSelect = (item) => {
62
+ onSelect(item.value);
63
+ };
64
+ // Footer actions
65
+ const footerActions = [
66
+ { key: 'enter', description: 'Select' },
67
+ { key: 'esc', description: 'Back' },
68
+ ];
69
+ return (React.createElement(Box, { flexDirection: "column", height: rows },
70
+ React.createElement(Header, { title: "AI Tool Selection", titleColor: "blue", version: version }),
71
+ React.createElement(Box, { flexDirection: "column", flexGrow: 1, marginTop: 1 },
72
+ React.createElement(Box, { marginBottom: 1 },
73
+ React.createElement(Text, null, "Select AI tool to use:")),
74
+ isLoading ? (React.createElement(Text, null, "Loading tools...")) : toolItems.length === 0 ? (React.createElement(Text, { color: "yellow" }, "No tools available. Please check your configuration.")) : (React.createElement(Select, { items: toolItems, onSelect: handleSelect }))),
75
+ React.createElement(Footer, { actions: footerActions })));
76
+ }
77
+ //# sourceMappingURL=AIToolSelectorScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIToolSelectorScreen.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/screens/AIToolSelectorScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import type { BatchMergeProgress, BranchMergeStatus } from "../../types.js";
3
+ export interface BatchMergeProgressScreenProps {
4
+ progress: BatchMergeProgress;
5
+ statuses: BranchMergeStatus[];
6
+ onCancel?: () => void;
7
+ }
8
+ /**
9
+ * BatchMergeProgressScreen - Real-time progress display for batch merge
10
+ * Layout: Header + Progress Bar + Status List + Footer
11
+ * @see specs/SPEC-ee33ca26/spec.md - User Story 4
12
+ */
13
+ export declare function BatchMergeProgressScreen({ progress, statuses, onCancel, }: BatchMergeProgressScreenProps): React.JSX.Element;
14
+ //# sourceMappingURL=BatchMergeProgressScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchMergeProgressScreen.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/screens/BatchMergeProgressScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,EAAE,6BAA6B,qBA6C/B"}
@@ -0,0 +1,41 @@
1
+ import React from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { Header } from "../parts/Header.js";
4
+ import { Footer } from "../parts/Footer.js";
5
+ import { ProgressBar } from "../parts/ProgressBar.js";
6
+ import { MergeStatusList } from "../parts/MergeStatusList.js";
7
+ import { useTerminalSize } from "../../hooks/useTerminalSize.js";
8
+ /**
9
+ * BatchMergeProgressScreen - Real-time progress display for batch merge
10
+ * Layout: Header + Progress Bar + Status List + Footer
11
+ * @see specs/SPEC-ee33ca26/spec.md - User Story 4
12
+ */
13
+ export function BatchMergeProgressScreen({ progress, statuses, onCancel, }) {
14
+ const { rows } = useTerminalSize();
15
+ // Handle keyboard input
16
+ useInput((input, key) => {
17
+ if ((input === "q" || key.escape) && onCancel) {
18
+ onCancel();
19
+ }
20
+ });
21
+ // Calculate available space for status list
22
+ const headerLines = 1;
23
+ const progressLines = 5; // Progress bar takes ~5 lines
24
+ const footerLines = 1;
25
+ const maxStatusLines = Math.max(5, rows - headerLines - progressLines - footerLines - 2);
26
+ return (React.createElement(Box, { flexDirection: "column", height: rows },
27
+ React.createElement(Header, { title: "Batch Merge in Progress" }),
28
+ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
29
+ React.createElement(ProgressBar, { progress: progress }),
30
+ React.createElement(Box, { marginTop: 2 },
31
+ React.createElement(Text, { bold: true }, "Recent Branches:")),
32
+ React.createElement(Box, { marginTop: 1 },
33
+ React.createElement(MergeStatusList, { statuses: statuses, maxVisible: maxStatusLines }))),
34
+ React.createElement(Footer, { actions: [
35
+ {
36
+ key: "q",
37
+ description: `Cancel | Processing ${progress.currentIndex + 1}/${progress.totalBranches}`,
38
+ },
39
+ ] })));
40
+ }
41
+ //# sourceMappingURL=BatchMergeProgressScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchMergeProgressScreen.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/screens/BatchMergeProgressScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AASjE;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,QAAQ,EACR,QAAQ,EACR,QAAQ,GACsB;IAC9B,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,EAAE,CAAC;IAEnC,wBAAwB;IACxB,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC9C,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,4CAA4C;IAC5C,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC,8BAA8B;IACvD,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,CAAC,EACD,IAAI,GAAG,WAAW,GAAG,aAAa,GAAG,WAAW,GAAG,CAAC,CACrD,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,IAAI;QACtC,oBAAC,MAAM,IAAC,KAAK,EAAC,yBAAyB,GAAG;QAE1C,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;YAClD,oBAAC,WAAW,IAAC,QAAQ,EAAE,QAAQ,GAAI;YAEnC,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;gBACf,oBAAC,IAAI,IAAC,IAAI,6BAAwB,CAC9B;YAEN,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;gBACf,oBAAC,eAAe,IAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,GAAI,CAC/D,CACF;QAEN,oBAAC,MAAM,IACL,OAAO,EAAE;gBACP;oBACE,GAAG,EAAE,GAAG;oBACR,WAAW,EAAE,uBAAuB,QAAQ,CAAC,YAAY,GAAG,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE;iBAC1F;aACF,GACD,CACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import type { BatchMergeResult } from "../../types.js";
3
+ export interface BatchMergeResultScreenProps {
4
+ result: BatchMergeResult;
5
+ onBack?: () => void;
6
+ onQuit?: () => void;
7
+ }
8
+ /**
9
+ * BatchMergeResultScreen - Final result summary for batch merge
10
+ * Layout: Header + Summary + Status List + Footer
11
+ * @see specs/SPEC-ee33ca26/spec.md - FR-010
12
+ */
13
+ export declare function BatchMergeResultScreen({ result, onBack, onQuit, }: BatchMergeResultScreenProps): React.JSX.Element;
14
+ //# sourceMappingURL=BatchMergeResultScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchMergeResultScreen.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/screens/BatchMergeResultScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,MAAM,EACN,MAAM,GACP,EAAE,2BAA2B,qBAgF7B"}
@@ -0,0 +1,71 @@
1
+ import React from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { Header } from "../parts/Header.js";
4
+ import { Footer } from "../parts/Footer.js";
5
+ import { MergeStatusList } from "../parts/MergeStatusList.js";
6
+ import { useTerminalSize } from "../../hooks/useTerminalSize.js";
7
+ /**
8
+ * BatchMergeResultScreen - Final result summary for batch merge
9
+ * Layout: Header + Summary + Status List + Footer
10
+ * @see specs/SPEC-ee33ca26/spec.md - FR-010
11
+ */
12
+ export function BatchMergeResultScreen({ result, onBack, onQuit, }) {
13
+ const { rows } = useTerminalSize();
14
+ // Handle keyboard input
15
+ useInput((input, key) => {
16
+ if (input === "q" && onQuit) {
17
+ onQuit();
18
+ }
19
+ else if (key.escape && onBack) {
20
+ onBack();
21
+ }
22
+ });
23
+ const { summary, totalDurationSeconds, cancelled } = result;
24
+ return (React.createElement(Box, { flexDirection: "column", height: rows },
25
+ React.createElement(Header, { title: cancelled ? "Batch Merge Cancelled" : "Batch Merge Complete" }),
26
+ React.createElement(Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
27
+ React.createElement(Box, { flexDirection: "column", marginBottom: 2 },
28
+ React.createElement(Text, { bold: true }, "Summary:"),
29
+ React.createElement(Box, { marginTop: 1 },
30
+ React.createElement(Text, { color: "green" },
31
+ "\u2713 Success: ",
32
+ summary.successCount),
33
+ React.createElement(Text, { dimColor: true }, " | "),
34
+ React.createElement(Text, { color: "yellow" },
35
+ "\u2298 Skipped: ",
36
+ summary.skippedCount),
37
+ React.createElement(Text, { dimColor: true }, " | "),
38
+ React.createElement(Text, { color: "red" },
39
+ "\u2717 Failed: ",
40
+ summary.failedCount),
41
+ React.createElement(Text, { dimColor: true }, " | "),
42
+ React.createElement(Text, { dimColor: true },
43
+ "Total: ",
44
+ totalDurationSeconds.toFixed(1),
45
+ "s")),
46
+ summary.pushedCount > 0 && (React.createElement(Box, { marginTop: 1 },
47
+ React.createElement(Text, { color: "cyan" },
48
+ "\u2191 Pushed: ",
49
+ summary.pushedCount),
50
+ summary.pushFailedCount > 0 && (React.createElement(React.Fragment, null,
51
+ React.createElement(Text, { dimColor: true }, " | "),
52
+ React.createElement(Text, { color: "red" },
53
+ "Push Failed: ",
54
+ summary.pushFailedCount)))))),
55
+ React.createElement(Box, { flexDirection: "column" },
56
+ React.createElement(Text, { bold: true }, "Branch Details:"),
57
+ React.createElement(Box, { marginTop: 1 },
58
+ React.createElement(MergeStatusList, { statuses: result.statuses, maxVisible: rows - 12 }))),
59
+ summary.skippedCount > 0 && (React.createElement(Box, { marginTop: 2 },
60
+ React.createElement(Text, { color: "yellow" },
61
+ "Note: ",
62
+ summary.skippedCount,
63
+ " branch",
64
+ summary.skippedCount > 1 ? "es" : "",
65
+ " skipped due to conflicts. Please resolve manually.")))),
66
+ React.createElement(Footer, { actions: [
67
+ { key: "q", description: "Quit" },
68
+ ...(onBack ? [{ key: "ESC", description: "Back" }] : []),
69
+ ] })));
70
+ }
71
+ //# sourceMappingURL=BatchMergeResultScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchMergeResultScreen.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/screens/BatchMergeResultScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ export interface BranchCreatorScreenProps {
3
+ onBack: () => void;
4
+ onCreate: (branchName: string) => Promise<void>;
5
+ baseBranch?: string;
6
+ version?: string | null;
7
+ disableAnimation?: boolean;
8
+ }
9
+ /**
10
+ * BranchCreatorScreen - Screen for creating new branches
11
+ * Layout: Header + Type Selection or Name Input + Footer
12
+ * Flow: Type Selection → Name Input → onCreate
13
+ */
14
+ export declare function BranchCreatorScreen({ onBack, onCreate, baseBranch, version, disableAnimation, }: BranchCreatorScreenProps): React.JSX.Element;
15
+ //# sourceMappingURL=BranchCreatorScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BranchCreatorScreen.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ui/components/screens/BranchCreatorScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAcxE,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAQD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,QAAQ,EACR,UAAU,EACV,OAAO,EACP,gBAAwB,GACzB,EAAE,wBAAwB,qBA6K1B"}
@@ -0,0 +1,142 @@
1
+ import React, { useState, useCallback, useEffect, useRef } from 'react';
2
+ import { Box, Text, useInput } from 'ink';
3
+ import { Header } from '../parts/Header.js';
4
+ import { Footer } from '../parts/Footer.js';
5
+ import { Select } from '../common/Select.js';
6
+ import { Input } from '../common/Input.js';
7
+ import { useTerminalSize } from '../../hooks/useTerminalSize.js';
8
+ import { BRANCH_PREFIXES } from '../../../../config/constants.js';
9
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧'];
10
+ /**
11
+ * BranchCreatorScreen - Screen for creating new branches
12
+ * Layout: Header + Type Selection or Name Input + Footer
13
+ * Flow: Type Selection → Name Input → onCreate
14
+ */
15
+ export function BranchCreatorScreen({ onBack, onCreate, baseBranch, version, disableAnimation = false, }) {
16
+ const { rows } = useTerminalSize();
17
+ const [step, setStep] = useState('type-selection');
18
+ const [selectedType, setSelectedType] = useState('feature');
19
+ const [branchName, setBranchName] = useState('');
20
+ const [isCreating, setIsCreating] = useState(false);
21
+ const [pendingBranchName, setPendingBranchName] = useState(null);
22
+ const spinnerIndexRef = useRef(0);
23
+ const [spinnerIndex, setSpinnerIndex] = useState(0);
24
+ const spinnerFrame = SPINNER_FRAMES[spinnerIndex] ?? SPINNER_FRAMES[0];
25
+ // Handle keyboard input for back navigation
26
+ useInput((input, key) => {
27
+ if (isCreating) {
28
+ return;
29
+ }
30
+ if (key.escape) {
31
+ onBack();
32
+ }
33
+ });
34
+ // Branch type options
35
+ const branchTypeItems = [
36
+ {
37
+ label: 'feature',
38
+ value: 'feature',
39
+ description: 'New feature development',
40
+ },
41
+ {
42
+ label: 'hotfix',
43
+ value: 'hotfix',
44
+ description: 'Critical bug fix',
45
+ },
46
+ {
47
+ label: 'release',
48
+ value: 'release',
49
+ description: 'Release preparation',
50
+ },
51
+ ];
52
+ // Handle branch type selection
53
+ const handleTypeSelect = useCallback((item) => {
54
+ setSelectedType(item.value);
55
+ setStep('name-input');
56
+ }, []);
57
+ // Handle branch name input
58
+ const handleNameChange = useCallback((value) => {
59
+ if (isCreating) {
60
+ return;
61
+ }
62
+ setBranchName(value);
63
+ }, [isCreating]);
64
+ // Handle branch creation
65
+ const handleCreate = useCallback(async () => {
66
+ if (isCreating) {
67
+ return;
68
+ }
69
+ const trimmedName = branchName.trim();
70
+ if (!trimmedName) {
71
+ return;
72
+ }
73
+ const prefix = BRANCH_PREFIXES[selectedType.toUpperCase()];
74
+ const fullBranchName = `${prefix}${trimmedName}`;
75
+ setIsCreating(true);
76
+ setPendingBranchName(fullBranchName);
77
+ try {
78
+ await onCreate(fullBranchName);
79
+ }
80
+ catch (error) {
81
+ setPendingBranchName(null);
82
+ setIsCreating(false);
83
+ throw error;
84
+ }
85
+ }, [branchName, selectedType, onCreate, isCreating]);
86
+ // Footer actions
87
+ const footerActions = isCreating
88
+ ? []
89
+ : step === 'type-selection'
90
+ ? [
91
+ { key: 'enter', description: 'Select' },
92
+ { key: 'esc', description: 'Back' },
93
+ ]
94
+ : [
95
+ { key: 'enter', description: 'Create' },
96
+ { key: 'esc', description: 'Back' },
97
+ ];
98
+ useEffect(() => {
99
+ if (!isCreating || disableAnimation) {
100
+ spinnerIndexRef.current = 0;
101
+ setSpinnerIndex(0);
102
+ return undefined;
103
+ }
104
+ const interval = setInterval(() => {
105
+ spinnerIndexRef.current = (spinnerIndexRef.current + 1) % SPINNER_FRAMES.length;
106
+ setSpinnerIndex(spinnerIndexRef.current);
107
+ }, 120);
108
+ return () => {
109
+ clearInterval(interval);
110
+ spinnerIndexRef.current = 0;
111
+ setSpinnerIndex(0);
112
+ };
113
+ }, [isCreating, disableAnimation]);
114
+ return (React.createElement(Box, { flexDirection: "column", height: rows },
115
+ React.createElement(Header, { title: "New Branch", titleColor: "green", version: version }),
116
+ React.createElement(Box, { flexDirection: "column", flexGrow: 1, marginTop: 1 },
117
+ baseBranch && (React.createElement(Box, { marginBottom: 1 },
118
+ React.createElement(Text, null,
119
+ "Base branch: ",
120
+ React.createElement(Text, { bold: true, color: "cyan" }, baseBranch)))),
121
+ isCreating ? (React.createElement(Box, { flexDirection: "column" },
122
+ React.createElement(Box, { marginBottom: 1 },
123
+ React.createElement(Text, null,
124
+ spinnerFrame,
125
+ ' ',
126
+ React.createElement(Text, { color: "cyan" },
127
+ "Creating branch",
128
+ ' ',
129
+ React.createElement(Text, { bold: true }, pendingBranchName ??
130
+ `${BRANCH_PREFIXES[selectedType.toUpperCase()]}${branchName.trim()}`)))),
131
+ React.createElement(Text, { color: "gray" }, "Please wait while the branch is being created..."))) : step === 'type-selection' ? (React.createElement(Box, { flexDirection: "column" },
132
+ React.createElement(Box, { marginBottom: 1 },
133
+ React.createElement(Text, null, "Select branch type:")),
134
+ React.createElement(Select, { items: branchTypeItems, onSelect: handleTypeSelect }))) : (React.createElement(Box, { flexDirection: "column" },
135
+ React.createElement(Box, { marginBottom: 1 },
136
+ React.createElement(Text, null,
137
+ "Branch name prefix: ",
138
+ React.createElement(Text, { bold: true }, BRANCH_PREFIXES[selectedType.toUpperCase()]))),
139
+ React.createElement(Input, { value: branchName, onChange: handleNameChange, onSubmit: handleCreate, placeholder: "Enter branch name (e.g., add-new-feature)" })))),
140
+ React.createElement(Footer, { actions: footerActions })));
141
+ }
142
+ //# sourceMappingURL=BranchCreatorScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BranchCreatorScreen.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/screens/BranchCreatorScreen.tsx"],"names":[],"mappings":"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"}