@akiojin/gwt 2.0.0 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/dist/claude-history.d.ts +60 -0
  2. package/dist/claude-history.d.ts.map +1 -0
  3. package/dist/claude-history.js +606 -0
  4. package/dist/claude-history.js.map +1 -0
  5. package/dist/claude.d.ts +12 -0
  6. package/dist/claude.d.ts.map +1 -0
  7. package/dist/claude.js +222 -0
  8. package/dist/claude.js.map +1 -0
  9. package/dist/cli/ui/components/App.d.ts +22 -0
  10. package/dist/cli/ui/components/App.d.ts.map +1 -0
  11. package/dist/cli/ui/components/App.js +557 -0
  12. package/dist/cli/ui/components/App.js.map +1 -0
  13. package/dist/cli/ui/components/common/Confirm.d.ts +13 -0
  14. package/dist/cli/ui/components/common/Confirm.d.ts.map +1 -0
  15. package/dist/cli/ui/components/common/Confirm.js +20 -0
  16. package/dist/cli/ui/components/common/Confirm.js.map +1 -0
  17. package/dist/cli/ui/components/common/ErrorBoundary.d.ts +23 -0
  18. package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +1 -0
  19. package/dist/cli/ui/components/common/ErrorBoundary.js +37 -0
  20. package/dist/cli/ui/components/common/ErrorBoundary.js.map +1 -0
  21. package/dist/cli/ui/components/common/Input.d.ts +14 -0
  22. package/dist/cli/ui/components/common/Input.d.ts.map +1 -0
  23. package/dist/cli/ui/components/common/Input.js +14 -0
  24. package/dist/cli/ui/components/common/Input.js.map +1 -0
  25. package/dist/cli/ui/components/common/LoadingIndicator.d.ts +19 -0
  26. package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +1 -0
  27. package/dist/cli/ui/components/common/LoadingIndicator.js +61 -0
  28. package/dist/cli/ui/components/common/LoadingIndicator.js.map +1 -0
  29. package/dist/cli/ui/components/common/Select.d.ts +30 -0
  30. package/dist/cli/ui/components/common/Select.d.ts.map +1 -0
  31. package/dist/cli/ui/components/common/Select.js +140 -0
  32. package/dist/cli/ui/components/common/Select.js.map +1 -0
  33. package/dist/cli/ui/components/parts/Footer.d.ts +15 -0
  34. package/dist/cli/ui/components/parts/Footer.d.ts.map +1 -0
  35. package/dist/cli/ui/components/parts/Footer.js +20 -0
  36. package/dist/cli/ui/components/parts/Footer.js.map +1 -0
  37. package/dist/cli/ui/components/parts/Header.d.ts +29 -0
  38. package/dist/cli/ui/components/parts/Header.d.ts.map +1 -0
  39. package/dist/cli/ui/components/parts/Header.js +19 -0
  40. package/dist/cli/ui/components/parts/Header.js.map +1 -0
  41. package/dist/cli/ui/components/parts/MergeStatusList.d.ts +13 -0
  42. package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +1 -0
  43. package/dist/cli/ui/components/parts/MergeStatusList.js +52 -0
  44. package/dist/cli/ui/components/parts/MergeStatusList.js.map +1 -0
  45. package/dist/cli/ui/components/parts/ProgressBar.d.ts +13 -0
  46. package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +1 -0
  47. package/dist/cli/ui/components/parts/ProgressBar.js +53 -0
  48. package/dist/cli/ui/components/parts/ProgressBar.js.map +1 -0
  49. package/dist/cli/ui/components/parts/ScrollableList.d.ts +12 -0
  50. package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +1 -0
  51. package/dist/cli/ui/components/parts/ScrollableList.js +11 -0
  52. package/dist/cli/ui/components/parts/ScrollableList.js.map +1 -0
  53. package/dist/cli/ui/components/parts/Stats.d.ts +13 -0
  54. package/dist/cli/ui/components/parts/Stats.d.ts.map +1 -0
  55. package/dist/cli/ui/components/parts/Stats.js +42 -0
  56. package/dist/cli/ui/components/parts/Stats.js.map +1 -0
  57. package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts +20 -0
  58. package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts.map +1 -0
  59. package/dist/cli/ui/components/screens/AIToolSelectorScreen.js +77 -0
  60. package/dist/cli/ui/components/screens/AIToolSelectorScreen.js.map +1 -0
  61. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +14 -0
  62. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +1 -0
  63. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +41 -0
  64. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +1 -0
  65. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +14 -0
  66. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +1 -0
  67. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +71 -0
  68. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +1 -0
  69. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +15 -0
  70. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +1 -0
  71. package/dist/cli/ui/components/screens/BranchCreatorScreen.js +142 -0
  72. package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +1 -0
  73. package/dist/cli/ui/components/screens/BranchListScreen.d.ts +39 -0
  74. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +1 -0
  75. package/dist/cli/ui/components/screens/BranchListScreen.js +172 -0
  76. package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -0
  77. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +29 -0
  78. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +1 -0
  79. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +92 -0
  80. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +1 -0
  81. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +23 -0
  82. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +1 -0
  83. package/dist/cli/ui/components/screens/PRCleanupScreen.js +94 -0
  84. package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +1 -0
  85. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +17 -0
  86. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +1 -0
  87. package/dist/cli/ui/components/screens/SessionSelectorScreen.js +55 -0
  88. package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +1 -0
  89. package/dist/cli/ui/components/screens/WorktreeManagerScreen.d.ts +20 -0
  90. package/dist/cli/ui/components/screens/WorktreeManagerScreen.d.ts.map +1 -0
  91. package/dist/cli/ui/components/screens/WorktreeManagerScreen.js +65 -0
  92. package/dist/cli/ui/components/screens/WorktreeManagerScreen.js.map +1 -0
  93. package/dist/cli/ui/hooks/useBatchMerge.d.ts +17 -0
  94. package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +1 -0
  95. package/dist/cli/ui/hooks/useBatchMerge.js +77 -0
  96. package/dist/cli/ui/hooks/useBatchMerge.js.map +1 -0
  97. package/dist/cli/ui/hooks/useGitData.d.ts +20 -0
  98. package/dist/cli/ui/hooks/useGitData.d.ts.map +1 -0
  99. package/dist/cli/ui/hooks/useGitData.js +116 -0
  100. package/dist/cli/ui/hooks/useGitData.js.map +1 -0
  101. package/dist/cli/ui/hooks/useScreenState.d.ts +12 -0
  102. package/dist/cli/ui/hooks/useScreenState.d.ts.map +1 -0
  103. package/dist/cli/ui/hooks/useScreenState.js +30 -0
  104. package/dist/cli/ui/hooks/useScreenState.js.map +1 -0
  105. package/dist/cli/ui/hooks/useTerminalSize.d.ts +9 -0
  106. package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +1 -0
  107. package/dist/cli/ui/hooks/useTerminalSize.js +24 -0
  108. package/dist/cli/ui/hooks/useTerminalSize.js.map +1 -0
  109. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +21 -0
  110. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +1 -0
  111. package/dist/cli/ui/screens/BranchActionSelectorScreen.js +61 -0
  112. package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +1 -0
  113. package/dist/cli/ui/types.d.ts +245 -0
  114. package/dist/cli/ui/types.d.ts.map +1 -0
  115. package/dist/cli/ui/types.js +2 -0
  116. package/dist/cli/ui/types.js.map +1 -0
  117. package/dist/cli/ui/utils/baseBranch.d.ts +4 -0
  118. package/dist/cli/ui/utils/baseBranch.d.ts.map +1 -0
  119. package/dist/cli/ui/utils/baseBranch.js +17 -0
  120. package/dist/cli/ui/utils/baseBranch.js.map +1 -0
  121. package/dist/cli/ui/utils/branchFormatter.d.ts +13 -0
  122. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -0
  123. package/dist/cli/ui/utils/branchFormatter.js +202 -0
  124. package/dist/cli/ui/utils/branchFormatter.js.map +1 -0
  125. package/dist/cli/ui/utils/statisticsCalculator.d.ts +9 -0
  126. package/dist/cli/ui/utils/statisticsCalculator.d.ts.map +1 -0
  127. package/dist/cli/ui/utils/statisticsCalculator.js +37 -0
  128. package/dist/cli/ui/utils/statisticsCalculator.js.map +1 -0
  129. package/dist/client/assets/index-CqaYsI0z.js +81 -0
  130. package/dist/client/assets/index-Dy3OxWpP.css +32 -0
  131. package/dist/client/index.html +13 -0
  132. package/dist/codex.d.ts +12 -0
  133. package/dist/codex.d.ts.map +1 -0
  134. package/dist/codex.js +106 -0
  135. package/dist/codex.js.map +1 -0
  136. package/dist/config/builtin-tools.d.ts +19 -0
  137. package/dist/config/builtin-tools.d.ts.map +1 -0
  138. package/dist/config/builtin-tools.js +40 -0
  139. package/dist/config/builtin-tools.js.map +1 -0
  140. package/dist/config/constants.d.ts +74 -0
  141. package/dist/config/constants.d.ts.map +1 -0
  142. package/dist/config/constants.js +90 -0
  143. package/dist/config/constants.js.map +1 -0
  144. package/dist/config/env-history.d.ts +4 -0
  145. package/dist/config/env-history.d.ts.map +1 -0
  146. package/dist/config/env-history.js +34 -0
  147. package/dist/config/env-history.js.map +1 -0
  148. package/dist/config/index.d.ts +24 -0
  149. package/dist/config/index.d.ts.map +1 -0
  150. package/dist/config/index.js +144 -0
  151. package/dist/config/index.js.map +1 -0
  152. package/dist/config/tools.d.ts +40 -0
  153. package/dist/config/tools.d.ts.map +1 -0
  154. package/dist/config/tools.js +238 -0
  155. package/dist/config/tools.js.map +1 -0
  156. package/dist/git.d.ts +145 -0
  157. package/dist/git.d.ts.map +1 -0
  158. package/dist/git.js +871 -0
  159. package/dist/git.js.map +1 -0
  160. package/dist/github.d.ts +14 -0
  161. package/dist/github.d.ts.map +1 -0
  162. package/dist/github.js +123 -0
  163. package/dist/github.js.map +1 -0
  164. package/dist/index.d.ts +15 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.js +510 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/launcher.d.ts +30 -0
  169. package/dist/launcher.d.ts.map +1 -0
  170. package/dist/launcher.js +116 -0
  171. package/dist/launcher.js.map +1 -0
  172. package/dist/repositories/git.repository.d.ts +38 -0
  173. package/dist/repositories/git.repository.d.ts.map +1 -0
  174. package/dist/repositories/git.repository.js +117 -0
  175. package/dist/repositories/git.repository.js.map +1 -0
  176. package/dist/repositories/github.repository.d.ts +16 -0
  177. package/dist/repositories/github.repository.d.ts.map +1 -0
  178. package/dist/repositories/github.repository.js +61 -0
  179. package/dist/repositories/github.repository.js.map +1 -0
  180. package/dist/repositories/worktree.repository.d.ts +18 -0
  181. package/dist/repositories/worktree.repository.d.ts.map +1 -0
  182. package/dist/repositories/worktree.repository.js +57 -0
  183. package/dist/repositories/worktree.repository.js.map +1 -0
  184. package/dist/services/BatchMergeService.d.ts +45 -0
  185. package/dist/services/BatchMergeService.d.ts.map +1 -0
  186. package/dist/services/BatchMergeService.js +197 -0
  187. package/dist/services/BatchMergeService.js.map +1 -0
  188. package/dist/services/WorktreeOrchestrator.d.ts +37 -0
  189. package/dist/services/WorktreeOrchestrator.d.ts.map +1 -0
  190. package/dist/services/WorktreeOrchestrator.js +74 -0
  191. package/dist/services/WorktreeOrchestrator.js.map +1 -0
  192. package/dist/services/dependency-installer.d.ts +26 -0
  193. package/dist/services/dependency-installer.d.ts.map +1 -0
  194. package/dist/services/dependency-installer.js +139 -0
  195. package/dist/services/dependency-installer.js.map +1 -0
  196. package/dist/services/git.service.d.ts +27 -0
  197. package/dist/services/git.service.d.ts.map +1 -0
  198. package/dist/services/git.service.js +95 -0
  199. package/dist/services/git.service.js.map +1 -0
  200. package/dist/services/github.service.d.ts +14 -0
  201. package/dist/services/github.service.d.ts.map +1 -0
  202. package/dist/services/github.service.js +52 -0
  203. package/dist/services/github.service.js.map +1 -0
  204. package/dist/services/worktree.service.d.ts +20 -0
  205. package/dist/services/worktree.service.d.ts.map +1 -0
  206. package/dist/services/worktree.service.js +52 -0
  207. package/dist/services/worktree.service.js.map +1 -0
  208. package/dist/types/api.d.ts +211 -0
  209. package/dist/types/api.d.ts.map +1 -0
  210. package/dist/types/api.js +8 -0
  211. package/dist/types/api.js.map +1 -0
  212. package/dist/types/tools.d.ts +201 -0
  213. package/dist/types/tools.d.ts.map +1 -0
  214. package/dist/types/tools.js +8 -0
  215. package/dist/types/tools.js.map +1 -0
  216. package/dist/utils/spinner.d.ts +6 -0
  217. package/dist/utils/spinner.d.ts.map +1 -0
  218. package/dist/utils/spinner.js +47 -0
  219. package/dist/utils/spinner.js.map +1 -0
  220. package/dist/utils/terminal.d.ts +20 -0
  221. package/dist/utils/terminal.d.ts.map +1 -0
  222. package/dist/utils/terminal.js +232 -0
  223. package/dist/utils/terminal.js.map +1 -0
  224. package/dist/utils.d.ts +9 -0
  225. package/dist/utils.d.ts.map +1 -0
  226. package/dist/utils.js +48 -0
  227. package/dist/utils.js.map +1 -0
  228. package/dist/web/client/src/components/BranchGraph.d.ts +8 -0
  229. package/dist/web/client/src/components/BranchGraph.d.ts.map +1 -0
  230. package/dist/web/client/src/components/BranchGraph.js +125 -0
  231. package/dist/web/client/src/components/BranchGraph.js.map +1 -0
  232. package/dist/web/client/src/components/EnvEditor.d.ts +20 -0
  233. package/dist/web/client/src/components/EnvEditor.d.ts.map +1 -0
  234. package/dist/web/client/src/components/EnvEditor.js +65 -0
  235. package/dist/web/client/src/components/EnvEditor.js.map +1 -0
  236. package/dist/web/client/src/components/Terminal.d.ts +15 -0
  237. package/dist/web/client/src/components/Terminal.d.ts.map +1 -0
  238. package/dist/web/client/src/components/Terminal.js +112 -0
  239. package/dist/web/client/src/components/Terminal.js.map +1 -0
  240. package/dist/web/client/src/hooks/useBranches.d.ts +16 -0
  241. package/dist/web/client/src/hooks/useBranches.d.ts.map +1 -0
  242. package/dist/web/client/src/hooks/useBranches.js +35 -0
  243. package/dist/web/client/src/hooks/useBranches.js.map +1 -0
  244. package/dist/web/client/src/hooks/useConfig.d.ts +13 -0
  245. package/dist/web/client/src/hooks/useConfig.d.ts.map +1 -0
  246. package/dist/web/client/src/hooks/useConfig.js +27 -0
  247. package/dist/web/client/src/hooks/useConfig.js.map +1 -0
  248. package/dist/web/client/src/hooks/useSessions.d.ts +21 -0
  249. package/dist/web/client/src/hooks/useSessions.d.ts.map +1 -0
  250. package/dist/web/client/src/hooks/useSessions.js +49 -0
  251. package/dist/web/client/src/hooks/useSessions.js.map +1 -0
  252. package/dist/web/client/src/hooks/useWorktrees.d.ts +17 -0
  253. package/dist/web/client/src/hooks/useWorktrees.d.ts.map +1 -0
  254. package/dist/web/client/src/hooks/useWorktrees.js +41 -0
  255. package/dist/web/client/src/hooks/useWorktrees.js.map +1 -0
  256. package/dist/web/client/src/lib/api.d.ts +82 -0
  257. package/dist/web/client/src/lib/api.d.ts.map +1 -0
  258. package/dist/web/client/src/lib/api.js +147 -0
  259. package/dist/web/client/src/lib/api.js.map +1 -0
  260. package/dist/web/client/src/lib/websocket.d.ts +52 -0
  261. package/dist/web/client/src/lib/websocket.d.ts.map +1 -0
  262. package/dist/web/client/src/lib/websocket.js +137 -0
  263. package/dist/web/client/src/lib/websocket.js.map +1 -0
  264. package/dist/web/client/src/main.d.ts +2 -0
  265. package/dist/web/client/src/main.d.ts.map +1 -0
  266. package/dist/web/client/src/main.js +23 -0
  267. package/dist/web/client/src/main.js.map +1 -0
  268. package/dist/web/client/src/pages/BranchDetailPage.d.ts +3 -0
  269. package/dist/web/client/src/pages/BranchDetailPage.d.ts.map +1 -0
  270. package/dist/web/client/src/pages/BranchDetailPage.js +519 -0
  271. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -0
  272. package/dist/web/client/src/pages/BranchListPage.d.ts +3 -0
  273. package/dist/web/client/src/pages/BranchListPage.d.ts.map +1 -0
  274. package/dist/web/client/src/pages/BranchListPage.js +150 -0
  275. package/dist/web/client/src/pages/BranchListPage.js.map +1 -0
  276. package/dist/web/client/src/pages/ConfigManagementPage.d.ts +3 -0
  277. package/dist/web/client/src/pages/ConfigManagementPage.d.ts.map +1 -0
  278. package/dist/web/client/src/pages/ConfigManagementPage.js +125 -0
  279. package/dist/web/client/src/pages/ConfigManagementPage.js.map +1 -0
  280. package/dist/web/client/src/router.d.ts +9 -0
  281. package/dist/web/client/src/router.d.ts.map +1 -0
  282. package/dist/web/client/src/router.js +27 -0
  283. package/dist/web/client/src/router.js.map +1 -0
  284. package/dist/web/client/vite.config.d.ts +3 -0
  285. package/dist/web/client/vite.config.d.ts.map +1 -0
  286. package/dist/web/client/vite.config.js +21 -0
  287. package/dist/web/client/vite.config.js.map +1 -0
  288. package/dist/web/server/env/importer.d.ts +3 -0
  289. package/dist/web/server/env/importer.d.ts.map +1 -0
  290. package/dist/web/server/env/importer.js +47 -0
  291. package/dist/web/server/env/importer.js.map +1 -0
  292. package/dist/web/server/index.d.ts +11 -0
  293. package/dist/web/server/index.d.ts.map +1 -0
  294. package/dist/web/server/index.js +62 -0
  295. package/dist/web/server/index.js.map +1 -0
  296. package/dist/web/server/pty/manager.d.ts +50 -0
  297. package/dist/web/server/pty/manager.d.ts.map +1 -0
  298. package/dist/web/server/pty/manager.js +143 -0
  299. package/dist/web/server/pty/manager.js.map +1 -0
  300. package/dist/web/server/routes/branches.d.ts +11 -0
  301. package/dist/web/server/routes/branches.d.ts.map +1 -0
  302. package/dist/web/server/routes/branches.js +97 -0
  303. package/dist/web/server/routes/branches.js.map +1 -0
  304. package/dist/web/server/routes/config.d.ts +6 -0
  305. package/dist/web/server/routes/config.d.ts.map +1 -0
  306. package/dist/web/server/routes/config.js +162 -0
  307. package/dist/web/server/routes/config.js.map +1 -0
  308. package/dist/web/server/routes/index.d.ts +13 -0
  309. package/dist/web/server/routes/index.d.ts.map +1 -0
  310. package/dist/web/server/routes/index.js +29 -0
  311. package/dist/web/server/routes/index.js.map +1 -0
  312. package/dist/web/server/routes/sessions.d.ts +12 -0
  313. package/dist/web/server/routes/sessions.d.ts.map +1 -0
  314. package/dist/web/server/routes/sessions.js +95 -0
  315. package/dist/web/server/routes/sessions.js.map +1 -0
  316. package/dist/web/server/routes/worktrees.d.ts +11 -0
  317. package/dist/web/server/routes/worktrees.d.ts.map +1 -0
  318. package/dist/web/server/routes/worktrees.js +80 -0
  319. package/dist/web/server/routes/worktrees.js.map +1 -0
  320. package/dist/web/server/services/branches.d.ts +17 -0
  321. package/dist/web/server/services/branches.d.ts.map +1 -0
  322. package/dist/web/server/services/branches.js +262 -0
  323. package/dist/web/server/services/branches.js.map +1 -0
  324. package/dist/web/server/services/worktrees.d.ts +24 -0
  325. package/dist/web/server/services/worktrees.d.ts.map +1 -0
  326. package/dist/web/server/services/worktrees.js +60 -0
  327. package/dist/web/server/services/worktrees.js.map +1 -0
  328. package/dist/web/server/websocket/handler.d.ts +41 -0
  329. package/dist/web/server/websocket/handler.d.ts.map +1 -0
  330. package/dist/web/server/websocket/handler.js +143 -0
  331. package/dist/web/server/websocket/handler.js.map +1 -0
  332. package/dist/worktree.d.ts +53 -0
  333. package/dist/worktree.d.ts.map +1 -0
  334. package/dist/worktree.js +489 -0
  335. package/dist/worktree.js.map +1 -0
  336. package/package.json +1 -1
@@ -0,0 +1,197 @@
1
+ import * as git from "../git";
2
+ import * as worktree from "../worktree";
3
+ /**
4
+ * BatchMergeService - Orchestrates batch merge operations
5
+ * @see specs/SPEC-ee33ca26/plan.md - Service layer architecture
6
+ */
7
+ export class BatchMergeService {
8
+ /**
9
+ * Determine source branch for merge (main > develop > master)
10
+ * @returns Source branch name
11
+ * @throws Error if no source branch found
12
+ * @see specs/SPEC-ee33ca26/spec.md - FR-004
13
+ */
14
+ async determineSourceBranch() {
15
+ const branches = await git.getLocalBranches();
16
+ const branchNames = branches.map((b) => b.name);
17
+ // Priority: main > develop > master
18
+ if (branchNames.includes("main")) {
19
+ return "main";
20
+ }
21
+ if (branchNames.includes("develop")) {
22
+ return "develop";
23
+ }
24
+ if (branchNames.includes("master")) {
25
+ return "master";
26
+ }
27
+ throw new Error("Unable to determine source branch");
28
+ }
29
+ /**
30
+ * Get target branches for merge (exclude main, develop, master)
31
+ * @returns Array of target branch names
32
+ * @see specs/SPEC-ee33ca26/spec.md - FR-003
33
+ */
34
+ async getTargetBranches() {
35
+ const branches = await git.getLocalBranches();
36
+ const excludedBranches = ["main", "develop", "master"];
37
+ return branches
38
+ .map((b) => b.name)
39
+ .filter((name) => !excludedBranches.includes(name));
40
+ }
41
+ /**
42
+ * Ensure worktree exists for target branch
43
+ * @param branchName - Target branch name
44
+ * @returns Worktree path
45
+ * @see specs/SPEC-ee33ca26/spec.md - FR-006
46
+ */
47
+ async ensureWorktree(branchName) {
48
+ const worktrees = await worktree.listAdditionalWorktrees();
49
+ const existingWorktree = worktrees.find((w) => w.path.includes(branchName.replace(/\//g, "-")));
50
+ if (existingWorktree) {
51
+ return existingWorktree.path;
52
+ }
53
+ // Create new worktree
54
+ const repoRoot = await git.getRepositoryRoot();
55
+ const worktreePath = await worktree.generateWorktreePath(repoRoot, branchName);
56
+ await worktree.createWorktree({
57
+ branchName,
58
+ worktreePath,
59
+ repoRoot,
60
+ isNewBranch: false,
61
+ baseBranch: "",
62
+ });
63
+ return worktreePath;
64
+ }
65
+ /**
66
+ * Merge source branch into target branch
67
+ * @param branchName - Target branch name
68
+ * @param sourceBranch - Source branch name
69
+ * @param config - Batch merge configuration
70
+ * @returns Merge status for the branch
71
+ * @see specs/SPEC-ee33ca26/spec.md - FR-007, FR-008
72
+ */
73
+ async mergeBranch(branchName, sourceBranch, config) {
74
+ const startTime = Date.now();
75
+ let worktreeCreated = false;
76
+ try {
77
+ // Ensure worktree exists
78
+ const worktrees = await worktree.listAdditionalWorktrees();
79
+ const worktreePath = await this.ensureWorktree(branchName);
80
+ worktreeCreated = !worktrees.some((w) => w.path === worktreePath);
81
+ // Execute merge
82
+ await git.mergeFromBranch(worktreePath, sourceBranch, config.dryRun);
83
+ // Check for conflicts
84
+ const hasConflict = await git.hasMergeConflict(worktreePath);
85
+ if (hasConflict) {
86
+ await git.abortMerge(worktreePath);
87
+ return {
88
+ branchName,
89
+ status: "skipped",
90
+ worktreeCreated,
91
+ durationSeconds: (Date.now() - startTime) / 1000,
92
+ };
93
+ }
94
+ // Rollback dry-run merge
95
+ if (config.dryRun) {
96
+ await git.resetToHead(worktreePath);
97
+ }
98
+ // Auto-push after successful merge
99
+ let pushStatus = "not_executed";
100
+ if (config.autoPush && !config.dryRun) {
101
+ try {
102
+ const currentBranch = await git.getCurrentBranchName(worktreePath);
103
+ await git.pushBranchToRemote(worktreePath, currentBranch, config.remote || "origin");
104
+ pushStatus = "success";
105
+ }
106
+ catch {
107
+ // Push failure should not fail the merge
108
+ pushStatus = "failed";
109
+ }
110
+ }
111
+ return {
112
+ branchName,
113
+ status: "success",
114
+ pushStatus,
115
+ worktreeCreated,
116
+ durationSeconds: (Date.now() - startTime) / 1000,
117
+ };
118
+ }
119
+ catch (error) {
120
+ // Check if it's a merge conflict
121
+ const hasConflict = await git.hasMergeConflict(await this.ensureWorktree(branchName));
122
+ if (hasConflict) {
123
+ try {
124
+ await git.abortMerge(await this.ensureWorktree(branchName));
125
+ }
126
+ catch {
127
+ // Ignore abort errors
128
+ }
129
+ return {
130
+ branchName,
131
+ status: "skipped",
132
+ worktreeCreated,
133
+ durationSeconds: (Date.now() - startTime) / 1000,
134
+ };
135
+ }
136
+ return {
137
+ branchName,
138
+ status: "failed",
139
+ error: error instanceof Error ? error.message : String(error),
140
+ worktreeCreated,
141
+ durationSeconds: (Date.now() - startTime) / 1000,
142
+ };
143
+ }
144
+ }
145
+ /**
146
+ * Execute batch merge for all target branches
147
+ * @param config - Batch merge configuration
148
+ * @param onProgress - Progress callback function
149
+ * @returns Batch merge result
150
+ * @see specs/SPEC-ee33ca26/spec.md - FR-001 to FR-015
151
+ */
152
+ async executeBatchMerge(config, onProgress) {
153
+ const startTime = Date.now();
154
+ const statuses = [];
155
+ // Fetch latest from remote
156
+ await git.fetchAllRemotes();
157
+ const totalBranches = config.targetBranches.length;
158
+ for (let i = 0; i < totalBranches; i++) {
159
+ const branchName = config.targetBranches[i] || "";
160
+ const elapsedSeconds = (Date.now() - startTime) / 1000;
161
+ // Report progress
162
+ if (onProgress) {
163
+ const progress = {
164
+ currentBranch: branchName,
165
+ currentIndex: i,
166
+ totalBranches,
167
+ percentage: Math.floor((i / totalBranches) * 100),
168
+ elapsedSeconds,
169
+ currentPhase: "merge",
170
+ };
171
+ onProgress(progress);
172
+ }
173
+ // Merge branch
174
+ if (branchName) {
175
+ const status = await this.mergeBranch(branchName, config.sourceBranch, config);
176
+ statuses.push(status);
177
+ }
178
+ }
179
+ // Calculate summary
180
+ const summary = {
181
+ totalCount: statuses.length,
182
+ successCount: statuses.filter((s) => s.status === "success").length,
183
+ skippedCount: statuses.filter((s) => s.status === "skipped").length,
184
+ failedCount: statuses.filter((s) => s.status === "failed").length,
185
+ pushedCount: 0,
186
+ pushFailedCount: 0,
187
+ };
188
+ return {
189
+ statuses,
190
+ summary,
191
+ totalDurationSeconds: (Date.now() - startTime) / 1000,
192
+ cancelled: false,
193
+ config,
194
+ };
195
+ }
196
+ }
197
+ //# sourceMappingURL=BatchMergeService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchMergeService.js","sourceRoot":"","sources":["../../src/services/BatchMergeService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { WorktreeConfig } from "../worktree.js";
2
+ /**
3
+ * WorktreeService interface for dependency injection
4
+ */
5
+ export interface WorktreeService {
6
+ worktreeExists: (branch: string) => Promise<string | null>;
7
+ generateWorktreePath: (repoRoot: string, branch: string) => Promise<string>;
8
+ createWorktree: (config: WorktreeConfig) => Promise<void>;
9
+ }
10
+ export interface EnsureWorktreeOptions {
11
+ baseBranch?: string;
12
+ isNewBranch?: boolean;
13
+ }
14
+ /**
15
+ * WorktreeOrchestrator - Manages worktree existence checks and creation
16
+ *
17
+ * Responsibility:
18
+ * - Check if worktree exists for a given branch
19
+ * - Create worktree if it doesn't exist
20
+ * - Return worktree path
21
+ */
22
+ export declare class WorktreeOrchestrator {
23
+ private worktreeService;
24
+ constructor(worktreeService?: WorktreeService);
25
+ /**
26
+ * Ensure worktree exists for the given branch
27
+ * If worktree exists, return its path
28
+ * If worktree doesn't exist, create it and return the path
29
+ *
30
+ * @param branch - Branch name
31
+ * @param repoRoot - Repository root path
32
+ * @param options - Creation options (base branch, new branch flag)
33
+ * @returns Worktree path
34
+ */
35
+ ensureWorktree(branch: string, repoRoot: string, options?: EnsureWorktreeOptions): Promise<string>;
36
+ }
37
+ //# sourceMappingURL=WorktreeOrchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorktreeOrchestrator.d.ts","sourceRoot":"","sources":["../../src/services/WorktreeOrchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AASrD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,eAAe,CAAkB;gBAE7B,eAAe,CAAC,EAAE,eAAe;IAQ7C;;;;;;;;;OASG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC;CA0DnB"}
@@ -0,0 +1,74 @@
1
+ import { worktreeExists, generateWorktreePath, createWorktree, } from "../worktree.js";
2
+ import { getCurrentBranch } from "../git.js";
3
+ import chalk from "chalk";
4
+ /**
5
+ * WorktreeOrchestrator - Manages worktree existence checks and creation
6
+ *
7
+ * Responsibility:
8
+ * - Check if worktree exists for a given branch
9
+ * - Create worktree if it doesn't exist
10
+ * - Return worktree path
11
+ */
12
+ export class WorktreeOrchestrator {
13
+ worktreeService;
14
+ constructor(worktreeService) {
15
+ this.worktreeService = worktreeService || {
16
+ worktreeExists,
17
+ generateWorktreePath,
18
+ createWorktree,
19
+ };
20
+ }
21
+ /**
22
+ * Ensure worktree exists for the given branch
23
+ * If worktree exists, return its path
24
+ * If worktree doesn't exist, create it and return the path
25
+ *
26
+ * @param branch - Branch name
27
+ * @param repoRoot - Repository root path
28
+ * @param options - Creation options (base branch, new branch flag)
29
+ * @returns Worktree path
30
+ */
31
+ async ensureWorktree(branch, repoRoot, options = {}) {
32
+ const baseBranch = options.baseBranch ?? "main";
33
+ const isNewBranch = options.isNewBranch ?? false;
34
+ // Check if selected branch is current branch
35
+ const currentBranch = await getCurrentBranch();
36
+ if (currentBranch === branch) {
37
+ // Current branch selected: use repository root
38
+ console.log(chalk.gray(` ℹ️ Current branch '${branch}' selected - using repository root`));
39
+ return repoRoot;
40
+ }
41
+ // Check if worktree already exists
42
+ const existingPath = await this.worktreeService.worktreeExists(branch);
43
+ if (existingPath) {
44
+ return existingPath;
45
+ }
46
+ // Generate worktree path
47
+ const worktreePath = await this.worktreeService.generateWorktreePath(repoRoot, branch);
48
+ try {
49
+ // Create worktree (or branch)
50
+ await this.worktreeService.createWorktree({
51
+ branchName: branch,
52
+ worktreePath,
53
+ repoRoot,
54
+ isNewBranch,
55
+ baseBranch,
56
+ });
57
+ return worktreePath;
58
+ }
59
+ catch (error) {
60
+ const message = error instanceof Error ? error.message : String(error ?? "");
61
+ const normalized = message.toLowerCase();
62
+ const alreadyExists = normalized.includes("already checked out") ||
63
+ normalized.includes("already exists");
64
+ if (alreadyExists) {
65
+ const fallbackPath = await this.worktreeService.worktreeExists(branch);
66
+ if (fallbackPath) {
67
+ return fallbackPath;
68
+ }
69
+ }
70
+ throw error;
71
+ }
72
+ }
73
+ }
74
+ //# sourceMappingURL=WorktreeOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorktreeOrchestrator.js","sourceRoot":"","sources":["../../src/services/WorktreeOrchestrator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAgB1B;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IACvB,eAAe,CAAkB;IAEzC,YAAY,eAAiC;QAC3C,IAAI,CAAC,eAAe,GAAG,eAAe,IAAI;YACxC,cAAc;YACd,oBAAoB;YACpB,cAAc;SACf,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,cAAc,CAClB,MAAc,EACd,QAAgB,EAChB,UAAiC,EAAE;QAEnC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;QAChD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;QAEjD,6CAA6C;QAC7C,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC/C,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;YAC7B,+CAA+C;YAC/C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,0BAA0B,MAAM,oCAAoC,CACrE,CACF,CAAC;YACF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,mCAAmC;QACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAEvE,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,yBAAyB;QACzB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAClE,QAAQ,EACR,MAAM,CACP,CAAC;QAEF,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;gBACxC,UAAU,EAAE,MAAM;gBAClB,YAAY;gBACZ,QAAQ;gBACR,WAAW;gBACX,UAAU;aACX,CAAC,CAAC;YAEH,OAAO,YAAY,CAAC;QACtB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,aAAa,GACjB,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC;gBAC1C,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAExC,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBACvE,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,YAAY,CAAC;gBACtB,CAAC;YACH,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ export type PackageManager = "bun" | "pnpm" | "npm";
2
+ interface DetectedPackageManager {
3
+ manager: PackageManager;
4
+ lockfile: string;
5
+ command: [string, ...string[]];
6
+ }
7
+ export type DependencySkipReason = "missing-lockfile" | "missing-binary" | "install-failed" | "lockfile-access-error" | "unknown-error";
8
+ export type DependencyInstallResult = {
9
+ skipped: false;
10
+ manager: PackageManager;
11
+ lockfile: string;
12
+ } | {
13
+ skipped: true;
14
+ manager: PackageManager | null;
15
+ lockfile: string | null;
16
+ reason: DependencySkipReason;
17
+ message?: string;
18
+ };
19
+ export declare class DependencyInstallError extends Error {
20
+ cause?: unknown | undefined;
21
+ constructor(message: string, cause?: unknown | undefined);
22
+ }
23
+ export declare function detectPackageManager(worktreePath: string): Promise<DetectedPackageManager | null>;
24
+ export declare function installDependenciesForWorktree(worktreePath: string): Promise<DependencyInstallResult>;
25
+ export {};
26
+ //# sourceMappingURL=dependency-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-installer.d.ts","sourceRoot":"","sources":["../../src/services/dependency-installer.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAQpD,UAAU,sBAAsB;IAC9B,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,oBAAoB,GAC5B,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,eAAe,CAAC;AAEpB,MAAM,MAAM,uBAAuB,GAC/B;IACE,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN,qBAAa,sBAAuB,SAAQ,KAAK;IAGtC,KAAK,CAAC,EAAE,OAAO;gBADtB,OAAO,EAAE,MAAM,EACR,KAAK,CAAC,EAAE,OAAO,YAAA;CAKzB;AAyCD,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAexC;AAED,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,uBAAuB,CAAC,CAwFlC"}
@@ -0,0 +1,139 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import { execa } from "execa";
4
+ import { startSpinner } from "../utils/spinner.js";
5
+ export class DependencyInstallError extends Error {
6
+ cause;
7
+ constructor(message, cause) {
8
+ super(message);
9
+ this.cause = cause;
10
+ this.name = "DependencyInstallError";
11
+ }
12
+ }
13
+ const INSTALL_CANDIDATES = [
14
+ {
15
+ manager: "bun",
16
+ lockfile: "bun.lock",
17
+ command: ["bun", "install", "--frozen-lockfile"],
18
+ },
19
+ {
20
+ manager: "pnpm",
21
+ lockfile: "pnpm-lock.yaml",
22
+ command: ["pnpm", "install", "--frozen-lockfile"],
23
+ },
24
+ {
25
+ manager: "npm",
26
+ lockfile: "package-lock.json",
27
+ command: ["npm", "ci"],
28
+ },
29
+ {
30
+ manager: "npm",
31
+ lockfile: "package.json",
32
+ command: ["npm", "install"],
33
+ },
34
+ ];
35
+ async function fileExists(targetPath) {
36
+ try {
37
+ await fs.access(targetPath);
38
+ return true;
39
+ }
40
+ catch (error) {
41
+ const code = error?.code;
42
+ if (code === "ENOENT") {
43
+ return false;
44
+ }
45
+ throw new DependencyInstallError(`Lockfile access failed: ${targetPath} (${code ?? "unknown"})`, error);
46
+ }
47
+ }
48
+ export async function detectPackageManager(worktreePath) {
49
+ const normalized = path.resolve(worktreePath);
50
+ for (const candidate of INSTALL_CANDIDATES) {
51
+ const fullPath = path.join(normalized, candidate.lockfile);
52
+ if (await fileExists(fullPath)) {
53
+ return {
54
+ manager: candidate.manager,
55
+ lockfile: fullPath,
56
+ command: candidate.command,
57
+ };
58
+ }
59
+ }
60
+ return null;
61
+ }
62
+ export async function installDependenciesForWorktree(worktreePath) {
63
+ let detection = null;
64
+ try {
65
+ detection = await detectPackageManager(worktreePath);
66
+ }
67
+ catch (error) {
68
+ if (error instanceof DependencyInstallError) {
69
+ return {
70
+ skipped: true,
71
+ manager: null,
72
+ lockfile: null,
73
+ reason: "lockfile-access-error",
74
+ message: error.message,
75
+ };
76
+ }
77
+ return {
78
+ skipped: true,
79
+ manager: null,
80
+ lockfile: null,
81
+ reason: "unknown-error",
82
+ message: error instanceof Error ? error.message : String(error),
83
+ };
84
+ }
85
+ if (!detection) {
86
+ return {
87
+ skipped: true,
88
+ manager: null,
89
+ lockfile: null,
90
+ reason: "missing-lockfile",
91
+ };
92
+ }
93
+ const [binary, ...args] = detection.command;
94
+ const spinner = startSpinner(`Installing dependencies via ${detection.manager} (${path.basename(detection.lockfile)})`);
95
+ try {
96
+ await execa(binary, args, {
97
+ cwd: worktreePath,
98
+ stdout: "inherit",
99
+ stderr: "inherit",
100
+ });
101
+ }
102
+ catch (error) {
103
+ const code = error?.code;
104
+ if (code === "ENOENT") {
105
+ console.warn(`Package manager '${binary}' was not found; skipping automatic install.`);
106
+ return {
107
+ skipped: true,
108
+ manager: detection.manager,
109
+ lockfile: detection.lockfile,
110
+ reason: "missing-binary",
111
+ };
112
+ }
113
+ const messageParts = [
114
+ `Dependency installation failed (${detection.manager}).`,
115
+ `Command: ${binary} ${args.join(" ")}`,
116
+ ];
117
+ const stderr = error?.stderr;
118
+ if (stderr) {
119
+ messageParts.push(stderr.trim());
120
+ }
121
+ const failureMessage = messageParts.join("\n");
122
+ return {
123
+ skipped: true,
124
+ manager: detection.manager,
125
+ lockfile: detection.lockfile,
126
+ reason: "install-failed",
127
+ message: failureMessage,
128
+ };
129
+ }
130
+ finally {
131
+ spinner();
132
+ }
133
+ return {
134
+ skipped: false,
135
+ manager: detection.manager,
136
+ lockfile: detection.lockfile,
137
+ };
138
+ }
139
+ //# sourceMappingURL=dependency-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-installer.js","sourceRoot":"","sources":["../../src/services/dependency-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { GitRepository } from "../repositories/git.repository.js";
2
+ import { BranchInfo } from "../cli/ui/types.js";
3
+ /**
4
+ * Git操作のビジネスロジックを管理するService
5
+ */
6
+ export declare class GitService {
7
+ private readonly repository;
8
+ constructor(repository: GitRepository);
9
+ isValidRepository(): Promise<boolean>;
10
+ getAllBranches(): Promise<BranchInfo[]>;
11
+ private getLocalBranchesInfo;
12
+ private getRemoteBranchesInfo;
13
+ private getBranchType;
14
+ createFeatureBranch(taskName: string, baseBranch: string): Promise<string>;
15
+ deleteBranch(branchName: string, options?: {
16
+ force?: boolean;
17
+ remote?: boolean;
18
+ }): Promise<void>;
19
+ hasUncommittedChanges(workdir?: string): Promise<boolean>;
20
+ getChangedFilesCount(workdir?: string): Promise<number>;
21
+ commitAllChanges(message: string): Promise<void>;
22
+ pushChanges(branchName: string): Promise<void>;
23
+ stashChanges(message?: string): Promise<void>;
24
+ discardAllChanges(): Promise<void>;
25
+ fetchRemoteUpdates(): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=git.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.service.d.ts","sourceRoot":"","sources":["../../src/services/git.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;GAEG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,aAAa;IAEhD,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAmB/B,oBAAoB;YAUpB,qBAAqB;IAUnC,OAAO,CAAC,aAAa;IASf,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IAMZ,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,GACA,OAAO,CAAC,IAAI,CAAC;IAQV,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzD,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;CAG1C"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Git操作のビジネスロジックを管理するService
3
+ */
4
+ export class GitService {
5
+ repository;
6
+ constructor(repository) {
7
+ this.repository = repository;
8
+ }
9
+ async isValidRepository() {
10
+ return await this.repository.isRepository();
11
+ }
12
+ async getAllBranches() {
13
+ const [localBranches, remoteBranches, currentBranch] = await Promise.all([
14
+ this.getLocalBranchesInfo(),
15
+ this.getRemoteBranchesInfo(),
16
+ this.repository.getCurrentBranch(),
17
+ ]);
18
+ // 現在のブランチ情報を設定
19
+ if (currentBranch) {
20
+ localBranches.forEach((branch) => {
21
+ if (branch.name === currentBranch) {
22
+ branch.isCurrent = true;
23
+ }
24
+ });
25
+ }
26
+ return [...localBranches, ...remoteBranches];
27
+ }
28
+ async getLocalBranchesInfo() {
29
+ const branches = await this.repository.getBranches({ remote: false });
30
+ return branches.map((name) => ({
31
+ name,
32
+ type: "local",
33
+ branchType: this.getBranchType(name),
34
+ isCurrent: false,
35
+ }));
36
+ }
37
+ async getRemoteBranchesInfo() {
38
+ const branches = await this.repository.getBranches({ remote: true });
39
+ return branches.map((name) => ({
40
+ name,
41
+ type: "remote",
42
+ branchType: this.getBranchType(name.replace(/^origin\//, "")),
43
+ isCurrent: false,
44
+ }));
45
+ }
46
+ getBranchType(branchName) {
47
+ if (branchName.startsWith("feature/"))
48
+ return "feature";
49
+ if (branchName.startsWith("hotfix/"))
50
+ return "hotfix";
51
+ if (branchName.startsWith("release/"))
52
+ return "release";
53
+ if (branchName === "main" || branchName === "master")
54
+ return "main";
55
+ if (branchName === "develop" || branchName === "dev")
56
+ return "develop";
57
+ return "other";
58
+ }
59
+ async createFeatureBranch(taskName, baseBranch) {
60
+ const branchName = `feature/${taskName}`;
61
+ await this.repository.createBranch(branchName, baseBranch);
62
+ return branchName;
63
+ }
64
+ async deleteBranch(branchName, options) {
65
+ if (options?.remote) {
66
+ await this.repository.deleteRemoteBranch(branchName);
67
+ }
68
+ else {
69
+ await this.repository.deleteBranch(branchName, options?.force);
70
+ }
71
+ }
72
+ async hasUncommittedChanges(workdir) {
73
+ return await this.repository.hasChanges(workdir);
74
+ }
75
+ async getChangedFilesCount(workdir) {
76
+ return await this.repository.getChangedFilesCount(workdir);
77
+ }
78
+ async commitAllChanges(message) {
79
+ await this.repository.add(".");
80
+ await this.repository.commit(message, { all: true });
81
+ }
82
+ async pushChanges(branchName) {
83
+ await this.repository.push({ upstream: true, branch: branchName });
84
+ }
85
+ async stashChanges(message) {
86
+ await this.repository.stash(message);
87
+ }
88
+ async discardAllChanges() {
89
+ await this.repository.checkout(".");
90
+ }
91
+ async fetchRemoteUpdates() {
92
+ await this.repository.fetch({ all: true, prune: true });
93
+ }
94
+ }
95
+ //# sourceMappingURL=git.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.service.js","sourceRoot":"","sources":["../../src/services/git.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { GitHubRepository } from "../repositories/github.repository.js";
2
+ import type { PullRequest, MergedPullRequest } from "../cli/ui/types.js";
3
+ /**
4
+ * GitHub操作のビジネスロジックを管理するService
5
+ */
6
+ export declare class GitHubService {
7
+ private readonly repository;
8
+ constructor(repository: GitHubRepository);
9
+ isAvailable(): Promise<boolean>;
10
+ checkAuthentication(): Promise<boolean>;
11
+ getMergedPullRequests(): Promise<MergedPullRequest[]>;
12
+ getPullRequestByBranch(branchName: string): Promise<PullRequest | null>;
13
+ }
14
+ //# sourceMappingURL=github.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.service.d.ts","sourceRoot":"","sources":["../../src/services/github.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEzE;;GAEG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,gBAAgB;IAEnD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIvC,qBAAqB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAoBrD,sBAAsB,CAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;CAqB/B"}