@akiojin/gwt 4.12.1 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (860) hide show
  1. package/README.ja.md +173 -203
  2. package/README.md +170 -212
  3. package/bin/gwt +0 -0
  4. package/bin/gwt.js +42 -33
  5. package/package.json +20 -107
  6. package/scripts/postinstall.js +152 -0
  7. package/dist/claude-history.d.ts +0 -60
  8. package/dist/claude-history.d.ts.map +0 -1
  9. package/dist/claude-history.js +0 -606
  10. package/dist/claude-history.js.map +0 -1
  11. package/dist/claude.d.ts +0 -42
  12. package/dist/claude.d.ts.map +0 -1
  13. package/dist/claude.js +0 -429
  14. package/dist/claude.js.map +0 -1
  15. package/dist/cli/ui/App.solid.d.ts +0 -29
  16. package/dist/cli/ui/App.solid.d.ts.map +0 -1
  17. package/dist/cli/ui/App.solid.js +0 -1427
  18. package/dist/cli/ui/App.solid.js.map +0 -1
  19. package/dist/cli/ui/components/solid/Footer.d.ts +0 -10
  20. package/dist/cli/ui/components/solid/Footer.d.ts.map +0 -1
  21. package/dist/cli/ui/components/solid/Footer.js +0 -10
  22. package/dist/cli/ui/components/solid/Footer.js.map +0 -1
  23. package/dist/cli/ui/components/solid/Header.d.ts +0 -32
  24. package/dist/cli/ui/components/solid/Header.d.ts.map +0 -1
  25. package/dist/cli/ui/components/solid/Header.js +0 -13
  26. package/dist/cli/ui/components/solid/Header.js.map +0 -1
  27. package/dist/cli/ui/components/solid/HelpOverlay.d.ts +0 -8
  28. package/dist/cli/ui/components/solid/HelpOverlay.d.ts.map +0 -1
  29. package/dist/cli/ui/components/solid/HelpOverlay.js +0 -118
  30. package/dist/cli/ui/components/solid/HelpOverlay.js.map +0 -1
  31. package/dist/cli/ui/components/solid/QuickStartStep.d.ts +0 -17
  32. package/dist/cli/ui/components/solid/QuickStartStep.d.ts.map +0 -1
  33. package/dist/cli/ui/components/solid/QuickStartStep.js +0 -152
  34. package/dist/cli/ui/components/solid/QuickStartStep.js.map +0 -1
  35. package/dist/cli/ui/components/solid/SelectInput.d.ts +0 -22
  36. package/dist/cli/ui/components/solid/SelectInput.d.ts.map +0 -1
  37. package/dist/cli/ui/components/solid/SelectInput.js +0 -45
  38. package/dist/cli/ui/components/solid/SelectInput.js.map +0 -1
  39. package/dist/cli/ui/components/solid/TextInput.d.ts +0 -12
  40. package/dist/cli/ui/components/solid/TextInput.d.ts.map +0 -1
  41. package/dist/cli/ui/components/solid/TextInput.js +0 -9
  42. package/dist/cli/ui/components/solid/TextInput.js.map +0 -1
  43. package/dist/cli/ui/components/solid/WizardController.d.ts +0 -34
  44. package/dist/cli/ui/components/solid/WizardController.d.ts.map +0 -1
  45. package/dist/cli/ui/components/solid/WizardController.js +0 -269
  46. package/dist/cli/ui/components/solid/WizardController.js.map +0 -1
  47. package/dist/cli/ui/components/solid/WizardPopup.d.ts +0 -26
  48. package/dist/cli/ui/components/solid/WizardPopup.d.ts.map +0 -1
  49. package/dist/cli/ui/components/solid/WizardPopup.js +0 -68
  50. package/dist/cli/ui/components/solid/WizardPopup.js.map +0 -1
  51. package/dist/cli/ui/components/solid/WizardSteps.d.ts +0 -57
  52. package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +0 -1
  53. package/dist/cli/ui/components/solid/WizardSteps.js +0 -442
  54. package/dist/cli/ui/components/solid/WizardSteps.js.map +0 -1
  55. package/dist/cli/ui/core/index.d.ts +0 -12
  56. package/dist/cli/ui/core/index.d.ts.map +0 -1
  57. package/dist/cli/ui/core/index.js +0 -15
  58. package/dist/cli/ui/core/index.js.map +0 -1
  59. package/dist/cli/ui/core/keybindings.d.ts +0 -106
  60. package/dist/cli/ui/core/keybindings.d.ts.map +0 -1
  61. package/dist/cli/ui/core/keybindings.js +0 -270
  62. package/dist/cli/ui/core/keybindings.js.map +0 -1
  63. package/dist/cli/ui/core/theme.d.ts +0 -123
  64. package/dist/cli/ui/core/theme.d.ts.map +0 -1
  65. package/dist/cli/ui/core/theme.js +0 -191
  66. package/dist/cli/ui/core/theme.js.map +0 -1
  67. package/dist/cli/ui/core/types.d.ts +0 -156
  68. package/dist/cli/ui/core/types.d.ts.map +0 -1
  69. package/dist/cli/ui/core/types.js +0 -10
  70. package/dist/cli/ui/core/types.js.map +0 -1
  71. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts +0 -26
  72. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts.map +0 -1
  73. package/dist/cli/ui/hooks/solid/useScrollableList.js +0 -89
  74. package/dist/cli/ui/hooks/solid/useScrollableList.js.map +0 -1
  75. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts +0 -10
  76. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts.map +0 -1
  77. package/dist/cli/ui/hooks/solid/useTerminalSize.js +0 -16
  78. package/dist/cli/ui/hooks/solid/useTerminalSize.js.map +0 -1
  79. package/dist/cli/ui/index.solid.d.ts +0 -5
  80. package/dist/cli/ui/index.solid.d.ts.map +0 -1
  81. package/dist/cli/ui/index.solid.js +0 -21
  82. package/dist/cli/ui/index.solid.js.map +0 -1
  83. package/dist/cli/ui/screens/solid/BranchListScreen.d.ts +0 -53
  84. package/dist/cli/ui/screens/solid/BranchListScreen.d.ts.map +0 -1
  85. package/dist/cli/ui/screens/solid/BranchListScreen.js +0 -829
  86. package/dist/cli/ui/screens/solid/BranchListScreen.js.map +0 -1
  87. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts +0 -11
  88. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts.map +0 -1
  89. package/dist/cli/ui/screens/solid/ConfirmScreen.js +0 -45
  90. package/dist/cli/ui/screens/solid/ConfirmScreen.js.map +0 -1
  91. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts +0 -14
  92. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts.map +0 -1
  93. package/dist/cli/ui/screens/solid/EnvironmentScreen.js +0 -90
  94. package/dist/cli/ui/screens/solid/EnvironmentScreen.js.map +0 -1
  95. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts +0 -8
  96. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts.map +0 -1
  97. package/dist/cli/ui/screens/solid/ErrorScreen.js +0 -18
  98. package/dist/cli/ui/screens/solid/ErrorScreen.js.map +0 -1
  99. package/dist/cli/ui/screens/solid/InputScreen.d.ts +0 -13
  100. package/dist/cli/ui/screens/solid/InputScreen.d.ts.map +0 -1
  101. package/dist/cli/ui/screens/solid/InputScreen.js +0 -17
  102. package/dist/cli/ui/screens/solid/InputScreen.js.map +0 -1
  103. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts +0 -9
  104. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts.map +0 -1
  105. package/dist/cli/ui/screens/solid/LoadingIndicator.js +0 -43
  106. package/dist/cli/ui/screens/solid/LoadingIndicator.js.map +0 -1
  107. package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts +0 -14
  108. package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts.map +0 -1
  109. package/dist/cli/ui/screens/solid/LogDetailScreen.js +0 -34
  110. package/dist/cli/ui/screens/solid/LogDetailScreen.js.map +0 -1
  111. package/dist/cli/ui/screens/solid/LogScreen.d.ts +0 -25
  112. package/dist/cli/ui/screens/solid/LogScreen.d.ts.map +0 -1
  113. package/dist/cli/ui/screens/solid/LogScreen.js +0 -333
  114. package/dist/cli/ui/screens/solid/LogScreen.js.map +0 -1
  115. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts +0 -17
  116. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts.map +0 -1
  117. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js +0 -115
  118. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js.map +0 -1
  119. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts +0 -17
  120. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts.map +0 -1
  121. package/dist/cli/ui/screens/solid/ProfileScreen.js +0 -50
  122. package/dist/cli/ui/screens/solid/ProfileScreen.js.map +0 -1
  123. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts +0 -20
  124. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts.map +0 -1
  125. package/dist/cli/ui/screens/solid/SelectorScreen.js +0 -98
  126. package/dist/cli/ui/screens/solid/SelectorScreen.js.map +0 -1
  127. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts +0 -13
  128. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts.map +0 -1
  129. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js +0 -59
  130. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js.map +0 -1
  131. package/dist/cli/ui/stores/appStore.d.ts +0 -143
  132. package/dist/cli/ui/stores/appStore.d.ts.map +0 -1
  133. package/dist/cli/ui/stores/appStore.js +0 -158
  134. package/dist/cli/ui/stores/appStore.js.map +0 -1
  135. package/dist/cli/ui/stores/branchStore.d.ts +0 -159
  136. package/dist/cli/ui/stores/branchStore.d.ts.map +0 -1
  137. package/dist/cli/ui/stores/branchStore.js +0 -275
  138. package/dist/cli/ui/stores/branchStore.js.map +0 -1
  139. package/dist/cli/ui/stores/index.d.ts +0 -11
  140. package/dist/cli/ui/stores/index.d.ts.map +0 -1
  141. package/dist/cli/ui/stores/index.js +0 -14
  142. package/dist/cli/ui/stores/index.js.map +0 -1
  143. package/dist/cli/ui/stores/uiStore.d.ts +0 -146
  144. package/dist/cli/ui/stores/uiStore.d.ts.map +0 -1
  145. package/dist/cli/ui/stores/uiStore.js +0 -166
  146. package/dist/cli/ui/stores/uiStore.js.map +0 -1
  147. package/dist/cli/ui/types.d.ts +0 -293
  148. package/dist/cli/ui/types.d.ts.map +0 -1
  149. package/dist/cli/ui/types.js +0 -2
  150. package/dist/cli/ui/types.js.map +0 -1
  151. package/dist/cli/ui/utils/baseBranch.d.ts +0 -4
  152. package/dist/cli/ui/utils/baseBranch.d.ts.map +0 -1
  153. package/dist/cli/ui/utils/baseBranch.js +0 -17
  154. package/dist/cli/ui/utils/baseBranch.js.map +0 -1
  155. package/dist/cli/ui/utils/branchFormatter.d.ts +0 -19
  156. package/dist/cli/ui/utils/branchFormatter.d.ts.map +0 -1
  157. package/dist/cli/ui/utils/branchFormatter.js +0 -199
  158. package/dist/cli/ui/utils/branchFormatter.js.map +0 -1
  159. package/dist/cli/ui/utils/clipboard.d.ts +0 -7
  160. package/dist/cli/ui/utils/clipboard.d.ts.map +0 -1
  161. package/dist/cli/ui/utils/clipboard.js +0 -21
  162. package/dist/cli/ui/utils/clipboard.js.map +0 -1
  163. package/dist/cli/ui/utils/continueSession.d.ts +0 -36
  164. package/dist/cli/ui/utils/continueSession.d.ts.map +0 -1
  165. package/dist/cli/ui/utils/continueSession.js +0 -155
  166. package/dist/cli/ui/utils/continueSession.js.map +0 -1
  167. package/dist/cli/ui/utils/installedVersionCache.d.ts +0 -33
  168. package/dist/cli/ui/utils/installedVersionCache.d.ts.map +0 -1
  169. package/dist/cli/ui/utils/installedVersionCache.js +0 -59
  170. package/dist/cli/ui/utils/installedVersionCache.js.map +0 -1
  171. package/dist/cli/ui/utils/modelOptions.d.ts +0 -10
  172. package/dist/cli/ui/utils/modelOptions.d.ts.map +0 -1
  173. package/dist/cli/ui/utils/modelOptions.js +0 -155
  174. package/dist/cli/ui/utils/modelOptions.js.map +0 -1
  175. package/dist/cli/ui/utils/statisticsCalculator.d.ts +0 -9
  176. package/dist/cli/ui/utils/statisticsCalculator.d.ts.map +0 -1
  177. package/dist/cli/ui/utils/statisticsCalculator.js +0 -37
  178. package/dist/cli/ui/utils/statisticsCalculator.js.map +0 -1
  179. package/dist/cli/ui/utils/versionCache.d.ts +0 -37
  180. package/dist/cli/ui/utils/versionCache.d.ts.map +0 -1
  181. package/dist/cli/ui/utils/versionCache.js +0 -70
  182. package/dist/cli/ui/utils/versionCache.js.map +0 -1
  183. package/dist/cli/ui/utils/versionFetcher.d.ts +0 -41
  184. package/dist/cli/ui/utils/versionFetcher.d.ts.map +0 -1
  185. package/dist/cli/ui/utils/versionFetcher.js +0 -89
  186. package/dist/cli/ui/utils/versionFetcher.js.map +0 -1
  187. package/dist/client/assets/index-BbfV7Wuj.css +0 -1
  188. package/dist/client/assets/index-CoAyq5x1.js +0 -78
  189. package/dist/client/index.html +0 -13
  190. package/dist/codex.d.ts +0 -55
  191. package/dist/codex.d.ts.map +0 -1
  192. package/dist/codex.js +0 -329
  193. package/dist/codex.js.map +0 -1
  194. package/dist/config/builtin-coding-agents.d.ts +0 -27
  195. package/dist/config/builtin-coding-agents.d.ts.map +0 -1
  196. package/dist/config/builtin-coding-agents.js +0 -78
  197. package/dist/config/builtin-coding-agents.js.map +0 -1
  198. package/dist/config/constants.d.ts +0 -76
  199. package/dist/config/constants.d.ts.map +0 -1
  200. package/dist/config/constants.js +0 -92
  201. package/dist/config/constants.js.map +0 -1
  202. package/dist/config/env-history.d.ts +0 -4
  203. package/dist/config/env-history.d.ts.map +0 -1
  204. package/dist/config/env-history.js +0 -34
  205. package/dist/config/env-history.js.map +0 -1
  206. package/dist/config/index.d.ts +0 -51
  207. package/dist/config/index.d.ts.map +0 -1
  208. package/dist/config/index.js +0 -225
  209. package/dist/config/index.js.map +0 -1
  210. package/dist/config/profiles.d.ts +0 -94
  211. package/dist/config/profiles.d.ts.map +0 -1
  212. package/dist/config/profiles.js +0 -284
  213. package/dist/config/profiles.js.map +0 -1
  214. package/dist/config/shared-env.d.ts +0 -41
  215. package/dist/config/shared-env.d.ts.map +0 -1
  216. package/dist/config/shared-env.js +0 -114
  217. package/dist/config/shared-env.js.map +0 -1
  218. package/dist/config/tools.d.ts +0 -50
  219. package/dist/config/tools.d.ts.map +0 -1
  220. package/dist/config/tools.js +0 -239
  221. package/dist/config/tools.js.map +0 -1
  222. package/dist/gemini.d.ts +0 -35
  223. package/dist/gemini.d.ts.map +0 -1
  224. package/dist/gemini.js +0 -299
  225. package/dist/gemini.js.map +0 -1
  226. package/dist/git.d.ts +0 -154
  227. package/dist/git.d.ts.map +0 -1
  228. package/dist/git.js +0 -1012
  229. package/dist/git.js.map +0 -1
  230. package/dist/github.d.ts +0 -14
  231. package/dist/github.d.ts.map +0 -1
  232. package/dist/github.js +0 -123
  233. package/dist/github.js.map +0 -1
  234. package/dist/index.d.ts +0 -16
  235. package/dist/index.d.ts.map +0 -1
  236. package/dist/index.js +0 -782
  237. package/dist/index.js.map +0 -1
  238. package/dist/launcher.d.ts +0 -30
  239. package/dist/launcher.d.ts.map +0 -1
  240. package/dist/launcher.js +0 -185
  241. package/dist/launcher.js.map +0 -1
  242. package/dist/logging/agentOutput.d.ts +0 -21
  243. package/dist/logging/agentOutput.d.ts.map +0 -1
  244. package/dist/logging/agentOutput.js +0 -164
  245. package/dist/logging/agentOutput.js.map +0 -1
  246. package/dist/logging/formatter.d.ts +0 -15
  247. package/dist/logging/formatter.d.ts.map +0 -1
  248. package/dist/logging/formatter.js +0 -95
  249. package/dist/logging/formatter.js.map +0 -1
  250. package/dist/logging/logger.d.ts +0 -24
  251. package/dist/logging/logger.d.ts.map +0 -1
  252. package/dist/logging/logger.js +0 -79
  253. package/dist/logging/logger.js.map +0 -1
  254. package/dist/logging/reader.d.ts +0 -34
  255. package/dist/logging/reader.d.ts.map +0 -1
  256. package/dist/logging/reader.js +0 -178
  257. package/dist/logging/reader.js.map +0 -1
  258. package/dist/logging/rotation.d.ts +0 -6
  259. package/dist/logging/rotation.d.ts.map +0 -1
  260. package/dist/logging/rotation.js +0 -26
  261. package/dist/logging/rotation.js.map +0 -1
  262. package/dist/opentui/highlights-eq9cgrbb.scm +0 -604
  263. package/dist/opentui/highlights-ghv9g403.scm +0 -205
  264. package/dist/opentui/highlights-hk7bwhj4.scm +0 -284
  265. package/dist/opentui/highlights-r812a2qc.scm +0 -150
  266. package/dist/opentui/highlights-x6tmsnaa.scm +0 -115
  267. package/dist/opentui/index.solid.d.ts +0 -2
  268. package/dist/opentui/index.solid.d.ts.map +0 -1
  269. package/dist/opentui/index.solid.js +0 -53721
  270. package/dist/opentui/index.solid.js.map +0 -1
  271. package/dist/opentui/injections-73j83es3.scm +0 -27
  272. package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  273. package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
  274. package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  275. package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  276. package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
  277. package/dist/repositories/git.repository.d.ts +0 -38
  278. package/dist/repositories/git.repository.d.ts.map +0 -1
  279. package/dist/repositories/git.repository.js +0 -117
  280. package/dist/repositories/git.repository.js.map +0 -1
  281. package/dist/repositories/github.repository.d.ts +0 -16
  282. package/dist/repositories/github.repository.d.ts.map +0 -1
  283. package/dist/repositories/github.repository.js +0 -61
  284. package/dist/repositories/github.repository.js.map +0 -1
  285. package/dist/repositories/worktree.repository.d.ts +0 -19
  286. package/dist/repositories/worktree.repository.d.ts.map +0 -1
  287. package/dist/repositories/worktree.repository.js +0 -64
  288. package/dist/repositories/worktree.repository.js.map +0 -1
  289. package/dist/services/BatchMergeService.d.ts +0 -45
  290. package/dist/services/BatchMergeService.d.ts.map +0 -1
  291. package/dist/services/BatchMergeService.js +0 -197
  292. package/dist/services/BatchMergeService.js.map +0 -1
  293. package/dist/services/WorktreeOrchestrator.d.ts +0 -37
  294. package/dist/services/WorktreeOrchestrator.d.ts.map +0 -1
  295. package/dist/services/WorktreeOrchestrator.js +0 -74
  296. package/dist/services/WorktreeOrchestrator.js.map +0 -1
  297. package/dist/services/codingAgentCommandResolver.d.ts +0 -10
  298. package/dist/services/codingAgentCommandResolver.d.ts.map +0 -1
  299. package/dist/services/codingAgentCommandResolver.js +0 -81
  300. package/dist/services/codingAgentCommandResolver.js.map +0 -1
  301. package/dist/services/codingAgentResolver.d.ts +0 -43
  302. package/dist/services/codingAgentResolver.d.ts.map +0 -1
  303. package/dist/services/codingAgentResolver.js +0 -269
  304. package/dist/services/codingAgentResolver.js.map +0 -1
  305. package/dist/services/dependency-installer.d.ts +0 -26
  306. package/dist/services/dependency-installer.d.ts.map +0 -1
  307. package/dist/services/dependency-installer.js +0 -134
  308. package/dist/services/dependency-installer.js.map +0 -1
  309. package/dist/services/git.service.d.ts +0 -27
  310. package/dist/services/git.service.d.ts.map +0 -1
  311. package/dist/services/git.service.js +0 -97
  312. package/dist/services/git.service.js.map +0 -1
  313. package/dist/services/github.service.d.ts +0 -14
  314. package/dist/services/github.service.d.ts.map +0 -1
  315. package/dist/services/github.service.js +0 -52
  316. package/dist/services/github.service.js.map +0 -1
  317. package/dist/services/worktree.service.d.ts +0 -20
  318. package/dist/services/worktree.service.d.ts.map +0 -1
  319. package/dist/services/worktree.service.js +0 -52
  320. package/dist/services/worktree.service.js.map +0 -1
  321. package/dist/shared/codingAgentConstants.d.ts +0 -12
  322. package/dist/shared/codingAgentConstants.d.ts.map +0 -1
  323. package/dist/shared/codingAgentConstants.js +0 -95
  324. package/dist/shared/codingAgentConstants.js.map +0 -1
  325. package/dist/types/api.d.ts +0 -225
  326. package/dist/types/api.d.ts.map +0 -1
  327. package/dist/types/api.js +0 -8
  328. package/dist/types/api.js.map +0 -1
  329. package/dist/types/coding-agent.d.ts +0 -62
  330. package/dist/types/coding-agent.d.ts.map +0 -1
  331. package/dist/types/coding-agent.js +0 -29
  332. package/dist/types/coding-agent.js.map +0 -1
  333. package/dist/types/profiles.d.ts +0 -54
  334. package/dist/types/profiles.d.ts.map +0 -1
  335. package/dist/types/profiles.js +0 -33
  336. package/dist/types/profiles.js.map +0 -1
  337. package/dist/types/tools.d.ts +0 -230
  338. package/dist/types/tools.d.ts.map +0 -1
  339. package/dist/types/tools.js +0 -8
  340. package/dist/types/tools.js.map +0 -1
  341. package/dist/utils/bun-runtime.d.ts +0 -12
  342. package/dist/utils/bun-runtime.d.ts.map +0 -1
  343. package/dist/utils/bun-runtime.js +0 -13
  344. package/dist/utils/bun-runtime.js.map +0 -1
  345. package/dist/utils/coding-agent-colors.d.ts +0 -88
  346. package/dist/utils/coding-agent-colors.d.ts.map +0 -1
  347. package/dist/utils/coding-agent-colors.js +0 -137
  348. package/dist/utils/coding-agent-colors.js.map +0 -1
  349. package/dist/utils/command.d.ts +0 -62
  350. package/dist/utils/command.d.ts.map +0 -1
  351. package/dist/utils/command.js +0 -186
  352. package/dist/utils/command.js.map +0 -1
  353. package/dist/utils/error-utils.d.ts +0 -27
  354. package/dist/utils/error-utils.d.ts.map +0 -1
  355. package/dist/utils/error-utils.js +0 -98
  356. package/dist/utils/error-utils.js.map +0 -1
  357. package/dist/utils/npmRegistry.d.ts +0 -61
  358. package/dist/utils/npmRegistry.d.ts.map +0 -1
  359. package/dist/utils/npmRegistry.js +0 -180
  360. package/dist/utils/npmRegistry.js.map +0 -1
  361. package/dist/utils/prompt.d.ts +0 -18
  362. package/dist/utils/prompt.d.ts.map +0 -1
  363. package/dist/utils/prompt.js +0 -107
  364. package/dist/utils/prompt.js.map +0 -1
  365. package/dist/utils/session/common.d.ts +0 -108
  366. package/dist/utils/session/common.d.ts.map +0 -1
  367. package/dist/utils/session/common.js +0 -439
  368. package/dist/utils/session/common.js.map +0 -1
  369. package/dist/utils/session/index.d.ts +0 -16
  370. package/dist/utils/session/index.d.ts.map +0 -1
  371. package/dist/utils/session/index.js +0 -20
  372. package/dist/utils/session/index.js.map +0 -1
  373. package/dist/utils/session/parsers/claude.d.ts +0 -62
  374. package/dist/utils/session/parsers/claude.d.ts.map +0 -1
  375. package/dist/utils/session/parsers/claude.js +0 -224
  376. package/dist/utils/session/parsers/claude.js.map +0 -1
  377. package/dist/utils/session/parsers/codex.d.ts +0 -37
  378. package/dist/utils/session/parsers/codex.d.ts.map +0 -1
  379. package/dist/utils/session/parsers/codex.js +0 -139
  380. package/dist/utils/session/parsers/codex.js.map +0 -1
  381. package/dist/utils/session/parsers/gemini.d.ts +0 -22
  382. package/dist/utils/session/parsers/gemini.d.ts.map +0 -1
  383. package/dist/utils/session/parsers/gemini.js +0 -118
  384. package/dist/utils/session/parsers/gemini.js.map +0 -1
  385. package/dist/utils/session/parsers/index.d.ts +0 -8
  386. package/dist/utils/session/parsers/index.d.ts.map +0 -1
  387. package/dist/utils/session/parsers/index.js +0 -12
  388. package/dist/utils/session/parsers/index.js.map +0 -1
  389. package/dist/utils/session/parsers/opencode.d.ts +0 -23
  390. package/dist/utils/session/parsers/opencode.d.ts.map +0 -1
  391. package/dist/utils/session/parsers/opencode.js +0 -126
  392. package/dist/utils/session/parsers/opencode.js.map +0 -1
  393. package/dist/utils/session/types.d.ts +0 -49
  394. package/dist/utils/session/types.d.ts.map +0 -1
  395. package/dist/utils/session/types.js +0 -5
  396. package/dist/utils/session/types.js.map +0 -1
  397. package/dist/utils/session.d.ts +0 -16
  398. package/dist/utils/session.d.ts.map +0 -1
  399. package/dist/utils/session.js +0 -16
  400. package/dist/utils/session.js.map +0 -1
  401. package/dist/utils/spinner.d.ts +0 -6
  402. package/dist/utils/spinner.d.ts.map +0 -1
  403. package/dist/utils/spinner.js +0 -47
  404. package/dist/utils/spinner.js.map +0 -1
  405. package/dist/utils/terminal.d.ts +0 -64
  406. package/dist/utils/terminal.d.ts.map +0 -1
  407. package/dist/utils/terminal.js +0 -270
  408. package/dist/utils/terminal.js.map +0 -1
  409. package/dist/utils/webui.d.ts +0 -8
  410. package/dist/utils/webui.d.ts.map +0 -1
  411. package/dist/utils/webui.js +0 -35
  412. package/dist/utils/webui.js.map +0 -1
  413. package/dist/utils.d.ts +0 -18
  414. package/dist/utils.d.ts.map +0 -1
  415. package/dist/utils.js +0 -79
  416. package/dist/utils.js.map +0 -1
  417. package/dist/web/client/src/components/BranchGraph.d.ts +0 -13
  418. package/dist/web/client/src/components/BranchGraph.d.ts.map +0 -1
  419. package/dist/web/client/src/components/BranchGraph.js +0 -49
  420. package/dist/web/client/src/components/BranchGraph.js.map +0 -1
  421. package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts +0 -9
  422. package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +0 -1
  423. package/dist/web/client/src/components/CodingAgentLaunchModal.js +0 -354
  424. package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +0 -1
  425. package/dist/web/client/src/components/CustomCodingAgentForm.d.ts +0 -23
  426. package/dist/web/client/src/components/CustomCodingAgentForm.d.ts.map +0 -1
  427. package/dist/web/client/src/components/CustomCodingAgentForm.js +0 -209
  428. package/dist/web/client/src/components/CustomCodingAgentForm.js.map +0 -1
  429. package/dist/web/client/src/components/CustomCodingAgentList.d.ts +0 -10
  430. package/dist/web/client/src/components/CustomCodingAgentList.d.ts.map +0 -1
  431. package/dist/web/client/src/components/CustomCodingAgentList.js +0 -57
  432. package/dist/web/client/src/components/CustomCodingAgentList.js.map +0 -1
  433. package/dist/web/client/src/components/EnvEditor.d.ts +0 -20
  434. package/dist/web/client/src/components/EnvEditor.d.ts.map +0 -1
  435. package/dist/web/client/src/components/EnvEditor.js +0 -75
  436. package/dist/web/client/src/components/EnvEditor.js.map +0 -1
  437. package/dist/web/client/src/components/EnvironmentEditor.d.ts +0 -17
  438. package/dist/web/client/src/components/EnvironmentEditor.d.ts.map +0 -1
  439. package/dist/web/client/src/components/EnvironmentEditor.js +0 -22
  440. package/dist/web/client/src/components/EnvironmentEditor.js.map +0 -1
  441. package/dist/web/client/src/components/Terminal.d.ts +0 -15
  442. package/dist/web/client/src/components/Terminal.d.ts.map +0 -1
  443. package/dist/web/client/src/components/Terminal.js +0 -119
  444. package/dist/web/client/src/components/Terminal.js.map +0 -1
  445. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts +0 -10
  446. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +0 -1
  447. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +0 -107
  448. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +0 -1
  449. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts +0 -22
  450. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +0 -1
  451. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +0 -80
  452. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +0 -1
  453. package/dist/web/client/src/components/branch-detail/TerminalPanel.d.ts +0 -11
  454. package/dist/web/client/src/components/branch-detail/TerminalPanel.d.ts.map +0 -1
  455. package/dist/web/client/src/components/branch-detail/TerminalPanel.js +0 -32
  456. package/dist/web/client/src/components/branch-detail/TerminalPanel.js.map +0 -1
  457. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +0 -40
  458. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +0 -1
  459. package/dist/web/client/src/components/branch-detail/ToolLauncher.js +0 -147
  460. package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +0 -1
  461. package/dist/web/client/src/components/branch-detail/index.d.ts +0 -5
  462. package/dist/web/client/src/components/branch-detail/index.d.ts.map +0 -1
  463. package/dist/web/client/src/components/branch-detail/index.js +0 -5
  464. package/dist/web/client/src/components/branch-detail/index.js.map +0 -1
  465. package/dist/web/client/src/components/common/BranchCard.d.ts +0 -17
  466. package/dist/web/client/src/components/common/BranchCard.d.ts.map +0 -1
  467. package/dist/web/client/src/components/common/BranchCard.js +0 -36
  468. package/dist/web/client/src/components/common/BranchCard.js.map +0 -1
  469. package/dist/web/client/src/components/common/MetricCard.d.ts +0 -10
  470. package/dist/web/client/src/components/common/MetricCard.d.ts.map +0 -1
  471. package/dist/web/client/src/components/common/MetricCard.js +0 -10
  472. package/dist/web/client/src/components/common/MetricCard.js.map +0 -1
  473. package/dist/web/client/src/components/common/PageHeader.d.ts +0 -12
  474. package/dist/web/client/src/components/common/PageHeader.d.ts.map +0 -1
  475. package/dist/web/client/src/components/common/PageHeader.js +0 -14
  476. package/dist/web/client/src/components/common/PageHeader.js.map +0 -1
  477. package/dist/web/client/src/components/common/SearchInput.d.ts +0 -14
  478. package/dist/web/client/src/components/common/SearchInput.d.ts.map +0 -1
  479. package/dist/web/client/src/components/common/SearchInput.js +0 -15
  480. package/dist/web/client/src/components/common/SearchInput.js.map +0 -1
  481. package/dist/web/client/src/components/common/StatusBadge.d.ts +0 -10
  482. package/dist/web/client/src/components/common/StatusBadge.d.ts.map +0 -1
  483. package/dist/web/client/src/components/common/StatusBadge.js +0 -15
  484. package/dist/web/client/src/components/common/StatusBadge.js.map +0 -1
  485. package/dist/web/client/src/components/common/index.d.ts +0 -6
  486. package/dist/web/client/src/components/common/index.d.ts.map +0 -1
  487. package/dist/web/client/src/components/common/index.js +0 -6
  488. package/dist/web/client/src/components/common/index.js.map +0 -1
  489. package/dist/web/client/src/components/graph/BranchDetailPanel.d.ts +0 -15
  490. package/dist/web/client/src/components/graph/BranchDetailPanel.d.ts.map +0 -1
  491. package/dist/web/client/src/components/graph/BranchDetailPanel.js +0 -57
  492. package/dist/web/client/src/components/graph/BranchDetailPanel.js.map +0 -1
  493. package/dist/web/client/src/components/graph/BranchNode.d.ts +0 -13
  494. package/dist/web/client/src/components/graph/BranchNode.d.ts.map +0 -1
  495. package/dist/web/client/src/components/graph/BranchNode.js +0 -103
  496. package/dist/web/client/src/components/graph/BranchNode.js.map +0 -1
  497. package/dist/web/client/src/components/graph/ClusterNode.d.ts +0 -13
  498. package/dist/web/client/src/components/graph/ClusterNode.d.ts.map +0 -1
  499. package/dist/web/client/src/components/graph/ClusterNode.js +0 -109
  500. package/dist/web/client/src/components/graph/ClusterNode.js.map +0 -1
  501. package/dist/web/client/src/components/graph/SynapticCanvas.d.ts +0 -17
  502. package/dist/web/client/src/components/graph/SynapticCanvas.d.ts.map +0 -1
  503. package/dist/web/client/src/components/graph/SynapticCanvas.js +0 -94
  504. package/dist/web/client/src/components/graph/SynapticCanvas.js.map +0 -1
  505. package/dist/web/client/src/components/graph/SynapticEdge.d.ts +0 -13
  506. package/dist/web/client/src/components/graph/SynapticEdge.d.ts.map +0 -1
  507. package/dist/web/client/src/components/graph/SynapticEdge.js +0 -113
  508. package/dist/web/client/src/components/graph/SynapticEdge.js.map +0 -1
  509. package/dist/web/client/src/components/graph/graphUtils.d.ts +0 -67
  510. package/dist/web/client/src/components/graph/graphUtils.d.ts.map +0 -1
  511. package/dist/web/client/src/components/graph/graphUtils.js +0 -175
  512. package/dist/web/client/src/components/graph/graphUtils.js.map +0 -1
  513. package/dist/web/client/src/components/graph/index.d.ts +0 -10
  514. package/dist/web/client/src/components/graph/index.d.ts.map +0 -1
  515. package/dist/web/client/src/components/graph/index.js +0 -10
  516. package/dist/web/client/src/components/graph/index.js.map +0 -1
  517. package/dist/web/client/src/components/ui/alert.d.ts +0 -9
  518. package/dist/web/client/src/components/ui/alert.d.ts.map +0 -1
  519. package/dist/web/client/src/components/ui/alert.js +0 -25
  520. package/dist/web/client/src/components/ui/alert.js.map +0 -1
  521. package/dist/web/client/src/components/ui/badge.d.ts +0 -10
  522. package/dist/web/client/src/components/ui/badge.d.ts.map +0 -1
  523. package/dist/web/client/src/components/ui/badge.js +0 -25
  524. package/dist/web/client/src/components/ui/badge.js.map +0 -1
  525. package/dist/web/client/src/components/ui/button.d.ts +0 -12
  526. package/dist/web/client/src/components/ui/button.d.ts.map +0 -1
  527. package/dist/web/client/src/components/ui/button.js +0 -33
  528. package/dist/web/client/src/components/ui/button.js.map +0 -1
  529. package/dist/web/client/src/components/ui/card.d.ts +0 -9
  530. package/dist/web/client/src/components/ui/card.d.ts.map +0 -1
  531. package/dist/web/client/src/components/ui/card.js +0 -16
  532. package/dist/web/client/src/components/ui/card.js.map +0 -1
  533. package/dist/web/client/src/components/ui/index.d.ts +0 -8
  534. package/dist/web/client/src/components/ui/index.d.ts.map +0 -1
  535. package/dist/web/client/src/components/ui/index.js +0 -8
  536. package/dist/web/client/src/components/ui/index.js.map +0 -1
  537. package/dist/web/client/src/components/ui/input.d.ts +0 -4
  538. package/dist/web/client/src/components/ui/input.d.ts.map +0 -1
  539. package/dist/web/client/src/components/ui/input.js +0 -8
  540. package/dist/web/client/src/components/ui/input.js.map +0 -1
  541. package/dist/web/client/src/components/ui/select.d.ts +0 -14
  542. package/dist/web/client/src/components/ui/select.d.ts.map +0 -1
  543. package/dist/web/client/src/components/ui/select.js +0 -39
  544. package/dist/web/client/src/components/ui/select.js.map +0 -1
  545. package/dist/web/client/src/components/ui/table.d.ts +0 -11
  546. package/dist/web/client/src/components/ui/table.d.ts.map +0 -1
  547. package/dist/web/client/src/components/ui/table.js +0 -21
  548. package/dist/web/client/src/components/ui/table.js.map +0 -1
  549. package/dist/web/client/src/hooks/useBranches.d.ts +0 -16
  550. package/dist/web/client/src/hooks/useBranches.d.ts.map +0 -1
  551. package/dist/web/client/src/hooks/useBranches.js +0 -35
  552. package/dist/web/client/src/hooks/useBranches.js.map +0 -1
  553. package/dist/web/client/src/hooks/useConfig.d.ts +0 -13
  554. package/dist/web/client/src/hooks/useConfig.d.ts.map +0 -1
  555. package/dist/web/client/src/hooks/useConfig.js +0 -27
  556. package/dist/web/client/src/hooks/useConfig.js.map +0 -1
  557. package/dist/web/client/src/hooks/useSessions.d.ts +0 -21
  558. package/dist/web/client/src/hooks/useSessions.d.ts.map +0 -1
  559. package/dist/web/client/src/hooks/useSessions.js +0 -54
  560. package/dist/web/client/src/hooks/useSessions.js.map +0 -1
  561. package/dist/web/client/src/hooks/useWorktrees.d.ts +0 -17
  562. package/dist/web/client/src/hooks/useWorktrees.d.ts.map +0 -1
  563. package/dist/web/client/src/hooks/useWorktrees.js +0 -41
  564. package/dist/web/client/src/hooks/useWorktrees.js.map +0 -1
  565. package/dist/web/client/src/lib/api.d.ts +0 -82
  566. package/dist/web/client/src/lib/api.d.ts.map +0 -1
  567. package/dist/web/client/src/lib/api.js +0 -147
  568. package/dist/web/client/src/lib/api.js.map +0 -1
  569. package/dist/web/client/src/lib/coding-agent-colors.d.ts +0 -86
  570. package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +0 -1
  571. package/dist/web/client/src/lib/coding-agent-colors.js +0 -135
  572. package/dist/web/client/src/lib/coding-agent-colors.js.map +0 -1
  573. package/dist/web/client/src/lib/utils.d.ts +0 -7
  574. package/dist/web/client/src/lib/utils.d.ts.map +0 -1
  575. package/dist/web/client/src/lib/utils.js +0 -10
  576. package/dist/web/client/src/lib/utils.js.map +0 -1
  577. package/dist/web/client/src/lib/websocket.d.ts +0 -59
  578. package/dist/web/client/src/lib/websocket.d.ts.map +0 -1
  579. package/dist/web/client/src/lib/websocket.js +0 -182
  580. package/dist/web/client/src/lib/websocket.js.map +0 -1
  581. package/dist/web/client/src/main.d.ts +0 -2
  582. package/dist/web/client/src/main.d.ts.map +0 -1
  583. package/dist/web/client/src/main.js +0 -23
  584. package/dist/web/client/src/main.js.map +0 -1
  585. package/dist/web/client/src/pages/BranchDetailPage.d.ts +0 -3
  586. package/dist/web/client/src/pages/BranchDetailPage.d.ts.map +0 -1
  587. package/dist/web/client/src/pages/BranchDetailPage.js +0 -365
  588. package/dist/web/client/src/pages/BranchDetailPage.js.map +0 -1
  589. package/dist/web/client/src/pages/BranchListPage.d.ts +0 -3
  590. package/dist/web/client/src/pages/BranchListPage.d.ts.map +0 -1
  591. package/dist/web/client/src/pages/BranchListPage.js +0 -118
  592. package/dist/web/client/src/pages/BranchListPage.js.map +0 -1
  593. package/dist/web/client/src/pages/ConfigManagementPage.d.ts +0 -3
  594. package/dist/web/client/src/pages/ConfigManagementPage.d.ts.map +0 -1
  595. package/dist/web/client/src/pages/ConfigManagementPage.js +0 -132
  596. package/dist/web/client/src/pages/ConfigManagementPage.js.map +0 -1
  597. package/dist/web/client/src/pages/ConfigPage.d.ts +0 -3
  598. package/dist/web/client/src/pages/ConfigPage.d.ts.map +0 -1
  599. package/dist/web/client/src/pages/ConfigPage.js +0 -220
  600. package/dist/web/client/src/pages/ConfigPage.js.map +0 -1
  601. package/dist/web/client/src/router.d.ts +0 -9
  602. package/dist/web/client/src/router.d.ts.map +0 -1
  603. package/dist/web/client/src/router.js +0 -27
  604. package/dist/web/client/src/router.js.map +0 -1
  605. package/dist/web/client/vite.config.d.ts +0 -3
  606. package/dist/web/client/vite.config.d.ts.map +0 -1
  607. package/dist/web/client/vite.config.js +0 -28
  608. package/dist/web/client/vite.config.js.map +0 -1
  609. package/dist/web/server/env/importer.d.ts +0 -3
  610. package/dist/web/server/env/importer.d.ts.map +0 -1
  611. package/dist/web/server/env/importer.js +0 -51
  612. package/dist/web/server/env/importer.js.map +0 -1
  613. package/dist/web/server/index.d.ts +0 -33
  614. package/dist/web/server/index.d.ts.map +0 -1
  615. package/dist/web/server/index.js +0 -102
  616. package/dist/web/server/index.js.map +0 -1
  617. package/dist/web/server/pty/manager.d.ts +0 -54
  618. package/dist/web/server/pty/manager.d.ts.map +0 -1
  619. package/dist/web/server/pty/manager.js +0 -303
  620. package/dist/web/server/pty/manager.js.map +0 -1
  621. package/dist/web/server/routes/branches.d.ts +0 -11
  622. package/dist/web/server/routes/branches.d.ts.map +0 -1
  623. package/dist/web/server/routes/branches.js +0 -97
  624. package/dist/web/server/routes/branches.js.map +0 -1
  625. package/dist/web/server/routes/config.d.ts +0 -6
  626. package/dist/web/server/routes/config.d.ts.map +0 -1
  627. package/dist/web/server/routes/config.js +0 -162
  628. package/dist/web/server/routes/config.js.map +0 -1
  629. package/dist/web/server/routes/index.d.ts +0 -13
  630. package/dist/web/server/routes/index.d.ts.map +0 -1
  631. package/dist/web/server/routes/index.js +0 -29
  632. package/dist/web/server/routes/index.js.map +0 -1
  633. package/dist/web/server/routes/sessions.d.ts +0 -12
  634. package/dist/web/server/routes/sessions.d.ts.map +0 -1
  635. package/dist/web/server/routes/sessions.js +0 -176
  636. package/dist/web/server/routes/sessions.js.map +0 -1
  637. package/dist/web/server/routes/worktrees.d.ts +0 -11
  638. package/dist/web/server/routes/worktrees.d.ts.map +0 -1
  639. package/dist/web/server/routes/worktrees.js +0 -80
  640. package/dist/web/server/routes/worktrees.js.map +0 -1
  641. package/dist/web/server/services/branches.d.ts +0 -17
  642. package/dist/web/server/services/branches.d.ts.map +0 -1
  643. package/dist/web/server/services/branches.js +0 -275
  644. package/dist/web/server/services/branches.js.map +0 -1
  645. package/dist/web/server/services/worktrees.d.ts +0 -24
  646. package/dist/web/server/services/worktrees.d.ts.map +0 -1
  647. package/dist/web/server/services/worktrees.js +0 -66
  648. package/dist/web/server/services/worktrees.js.map +0 -1
  649. package/dist/web/server/tray.d.ts +0 -25
  650. package/dist/web/server/tray.d.ts.map +0 -1
  651. package/dist/web/server/tray.js +0 -116
  652. package/dist/web/server/tray.js.map +0 -1
  653. package/dist/web/server/types.d.ts +0 -4
  654. package/dist/web/server/types.d.ts.map +0 -1
  655. package/dist/web/server/types.js +0 -2
  656. package/dist/web/server/types.js.map +0 -1
  657. package/dist/web/server/websocket/handler.d.ts +0 -57
  658. package/dist/web/server/websocket/handler.d.ts.map +0 -1
  659. package/dist/web/server/websocket/handler.js +0 -220
  660. package/dist/web/server/websocket/handler.js.map +0 -1
  661. package/dist/worktree.d.ts +0 -117
  662. package/dist/worktree.d.ts.map +0 -1
  663. package/dist/worktree.js +0 -788
  664. package/dist/worktree.js.map +0 -1
  665. package/src/claude-history.ts +0 -717
  666. package/src/claude.ts +0 -557
  667. package/src/cli/ui/App.solid.tsx +0 -2145
  668. package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +0 -1175
  669. package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +0 -343
  670. package/src/cli/ui/__tests__/solid/ConfirmScreen.test.tsx +0 -77
  671. package/src/cli/ui/__tests__/solid/LogScreen.test.tsx +0 -351
  672. package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +0 -308
  673. package/src/cli/ui/__tests__/solid/components/WizardController.test.tsx +0 -71
  674. package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +0 -231
  675. package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +0 -331
  676. package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +0 -702
  677. package/src/cli/ui/__tests__/utils/clipboard.test.ts +0 -65
  678. package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +0 -243
  679. package/src/cli/ui/components/solid/Footer.tsx +0 -36
  680. package/src/cli/ui/components/solid/Header.tsx +0 -67
  681. package/src/cli/ui/components/solid/HelpOverlay.tsx +0 -194
  682. package/src/cli/ui/components/solid/QuickStartStep.tsx +0 -209
  683. package/src/cli/ui/components/solid/ScrollableList.tsx +0 -23
  684. package/src/cli/ui/components/solid/SearchInput.tsx +0 -42
  685. package/src/cli/ui/components/solid/SelectInput.tsx +0 -88
  686. package/src/cli/ui/components/solid/Stats.tsx +0 -92
  687. package/src/cli/ui/components/solid/TextInput.tsx +0 -49
  688. package/src/cli/ui/components/solid/WizardController.tsx +0 -457
  689. package/src/cli/ui/components/solid/WizardPopup.tsx +0 -135
  690. package/src/cli/ui/components/solid/WizardSteps.tsx +0 -781
  691. package/src/cli/ui/core/index.ts +0 -17
  692. package/src/cli/ui/core/keybindings.ts +0 -367
  693. package/src/cli/ui/core/theme.ts +0 -266
  694. package/src/cli/ui/core/types.ts +0 -235
  695. package/src/cli/ui/hooks/solid/useAsyncOperation.ts +0 -78
  696. package/src/cli/ui/hooks/solid/useFilter.ts +0 -86
  697. package/src/cli/ui/hooks/solid/useGitOperations.ts +0 -81
  698. package/src/cli/ui/hooks/solid/useKeyHandler.ts +0 -103
  699. package/src/cli/ui/hooks/solid/useScrollableList.ts +0 -149
  700. package/src/cli/ui/hooks/solid/useSelection.ts +0 -77
  701. package/src/cli/ui/hooks/solid/useTerminalSize.ts +0 -22
  702. package/src/cli/ui/index.solid.ts +0 -28
  703. package/src/cli/ui/screens/solid/BranchListScreen.tsx +0 -1153
  704. package/src/cli/ui/screens/solid/ConfirmScreen.tsx +0 -86
  705. package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +0 -161
  706. package/src/cli/ui/screens/solid/ErrorScreen.tsx +0 -42
  707. package/src/cli/ui/screens/solid/InputScreen.tsx +0 -55
  708. package/src/cli/ui/screens/solid/LoadingIndicator.tsx +0 -77
  709. package/src/cli/ui/screens/solid/LogDetailScreen.tsx +0 -75
  710. package/src/cli/ui/screens/solid/LogScreen.tsx +0 -504
  711. package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +0 -196
  712. package/src/cli/ui/screens/solid/ProfileScreen.tsx +0 -98
  713. package/src/cli/ui/screens/solid/SelectorScreen.tsx +0 -181
  714. package/src/cli/ui/screens/solid/SettingsScreen.tsx +0 -52
  715. package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +0 -136
  716. package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +0 -40
  717. package/src/cli/ui/stores/appStore.ts +0 -208
  718. package/src/cli/ui/stores/branchStore.ts +0 -357
  719. package/src/cli/ui/stores/index.ts +0 -31
  720. package/src/cli/ui/stores/uiStore.ts +0 -226
  721. package/src/cli/ui/types.ts +0 -371
  722. package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +0 -227
  723. package/src/cli/ui/utils/__tests__/installedVersionCache.test.ts +0 -46
  724. package/src/cli/ui/utils/baseBranch.ts +0 -34
  725. package/src/cli/ui/utils/branchFormatter.ts +0 -222
  726. package/src/cli/ui/utils/clipboard.ts +0 -31
  727. package/src/cli/ui/utils/continueSession.ts +0 -231
  728. package/src/cli/ui/utils/installedVersionCache.ts +0 -84
  729. package/src/cli/ui/utils/modelOptions.test.ts +0 -98
  730. package/src/cli/ui/utils/modelOptions.ts +0 -169
  731. package/src/cli/ui/utils/statisticsCalculator.ts +0 -44
  732. package/src/cli/ui/utils/versionCache.ts +0 -93
  733. package/src/cli/ui/utils/versionFetcher.ts +0 -120
  734. package/src/codex.ts +0 -445
  735. package/src/config/__tests__/saveSession.test.ts +0 -143
  736. package/src/config/builtin-coding-agents.ts +0 -87
  737. package/src/config/constants.ts +0 -102
  738. package/src/config/env-history.ts +0 -45
  739. package/src/config/index.ts +0 -311
  740. package/src/config/profiles.ts +0 -359
  741. package/src/config/shared-env.ts +0 -139
  742. package/src/config/tools.ts +0 -319
  743. package/src/gemini.ts +0 -405
  744. package/src/git.ts +0 -1263
  745. package/src/github.ts +0 -158
  746. package/src/index.test.ts +0 -93
  747. package/src/index.ts +0 -1024
  748. package/src/launcher.ts +0 -235
  749. package/src/logging/agentOutput.ts +0 -216
  750. package/src/logging/formatter.ts +0 -125
  751. package/src/logging/logger.ts +0 -106
  752. package/src/logging/reader.ts +0 -240
  753. package/src/logging/rotation.ts +0 -25
  754. package/src/opentui/index.solid.ts +0 -1
  755. package/src/repositories/git.repository.ts +0 -129
  756. package/src/repositories/github.repository.ts +0 -83
  757. package/src/repositories/worktree.repository.ts +0 -77
  758. package/src/services/BatchMergeService.ts +0 -251
  759. package/src/services/WorktreeOrchestrator.ts +0 -115
  760. package/src/services/__tests__/BatchMergeService.test.ts +0 -534
  761. package/src/services/__tests__/WorktreeOrchestrator.test.ts +0 -259
  762. package/src/services/codingAgentCommandResolver.ts +0 -118
  763. package/src/services/codingAgentResolver.ts +0 -375
  764. package/src/services/dependency-installer.ts +0 -192
  765. package/src/services/git.service.ts +0 -115
  766. package/src/services/github.service.ts +0 -61
  767. package/src/services/worktree.service.ts +0 -66
  768. package/src/shared/codingAgentConstants.ts +0 -103
  769. package/src/trayicon.d.ts +0 -30
  770. package/src/types/api.ts +0 -256
  771. package/src/types/coding-agent.ts +0 -85
  772. package/src/types/profiles.ts +0 -64
  773. package/src/types/tools.ts +0 -269
  774. package/src/utils/__tests__/npmRegistry.test.ts +0 -250
  775. package/src/utils/__tests__/prompt.test.ts +0 -125
  776. package/src/utils/bun-runtime.ts +0 -29
  777. package/src/utils/coding-agent-colors.ts +0 -165
  778. package/src/utils/command.ts +0 -234
  779. package/src/utils/error-utils.ts +0 -133
  780. package/src/utils/npmRegistry.ts +0 -249
  781. package/src/utils/prompt.ts +0 -149
  782. package/src/utils/session/common.ts +0 -474
  783. package/src/utils/session/index.ts +0 -50
  784. package/src/utils/session/parsers/claude.ts +0 -283
  785. package/src/utils/session/parsers/codex.ts +0 -166
  786. package/src/utils/session/parsers/gemini.ts +0 -135
  787. package/src/utils/session/parsers/index.ts +0 -31
  788. package/src/utils/session/parsers/opencode.ts +0 -151
  789. package/src/utils/session/types.ts +0 -51
  790. package/src/utils/session.ts +0 -16
  791. package/src/utils/spinner.ts +0 -54
  792. package/src/utils/terminal.ts +0 -327
  793. package/src/utils/webui.ts +0 -43
  794. package/src/utils.test.ts +0 -43
  795. package/src/utils.ts +0 -93
  796. package/src/web/client/components.json +0 -21
  797. package/src/web/client/index.html +0 -12
  798. package/src/web/client/src/components/BranchGraph.tsx +0 -95
  799. package/src/web/client/src/components/CodingAgentLaunchModal.tsx +0 -570
  800. package/src/web/client/src/components/CustomCodingAgentForm.tsx +0 -386
  801. package/src/web/client/src/components/CustomCodingAgentList.tsx +0 -119
  802. package/src/web/client/src/components/EnvEditor.tsx +0 -188
  803. package/src/web/client/src/components/EnvironmentEditor.tsx +0 -97
  804. package/src/web/client/src/components/Terminal.tsx +0 -145
  805. package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +0 -193
  806. package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +0 -187
  807. package/src/web/client/src/components/branch-detail/TerminalPanel.tsx +0 -92
  808. package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +0 -332
  809. package/src/web/client/src/components/branch-detail/index.ts +0 -4
  810. package/src/web/client/src/components/common/BranchCard.tsx +0 -117
  811. package/src/web/client/src/components/common/MetricCard.tsx +0 -22
  812. package/src/web/client/src/components/common/PageHeader.tsx +0 -44
  813. package/src/web/client/src/components/common/SearchInput.tsx +0 -40
  814. package/src/web/client/src/components/common/StatusBadge.tsx +0 -37
  815. package/src/web/client/src/components/common/index.ts +0 -5
  816. package/src/web/client/src/components/graph/BranchDetailPanel.tsx +0 -152
  817. package/src/web/client/src/components/graph/BranchNode.tsx +0 -200
  818. package/src/web/client/src/components/graph/ClusterNode.tsx +0 -211
  819. package/src/web/client/src/components/graph/SynapticCanvas.tsx +0 -171
  820. package/src/web/client/src/components/graph/SynapticEdge.tsx +0 -311
  821. package/src/web/client/src/components/graph/graphUtils.ts +0 -265
  822. package/src/web/client/src/components/graph/index.ts +0 -10
  823. package/src/web/client/src/components/ui/alert.tsx +0 -63
  824. package/src/web/client/src/components/ui/badge.tsx +0 -44
  825. package/src/web/client/src/components/ui/button.tsx +0 -57
  826. package/src/web/client/src/components/ui/card.tsx +0 -82
  827. package/src/web/client/src/components/ui/index.ts +0 -32
  828. package/src/web/client/src/components/ui/input.tsx +0 -21
  829. package/src/web/client/src/components/ui/select.tsx +0 -156
  830. package/src/web/client/src/components/ui/table.tsx +0 -119
  831. package/src/web/client/src/hooks/useBranches.ts +0 -41
  832. package/src/web/client/src/hooks/useConfig.ts +0 -31
  833. package/src/web/client/src/hooks/useSessions.ts +0 -68
  834. package/src/web/client/src/hooks/useWorktrees.ts +0 -47
  835. package/src/web/client/src/index.css +0 -349
  836. package/src/web/client/src/lib/api.ts +0 -184
  837. package/src/web/client/src/lib/coding-agent-colors.ts +0 -149
  838. package/src/web/client/src/lib/utils.ts +0 -10
  839. package/src/web/client/src/lib/websocket.ts +0 -222
  840. package/src/web/client/src/main.tsx +0 -29
  841. package/src/web/client/src/pages/BranchDetailPage.tsx +0 -555
  842. package/src/web/client/src/pages/BranchListPage.tsx +0 -242
  843. package/src/web/client/src/pages/ConfigManagementPage.tsx +0 -248
  844. package/src/web/client/src/pages/ConfigPage.tsx +0 -368
  845. package/src/web/client/src/router.tsx +0 -27
  846. package/src/web/client/vite.config.ts +0 -28
  847. package/src/web/server/env/importer.ts +0 -62
  848. package/src/web/server/index.ts +0 -143
  849. package/src/web/server/pty/manager.ts +0 -443
  850. package/src/web/server/routes/branches.ts +0 -126
  851. package/src/web/server/routes/config.ts +0 -226
  852. package/src/web/server/routes/index.ts +0 -37
  853. package/src/web/server/routes/sessions.ts +0 -252
  854. package/src/web/server/routes/worktrees.ts +0 -108
  855. package/src/web/server/services/branches.ts +0 -387
  856. package/src/web/server/services/worktrees.ts +0 -93
  857. package/src/web/server/tray.ts +0 -136
  858. package/src/web/server/types.ts +0 -14
  859. package/src/web/server/websocket/handler.ts +0 -299
  860. package/src/worktree.ts +0 -1109
@@ -1,2145 +0,0 @@
1
- /** @jsxImportSource @opentui/solid */
2
- import { useKeyboard, useRenderer } from "@opentui/solid";
3
- import {
4
- batch,
5
- createEffect,
6
- createMemo,
7
- createSignal,
8
- onCleanup,
9
- onMount,
10
- } from "solid-js";
11
- import type {
12
- BranchItem,
13
- BranchInfo,
14
- CodingAgentId,
15
- CleanupStatus,
16
- InferenceLevel,
17
- SelectedBranchState,
18
- Statistics,
19
- WorktreeInfo as UIWorktreeInfo,
20
- } from "./types.js";
21
- import type { FormattedLogEntry } from "../../logging/formatter.js";
22
- import { BranchListScreen } from "./screens/solid/BranchListScreen.js";
23
- import { HelpOverlay } from "./components/solid/HelpOverlay.js";
24
- import {
25
- WizardController,
26
- type WizardResult,
27
- } from "./components/solid/WizardController.js";
28
- import {
29
- SelectorScreen,
30
- type SelectorItem,
31
- } from "./screens/solid/SelectorScreen.js";
32
- import { LogScreen } from "./screens/solid/LogScreen.js";
33
- import { LogDetailScreen } from "./screens/solid/LogDetailScreen.js";
34
- import { ErrorScreen } from "./screens/solid/ErrorScreen.js";
35
- import { LoadingIndicatorScreen } from "./screens/solid/LoadingIndicator.js";
36
- import { WorktreeCreateScreen } from "./screens/solid/WorktreeCreateScreen.js";
37
- import { InputScreen } from "./screens/solid/InputScreen.js";
38
- import { ConfirmScreen } from "./screens/solid/ConfirmScreen.js";
39
- import { useTerminalSize } from "./hooks/solid/useTerminalSize.js";
40
- import { EnvironmentScreen } from "./screens/solid/EnvironmentScreen.js";
41
- import { ProfileScreen } from "./screens/solid/ProfileScreen.js";
42
- import { ProfileEnvScreen } from "./screens/solid/ProfileEnvScreen.js";
43
- import { calculateStatistics } from "./utils/statisticsCalculator.js";
44
- import { formatBranchItems } from "./utils/branchFormatter.js";
45
- import { createLogger } from "../../logging/logger.js";
46
-
47
- const logger = createLogger({ category: "app" });
48
- import {
49
- getDefaultInferenceForModel,
50
- getDefaultModelOption,
51
- normalizeModelId,
52
- } from "./utils/modelOptions.js";
53
- import {
54
- resolveBaseBranchLabel,
55
- resolveBaseBranchRef,
56
- } from "./utils/baseBranch.js";
57
- import {
58
- getAllBranches,
59
- getCurrentBranch,
60
- getLocalBranches,
61
- getRepositoryRoot,
62
- deleteBranch,
63
- fetchAllRemotes,
64
- } from "../../git.js";
65
- import {
66
- isProtectedBranchName,
67
- getCleanupStatus,
68
- listAdditionalWorktrees,
69
- removeWorktree,
70
- repairWorktrees,
71
- type WorktreeInfo as WorktreeEntry,
72
- } from "../../worktree.js";
73
- import {
74
- getConfig,
75
- getLastToolUsageMap,
76
- loadSession,
77
- type ToolSessionEntry,
78
- } from "../../config/index.js";
79
- import {
80
- findLatestBranchSessionsByTool,
81
- refreshQuickStartEntries,
82
- } from "./utils/continueSession.js";
83
- import { getAllCodingAgents } from "../../config/tools.js";
84
- import {
85
- clearLogFiles,
86
- getTodayLogDate,
87
- readLogLinesForDate,
88
- resolveLogTarget,
89
- selectLogTargetByRecency,
90
- type LogTargetResolution,
91
- } from "../../logging/reader.js";
92
- import { parseLogLines } from "../../logging/formatter.js";
93
- import { copyToClipboard } from "./utils/clipboard.js";
94
- import { getPackageVersion } from "../../utils.js";
95
- import {
96
- createProfile,
97
- deleteProfile,
98
- loadProfiles,
99
- setActiveProfile,
100
- updateProfile,
101
- } from "../../config/profiles.js";
102
- import {
103
- isValidProfileName,
104
- type ProfilesConfig,
105
- } from "../../types/profiles.js";
106
- import { BRANCH_PREFIXES } from "../../config/constants.js";
107
- import { prefetchAgentVersions } from "./utils/versionCache.js";
108
- import { prefetchInstalledVersions } from "./utils/installedVersionCache.js";
109
- import { getBunxAgentIds } from "./utils/versionFetcher.js";
110
-
111
- export type ExecutionMode = "normal" | "continue" | "resume";
112
-
113
- const UNSAFE_SELECTION_MESSAGE = "Unsafe branch selected. Select anyway?";
114
- const SAFETY_PENDING_MESSAGE = "Safety check in progress. Select anyway?";
115
-
116
- export interface SelectionResult {
117
- branch: string;
118
- displayName: string;
119
- branchType: "local" | "remote";
120
- remoteBranch?: string;
121
- baseBranch?: string;
122
- isNewBranch?: boolean;
123
- tool: CodingAgentId;
124
- mode: ExecutionMode;
125
- skipPermissions: boolean;
126
- model?: string | null;
127
- inferenceLevel?: InferenceLevel;
128
- sessionId?: string | null;
129
- toolVersion?: string | null;
130
- }
131
-
132
- export type AppScreen =
133
- | "branch-list"
134
- | "tool-select"
135
- | "mode-select"
136
- | "skip-permissions"
137
- | "log-list"
138
- | "log-detail"
139
- | "profile"
140
- | "profile-env"
141
- | "profile-input"
142
- | "profile-confirm"
143
- | "profile-os-env"
144
- | "profile-error"
145
- | "worktree-create"
146
- | "loading"
147
- | "error";
148
-
149
- type ProfileInputMode = "create-profile" | "add-env" | "edit-env";
150
- type ProfileConfirmMode = "delete-profile" | "delete-env";
151
- type StatusColor = "cyan" | "green" | "yellow" | "red";
152
-
153
- interface CleanupIndicator {
154
- icon: string;
155
- isSpinning?: boolean;
156
- color?: StatusColor;
157
- }
158
-
159
- interface CleanupTask {
160
- branch: string;
161
- worktreePath: string | null;
162
- cleanupType: "worktree-and-branch" | "branch-only";
163
- isAccessible?: boolean;
164
- }
165
-
166
- export interface AppSolidProps {
167
- onExit?: (result?: SelectionResult) => void;
168
- loadingIndicatorDelay?: number;
169
- initialScreen?: AppScreen;
170
- version?: string | null;
171
- workingDirectory?: string;
172
- branches?: BranchItem[];
173
- stats?: Statistics;
174
- }
175
-
176
- const DEFAULT_SCREEN: AppScreen = "branch-list";
177
-
178
- const buildStats = (branches: BranchItem[]): Statistics =>
179
- calculateStatistics(branches);
180
-
181
- const applyCleanupStatus = (
182
- items: BranchItem[],
183
- statusByBranch: Map<string, CleanupStatus>,
184
- ): BranchItem[] =>
185
- items.map((branch) => {
186
- const status = statusByBranch.get(branch.name);
187
- if (!status) {
188
- return { ...branch, safeToCleanup: false, isUnmerged: false };
189
- }
190
- const safeToCleanup =
191
- status.hasUpstream && status.reasons.includes("no-diff-with-base");
192
- const isUnmerged = status.hasUpstream && status.hasUniqueCommits;
193
- const worktree = branch.worktree
194
- ? {
195
- ...branch.worktree,
196
- ...(status.hasUncommittedChanges !== undefined
197
- ? { hasUncommittedChanges: status.hasUncommittedChanges }
198
- : {}),
199
- }
200
- : undefined;
201
- const base: BranchItem = {
202
- ...branch,
203
- safeToCleanup,
204
- isUnmerged,
205
- hasUnpushedCommits: status.hasUnpushedCommits,
206
- };
207
- return worktree ? { ...base, worktree } : base;
208
- });
209
-
210
- const buildCleanupSafetyPending = (items: BranchItem[]): Set<string> => {
211
- const pending = new Set<string>();
212
- for (const branch of items) {
213
- if (branch.type === "remote") {
214
- continue;
215
- }
216
- if (branch.worktree) {
217
- pending.add(branch.name);
218
- continue;
219
- }
220
- if (isProtectedBranchName(branch.name)) {
221
- continue;
222
- }
223
- pending.add(branch.name);
224
- }
225
- return pending;
226
- };
227
-
228
- const toLocalBranchName = (name: string): string => {
229
- const segments = name.split("/");
230
- if (segments.length <= 1) {
231
- return name;
232
- }
233
- return segments.slice(1).join("/");
234
- };
235
-
236
- const toSelectedBranchState = (branch: BranchItem): SelectedBranchState => {
237
- const isRemote = branch.type === "remote";
238
- const baseName = isRemote ? toLocalBranchName(branch.name) : branch.name;
239
- return {
240
- name: baseName,
241
- displayName: branch.name,
242
- branchType: branch.type,
243
- branchCategory: branch.branchType,
244
- worktreePath: branch.worktree?.path ?? null,
245
- ...(isRemote ? { remoteBranch: branch.name } : {}),
246
- };
247
- };
248
-
249
- export function AppSolid(props: AppSolidProps) {
250
- const renderer = useRenderer();
251
- const terminal = useTerminalSize();
252
- let hasExited = false;
253
-
254
- const exitApp = (result?: SelectionResult) => {
255
- if (hasExited) return;
256
- hasExited = true;
257
- props.onExit?.(result);
258
- renderer.destroy();
259
- };
260
-
261
- const [currentScreen, setCurrentScreen] = createSignal<AppScreen>(
262
- props.initialScreen ?? DEFAULT_SCREEN,
263
- );
264
- const [screenStack, setScreenStack] = createSignal<AppScreen[]>([]);
265
- const [helpVisible, setHelpVisible] = createSignal(false);
266
- const [wizardVisible, setWizardVisible] = createSignal(false);
267
-
268
- const [branchItems, setBranchItems] = createSignal<BranchItem[]>(
269
- props.branches ?? [],
270
- );
271
- const [stats, setStats] = createSignal<Statistics>(
272
- props.stats ?? buildStats(props.branches ?? []),
273
- );
274
- const [loading, setLoading] = createSignal(!props.branches);
275
- const [error, setError] = createSignal<Error | null>(null);
276
-
277
- // ブランチ一覧のカーソル位置(グローバル管理で再マウント時もリセットされない)
278
- const [branchCursorPosition, setBranchCursorPosition] = createSignal(0);
279
-
280
- const [toolItems, setToolItems] = createSignal<SelectorItem[]>([]);
281
- const [toolError, setToolError] = createSignal<Error | null>(null);
282
-
283
- const [version, setVersion] = createSignal<string | null>(
284
- props.version ?? null,
285
- );
286
-
287
- const workingDirectory = createMemo(
288
- () => props.workingDirectory ?? process.cwd(),
289
- );
290
-
291
- const [selectedBranch, setSelectedBranch] =
292
- createSignal<SelectedBranchState | null>(null);
293
- const [selectedTool, setSelectedTool] = createSignal<CodingAgentId | null>(
294
- null,
295
- );
296
- const [selectedMode, setSelectedMode] = createSignal<ExecutionMode>("normal");
297
- const [selectedBranches, setSelectedBranches] = createSignal<string[]>([]);
298
- const [unsafeSelectionConfirmVisible, setUnsafeSelectionConfirmVisible] =
299
- createSignal(false);
300
- const [unsafeConfirmInputLocked, setUnsafeConfirmInputLocked] =
301
- createSignal(false);
302
- const [unsafeSelectionTarget, setUnsafeSelectionTarget] = createSignal<
303
- string | null
304
- >(null);
305
- const [unsafeSelectionMessage, setUnsafeSelectionMessage] = createSignal(
306
- UNSAFE_SELECTION_MESSAGE,
307
- );
308
- const [branchFooterMessage, setBranchFooterMessage] = createSignal<{
309
- text: string;
310
- isSpinning?: boolean;
311
- color?: StatusColor;
312
- } | null>(null);
313
- const [branchInputLocked, setBranchInputLocked] = createSignal(false);
314
- const [cleanupIndicators, setCleanupIndicators] = createSignal<
315
- Record<string, CleanupIndicator>
316
- >({});
317
- const [cleanupStatusByBranch, setCleanupStatusByBranch] = createSignal<
318
- Map<string, CleanupStatus>
319
- >(new Map());
320
- const [cleanupSafetyLoading, setCleanupSafetyLoading] = createSignal(false);
321
- const [cleanupSafetyPending, setCleanupSafetyPending] = createSignal<
322
- Set<string>
323
- >(new Set());
324
- const [isNewBranch, setIsNewBranch] = createSignal(false);
325
- const [newBranchBaseRef, setNewBranchBaseRef] = createSignal<string | null>(
326
- null,
327
- );
328
- const [creationSource, setCreationSource] =
329
- createSignal<SelectedBranchState | null>(null);
330
- const [createBranchName, setCreateBranchName] = createSignal("", {
331
- equals: false,
332
- });
333
- const [suppressCreateKey, setSuppressCreateKey] = createSignal<string | null>(
334
- null,
335
- );
336
- const [defaultBaseBranch, setDefaultBaseBranch] = createSignal("main");
337
-
338
- const suppressBranchInputOnce = () => {
339
- setUnsafeConfirmInputLocked(true);
340
- queueMicrotask(() => {
341
- setUnsafeConfirmInputLocked(false);
342
- });
343
- };
344
-
345
- const unsafeConfirmBoxWidth = createMemo(() => {
346
- const columns = terminal().columns || 80;
347
- return Math.max(1, Math.floor(columns * 0.6));
348
- });
349
- const unsafeConfirmContentWidth = createMemo(() =>
350
- Math.max(0, unsafeConfirmBoxWidth() - 4),
351
- );
352
-
353
- // セッション履歴(最終使用エージェントなど)
354
- const [sessionHistory, setSessionHistory] = createSignal<ToolSessionEntry[]>(
355
- [],
356
- );
357
- const [quickStartHistory, setQuickStartHistory] = createSignal<
358
- ToolSessionEntry[]
359
- >([]);
360
-
361
- // 選択中ブランチの履歴をフィルタリング
362
- const historyForBranch = createMemo(() => {
363
- const history = sessionHistory();
364
- const branch = selectedBranch();
365
- if (!branch) return [];
366
- return findLatestBranchSessionsByTool(
367
- history,
368
- branch.name,
369
- branch.worktreePath ?? null,
370
- );
371
- });
372
-
373
- createEffect(() => {
374
- setQuickStartHistory(historyForBranch());
375
- });
376
-
377
- createEffect(() => {
378
- const branch = selectedBranch();
379
- const baseHistory = historyForBranch();
380
- if (!wizardVisible() || !branch || baseHistory.length === 0) {
381
- return;
382
- }
383
-
384
- const worktreePath = branch.worktreePath ?? null;
385
- if (!worktreePath) {
386
- return;
387
- }
388
-
389
- const branchName = branch.name;
390
- void (async () => {
391
- const refreshed = await refreshQuickStartEntries(baseHistory, {
392
- branch: branchName,
393
- worktreePath,
394
- });
395
- if (selectedBranch()?.name !== branchName) {
396
- return;
397
- }
398
- setQuickStartHistory(refreshed);
399
- })();
400
- });
401
-
402
- const [logEntries, setLogEntries] = createSignal<FormattedLogEntry[]>([]);
403
- const [logLoading, setLogLoading] = createSignal(false);
404
- const [logError, setLogError] = createSignal<string | null>(null);
405
- const [logSelectedEntry, setLogSelectedEntry] =
406
- createSignal<FormattedLogEntry | null>(null);
407
- const [logSelectedDate, setLogSelectedDate] = createSignal<string | null>(
408
- getTodayLogDate(),
409
- );
410
- const [logNotification, setLogNotification] = createSignal<{
411
- message: string;
412
- tone: "success" | "error";
413
- } | null>(null);
414
- const [logTailEnabled, setLogTailEnabled] = createSignal(false);
415
- const [logTargetBranch, setLogTargetBranch] = createSignal<BranchItem | null>(
416
- null,
417
- );
418
-
419
- const [profileItems, setProfileItems] = createSignal<
420
- { name: string; displayName?: string; isActive?: boolean }[]
421
- >([]);
422
- const [activeProfile, setActiveProfileName] = createSignal<string | null>(
423
- null,
424
- );
425
- const [profileError, setProfileError] = createSignal<Error | null>(null);
426
- const [profilesConfig, setProfilesConfig] =
427
- createSignal<ProfilesConfig | null>(null);
428
- const [profileActionError, setProfileActionError] =
429
- createSignal<Error | null>(null);
430
- const [profileActionHint, setProfileActionHint] = createSignal<string | null>(
431
- null,
432
- );
433
- const [selectedProfileName, setSelectedProfileName] = createSignal<
434
- string | null
435
- >(null);
436
- const [profileInputValue, setProfileInputValue] = createSignal("", {
437
- equals: false,
438
- });
439
- const [profileInputMode, setProfileInputMode] =
440
- createSignal<ProfileInputMode>("create-profile");
441
- const [profileInputSuppressKey, setProfileInputSuppressKey] = createSignal<
442
- string | null
443
- >(null);
444
- const [profileEnvKey, setProfileEnvKey] = createSignal<string | null>(null);
445
- const [profileConfirmMode, setProfileConfirmMode] =
446
- createSignal<ProfileConfirmMode>("delete-profile");
447
-
448
- const [logEffectiveTarget, setLogEffectiveTarget] =
449
- createSignal<LogTargetResolution | null>(null);
450
- const logPrimaryTarget = createMemo(() =>
451
- resolveLogTarget(logTargetBranch(), workingDirectory()),
452
- );
453
- const logFallbackTarget = createMemo(() =>
454
- resolveLogTarget(null, workingDirectory()),
455
- );
456
- const logActiveTarget = createMemo(
457
- () => logEffectiveTarget() ?? logPrimaryTarget(),
458
- );
459
- const logBranchLabel = createMemo(() => logTargetBranch()?.label ?? null);
460
- const logSourceLabel = createMemo(() => {
461
- const target = logActiveTarget();
462
- if (!target.sourcePath) {
463
- return "(none)";
464
- }
465
- if (
466
- target.reason === "current-working-directory" ||
467
- target.reason === "working-directory"
468
- ) {
469
- return `${target.sourcePath} (cwd)`;
470
- }
471
- if (target.reason === "working-directory-fallback") {
472
- return `${target.sourcePath} (cwd fallback)`;
473
- }
474
- if (target.reason === "worktree-inaccessible") {
475
- return `${target.sourcePath} (inaccessible)`;
476
- }
477
- return target.sourcePath;
478
- });
479
- createEffect(() => {
480
- logPrimaryTarget();
481
- setLogEffectiveTarget(null);
482
- });
483
- const selectedProfileConfig = createMemo(() => {
484
- const name = selectedProfileName();
485
- const config = profilesConfig();
486
- if (!name || !config?.profiles?.[name]) {
487
- return null;
488
- }
489
- return { name, profile: config.profiles[name] };
490
- });
491
- const profileEnvVariables = createMemo(() => {
492
- const entry = selectedProfileConfig();
493
- if (!entry) {
494
- return [];
495
- }
496
- return Object.entries(entry.profile.env ?? {})
497
- .map(([key, value]) => ({ key, value }))
498
- .sort((a, b) => a.key.localeCompare(b.key));
499
- });
500
- const osEnvVariables = createMemo(() =>
501
- Object.entries(process.env)
502
- .filter(([, value]) => typeof value === "string")
503
- .map(([key, value]) => ({ key, value: String(value) }))
504
- .sort((a, b) => a.key.localeCompare(b.key)),
505
- );
506
-
507
- let cleanupSafetyRequestId = 0;
508
- const refreshCleanupSafety = async () => {
509
- const requestId = ++cleanupSafetyRequestId;
510
- const pendingBranches = buildCleanupSafetyPending(branchItems());
511
- setCleanupSafetyPending(pendingBranches);
512
- setCleanupSafetyLoading(pendingBranches.size > 0);
513
- const statusByBranch = new Map<string, CleanupStatus>();
514
- const applyProgress = (status: CleanupStatus) => {
515
- if (requestId !== cleanupSafetyRequestId) {
516
- return;
517
- }
518
- statusByBranch.set(status.branch, status);
519
- batch(() => {
520
- setCleanupStatusByBranch(new Map(statusByBranch));
521
- setBranchItems((items) => applyCleanupStatus(items, statusByBranch));
522
- setCleanupSafetyPending((prev) => {
523
- if (!prev.has(status.branch)) {
524
- return prev;
525
- }
526
- const next = new Set(prev);
527
- next.delete(status.branch);
528
- return next;
529
- });
530
- });
531
- };
532
- try {
533
- const cleanupStatuses = await getCleanupStatus({
534
- onProgress: applyProgress,
535
- });
536
- if (requestId !== cleanupSafetyRequestId) {
537
- return;
538
- }
539
- if (cleanupStatuses.length > statusByBranch.size) {
540
- cleanupStatuses.forEach((status) => {
541
- if (!statusByBranch.has(status.branch)) {
542
- applyProgress(status);
543
- }
544
- });
545
- }
546
- } catch (err) {
547
- if (requestId !== cleanupSafetyRequestId) {
548
- return;
549
- }
550
- logger.warn({ err }, "Failed to refresh cleanup safety indicators");
551
- const empty = new Map<string, CleanupStatus>();
552
- batch(() => {
553
- setCleanupStatusByBranch(empty);
554
- setBranchItems((items) => applyCleanupStatus(items, empty));
555
- });
556
- } finally {
557
- if (requestId === cleanupSafetyRequestId) {
558
- setCleanupSafetyLoading(false);
559
- setCleanupSafetyPending(new Set<string>());
560
- }
561
- }
562
- };
563
-
564
- let logNotificationTimer: ReturnType<typeof setTimeout> | null = null;
565
- let logTailTimer: ReturnType<typeof setInterval> | null = null;
566
- let branchFooterTimer: ReturnType<typeof setTimeout> | null = null;
567
- const BRANCH_LOAD_TIMEOUT_MS = 3000;
568
- const BRANCH_FULL_LOAD_TIMEOUT_MS = 8000;
569
-
570
- const isHelpKey = (key: {
571
- name: string;
572
- sequence: string;
573
- ctrl: boolean;
574
- meta: boolean;
575
- super?: boolean;
576
- hyper?: boolean;
577
- option?: boolean;
578
- }) => {
579
- if (key.ctrl || key.meta || key.super || key.hyper || key.option) {
580
- return false;
581
- }
582
- return key.name === "h" || key.sequence === "h" || key.sequence === "?";
583
- };
584
-
585
- useKeyboard((key) => {
586
- if (key.repeated) {
587
- return;
588
- }
589
-
590
- if (helpVisible()) {
591
- if (key.name === "escape" || isHelpKey(key)) {
592
- setHelpVisible(false);
593
- }
594
- return;
595
- }
596
-
597
- if (isHelpKey(key)) {
598
- setHelpVisible(true);
599
- }
600
- });
601
-
602
- const navigateTo = (screen: AppScreen) => {
603
- setScreenStack((prev) => [...prev, currentScreen()]);
604
- setCurrentScreen(screen);
605
- };
606
-
607
- const goBack = () => {
608
- const stack = screenStack();
609
- if (stack.length === 0) {
610
- return;
611
- }
612
- const previous = stack[stack.length - 1] ?? DEFAULT_SCREEN;
613
- setScreenStack(stack.slice(0, -1));
614
-
615
- // branch-list に戻る場合は選択状態をリセット
616
- if (previous === "branch-list") {
617
- setSelectedBranch(null);
618
- setSelectedTool(null);
619
- setSelectedMode("normal");
620
- setIsNewBranch(false);
621
- setNewBranchBaseRef(null);
622
- setCreationSource(null);
623
- }
624
-
625
- setCurrentScreen(previous);
626
- };
627
-
628
- const openProfileError = (err: unknown, hint: string) => {
629
- setProfileActionError(err instanceof Error ? err : new Error(String(err)));
630
- setProfileActionHint(hint);
631
- navigateTo("profile-error");
632
- };
633
-
634
- const showLogNotification = (message: string, tone: "success" | "error") => {
635
- setLogNotification({ message, tone });
636
- if (logNotificationTimer) {
637
- clearTimeout(logNotificationTimer);
638
- }
639
- logNotificationTimer = setTimeout(() => {
640
- setLogNotification(null);
641
- }, 2000);
642
- };
643
-
644
- const loadLogEntries = async (date: string | null) => {
645
- const targetDate = date ?? getTodayLogDate();
646
- setLogLoading(true);
647
- setLogError(null);
648
- try {
649
- const primaryTarget = logPrimaryTarget();
650
- const fallbackTarget = logFallbackTarget();
651
- const target = await selectLogTargetByRecency(
652
- primaryTarget,
653
- fallbackTarget,
654
- );
655
- setLogEffectiveTarget(target);
656
- if (!target.logDir) {
657
- setLogEntries([]);
658
- setLogSelectedDate(targetDate);
659
- return;
660
- }
661
- const result = await readLogLinesForDate(target.logDir, targetDate);
662
- if (!result) {
663
- setLogEntries([]);
664
- setLogSelectedDate(targetDate);
665
- return;
666
- }
667
- setLogSelectedDate(result.date);
668
- const parsed = parseLogLines(result.lines, { limit: 100 });
669
- setLogEntries(parsed);
670
- } catch (err) {
671
- setLogEntries([]);
672
- setLogError(err instanceof Error ? err.message : "Failed to load logs");
673
- } finally {
674
- setLogLoading(false);
675
- }
676
- };
677
-
678
- const clearLogTailTimer = () => {
679
- if (logTailTimer) {
680
- clearInterval(logTailTimer);
681
- logTailTimer = null;
682
- }
683
- };
684
-
685
- const toggleLogTail = () => {
686
- setLogTailEnabled((prev) => !prev);
687
- };
688
-
689
- const resetLogFiles = async () => {
690
- const target = logActiveTarget();
691
- if (!target.logDir) {
692
- showLogNotification("No logs available.", "error");
693
- return;
694
- }
695
- try {
696
- const cleared = await clearLogFiles(target.logDir);
697
- if (cleared === 0) {
698
- showLogNotification("No logs to reset.", "error");
699
- } else {
700
- showLogNotification("Logs cleared.", "success");
701
- }
702
- await loadLogEntries(logSelectedDate());
703
- } catch (err) {
704
- logger.warn({ err }, "Failed to clear log files");
705
- showLogNotification("Failed to reset logs.", "error");
706
- }
707
- };
708
-
709
- const refreshBranches = async () => {
710
- setLoading(true);
711
- setError(null);
712
- try {
713
- const repoRoot = await getRepositoryRoot();
714
- const worktreesPromise = listAdditionalWorktrees();
715
- const localBranchesPromise = getLocalBranches(repoRoot);
716
- const currentBranchPromise = getCurrentBranch(repoRoot);
717
- const lastToolUsagePromise = getLastToolUsageMap(repoRoot);
718
-
719
- const [localBranches, currentBranch, worktrees, lastToolUsageMap] =
720
- await Promise.all([
721
- withTimeout(localBranchesPromise, BRANCH_LOAD_TIMEOUT_MS).catch(
722
- () => [],
723
- ),
724
- withTimeout(currentBranchPromise, BRANCH_LOAD_TIMEOUT_MS).catch(
725
- () => null,
726
- ),
727
- withTimeout(worktreesPromise, BRANCH_LOAD_TIMEOUT_MS).catch(() => []),
728
- withTimeout(lastToolUsagePromise, BRANCH_LOAD_TIMEOUT_MS).catch(
729
- () => new Map<string, ToolSessionEntry>(),
730
- ),
731
- ]);
732
-
733
- if (currentBranch) {
734
- localBranches.forEach((branch) => {
735
- if (branch.name === currentBranch) {
736
- branch.isCurrent = true;
737
- }
738
- });
739
- }
740
-
741
- const initial = buildBranchList(
742
- localBranches,
743
- worktrees,
744
- lastToolUsageMap,
745
- );
746
- const initialItems = applyCleanupStatus(
747
- initial.items,
748
- cleanupStatusByBranch(),
749
- );
750
- setBranchItems(initialItems);
751
- setStats(buildStats(initialItems));
752
- void refreshCleanupSafety();
753
-
754
- void (async () => {
755
- // Fetch remote updates with --prune to remove stale tracking refs
756
- await withTimeout(
757
- fetchAllRemotes({ cwd: repoRoot }),
758
- BRANCH_FULL_LOAD_TIMEOUT_MS,
759
- ).catch(() => {
760
- // Ignore fetch errors (e.g., network issues)
761
- });
762
-
763
- const [branches, latestWorktrees] = await Promise.all([
764
- withTimeout(
765
- getAllBranches(repoRoot),
766
- BRANCH_FULL_LOAD_TIMEOUT_MS,
767
- ).catch(() => localBranches),
768
- withTimeout(
769
- listAdditionalWorktrees(),
770
- BRANCH_FULL_LOAD_TIMEOUT_MS,
771
- ).catch(() => worktrees),
772
- ]);
773
-
774
- const full = buildBranchList(
775
- branches,
776
- latestWorktrees,
777
- lastToolUsageMap,
778
- );
779
- const fullItems = applyCleanupStatus(
780
- full.items,
781
- cleanupStatusByBranch(),
782
- );
783
- setBranchItems(fullItems);
784
- setStats(buildStats(fullItems));
785
- })();
786
- } catch (err) {
787
- setError(err instanceof Error ? err : new Error(String(err)));
788
- } finally {
789
- setLoading(false);
790
- }
791
- };
792
-
793
- const refreshProfiles = async () => {
794
- try {
795
- const config = await loadProfiles();
796
- setProfilesConfig(config);
797
- const items = Object.entries(config.profiles ?? {}).map(
798
- ([name, profile]) => ({
799
- name,
800
- displayName: profile.displayName,
801
- isActive: config.activeProfile === name,
802
- }),
803
- );
804
- items.sort((a, b) => a.name.localeCompare(b.name));
805
- setProfileItems(items);
806
- setActiveProfileName(config.activeProfile ?? null);
807
- setProfileError(null);
808
- } catch (err) {
809
- setProfilesConfig(null);
810
- setProfileItems([]);
811
- setActiveProfileName(null);
812
- setProfileError(err instanceof Error ? err : new Error(String(err)));
813
- }
814
- };
815
-
816
- createEffect(() => {
817
- if (props.branches) {
818
- const statusByBranch = cleanupStatusByBranch();
819
- const nextItems = applyCleanupStatus(props.branches, statusByBranch);
820
- setBranchItems(nextItems);
821
- setStats(props.stats ?? buildStats(nextItems));
822
- setLoading(false);
823
- }
824
- });
825
-
826
- onMount(() => {
827
- if (!props.branches) {
828
- void refreshBranches();
829
- }
830
- });
831
-
832
- onMount(() => {
833
- if (props.branches) {
834
- void refreshCleanupSafety();
835
- }
836
- });
837
-
838
- onMount(() => {
839
- if (props.version === undefined) {
840
- void getPackageVersion()
841
- .then((value) => setVersion(value ?? null))
842
- .catch(() => setVersion(null));
843
- }
844
- });
845
-
846
- onMount(() => {
847
- void refreshProfiles();
848
- });
849
-
850
- onMount(() => {
851
- void getConfig()
852
- .then((config) => setDefaultBaseBranch(config.defaultBaseBranch))
853
- .catch(() => setDefaultBaseBranch("main"));
854
- });
855
-
856
- // セッション履歴をロード(最終使用エージェントなど)
857
- onMount(() => {
858
- void getRepositoryRoot()
859
- .then((repoRoot) => loadSession(repoRoot))
860
- .then((session) => {
861
- if (session?.history) {
862
- setSessionHistory(session.history);
863
- }
864
- })
865
- .catch(() => setSessionHistory([]));
866
- });
867
-
868
- onMount(() => {
869
- void getAllCodingAgents()
870
- .then((agents) => {
871
- setToolItems(
872
- agents.map((agent) => ({
873
- label: agent.displayName,
874
- value: agent.id,
875
- })),
876
- );
877
- })
878
- .catch((err) => {
879
- setToolItems([]);
880
- setToolError(err instanceof Error ? err : new Error(String(err)));
881
- });
882
- });
883
-
884
- // FR-028: Prefetch npm versions for all bunx-type agents at startup (background)
885
- onMount(() => {
886
- const bunxAgentIds = getBunxAgentIds();
887
- void prefetchAgentVersions(bunxAgentIds).catch(() => {
888
- // Silently handle errors - cache will return null and UI will show "latest" only
889
- });
890
- // FR-017: Prefetch installed versions for all builtin agents at startup
891
- void prefetchInstalledVersions(bunxAgentIds).catch(() => {
892
- // Silently handle errors - cache will return null and UI won't show "installed"
893
- });
894
- });
895
-
896
- createEffect(() => {
897
- if (currentScreen() === "log-list") {
898
- logPrimaryTarget();
899
- void loadLogEntries(logSelectedDate());
900
- }
901
- });
902
-
903
- createEffect(() => {
904
- if (currentScreen() !== "log-list" || !logTailEnabled()) {
905
- clearLogTailTimer();
906
- return;
907
- }
908
- clearLogTailTimer();
909
- logTailTimer = setInterval(() => {
910
- void loadLogEntries(logSelectedDate());
911
- }, 1500);
912
- });
913
-
914
- onCleanup(() => {
915
- if (logNotificationTimer) {
916
- clearTimeout(logNotificationTimer);
917
- }
918
- clearLogTailTimer();
919
- if (branchFooterTimer) {
920
- clearTimeout(branchFooterTimer);
921
- }
922
- });
923
-
924
- const showBranchFooterMessage = (
925
- text: string,
926
- color: StatusColor,
927
- options?: { spinning?: boolean; timeoutMs?: number },
928
- ) => {
929
- if (branchFooterTimer) {
930
- clearTimeout(branchFooterTimer);
931
- branchFooterTimer = null;
932
- }
933
- setBranchFooterMessage({
934
- text,
935
- color,
936
- ...(options?.spinning ? { isSpinning: true } : {}),
937
- });
938
- const timeout = options?.timeoutMs ?? 2000;
939
- if (timeout > 0) {
940
- branchFooterTimer = setTimeout(() => {
941
- setBranchFooterMessage(null);
942
- }, timeout);
943
- }
944
- };
945
-
946
- const setCleanupIndicator = (
947
- branchName: string,
948
- indicator: CleanupIndicator | null,
949
- ) => {
950
- setCleanupIndicators((prev) => {
951
- const next = { ...prev };
952
- if (indicator) {
953
- next[branchName] = indicator;
954
- } else {
955
- delete next[branchName];
956
- }
957
- return next;
958
- });
959
- };
960
-
961
- const handleBranchSelect = (branch: BranchItem) => {
962
- setSelectedBranch(toSelectedBranchState(branch));
963
- setIsNewBranch(false);
964
- setNewBranchBaseRef(null);
965
- setCreationSource(null);
966
- setSelectedTool(null);
967
- setSelectedMode("normal");
968
- // FR-044: ウィザードポップアップをレイヤー表示
969
- setWizardVisible(true);
970
- };
971
-
972
- const handleQuickCreate = (branch: BranchItem | null) => {
973
- // 選択中のブランチをベースにウィザードを開始
974
- if (branch) {
975
- setSelectedBranch(toSelectedBranchState(branch));
976
- }
977
- setCreationSource(branch ? toSelectedBranchState(branch) : null);
978
- setCreateBranchName("");
979
- setSuppressCreateKey("n");
980
- // FR-044: ウィザードポップアップをレイヤー表示(アクション選択から開始)
981
- setWizardVisible(true);
982
- };
983
-
984
- // FR-049: Escapeキーでウィザードをキャンセル
985
- const handleWizardClose = () => {
986
- setWizardVisible(false);
987
- };
988
-
989
- // ウィザード完了時の処理
990
- const handleWizardComplete = (result: WizardResult) => {
991
- setWizardVisible(false);
992
-
993
- const branch = selectedBranch();
994
- if (!branch) {
995
- return;
996
- }
997
-
998
- // 新規ブランチ作成の場合、ブランチ名を設定
999
- const isCreatingNew = result.isNewBranch ?? false;
1000
- const finalBranchName = result.branchName
1001
- ? `${result.branchType ?? ""}${result.branchName}`
1002
- : branch.name;
1003
-
1004
- // 新規作成時は選択中のブランチがベースとなる
1005
- const baseBranchRef = isCreatingNew ? branch.name : null;
1006
- const normalizedModel = normalizeModelId(result.tool, result.model);
1007
-
1008
- exitApp({
1009
- branch: finalBranchName,
1010
- displayName: branch.displayName,
1011
- branchType: branch.branchType,
1012
- ...(branch.remoteBranch ? { remoteBranch: branch.remoteBranch } : {}),
1013
- ...(isCreatingNew
1014
- ? {
1015
- isNewBranch: true,
1016
- ...(baseBranchRef ? { baseBranch: baseBranchRef } : {}),
1017
- }
1018
- : {}),
1019
- tool: result.tool,
1020
- mode: result.mode,
1021
- skipPermissions: result.skipPermissions,
1022
- ...(normalizedModel !== undefined ? { model: normalizedModel } : {}),
1023
- ...(result.reasoningLevel !== undefined
1024
- ? { inferenceLevel: result.reasoningLevel }
1025
- : {}),
1026
- ...(result.toolVersion !== undefined
1027
- ? { toolVersion: result.toolVersion }
1028
- : {}),
1029
- });
1030
- };
1031
-
1032
- // FR-010: クイックスタートからのResume(前回設定で続きから)
1033
- const handleWizardResume = (entry: ToolSessionEntry) => {
1034
- if (!entry.sessionId) {
1035
- handleWizardStartNew(entry);
1036
- return;
1037
- }
1038
-
1039
- setWizardVisible(false);
1040
-
1041
- const branch = selectedBranch();
1042
- if (!branch) {
1043
- return;
1044
- }
1045
-
1046
- const normalizedModel = normalizeModelId(
1047
- entry.toolId as CodingAgentId,
1048
- entry.model ?? undefined,
1049
- );
1050
-
1051
- exitApp({
1052
- branch: branch.name,
1053
- displayName: branch.displayName,
1054
- branchType: branch.branchType,
1055
- ...(branch.remoteBranch ? { remoteBranch: branch.remoteBranch } : {}),
1056
- tool: entry.toolId as CodingAgentId,
1057
- mode: "continue",
1058
- skipPermissions: entry.skipPermissions ?? false,
1059
- ...(normalizedModel !== undefined ? { model: normalizedModel } : {}),
1060
- ...(entry.reasoningLevel
1061
- ? { inferenceLevel: entry.reasoningLevel as InferenceLevel }
1062
- : {}),
1063
- ...(entry.sessionId ? { sessionId: entry.sessionId } : {}),
1064
- ...(entry.toolVersion !== undefined
1065
- ? { toolVersion: entry.toolVersion }
1066
- : {}),
1067
- });
1068
- };
1069
-
1070
- // FR-010: クイックスタートからのStartNew(前回設定で新規)
1071
- const handleWizardStartNew = (entry: ToolSessionEntry) => {
1072
- setWizardVisible(false);
1073
-
1074
- const branch = selectedBranch();
1075
- if (!branch) {
1076
- return;
1077
- }
1078
-
1079
- const normalizedModel = normalizeModelId(
1080
- entry.toolId as CodingAgentId,
1081
- entry.model ?? undefined,
1082
- );
1083
-
1084
- exitApp({
1085
- branch: branch.name,
1086
- displayName: branch.displayName,
1087
- branchType: branch.branchType,
1088
- ...(branch.remoteBranch ? { remoteBranch: branch.remoteBranch } : {}),
1089
- tool: entry.toolId as CodingAgentId,
1090
- mode: "normal",
1091
- skipPermissions: entry.skipPermissions ?? false,
1092
- ...(normalizedModel !== undefined ? { model: normalizedModel } : {}),
1093
- ...(entry.reasoningLevel
1094
- ? { inferenceLevel: entry.reasoningLevel as InferenceLevel }
1095
- : {}),
1096
- ...(entry.toolVersion !== undefined
1097
- ? { toolVersion: entry.toolVersion }
1098
- : {}),
1099
- });
1100
- };
1101
-
1102
- const buildSkipNotice = (
1103
- skip: {
1104
- unsafe: number;
1105
- protected: number;
1106
- remote: number;
1107
- current: number;
1108
- },
1109
- unsafeLabel: string,
1110
- ): string | null => {
1111
- const parts: string[] = [];
1112
- if (skip.unsafe > 0) {
1113
- parts.push(`${skip.unsafe} ${unsafeLabel}`);
1114
- }
1115
- if (skip.protected > 0) {
1116
- parts.push(`${skip.protected} protected`);
1117
- }
1118
- if (skip.remote > 0) {
1119
- parts.push(`${skip.remote} remote-only`);
1120
- }
1121
- if (skip.current > 0) {
1122
- parts.push(`${skip.current} current`);
1123
- }
1124
- if (parts.length === 0) {
1125
- return null;
1126
- }
1127
- return `Skipped branches: ${parts.join(", ")}.`;
1128
- };
1129
-
1130
- const handleCleanupCommand = async () => {
1131
- if (branchInputLocked()) {
1132
- return;
1133
- }
1134
-
1135
- const selection = selectedBranches();
1136
- const hasSelection = selection.length > 0;
1137
- const skipCounts = {
1138
- unsafe: 0,
1139
- protected: 0,
1140
- remote: 0,
1141
- current: 0,
1142
- };
1143
-
1144
- setBranchInputLocked(true);
1145
- setCleanupIndicators({});
1146
- showBranchFooterMessage(
1147
- hasSelection
1148
- ? "Preparing cleanup..."
1149
- : "Scanning for cleanup candidates...",
1150
- "yellow",
1151
- { spinning: true, timeoutMs: 0 },
1152
- );
1153
-
1154
- try {
1155
- const tasks: CleanupTask[] = [];
1156
-
1157
- if (hasSelection) {
1158
- const branchMap = new Map(
1159
- branchItems().map((branch) => [branch.name, branch]),
1160
- );
1161
- for (const branchName of selection) {
1162
- const branch = branchMap.get(branchName);
1163
- if (!branch) {
1164
- continue;
1165
- }
1166
- if (branch.type === "remote") {
1167
- skipCounts.remote += 1;
1168
- continue;
1169
- }
1170
- if (branch.isCurrent) {
1171
- skipCounts.current += 1;
1172
- continue;
1173
- }
1174
- const worktreePath = branch.worktree?.path ?? null;
1175
- const cleanupType: CleanupTask["cleanupType"] = worktreePath
1176
- ? "worktree-and-branch"
1177
- : "branch-only";
1178
- const baseTask = {
1179
- branch: branch.name,
1180
- worktreePath,
1181
- cleanupType,
1182
- };
1183
- const isAccessible = branch.worktree?.isAccessible;
1184
- tasks.push(
1185
- isAccessible === undefined
1186
- ? baseTask
1187
- : { ...baseTask, isAccessible },
1188
- );
1189
- }
1190
- } else {
1191
- // FR-028: 選択が0件の場合は警告を表示して処理をスキップ
1192
- setBranchInputLocked(false);
1193
- showBranchFooterMessage("No branches selected.", "yellow");
1194
- return;
1195
- }
1196
-
1197
- const skipNotice = buildSkipNotice(
1198
- skipCounts,
1199
- hasSelection
1200
- ? "unsafe (uncommitted/unpushed, unmerged, or missing upstream)"
1201
- : "with uncommitted or unpushed changes",
1202
- );
1203
-
1204
- if (tasks.length === 0) {
1205
- const baseMessage = hasSelection
1206
- ? "No eligible branches selected for cleanup."
1207
- : "No cleanup candidates found.";
1208
- showBranchFooterMessage(
1209
- skipNotice ? `${baseMessage} ${skipNotice}` : baseMessage,
1210
- "yellow",
1211
- );
1212
- return;
1213
- }
1214
-
1215
- setCleanupIndicators(() => {
1216
- const next: Record<string, CleanupIndicator> = {};
1217
- tasks.forEach((task) => {
1218
- next[task.branch] = {
1219
- icon: "-",
1220
- isSpinning: true,
1221
- color: "yellow",
1222
- };
1223
- });
1224
- return next;
1225
- });
1226
-
1227
- showBranchFooterMessage(
1228
- `Cleaning up ${tasks.length} branch(es)...`,
1229
- "yellow",
1230
- { spinning: true, timeoutMs: 0 },
1231
- );
1232
-
1233
- let successCount = 0;
1234
- let failedCount = 0;
1235
-
1236
- for (const task of tasks) {
1237
- try {
1238
- if (task.cleanupType === "worktree-and-branch" && task.worktreePath) {
1239
- await removeWorktree(
1240
- task.worktreePath,
1241
- task.isAccessible === false,
1242
- );
1243
- }
1244
- await deleteBranch(task.branch, true);
1245
- setCleanupIndicator(task.branch, { icon: "v", color: "green" });
1246
- successCount += 1;
1247
- } catch {
1248
- setCleanupIndicator(task.branch, { icon: "x", color: "red" });
1249
- failedCount += 1;
1250
- }
1251
- }
1252
-
1253
- setSelectedBranches([]);
1254
- await refreshBranches();
1255
-
1256
- const skippedTotal =
1257
- skipCounts.unsafe +
1258
- skipCounts.protected +
1259
- skipCounts.remote +
1260
- skipCounts.current;
1261
- const summaryParts = [`${successCount} cleaned`];
1262
- if (failedCount > 0) {
1263
- summaryParts.push(`${failedCount} failed`);
1264
- }
1265
- if (skippedTotal > 0) {
1266
- summaryParts.push(`${skippedTotal} skipped`);
1267
- }
1268
- const summary = `Cleanup finished: ${summaryParts.join(", ")}.`;
1269
- const message = skipNotice ? `${summary} ${skipNotice}` : summary;
1270
- showBranchFooterMessage(message, failedCount > 0 ? "red" : "green");
1271
- } catch (err) {
1272
- const errorMessage = err instanceof Error ? err.message : String(err);
1273
- showBranchFooterMessage(`Cleanup failed: ${errorMessage}`, "red");
1274
- } finally {
1275
- setBranchInputLocked(false);
1276
- }
1277
- };
1278
-
1279
- const handleRepairWorktrees = async () => {
1280
- if (branchInputLocked()) {
1281
- return;
1282
- }
1283
-
1284
- // FR-002/FR-007: 選択済みブランチのみを対象とする
1285
- const selection = selectedBranches();
1286
- if (selection.length === 0) {
1287
- showBranchFooterMessage("No branches selected.", "yellow");
1288
- return;
1289
- }
1290
-
1291
- // 選択されたローカルブランチのうち、Worktreeを持つものを修復対象とする
1292
- const selectionSet = new Set(selection);
1293
- const targets = branchItems()
1294
- .filter(
1295
- (branch) =>
1296
- selectionSet.has(branch.name) &&
1297
- branch.type !== "remote" &&
1298
- branch.worktreeStatus !== undefined,
1299
- )
1300
- .map((branch) => branch.name);
1301
-
1302
- if (targets.length === 0) {
1303
- showBranchFooterMessage("No worktrees to repair.", "yellow");
1304
- return;
1305
- }
1306
-
1307
- setBranchInputLocked(true);
1308
- showBranchFooterMessage("Repairing worktrees...", "yellow", {
1309
- spinning: true,
1310
- timeoutMs: 0,
1311
- });
1312
- try {
1313
- const result = await repairWorktrees(targets);
1314
- await refreshBranches();
1315
-
1316
- // エラー詳細をログに出力
1317
- if (result.failedCount > 0) {
1318
- logger.error(
1319
- { failures: result.failures, targets },
1320
- "Worktree repair failed for some branches",
1321
- );
1322
- }
1323
-
1324
- const message =
1325
- result.failedCount > 0
1326
- ? `Repair finished: ${result.repairedCount} repaired, ${result.failedCount} failed.`
1327
- : result.repairedCount > 0
1328
- ? `Repaired ${result.repairedCount} worktree(s).`
1329
- : "No worktrees repaired.";
1330
- showBranchFooterMessage(
1331
- message,
1332
- result.failedCount > 0 ? "red" : "green",
1333
- );
1334
- } catch (err) {
1335
- const errorMessage = err instanceof Error ? err.message : String(err);
1336
- logger.error({ error: err, targets }, "Worktree repair threw an error");
1337
- showBranchFooterMessage(`Repair failed: ${errorMessage}`, "red");
1338
- } finally {
1339
- setBranchInputLocked(false);
1340
- }
1341
- };
1342
-
1343
- const openProfileCreate = () => {
1344
- setProfileInputMode("create-profile");
1345
- setProfileInputValue("");
1346
- setProfileEnvKey(null);
1347
- setProfileInputSuppressKey("n");
1348
- navigateTo("profile-input");
1349
- };
1350
-
1351
- const openProfileDelete = (profile: { name: string }) => {
1352
- setSelectedProfileName(profile.name);
1353
- setProfileConfirmMode("delete-profile");
1354
- navigateTo("profile-confirm");
1355
- };
1356
-
1357
- const openProfileEnv = (profile: { name: string }) => {
1358
- setSelectedProfileName(profile.name);
1359
- navigateTo("profile-env");
1360
- };
1361
-
1362
- const openProfileEnvAdd = () => {
1363
- setProfileInputMode("add-env");
1364
- setProfileInputValue("");
1365
- setProfileEnvKey(null);
1366
- setProfileInputSuppressKey("a");
1367
- navigateTo("profile-input");
1368
- };
1369
-
1370
- const openProfileEnvEdit = (variable: { key: string; value: string }) => {
1371
- setProfileInputMode("edit-env");
1372
- setProfileEnvKey(variable.key);
1373
- setProfileInputValue(variable.value);
1374
- setProfileInputSuppressKey("e");
1375
- navigateTo("profile-input");
1376
- };
1377
-
1378
- const openProfileEnvDelete = (variable: { key: string }) => {
1379
- setProfileConfirmMode("delete-env");
1380
- setProfileEnvKey(variable.key);
1381
- navigateTo("profile-confirm");
1382
- };
1383
-
1384
- const handleProfileInputChange = (value: string) => {
1385
- const suppressKey = profileInputSuppressKey();
1386
- if (suppressKey && profileInputValue() === "" && value === suppressKey) {
1387
- setProfileInputSuppressKey(null);
1388
- setProfileInputValue("");
1389
- return;
1390
- }
1391
- setProfileInputSuppressKey(null);
1392
- setProfileInputValue(value);
1393
- };
1394
-
1395
- const submitProfileInput = async (value: string) => {
1396
- const mode = profileInputMode();
1397
- const trimmed = value.trim();
1398
-
1399
- if (mode === "create-profile") {
1400
- if (!trimmed) {
1401
- openProfileError(
1402
- new Error("Profile name is required."),
1403
- "Invalid name.",
1404
- );
1405
- return;
1406
- }
1407
- if (!isValidProfileName(trimmed)) {
1408
- openProfileError(
1409
- new Error(`Invalid profile name: "${trimmed}".`),
1410
- "Profile names must use lowercase letters, numbers, and hyphens.",
1411
- );
1412
- return;
1413
- }
1414
- try {
1415
- await createProfile(trimmed, { displayName: trimmed, env: {} });
1416
- await refreshProfiles();
1417
- setSelectedProfileName(trimmed);
1418
- setProfileInputValue("");
1419
- setProfileInputSuppressKey(null);
1420
- goBack();
1421
- } catch (err) {
1422
- openProfileError(err, "Unable to create profile.");
1423
- }
1424
- return;
1425
- }
1426
-
1427
- const entry = selectedProfileConfig();
1428
- if (!entry) {
1429
- openProfileError(
1430
- new Error("Profile not selected."),
1431
- "Profile not found.",
1432
- );
1433
- return;
1434
- }
1435
-
1436
- if (mode === "add-env") {
1437
- const separatorIndex = trimmed.indexOf("=");
1438
- if (separatorIndex <= 0) {
1439
- openProfileError(
1440
- new Error("Environment variable must be in KEY=VALUE format."),
1441
- "Invalid environment variable.",
1442
- );
1443
- return;
1444
- }
1445
- const key = trimmed.slice(0, separatorIndex).trim();
1446
- const valuePart = trimmed.slice(separatorIndex + 1);
1447
- if (!key) {
1448
- openProfileError(
1449
- new Error("Environment variable key is required."),
1450
- "Invalid environment variable.",
1451
- );
1452
- return;
1453
- }
1454
- const nextEnv = { ...(entry.profile.env ?? {}) };
1455
- nextEnv[key] = valuePart;
1456
- try {
1457
- await updateProfile(entry.name, { env: nextEnv });
1458
- await refreshProfiles();
1459
- setProfileInputValue("");
1460
- setProfileInputSuppressKey(null);
1461
- goBack();
1462
- } catch (err) {
1463
- openProfileError(err, "Unable to update profile.");
1464
- }
1465
- return;
1466
- }
1467
-
1468
- if (mode === "edit-env") {
1469
- const envKey = profileEnvKey();
1470
- if (!envKey) {
1471
- openProfileError(
1472
- new Error("Environment variable not selected."),
1473
- "Select a variable to edit.",
1474
- );
1475
- return;
1476
- }
1477
- const nextEnv = { ...(entry.profile.env ?? {}) };
1478
- nextEnv[envKey] = value;
1479
- try {
1480
- await updateProfile(entry.name, { env: nextEnv });
1481
- await refreshProfiles();
1482
- setProfileInputValue("");
1483
- setProfileInputSuppressKey(null);
1484
- goBack();
1485
- } catch (err) {
1486
- openProfileError(err, "Unable to update profile.");
1487
- }
1488
- }
1489
- };
1490
-
1491
- const confirmProfileAction = async (confirmed: boolean) => {
1492
- if (!confirmed) {
1493
- goBack();
1494
- return;
1495
- }
1496
-
1497
- const mode = profileConfirmMode();
1498
- const entry = selectedProfileConfig();
1499
-
1500
- if (mode === "delete-profile") {
1501
- const name = selectedProfileName();
1502
- if (!name) {
1503
- openProfileError(
1504
- new Error("Profile not selected."),
1505
- "Profile not found.",
1506
- );
1507
- return;
1508
- }
1509
- try {
1510
- await deleteProfile(name);
1511
- await refreshProfiles();
1512
- setProfileEnvKey(null);
1513
- goBack();
1514
- } catch (err) {
1515
- openProfileError(err, "Unable to delete profile.");
1516
- }
1517
- return;
1518
- }
1519
-
1520
- if (mode === "delete-env") {
1521
- if (!entry) {
1522
- openProfileError(
1523
- new Error("Profile not selected."),
1524
- "Profile not found.",
1525
- );
1526
- return;
1527
- }
1528
- const envKey = profileEnvKey();
1529
- if (!envKey) {
1530
- openProfileError(
1531
- new Error("Environment variable not selected."),
1532
- "Select a variable to delete.",
1533
- );
1534
- return;
1535
- }
1536
- const nextEnv = { ...(entry.profile.env ?? {}) };
1537
- delete nextEnv[envKey];
1538
- try {
1539
- await updateProfile(entry.name, { env: nextEnv });
1540
- await refreshProfiles();
1541
- setProfileEnvKey(null);
1542
- goBack();
1543
- } catch (err) {
1544
- openProfileError(err, "Unable to update profile.");
1545
- }
1546
- }
1547
- };
1548
-
1549
- const toggleSelectedBranch = (branchName: string) => {
1550
- if (unsafeSelectionConfirmVisible()) {
1551
- return;
1552
- }
1553
- const currentSelection = new Set(selectedBranches());
1554
- if (currentSelection.has(branchName)) {
1555
- currentSelection.delete(branchName);
1556
- setSelectedBranches(Array.from(currentSelection));
1557
- return;
1558
- }
1559
-
1560
- const branch = branchItems().find((item) => item.name === branchName);
1561
- const pending = cleanupSafetyPending();
1562
- const hasSafetyPending = pending.has(branchName);
1563
- const hasUncommitted = branch?.worktree?.hasUncommittedChanges === true;
1564
- const hasUnpushed = branch?.hasUnpushedCommits === true;
1565
- const isUnmerged = branch?.isUnmerged === true;
1566
- const safeToCleanup = branch?.safeToCleanup === true;
1567
- const isRemoteBranch = branch?.type === "remote";
1568
- const isUnsafe =
1569
- Boolean(branch) &&
1570
- !isRemoteBranch &&
1571
- !hasSafetyPending &&
1572
- (hasUncommitted || hasUnpushed || isUnmerged || !safeToCleanup);
1573
-
1574
- if (branch && hasSafetyPending) {
1575
- setUnsafeSelectionTarget(branch.name);
1576
- setUnsafeSelectionMessage(SAFETY_PENDING_MESSAGE);
1577
- setUnsafeSelectionConfirmVisible(true);
1578
- return;
1579
- }
1580
- if (branch && isUnsafe) {
1581
- setUnsafeSelectionTarget(branch.name);
1582
- setUnsafeSelectionMessage(UNSAFE_SELECTION_MESSAGE);
1583
- setUnsafeSelectionConfirmVisible(true);
1584
- return;
1585
- }
1586
-
1587
- currentSelection.add(branchName);
1588
- setSelectedBranches(Array.from(currentSelection));
1589
- };
1590
-
1591
- const confirmUnsafeSelection = (confirmed: boolean) => {
1592
- suppressBranchInputOnce();
1593
- const target = unsafeSelectionTarget();
1594
- setUnsafeSelectionConfirmVisible(false);
1595
- setUnsafeSelectionTarget(null);
1596
- setUnsafeSelectionMessage(UNSAFE_SELECTION_MESSAGE);
1597
- if (!confirmed || !target) {
1598
- return;
1599
- }
1600
- setSelectedBranches((prev) =>
1601
- prev.includes(target) ? prev : [...prev, target],
1602
- );
1603
- };
1604
-
1605
- const handleToolSelect = (item: SelectorItem) => {
1606
- setSelectedTool(item.value as CodingAgentId);
1607
- navigateTo("mode-select");
1608
- };
1609
-
1610
- const handleModeSelect = (item: SelectorItem) => {
1611
- setSelectedMode(item.value as ExecutionMode);
1612
- navigateTo("skip-permissions");
1613
- };
1614
-
1615
- const finalizeSelection = (skipPermissions: boolean) => {
1616
- const branch = selectedBranch();
1617
- const tool = selectedTool();
1618
- if (!branch || !tool) {
1619
- return;
1620
- }
1621
-
1622
- const defaultModel = getDefaultModelOption(tool);
1623
- const resolvedModel = defaultModel?.id ?? null;
1624
- const normalizedModel = normalizeModelId(tool, resolvedModel);
1625
- const resolvedInference = getDefaultInferenceForModel(defaultModel);
1626
- const baseRef = newBranchBaseRef();
1627
-
1628
- exitApp({
1629
- branch: branch.name,
1630
- displayName: branch.displayName,
1631
- branchType: branch.branchType,
1632
- ...(branch.remoteBranch ? { remoteBranch: branch.remoteBranch } : {}),
1633
- ...(isNewBranch()
1634
- ? {
1635
- isNewBranch: true,
1636
- ...(baseRef ? { baseBranch: baseRef } : {}),
1637
- }
1638
- : {}),
1639
- tool,
1640
- mode: selectedMode(),
1641
- skipPermissions,
1642
- ...(normalizedModel !== undefined ? { model: normalizedModel } : {}),
1643
- ...(resolvedInference !== undefined
1644
- ? { inferenceLevel: resolvedInference }
1645
- : {}),
1646
- });
1647
- };
1648
-
1649
- const renderCurrentScreen = () => {
1650
- const screen = currentScreen();
1651
-
1652
- if (screen === "branch-list") {
1653
- const cleanupUI = {
1654
- indicators: cleanupIndicators(),
1655
- footerMessage: branchFooterMessage(),
1656
- inputLocked: branchInputLocked() || unsafeConfirmInputLocked(),
1657
- safetyLoading: cleanupSafetyLoading(),
1658
- safetyPendingBranches: cleanupSafetyPending(),
1659
- };
1660
- return (
1661
- <BranchListScreen
1662
- branches={branchItems()}
1663
- stats={stats()}
1664
- onSelect={handleBranchSelect}
1665
- onQuit={() => exitApp(undefined)}
1666
- onCleanupCommand={handleCleanupCommand}
1667
- onRefresh={refreshBranches}
1668
- onRepairWorktrees={handleRepairWorktrees}
1669
- loading={loading()}
1670
- error={error()}
1671
- loadingIndicatorDelay={props.loadingIndicatorDelay ?? 0}
1672
- lastUpdated={stats().lastUpdated}
1673
- version={version()}
1674
- workingDirectory={workingDirectory()}
1675
- activeProfile={activeProfile()}
1676
- onOpenLogs={(branch) => {
1677
- setLogTargetBranch(branch);
1678
- setLogSelectedEntry(null);
1679
- setLogSelectedDate(getTodayLogDate());
1680
- setLogTailEnabled(false);
1681
- navigateTo("log-list");
1682
- }}
1683
- onOpenProfiles={() => navigateTo("profile")}
1684
- selectedBranches={selectedBranches()}
1685
- onToggleSelect={toggleSelectedBranch}
1686
- onCreateBranch={handleQuickCreate}
1687
- cleanupUI={cleanupUI}
1688
- helpVisible={helpVisible()}
1689
- wizardVisible={wizardVisible()}
1690
- confirmVisible={unsafeSelectionConfirmVisible()}
1691
- cursorPosition={branchCursorPosition()}
1692
- onCursorPositionChange={setBranchCursorPosition}
1693
- />
1694
- );
1695
- }
1696
-
1697
- if (screen === "tool-select") {
1698
- if (toolError()) {
1699
- return (
1700
- <ErrorScreen
1701
- error={toolError() as Error}
1702
- onBack={goBack}
1703
- hint="Unable to load available tools."
1704
- />
1705
- );
1706
- }
1707
- return (
1708
- <SelectorScreen
1709
- title="Select tool"
1710
- items={toolItems()}
1711
- onSelect={handleToolSelect}
1712
- onBack={goBack}
1713
- helpVisible={helpVisible()}
1714
- />
1715
- );
1716
- }
1717
-
1718
- if (screen === "mode-select") {
1719
- return (
1720
- <SelectorScreen
1721
- title="Execution mode"
1722
- items={[
1723
- { label: "Normal", value: "normal" },
1724
- { label: "Continue", value: "continue" },
1725
- { label: "Resume", value: "resume" },
1726
- ]}
1727
- onSelect={handleModeSelect}
1728
- onBack={goBack}
1729
- helpVisible={helpVisible()}
1730
- />
1731
- );
1732
- }
1733
-
1734
- if (screen === "skip-permissions") {
1735
- return (
1736
- <SelectorScreen
1737
- title="Skip permission prompts?"
1738
- items={[
1739
- { label: "Yes", value: "true" },
1740
- { label: "No", value: "false" },
1741
- ]}
1742
- onSelect={(item) => finalizeSelection(item.value === "true")}
1743
- onBack={goBack}
1744
- helpVisible={helpVisible()}
1745
- />
1746
- );
1747
- }
1748
-
1749
- if (screen === "log-list") {
1750
- return (
1751
- <LogScreen
1752
- entries={logEntries()}
1753
- loading={logLoading()}
1754
- error={logError()}
1755
- onBack={goBack}
1756
- onSelect={(entry) => {
1757
- setLogSelectedEntry(entry);
1758
- navigateTo("log-detail");
1759
- }}
1760
- onCopy={async (entry) => {
1761
- try {
1762
- await copyToClipboard(entry.json);
1763
- showLogNotification("Copied to clipboard.", "success");
1764
- } catch {
1765
- showLogNotification("Failed to copy to clipboard.", "error");
1766
- }
1767
- }}
1768
- onReload={() => void loadLogEntries(logSelectedDate())}
1769
- onToggleTail={toggleLogTail}
1770
- onReset={() => void resetLogFiles()}
1771
- notification={logNotification()}
1772
- version={version()}
1773
- selectedDate={logSelectedDate()}
1774
- branchLabel={logBranchLabel()}
1775
- sourceLabel={logSourceLabel()}
1776
- tailing={logTailEnabled()}
1777
- helpVisible={helpVisible()}
1778
- />
1779
- );
1780
- }
1781
-
1782
- if (screen === "log-detail") {
1783
- return (
1784
- <LogDetailScreen
1785
- entry={logSelectedEntry()}
1786
- onBack={goBack}
1787
- onCopy={async (entry) => {
1788
- try {
1789
- await copyToClipboard(entry.json);
1790
- showLogNotification("Copied to clipboard.", "success");
1791
- } catch {
1792
- showLogNotification("Failed to copy to clipboard.", "error");
1793
- }
1794
- }}
1795
- notification={logNotification()}
1796
- version={version()}
1797
- helpVisible={helpVisible()}
1798
- />
1799
- );
1800
- }
1801
-
1802
- if (screen === "profile") {
1803
- if (profileError()) {
1804
- return (
1805
- <ErrorScreen
1806
- error={profileError() as Error}
1807
- onBack={goBack}
1808
- hint="Unable to load profiles."
1809
- />
1810
- );
1811
- }
1812
- return (
1813
- <ProfileScreen
1814
- profiles={profileItems()}
1815
- version={version()}
1816
- helpVisible={helpVisible()}
1817
- onCreate={openProfileCreate}
1818
- onDelete={openProfileDelete}
1819
- onEdit={openProfileEnv}
1820
- onSelect={(profile) => {
1821
- void setActiveProfile(profile.name)
1822
- .then(() => {
1823
- void refreshProfiles();
1824
- })
1825
- .catch((err) => {
1826
- openProfileError(err, "Unable to set active profile.");
1827
- });
1828
- }}
1829
- onBack={goBack}
1830
- />
1831
- );
1832
- }
1833
-
1834
- if (screen === "profile-env") {
1835
- const entry = selectedProfileConfig();
1836
- if (!entry) {
1837
- return (
1838
- <ErrorScreen
1839
- error="Profile not found."
1840
- onBack={goBack}
1841
- hint="Select a profile before editing."
1842
- />
1843
- );
1844
- }
1845
- return (
1846
- <ProfileEnvScreen
1847
- profileName={entry.name}
1848
- variables={profileEnvVariables()}
1849
- onAdd={openProfileEnvAdd}
1850
- onEdit={openProfileEnvEdit}
1851
- onDelete={openProfileEnvDelete}
1852
- onViewOsEnv={() => navigateTo("profile-os-env")}
1853
- onBack={goBack}
1854
- version={version()}
1855
- helpVisible={helpVisible()}
1856
- />
1857
- );
1858
- }
1859
-
1860
- if (screen === "profile-input") {
1861
- const mode = profileInputMode();
1862
- const envKey = profileEnvKey();
1863
- const message =
1864
- mode === "create-profile"
1865
- ? "New profile name"
1866
- : mode === "add-env"
1867
- ? "Add environment variable"
1868
- : `Edit value for ${envKey ?? "(unknown)"}`;
1869
- const label =
1870
- mode === "create-profile"
1871
- ? "Profile name"
1872
- : mode === "add-env"
1873
- ? "KEY=VALUE"
1874
- : "Value";
1875
- const placeholder =
1876
- mode === "create-profile"
1877
- ? "development"
1878
- : mode === "add-env"
1879
- ? "MY_VAR=value"
1880
- : undefined;
1881
-
1882
- return (
1883
- <InputScreen
1884
- message={message}
1885
- value={profileInputValue()}
1886
- onChange={handleProfileInputChange}
1887
- onSubmit={(value) => void submitProfileInput(value)}
1888
- onCancel={() => {
1889
- setProfileInputSuppressKey(null);
1890
- goBack();
1891
- }}
1892
- label={label}
1893
- {...(placeholder !== undefined ? { placeholder } : {})}
1894
- width={32}
1895
- helpVisible={helpVisible()}
1896
- />
1897
- );
1898
- }
1899
-
1900
- if (screen === "profile-confirm") {
1901
- const mode = profileConfirmMode();
1902
- const profileName = selectedProfileName();
1903
- const envKey = profileEnvKey();
1904
- const message =
1905
- mode === "delete-profile"
1906
- ? `Delete profile ${profileName ?? "(unknown)"}?`
1907
- : `Delete ${envKey ?? "(unknown)"}?`;
1908
-
1909
- return (
1910
- <ConfirmScreen
1911
- message={message}
1912
- onConfirm={(confirmed) => void confirmProfileAction(confirmed)}
1913
- defaultNo
1914
- helpVisible={helpVisible()}
1915
- />
1916
- );
1917
- }
1918
-
1919
- if (screen === "profile-os-env") {
1920
- const highlightKeys = profileEnvVariables().map(
1921
- (variable) => variable.key,
1922
- );
1923
- return (
1924
- <EnvironmentScreen
1925
- variables={osEnvVariables()}
1926
- highlightKeys={highlightKeys}
1927
- onBack={goBack}
1928
- version={version()}
1929
- helpVisible={helpVisible()}
1930
- />
1931
- );
1932
- }
1933
-
1934
- if (screen === "profile-error") {
1935
- return (
1936
- <ErrorScreen
1937
- error={profileActionError() ?? "Profile error"}
1938
- onBack={() => {
1939
- setProfileActionError(null);
1940
- setProfileActionHint(null);
1941
- goBack();
1942
- }}
1943
- {...(profileActionHint()
1944
- ? { hint: profileActionHint() as string }
1945
- : {})}
1946
- helpVisible={helpVisible()}
1947
- />
1948
- );
1949
- }
1950
-
1951
- if (screen === "worktree-create") {
1952
- const baseBranchRef = resolveBaseBranchRef(creationSource(), null, () =>
1953
- defaultBaseBranch(),
1954
- );
1955
- const baseBranchLabel = resolveBaseBranchLabel(
1956
- creationSource(),
1957
- null,
1958
- () => defaultBaseBranch(),
1959
- );
1960
-
1961
- return (
1962
- <WorktreeCreateScreen
1963
- branchName={createBranchName()}
1964
- baseBranch={baseBranchLabel}
1965
- version={version()}
1966
- helpVisible={helpVisible()}
1967
- onChange={(value) => {
1968
- const suppressKey = suppressCreateKey();
1969
- if (
1970
- suppressKey &&
1971
- createBranchName() === "" &&
1972
- value === suppressKey
1973
- ) {
1974
- setSuppressCreateKey(null);
1975
- setCreateBranchName("");
1976
- return;
1977
- }
1978
- setSuppressCreateKey(null);
1979
- setCreateBranchName(value);
1980
- }}
1981
- onSubmit={(value, branchType) => {
1982
- const trimmed = value.trim();
1983
- if (!trimmed) {
1984
- return;
1985
- }
1986
- // Add prefix based on selected branch type
1987
- const prefixKey =
1988
- branchType.toUpperCase() as keyof typeof BRANCH_PREFIXES;
1989
- const prefix = BRANCH_PREFIXES[prefixKey] ?? "";
1990
- const fullBranchName = `${prefix}${trimmed}`;
1991
-
1992
- setSelectedBranch({
1993
- name: fullBranchName,
1994
- displayName: fullBranchName,
1995
- branchType: "local",
1996
- branchCategory: branchType,
1997
- });
1998
- setIsNewBranch(true);
1999
- setNewBranchBaseRef(baseBranchRef);
2000
- setSelectedTool(null);
2001
- setSelectedMode("normal");
2002
- setSuppressCreateKey(null);
2003
- navigateTo("tool-select");
2004
- }}
2005
- onCancel={() => {
2006
- setSuppressCreateKey(null);
2007
- goBack();
2008
- }}
2009
- />
2010
- );
2011
- }
2012
-
2013
- if (screen === "loading") {
2014
- return (
2015
- <LoadingIndicatorScreen
2016
- message="Loading..."
2017
- delay={props.loadingIndicatorDelay ?? 0}
2018
- />
2019
- );
2020
- }
2021
-
2022
- if (screen === "error") {
2023
- return (
2024
- <ErrorScreen
2025
- error={error() ?? "Unknown error"}
2026
- helpVisible={helpVisible()}
2027
- />
2028
- );
2029
- }
2030
-
2031
- return (
2032
- <ErrorScreen
2033
- error={`Unknown screen: ${screen}`}
2034
- onBack={goBack}
2035
- helpVisible={helpVisible()}
2036
- />
2037
- );
2038
- };
2039
-
2040
- return (
2041
- <>
2042
- {renderCurrentScreen()}
2043
- {unsafeSelectionConfirmVisible() && (
2044
- <box
2045
- position="absolute"
2046
- top="30%"
2047
- left="20%"
2048
- width={unsafeConfirmBoxWidth()}
2049
- zIndex={110}
2050
- border
2051
- borderStyle="single"
2052
- borderColor="yellow"
2053
- backgroundColor="black"
2054
- padding={1}
2055
- >
2056
- <ConfirmScreen
2057
- message={unsafeSelectionMessage()}
2058
- onConfirm={confirmUnsafeSelection}
2059
- yesLabel="OK"
2060
- noLabel="Cancel"
2061
- defaultNo
2062
- helpVisible={helpVisible()}
2063
- width={unsafeConfirmContentWidth()}
2064
- />
2065
- </box>
2066
- )}
2067
- <HelpOverlay visible={helpVisible()} context={currentScreen()} />
2068
- {/* FR-044: ウィザードポップアップをレイヤー表示 */}
2069
- <WizardController
2070
- visible={wizardVisible()}
2071
- selectedBranchName={selectedBranch()?.name ?? ""}
2072
- history={quickStartHistory()}
2073
- onClose={handleWizardClose}
2074
- onComplete={handleWizardComplete}
2075
- onResume={handleWizardResume}
2076
- onStartNew={handleWizardStartNew}
2077
- />
2078
- </>
2079
- );
2080
- }
2081
- const withTimeout = async <T,>(
2082
- promise: Promise<T>,
2083
- timeoutMs: number,
2084
- ): Promise<T> =>
2085
- new Promise<T>((resolve, reject) => {
2086
- const timer = setTimeout(() => {
2087
- reject(new Error("timeout"));
2088
- }, timeoutMs);
2089
-
2090
- promise
2091
- .then((value) => {
2092
- clearTimeout(timer);
2093
- resolve(value);
2094
- })
2095
- .catch((err) => {
2096
- clearTimeout(timer);
2097
- reject(err);
2098
- });
2099
- });
2100
-
2101
- const buildBranchList = (
2102
- branches: BranchInfo[],
2103
- worktrees: WorktreeEntry[],
2104
- lastToolUsageMap?: Map<string, ToolSessionEntry>,
2105
- ) => {
2106
- const localBranchNames = new Set(
2107
- branches.filter((branch) => branch.type === "local").map((b) => b.name),
2108
- );
2109
-
2110
- const filtered = branches.filter((branch) => {
2111
- if (branch.type === "remote") {
2112
- const remoteName = branch.name.replace(/^origin\//, "");
2113
- return !localBranchNames.has(remoteName);
2114
- }
2115
- return true;
2116
- });
2117
-
2118
- const worktreeMap = new Map<string, UIWorktreeInfo>();
2119
- for (const worktree of worktrees) {
2120
- worktreeMap.set(worktree.branch, {
2121
- path: worktree.path,
2122
- locked: worktree.locked ?? false,
2123
- prunable: worktree.prunable ?? false,
2124
- isAccessible: worktree.isAccessible ?? true,
2125
- ...(worktree.hasUncommittedChanges !== undefined
2126
- ? { hasUncommittedChanges: worktree.hasUncommittedChanges }
2127
- : {}),
2128
- });
2129
- }
2130
-
2131
- const enriched = filtered.map((branch) => {
2132
- const lastToolUsage = lastToolUsageMap?.get(branch.name);
2133
- const baseBranch = lastToolUsage ? { ...branch, lastToolUsage } : branch;
2134
- if (branch.type === "local") {
2135
- const worktree = worktreeMap.get(branch.name);
2136
- if (worktree) {
2137
- return { ...baseBranch, worktree };
2138
- }
2139
- }
2140
- return baseBranch;
2141
- });
2142
-
2143
- const items = formatBranchItems(enriched, worktreeMap);
2144
- return { items, worktreeMap };
2145
- };