agent-tower 0.1.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 (341) hide show
  1. package/dist/app.d.ts +2 -0
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +62 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +131 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/core/container.d.ts +11 -0
  10. package/dist/core/container.d.ts.map +1 -0
  11. package/dist/core/container.js +66 -0
  12. package/dist/core/container.js.map +1 -0
  13. package/dist/core/event-bus.d.ts +58 -0
  14. package/dist/core/event-bus.d.ts.map +1 -0
  15. package/dist/core/event-bus.js +29 -0
  16. package/dist/core/event-bus.js.map +1 -0
  17. package/dist/errors.d.ts +22 -0
  18. package/dist/errors.d.ts.map +1 -0
  19. package/dist/errors.js +36 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/executors/base.executor.d.ts +160 -0
  22. package/dist/executors/base.executor.d.ts.map +1 -0
  23. package/dist/executors/base.executor.js +122 -0
  24. package/dist/executors/base.executor.js.map +1 -0
  25. package/dist/executors/claude-code.executor.d.ts +78 -0
  26. package/dist/executors/claude-code.executor.d.ts.map +1 -0
  27. package/dist/executors/claude-code.executor.js +160 -0
  28. package/dist/executors/claude-code.executor.js.map +1 -0
  29. package/dist/executors/command-builder.d.ts +64 -0
  30. package/dist/executors/command-builder.d.ts.map +1 -0
  31. package/dist/executors/command-builder.js +144 -0
  32. package/dist/executors/command-builder.js.map +1 -0
  33. package/dist/executors/cursor-agent.executor.d.ts +57 -0
  34. package/dist/executors/cursor-agent.executor.d.ts.map +1 -0
  35. package/dist/executors/cursor-agent.executor.js +109 -0
  36. package/dist/executors/cursor-agent.executor.js.map +1 -0
  37. package/dist/executors/default-profiles.json +29 -0
  38. package/dist/executors/execution-env.d.ts +64 -0
  39. package/dist/executors/execution-env.d.ts.map +1 -0
  40. package/dist/executors/execution-env.js +97 -0
  41. package/dist/executors/execution-env.js.map +1 -0
  42. package/dist/executors/gemini-cli.executor.d.ts +55 -0
  43. package/dist/executors/gemini-cli.executor.d.ts.map +1 -0
  44. package/dist/executors/gemini-cli.executor.js +117 -0
  45. package/dist/executors/gemini-cli.executor.js.map +1 -0
  46. package/dist/executors/index.d.ts +49 -0
  47. package/dist/executors/index.d.ts.map +1 -0
  48. package/dist/executors/index.js +95 -0
  49. package/dist/executors/index.js.map +1 -0
  50. package/dist/executors/profiles.d.ts +61 -0
  51. package/dist/executors/profiles.d.ts.map +1 -0
  52. package/dist/executors/profiles.js +192 -0
  53. package/dist/executors/profiles.js.map +1 -0
  54. package/dist/git/git-cli.d.ts +59 -0
  55. package/dist/git/git-cli.d.ts.map +1 -0
  56. package/dist/git/git-cli.js +156 -0
  57. package/dist/git/git-cli.js.map +1 -0
  58. package/dist/git/worktree.manager.d.ts +166 -0
  59. package/dist/git/worktree.manager.d.ts.map +1 -0
  60. package/dist/git/worktree.manager.js +481 -0
  61. package/dist/git/worktree.manager.js.map +1 -0
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +37 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/mcp/context.d.ts +15 -0
  67. package/dist/mcp/context.d.ts.map +1 -0
  68. package/dist/mcp/context.js +19 -0
  69. package/dist/mcp/context.js.map +1 -0
  70. package/dist/mcp/http-client.d.ts +46 -0
  71. package/dist/mcp/http-client.d.ts.map +1 -0
  72. package/dist/mcp/http-client.js +100 -0
  73. package/dist/mcp/http-client.js.map +1 -0
  74. package/dist/mcp/index.d.ts +3 -0
  75. package/dist/mcp/index.d.ts.map +1 -0
  76. package/dist/mcp/index.js +36 -0
  77. package/dist/mcp/index.js.map +1 -0
  78. package/dist/mcp/server.d.ts +6 -0
  79. package/dist/mcp/server.d.ts.map +1 -0
  80. package/dist/mcp/server.js +32 -0
  81. package/dist/mcp/server.js.map +1 -0
  82. package/dist/mcp/tools/projects.d.ts +7 -0
  83. package/dist/mcp/tools/projects.d.ts.map +1 -0
  84. package/dist/mcp/tools/projects.js +12 -0
  85. package/dist/mcp/tools/projects.js.map +1 -0
  86. package/dist/mcp/tools/sessions.d.ts +7 -0
  87. package/dist/mcp/tools/sessions.d.ts.map +1 -0
  88. package/dist/mcp/tools/sessions.js +22 -0
  89. package/dist/mcp/tools/sessions.js.map +1 -0
  90. package/dist/mcp/tools/tasks.d.ts +7 -0
  91. package/dist/mcp/tools/tasks.d.ts.map +1 -0
  92. package/dist/mcp/tools/tasks.js +68 -0
  93. package/dist/mcp/tools/tasks.js.map +1 -0
  94. package/dist/mcp/tools/workspaces.d.ts +7 -0
  95. package/dist/mcp/tools/workspaces.d.ts.map +1 -0
  96. package/dist/mcp/tools/workspaces.js +45 -0
  97. package/dist/mcp/tools/workspaces.js.map +1 -0
  98. package/dist/mcp/types.d.ts +109 -0
  99. package/dist/mcp/types.d.ts.map +1 -0
  100. package/dist/mcp/types.js +55 -0
  101. package/dist/mcp/types.js.map +1 -0
  102. package/dist/middleware/tunnel-auth.d.ts +13 -0
  103. package/dist/middleware/tunnel-auth.d.ts.map +1 -0
  104. package/dist/middleware/tunnel-auth.js +39 -0
  105. package/dist/middleware/tunnel-auth.js.map +1 -0
  106. package/dist/output/__tests__/claude-code-parser-token.test.d.ts +2 -0
  107. package/dist/output/__tests__/claude-code-parser-token.test.d.ts.map +1 -0
  108. package/dist/output/__tests__/claude-code-parser-token.test.js +233 -0
  109. package/dist/output/__tests__/claude-code-parser-token.test.js.map +1 -0
  110. package/dist/output/__tests__/cursor-agent-parser-token.test.d.ts +2 -0
  111. package/dist/output/__tests__/cursor-agent-parser-token.test.d.ts.map +1 -0
  112. package/dist/output/__tests__/cursor-agent-parser-token.test.js +95 -0
  113. package/dist/output/__tests__/cursor-agent-parser-token.test.js.map +1 -0
  114. package/dist/output/__tests__/msg-store-token.test.d.ts +2 -0
  115. package/dist/output/__tests__/msg-store-token.test.d.ts.map +1 -0
  116. package/dist/output/__tests__/msg-store-token.test.js +38 -0
  117. package/dist/output/__tests__/msg-store-token.test.js.map +1 -0
  118. package/dist/output/claude-code-parser.d.ts +96 -0
  119. package/dist/output/claude-code-parser.d.ts.map +1 -0
  120. package/dist/output/claude-code-parser.js +498 -0
  121. package/dist/output/claude-code-parser.js.map +1 -0
  122. package/dist/output/cursor-agent-parser.d.ts +87 -0
  123. package/dist/output/cursor-agent-parser.d.ts.map +1 -0
  124. package/dist/output/cursor-agent-parser.js +476 -0
  125. package/dist/output/cursor-agent-parser.js.map +1 -0
  126. package/dist/output/index.d.ts +9 -0
  127. package/dist/output/index.d.ts.map +1 -0
  128. package/dist/output/index.js +13 -0
  129. package/dist/output/index.js.map +1 -0
  130. package/dist/output/msg-store.d.ts +110 -0
  131. package/dist/output/msg-store.d.ts.map +1 -0
  132. package/dist/output/msg-store.js +274 -0
  133. package/dist/output/msg-store.js.map +1 -0
  134. package/dist/output/types.d.ts +90 -0
  135. package/dist/output/types.d.ts.map +1 -0
  136. package/dist/output/types.js +93 -0
  137. package/dist/output/types.js.map +1 -0
  138. package/dist/output/utils/ansi.d.ts +8 -0
  139. package/dist/output/utils/ansi.d.ts.map +1 -0
  140. package/dist/output/utils/ansi.js +17 -0
  141. package/dist/output/utils/ansi.js.map +1 -0
  142. package/dist/output/utils/patch.d.ts +57 -0
  143. package/dist/output/utils/patch.d.ts.map +1 -0
  144. package/dist/output/utils/patch.js +113 -0
  145. package/dist/output/utils/patch.js.map +1 -0
  146. package/dist/pipeline/agent-pipeline.d.ts +28 -0
  147. package/dist/pipeline/agent-pipeline.d.ts.map +1 -0
  148. package/dist/pipeline/agent-pipeline.js +76 -0
  149. package/dist/pipeline/agent-pipeline.js.map +1 -0
  150. package/dist/routes/attachments.d.ts +3 -0
  151. package/dist/routes/attachments.d.ts.map +1 -0
  152. package/dist/routes/attachments.js +141 -0
  153. package/dist/routes/attachments.js.map +1 -0
  154. package/dist/routes/demo.d.ts +3 -0
  155. package/dist/routes/demo.d.ts.map +1 -0
  156. package/dist/routes/demo.js +152 -0
  157. package/dist/routes/demo.js.map +1 -0
  158. package/dist/routes/files.d.ts +3 -0
  159. package/dist/routes/files.d.ts.map +1 -0
  160. package/dist/routes/files.js +313 -0
  161. package/dist/routes/files.js.map +1 -0
  162. package/dist/routes/filesystem.d.ts +3 -0
  163. package/dist/routes/filesystem.d.ts.map +1 -0
  164. package/dist/routes/filesystem.js +126 -0
  165. package/dist/routes/filesystem.js.map +1 -0
  166. package/dist/routes/git.d.ts +3 -0
  167. package/dist/routes/git.d.ts.map +1 -0
  168. package/dist/routes/git.js +170 -0
  169. package/dist/routes/git.js.map +1 -0
  170. package/dist/routes/index.d.ts +3 -0
  171. package/dist/routes/index.d.ts.map +1 -0
  172. package/dist/routes/index.js +45 -0
  173. package/dist/routes/index.js.map +1 -0
  174. package/dist/routes/notifications.d.ts +10 -0
  175. package/dist/routes/notifications.d.ts.map +1 -0
  176. package/dist/routes/notifications.js +54 -0
  177. package/dist/routes/notifications.js.map +1 -0
  178. package/dist/routes/profiles.d.ts +12 -0
  179. package/dist/routes/profiles.d.ts.map +1 -0
  180. package/dist/routes/profiles.js +76 -0
  181. package/dist/routes/profiles.js.map +1 -0
  182. package/dist/routes/projects.d.ts +3 -0
  183. package/dist/routes/projects.d.ts.map +1 -0
  184. package/dist/routes/projects.js +94 -0
  185. package/dist/routes/projects.js.map +1 -0
  186. package/dist/routes/sessions.d.ts +12 -0
  187. package/dist/routes/sessions.d.ts.map +1 -0
  188. package/dist/routes/sessions.js +109 -0
  189. package/dist/routes/sessions.js.map +1 -0
  190. package/dist/routes/system.d.ts +3 -0
  191. package/dist/routes/system.d.ts.map +1 -0
  192. package/dist/routes/system.js +42 -0
  193. package/dist/routes/system.js.map +1 -0
  194. package/dist/routes/tasks.d.ts +3 -0
  195. package/dist/routes/tasks.d.ts.map +1 -0
  196. package/dist/routes/tasks.js +136 -0
  197. package/dist/routes/tasks.js.map +1 -0
  198. package/dist/routes/terminals.d.ts +3 -0
  199. package/dist/routes/terminals.d.ts.map +1 -0
  200. package/dist/routes/terminals.js +54 -0
  201. package/dist/routes/terminals.js.map +1 -0
  202. package/dist/routes/tunnel.d.ts +3 -0
  203. package/dist/routes/tunnel.d.ts.map +1 -0
  204. package/dist/routes/tunnel.js +36 -0
  205. package/dist/routes/tunnel.js.map +1 -0
  206. package/dist/routes/workspaces.d.ts +3 -0
  207. package/dist/routes/workspaces.d.ts.map +1 -0
  208. package/dist/routes/workspaces.js +171 -0
  209. package/dist/routes/workspaces.js.map +1 -0
  210. package/dist/services/commit-message.service.d.ts +32 -0
  211. package/dist/services/commit-message.service.d.ts.map +1 -0
  212. package/dist/services/commit-message.service.js +202 -0
  213. package/dist/services/commit-message.service.js.map +1 -0
  214. package/dist/services/notifications/feishu-channel.d.ts +9 -0
  215. package/dist/services/notifications/feishu-channel.d.ts.map +1 -0
  216. package/dist/services/notifications/feishu-channel.js +51 -0
  217. package/dist/services/notifications/feishu-channel.js.map +1 -0
  218. package/dist/services/notifications/index.d.ts +3 -0
  219. package/dist/services/notifications/index.d.ts.map +1 -0
  220. package/dist/services/notifications/index.js +2 -0
  221. package/dist/services/notifications/index.js.map +1 -0
  222. package/dist/services/notifications/notification.service.d.ts +10 -0
  223. package/dist/services/notifications/notification.service.d.ts.map +1 -0
  224. package/dist/services/notifications/notification.service.js +85 -0
  225. package/dist/services/notifications/notification.service.js.map +1 -0
  226. package/dist/services/notifications/os-channel.d.ts +8 -0
  227. package/dist/services/notifications/os-channel.d.ts.map +1 -0
  228. package/dist/services/notifications/os-channel.js +38 -0
  229. package/dist/services/notifications/os-channel.js.map +1 -0
  230. package/dist/services/notifications/types.d.ts +11 -0
  231. package/dist/services/notifications/types.d.ts.map +1 -0
  232. package/dist/services/notifications/types.js +2 -0
  233. package/dist/services/notifications/types.js.map +1 -0
  234. package/dist/services/project.service.d.ts +91 -0
  235. package/dist/services/project.service.d.ts.map +1 -0
  236. package/dist/services/project.service.js +138 -0
  237. package/dist/services/project.service.js.map +1 -0
  238. package/dist/services/session-manager.d.ts +164 -0
  239. package/dist/services/session-manager.d.ts.map +1 -0
  240. package/dist/services/session-manager.js +569 -0
  241. package/dist/services/session-manager.js.map +1 -0
  242. package/dist/services/task.service.d.ts +179 -0
  243. package/dist/services/task.service.d.ts.map +1 -0
  244. package/dist/services/task.service.js +281 -0
  245. package/dist/services/task.service.js.map +1 -0
  246. package/dist/services/terminal-manager.d.ts +64 -0
  247. package/dist/services/terminal-manager.d.ts.map +1 -0
  248. package/dist/services/terminal-manager.js +217 -0
  249. package/dist/services/terminal-manager.js.map +1 -0
  250. package/dist/services/tunnel.service.d.ts +16 -0
  251. package/dist/services/tunnel.service.d.ts.map +1 -0
  252. package/dist/services/tunnel.service.js +77 -0
  253. package/dist/services/tunnel.service.js.map +1 -0
  254. package/dist/services/workspace.service.d.ts +219 -0
  255. package/dist/services/workspace.service.d.ts.map +1 -0
  256. package/dist/services/workspace.service.js +351 -0
  257. package/dist/services/workspace.service.js.map +1 -0
  258. package/dist/socket/events.d.ts +2 -0
  259. package/dist/socket/events.d.ts.map +1 -0
  260. package/dist/socket/events.js +3 -0
  261. package/dist/socket/events.js.map +1 -0
  262. package/dist/socket/index.d.ts +20 -0
  263. package/dist/socket/index.d.ts.map +1 -0
  264. package/dist/socket/index.js +77 -0
  265. package/dist/socket/index.js.map +1 -0
  266. package/dist/socket/middleware/auth.d.ts +13 -0
  267. package/dist/socket/middleware/auth.d.ts.map +1 -0
  268. package/dist/socket/middleware/auth.js +29 -0
  269. package/dist/socket/middleware/auth.js.map +1 -0
  270. package/dist/socket/middleware/error-handler.d.ts +11 -0
  271. package/dist/socket/middleware/error-handler.d.ts.map +1 -0
  272. package/dist/socket/middleware/error-handler.js +39 -0
  273. package/dist/socket/middleware/error-handler.js.map +1 -0
  274. package/dist/socket/middleware/index.d.ts +3 -0
  275. package/dist/socket/middleware/index.d.ts.map +1 -0
  276. package/dist/socket/middleware/index.js +3 -0
  277. package/dist/socket/middleware/index.js.map +1 -0
  278. package/dist/socket/rooms.d.ts +30 -0
  279. package/dist/socket/rooms.d.ts.map +1 -0
  280. package/dist/socket/rooms.js +39 -0
  281. package/dist/socket/rooms.js.map +1 -0
  282. package/dist/socket/socket-gateway.d.ts +21 -0
  283. package/dist/socket/socket-gateway.d.ts.map +1 -0
  284. package/dist/socket/socket-gateway.js +173 -0
  285. package/dist/socket/socket-gateway.js.map +1 -0
  286. package/dist/types/index.d.ts +41 -0
  287. package/dist/types/index.d.ts.map +1 -0
  288. package/dist/types/index.js +41 -0
  289. package/dist/types/index.js.map +1 -0
  290. package/dist/utils/index.d.ts +12 -0
  291. package/dist/utils/index.d.ts.map +1 -0
  292. package/dist/utils/index.js +25 -0
  293. package/dist/utils/index.js.map +1 -0
  294. package/dist/web/assets/AgentDemoPage-WdWEQtyU.js +1 -0
  295. package/dist/web/assets/DemoPage-C4Z_ftHI.js +4 -0
  296. package/dist/web/assets/NotificationSettingsPage-FrLfgt9y.js +1 -0
  297. package/dist/web/assets/ProfileSettingsPage-Cs93rTRr.js +3 -0
  298. package/dist/web/assets/ProjectKanbanPage-BmlRVfzo.js +75 -0
  299. package/dist/web/assets/ProjectKanbanPage-G5OQeJvU.css +1 -0
  300. package/dist/web/assets/api-client-CEBkg5lt.js +1 -0
  301. package/dist/web/assets/circle-alert-BEozlsMd.js +1 -0
  302. package/dist/web/assets/code-block-OCS4YCEC-CGgYYS4A.js +2 -0
  303. package/dist/web/assets/folder-picker-BP3x3phB.js +1 -0
  304. package/dist/web/assets/index-BuAijQvi.js +13 -0
  305. package/dist/web/assets/index-CxV866Yg.css +1 -0
  306. package/dist/web/assets/loader-circle-yEIqsdJ1.js +1 -0
  307. package/dist/web/assets/mermaid-NOHMQCX5-CIqtI2jF.js +123 -0
  308. package/dist/web/assets/mermaid-NOHMQCX5-lI9o3AWT.css +1 -0
  309. package/dist/web/assets/modal-BoX2RXaV.js +1 -0
  310. package/dist/web/assets/query-keys-BD_s_Etj.js +1 -0
  311. package/dist/web/assets/use-profiles-Rh8rBsAt.js +1 -0
  312. package/dist/web/index.html +14 -0
  313. package/dist/web/vite.svg +1 -0
  314. package/node_modules/@agent-tower/shared/dist/dev-port.d.ts +12 -0
  315. package/node_modules/@agent-tower/shared/dist/dev-port.d.ts.map +1 -0
  316. package/node_modules/@agent-tower/shared/dist/dev-port.js +31 -0
  317. package/node_modules/@agent-tower/shared/dist/dev-port.js.map +1 -0
  318. package/node_modules/@agent-tower/shared/dist/index.d.ts +5 -0
  319. package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -0
  320. package/node_modules/@agent-tower/shared/dist/index.js +5 -0
  321. package/node_modules/@agent-tower/shared/dist/index.js.map +1 -0
  322. package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts +72 -0
  323. package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts.map +1 -0
  324. package/node_modules/@agent-tower/shared/dist/log-adapter.js +144 -0
  325. package/node_modules/@agent-tower/shared/dist/log-adapter.js.map +1 -0
  326. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +133 -0
  327. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -0
  328. package/node_modules/@agent-tower/shared/dist/socket/events.js +32 -0
  329. package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -0
  330. package/node_modules/@agent-tower/shared/dist/socket/index.d.ts +2 -0
  331. package/node_modules/@agent-tower/shared/dist/socket/index.d.ts.map +1 -0
  332. package/node_modules/@agent-tower/shared/dist/socket/index.js +2 -0
  333. package/node_modules/@agent-tower/shared/dist/socket/index.js.map +1 -0
  334. package/node_modules/@agent-tower/shared/dist/types.d.ts +168 -0
  335. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -0
  336. package/node_modules/@agent-tower/shared/dist/types.js +53 -0
  337. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -0
  338. package/node_modules/@agent-tower/shared/package.json +38 -0
  339. package/package.json +46 -0
  340. package/prisma/schema.prisma +130 -0
  341. package/scripts/postinstall.js +120 -0
@@ -0,0 +1,61 @@
1
+ /**
2
+ * ExecutorProfiles — 执行器配置管理
3
+ *
4
+ * 数据结构: { executors: { [AgentType]: { [variant]: config } } }
5
+ * - 内置默认配置 (default-profiles.json)
6
+ * - 用户自定义覆盖 (data 目录下 profiles.json)
7
+ * - 合并策略: 用户配置覆盖默认,但不能删除内置 executor
8
+ */
9
+ import { AgentType } from '../types/index.js';
10
+ /** 单个 variant 的配置,字段取决于 agent 类型 */
11
+ export type VariantConfig = Record<string, unknown>;
12
+ /** 某个 agent 的所有 variant 配置 */
13
+ export type AgentVariants = Record<string, VariantConfig>;
14
+ /** 完整的 profiles 结构 */
15
+ export interface ExecutorProfiles {
16
+ executors: Record<string, AgentVariants>;
17
+ }
18
+ /**
19
+ * 深度合并: 用户配置覆盖默认配置
20
+ * - 用户可以新增 executor / variant
21
+ * - 用户可以覆盖已有 variant 的配置
22
+ * - 不会删除默认的 executor 或 variant
23
+ */
24
+ export declare function mergeWithDefaults(defaults: ExecutorProfiles, overrides: ExecutorProfiles): ExecutorProfiles;
25
+ /**
26
+ * 加载 profiles(默认 + 用户覆盖合并)
27
+ */
28
+ export declare function loadProfiles(): ExecutorProfiles;
29
+ /**
30
+ * 获取当前 profiles(带缓存)
31
+ */
32
+ export declare function getProfiles(): ExecutorProfiles;
33
+ /**
34
+ * 重新加载 profiles
35
+ */
36
+ export declare function reloadProfiles(): ExecutorProfiles;
37
+ /**
38
+ * 获取某个 agent 的某个 variant 配置
39
+ */
40
+ export declare function getVariantConfig(agentType: AgentType | string, variant?: string): VariantConfig | null;
41
+ /**
42
+ * 获取某个 agent 的所有 variant 名称
43
+ */
44
+ export declare function getVariantNames(agentType: AgentType | string): string[];
45
+ /**
46
+ * 保存用户覆盖配置
47
+ */
48
+ export declare function saveProfiles(profiles: ExecutorProfiles): void;
49
+ /**
50
+ * 更新某个 variant 配置
51
+ */
52
+ export declare function setVariantConfig(agentType: AgentType | string, variant: string, config: VariantConfig): void;
53
+ /**
54
+ * 删除某个 variant 配置(不允许删除内置默认的 DEFAULT)
55
+ */
56
+ export declare function deleteVariantConfig(agentType: AgentType | string, variant: string): boolean;
57
+ /**
58
+ * 获取默认 profiles(不含用户覆盖)
59
+ */
60
+ export declare function getDefaultProfiles(): ExecutorProfiles;
61
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/executors/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAK9C,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE1D,sBAAsB;AACtB,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1C;AA4BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,gBAAgB,GAC1B,gBAAgB,CAmBlB;AAkCD;;GAEG;AACH,wBAAgB,YAAY,IAAI,gBAAgB,CAqB/C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,gBAAgB,CAK9C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,gBAAgB,CAGjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,GAAG,MAAM,EAC7B,OAAO,GAAE,MAAkB,GAC1B,aAAa,GAAG,IAAI,CAOtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE,CAKvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAc7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,GAAG,MAAM,EAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,GACpB,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,GAAG,MAAM,EAC7B,OAAO,EAAE,MAAM,GACd,OAAO,CAoBT;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,CAErD"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * ExecutorProfiles — 执行器配置管理
3
+ *
4
+ * 数据结构: { executors: { [AgentType]: { [variant]: config } } }
5
+ * - 内置默认配置 (default-profiles.json)
6
+ * - 用户自定义覆盖 (data 目录下 profiles.json)
7
+ * - 合并策略: 用户配置覆盖默认,但不能删除内置 executor
8
+ */
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import { fileURLToPath } from 'url';
12
+ // ─── Defaults ────────────────────────────────────────────────────
13
+ import { createRequire } from 'module';
14
+ const require = createRequire(import.meta.url);
15
+ const defaultProfilesJson = require('./default-profiles.json');
16
+ const DEFAULT_PROFILES = defaultProfilesJson;
17
+ // ─── State ───────────────────────────────────────────────────────
18
+ let cachedProfiles = null;
19
+ // ─── User overrides path ─────────────────────────────────────────
20
+ function getUserProfilesPath() {
21
+ if (process.env.AGENT_TOWER_DATA_DIR) {
22
+ return path.join(process.env.AGENT_TOWER_DATA_DIR, 'profiles.json');
23
+ }
24
+ // 开发模式回退: server 包根目录的 data 目录
25
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
26
+ const serverRoot = path.resolve(__dirname, '..', '..');
27
+ return path.join(serverRoot, 'data', 'profiles.json');
28
+ }
29
+ // ─── Core functions ──────────────────────────────────────────────
30
+ /**
31
+ * 深度合并: 用户配置覆盖默认配置
32
+ * - 用户可以新增 executor / variant
33
+ * - 用户可以覆盖已有 variant 的配置
34
+ * - 不会删除默认的 executor 或 variant
35
+ */
36
+ export function mergeWithDefaults(defaults, overrides) {
37
+ const merged = {
38
+ executors: { ...defaults.executors },
39
+ };
40
+ for (const [agentType, overrideVariants] of Object.entries(overrides.executors)) {
41
+ if (merged.executors[agentType]) {
42
+ // 合并 variant 级别
43
+ merged.executors[agentType] = {
44
+ ...merged.executors[agentType],
45
+ ...overrideVariants,
46
+ };
47
+ }
48
+ else {
49
+ // 新增的 agent 类型
50
+ merged.executors[agentType] = { ...overrideVariants };
51
+ }
52
+ }
53
+ return merged;
54
+ }
55
+ /**
56
+ * 计算用户覆盖部分(与默认不同的配置)
57
+ */
58
+ function computeOverrides(defaults, current) {
59
+ const overrides = { executors: {} };
60
+ for (const [agentType, variants] of Object.entries(current.executors)) {
61
+ const defaultVariants = defaults.executors[agentType];
62
+ if (!defaultVariants) {
63
+ // 整个 agent 是用户新增的
64
+ overrides.executors[agentType] = { ...variants };
65
+ continue;
66
+ }
67
+ for (const [variantName, config] of Object.entries(variants)) {
68
+ const defaultConfig = defaultVariants[variantName];
69
+ if (!defaultConfig || JSON.stringify(defaultConfig) !== JSON.stringify(config)) {
70
+ if (!overrides.executors[agentType]) {
71
+ overrides.executors[agentType] = {};
72
+ }
73
+ overrides.executors[agentType][variantName] = config;
74
+ }
75
+ }
76
+ }
77
+ return overrides;
78
+ }
79
+ /**
80
+ * 加载 profiles(默认 + 用户覆盖合并)
81
+ */
82
+ export function loadProfiles() {
83
+ const defaults = structuredClone(DEFAULT_PROFILES);
84
+ const userPath = getUserProfilesPath();
85
+ let userOverrides = null;
86
+ try {
87
+ if (fs.existsSync(userPath)) {
88
+ const content = fs.readFileSync(userPath, 'utf-8');
89
+ userOverrides = JSON.parse(content);
90
+ }
91
+ }
92
+ catch (e) {
93
+ console.error('[Profiles] Failed to load user profiles.json:', e);
94
+ }
95
+ if (userOverrides) {
96
+ cachedProfiles = mergeWithDefaults(defaults, userOverrides);
97
+ }
98
+ else {
99
+ cachedProfiles = defaults;
100
+ }
101
+ return cachedProfiles;
102
+ }
103
+ /**
104
+ * 获取当前 profiles(带缓存)
105
+ */
106
+ export function getProfiles() {
107
+ if (!cachedProfiles) {
108
+ return loadProfiles();
109
+ }
110
+ return cachedProfiles;
111
+ }
112
+ /**
113
+ * 重新加载 profiles
114
+ */
115
+ export function reloadProfiles() {
116
+ cachedProfiles = null;
117
+ return loadProfiles();
118
+ }
119
+ /**
120
+ * 获取某个 agent 的某个 variant 配置
121
+ */
122
+ export function getVariantConfig(agentType, variant = 'DEFAULT') {
123
+ const profiles = getProfiles();
124
+ const agentVariants = profiles.executors[agentType];
125
+ if (!agentVariants)
126
+ return null;
127
+ const normalizedVariant = variant.toUpperCase();
128
+ return agentVariants[normalizedVariant] ?? null;
129
+ }
130
+ /**
131
+ * 获取某个 agent 的所有 variant 名称
132
+ */
133
+ export function getVariantNames(agentType) {
134
+ const profiles = getProfiles();
135
+ const agentVariants = profiles.executors[agentType];
136
+ if (!agentVariants)
137
+ return [];
138
+ return Object.keys(agentVariants);
139
+ }
140
+ /**
141
+ * 保存用户覆盖配置
142
+ */
143
+ export function saveProfiles(profiles) {
144
+ const defaults = structuredClone(DEFAULT_PROFILES);
145
+ const overrides = computeOverrides(defaults, profiles);
146
+ const userPath = getUserProfilesPath();
147
+ const dir = path.dirname(userPath);
148
+ if (!fs.existsSync(dir)) {
149
+ fs.mkdirSync(dir, { recursive: true });
150
+ }
151
+ fs.writeFileSync(userPath, JSON.stringify(overrides, null, 2), 'utf-8');
152
+ // 更新缓存
153
+ cachedProfiles = profiles;
154
+ }
155
+ /**
156
+ * 更新某个 variant 配置
157
+ */
158
+ export function setVariantConfig(agentType, variant, config) {
159
+ const profiles = structuredClone(getProfiles());
160
+ const normalizedVariant = variant.toUpperCase();
161
+ if (!profiles.executors[agentType]) {
162
+ profiles.executors[agentType] = {};
163
+ }
164
+ profiles.executors[agentType][normalizedVariant] = config;
165
+ saveProfiles(profiles);
166
+ }
167
+ /**
168
+ * 删除某个 variant 配置(不允许删除内置默认的 DEFAULT)
169
+ */
170
+ export function deleteVariantConfig(agentType, variant) {
171
+ const normalizedVariant = variant.toUpperCase();
172
+ // 检查是否是内置默认配置
173
+ const defaultVariants = DEFAULT_PROFILES.executors[agentType];
174
+ if (defaultVariants && normalizedVariant in defaultVariants) {
175
+ throw new Error(`Cannot delete built-in variant '${normalizedVariant}' of '${agentType}'. You can override it instead.`);
176
+ }
177
+ const profiles = structuredClone(getProfiles());
178
+ const agentVariants = profiles.executors[agentType];
179
+ if (!agentVariants || !(normalizedVariant in agentVariants)) {
180
+ return false;
181
+ }
182
+ delete agentVariants[normalizedVariant];
183
+ saveProfiles(profiles);
184
+ return true;
185
+ }
186
+ /**
187
+ * 获取默认 profiles(不含用户覆盖)
188
+ */
189
+ export function getDefaultProfiles() {
190
+ return structuredClone(DEFAULT_PROFILES);
191
+ }
192
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/executors/profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { ConflictOp } from '@agent-tower/shared';
2
+ export declare class GitError extends Error {
3
+ code: string;
4
+ constructor(message: string, code?: string);
5
+ }
6
+ export declare class BranchNotFoundError extends GitError {
7
+ constructor(branchName: string);
8
+ }
9
+ export declare class BranchExistsError extends GitError {
10
+ constructor(branchName: string);
11
+ }
12
+ export declare class InvalidBranchNameError extends GitError {
13
+ constructor(branchName: string, reason?: string);
14
+ }
15
+ export declare class WorktreeNotFoundError extends GitError {
16
+ constructor(worktreePath: string);
17
+ }
18
+ export declare class WorktreeDirtyError extends GitError {
19
+ constructor(worktreePath: string);
20
+ }
21
+ export declare class MergeConflictError extends GitError {
22
+ conflictedFiles: string[];
23
+ conflictOp: ConflictOp;
24
+ constructor(conflictedFiles: string[], conflictOp?: ConflictOp);
25
+ }
26
+ export declare class RebaseInProgressError extends GitError {
27
+ constructor();
28
+ }
29
+ export declare class BranchesDivergedError extends GitError {
30
+ ahead: number;
31
+ behind: number;
32
+ constructor(taskBranch: string, baseBranch: string, ahead: number, behind: number);
33
+ }
34
+ /**
35
+ * Execute a git command in the given repository path.
36
+ * All git operations go through this single entry point for uniform error handling.
37
+ */
38
+ export declare function execGit(repoPath: string, args: string[], options?: {
39
+ timeout?: number;
40
+ }): Promise<string>;
41
+ /**
42
+ * Check that the `git` binary is available on PATH.
43
+ */
44
+ export declare function ensureGitAvailable(): Promise<void>;
45
+ /**
46
+ * Validate a git branch name.
47
+ * Follows rules from `git check-ref-format --branch`:
48
+ * - No double dots (..)
49
+ * - No ASCII control chars or space, ~, ^, :, ?, *, [, \
50
+ * - Cannot begin or end with a dot, or end with .lock
51
+ * - Cannot contain @{
52
+ * - Cannot be a single @
53
+ * - Each component cannot begin with a dot
54
+ */
55
+ export declare function isValidBranchName(name: string): {
56
+ valid: boolean;
57
+ reason?: string;
58
+ };
59
+ //# sourceMappingURL=git-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-cli.d.ts","sourceRoot":"","sources":["../../src/git/git-cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMjD,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,MAAM,CAAC;gBAED,OAAO,EAAE,MAAM,EAAE,IAAI,SAAc;CAKhD;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,UAAU,EAAE,MAAM;CAI/B;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,UAAU,EAAE,MAAM;CAI/B;AAED,qBAAa,sBAAuB,SAAQ,QAAQ;gBACtC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAOhD;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;gBACrC,YAAY,EAAE,MAAM;CAOjC;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,YAAY,EAAE,MAAM;CAOjC;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC;gBAEX,eAAe,EAAE,MAAM,EAAE,EAAE,UAAU,GAAE,UAA6B;CAUjF;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;;CAKlD;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;gBAEH,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CASlF;AAID;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CASxD;AAID;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAgDnF"}
@@ -0,0 +1,156 @@
1
+ import { execFile } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { ConflictOp } from '@agent-tower/shared';
4
+ const execFileAsync = promisify(execFile);
5
+ // ─── Custom Error Types ───────────────────────────────────────────────────────
6
+ export class GitError extends Error {
7
+ code;
8
+ constructor(message, code = 'GIT_ERROR') {
9
+ super(message);
10
+ this.name = 'GitError';
11
+ this.code = code;
12
+ }
13
+ }
14
+ export class BranchNotFoundError extends GitError {
15
+ constructor(branchName) {
16
+ super(`Branch '${branchName}' does not exist`, 'BRANCH_NOT_FOUND');
17
+ this.name = 'BranchNotFoundError';
18
+ }
19
+ }
20
+ export class BranchExistsError extends GitError {
21
+ constructor(branchName) {
22
+ super(`Branch '${branchName}' already exists`, 'BRANCH_EXISTS');
23
+ this.name = 'BranchExistsError';
24
+ }
25
+ }
26
+ export class InvalidBranchNameError extends GitError {
27
+ constructor(branchName, reason) {
28
+ const msg = reason
29
+ ? `Invalid branch name '${branchName}': ${reason}`
30
+ : `Invalid branch name '${branchName}'`;
31
+ super(msg, 'INVALID_BRANCH_NAME');
32
+ this.name = 'InvalidBranchNameError';
33
+ }
34
+ }
35
+ export class WorktreeNotFoundError extends GitError {
36
+ constructor(worktreePath) {
37
+ super(`Worktree not found at '${worktreePath}'`, 'WORKTREE_NOT_FOUND');
38
+ this.name = 'WorktreeNotFoundError';
39
+ }
40
+ }
41
+ export class WorktreeDirtyError extends GitError {
42
+ constructor(worktreePath) {
43
+ super(`Worktree at '${worktreePath}' has uncommitted changes`, 'WORKTREE_DIRTY');
44
+ this.name = 'WorktreeDirtyError';
45
+ }
46
+ }
47
+ export class MergeConflictError extends GitError {
48
+ conflictedFiles;
49
+ conflictOp;
50
+ constructor(conflictedFiles, conflictOp = ConflictOp.MERGE) {
51
+ const fileList = conflictedFiles.join(', ');
52
+ super(`Merge conflict in files: ${fileList}`, 'MERGE_CONFLICT');
53
+ this.name = 'MergeConflictError';
54
+ this.conflictedFiles = conflictedFiles;
55
+ this.conflictOp = conflictOp;
56
+ }
57
+ }
58
+ export class RebaseInProgressError extends GitError {
59
+ constructor() {
60
+ super('Rebase in progress; resolve or abort it before retrying', 'REBASE_IN_PROGRESS');
61
+ this.name = 'RebaseInProgressError';
62
+ }
63
+ }
64
+ export class BranchesDivergedError extends GitError {
65
+ ahead;
66
+ behind;
67
+ constructor(taskBranch, baseBranch, ahead, behind) {
68
+ super(`Branch '${taskBranch}' has diverged from '${baseBranch}' (ahead: ${ahead}, behind: ${behind}). Rebase or update before merging.`, 'BRANCHES_DIVERGED');
69
+ this.name = 'BranchesDivergedError';
70
+ this.ahead = ahead;
71
+ this.behind = behind;
72
+ }
73
+ }
74
+ // ─── Git CLI Wrapper ──────────────────────────────────────────────────────────
75
+ /**
76
+ * Execute a git command in the given repository path.
77
+ * All git operations go through this single entry point for uniform error handling.
78
+ */
79
+ export async function execGit(repoPath, args, options) {
80
+ try {
81
+ const { stdout } = await execFileAsync('git', args, {
82
+ cwd: repoPath,
83
+ maxBuffer: 10 * 1024 * 1024, // 10 MB
84
+ timeout: options?.timeout ?? 30_000,
85
+ });
86
+ return stdout;
87
+ }
88
+ catch (err) {
89
+ const error = err;
90
+ const stderr = error.stderr ?? error.message ?? 'Unknown git error';
91
+ throw new GitError(`git ${args.join(' ')} failed: ${stderr.trim()}`, typeof error.code === 'string' ? error.code : 'GIT_EXEC_ERROR');
92
+ }
93
+ }
94
+ /**
95
+ * Check that the `git` binary is available on PATH.
96
+ */
97
+ export async function ensureGitAvailable() {
98
+ try {
99
+ await execFileAsync('git', ['--version']);
100
+ }
101
+ catch {
102
+ throw new GitError('git is not installed or not found on PATH', 'GIT_NOT_AVAILABLE');
103
+ }
104
+ }
105
+ // ─── Branch Name Validation ───────────────────────────────────────────────────
106
+ /**
107
+ * Validate a git branch name.
108
+ * Follows rules from `git check-ref-format --branch`:
109
+ * - No double dots (..)
110
+ * - No ASCII control chars or space, ~, ^, :, ?, *, [, \
111
+ * - Cannot begin or end with a dot, or end with .lock
112
+ * - Cannot contain @{
113
+ * - Cannot be a single @
114
+ * - Each component cannot begin with a dot
115
+ */
116
+ export function isValidBranchName(name) {
117
+ if (!name || name.trim().length === 0) {
118
+ return { valid: false, reason: 'branch name cannot be empty' };
119
+ }
120
+ if (name === '@') {
121
+ return { valid: false, reason: 'branch name cannot be a single @' };
122
+ }
123
+ if (name.includes('..')) {
124
+ return { valid: false, reason: 'branch name cannot contain ".."' };
125
+ }
126
+ if (name.includes('@{')) {
127
+ return { valid: false, reason: 'branch name cannot contain "@{"' };
128
+ }
129
+ if (name.endsWith('.lock')) {
130
+ return { valid: false, reason: 'branch name cannot end with ".lock"' };
131
+ }
132
+ if (name.startsWith('.') || name.endsWith('.')) {
133
+ return { valid: false, reason: 'branch name cannot start or end with "."' };
134
+ }
135
+ if (name.startsWith('-')) {
136
+ return { valid: false, reason: 'branch name cannot start with "-"' };
137
+ }
138
+ // No ASCII control chars, space, ~, ^, :, ?, *, [, backslash
139
+ // eslint-disable-next-line no-control-regex
140
+ const invalidChars = /[\x00-\x1f\x7f ~^:?*[\]\\]/;
141
+ if (invalidChars.test(name)) {
142
+ return { valid: false, reason: 'branch name contains invalid characters' };
143
+ }
144
+ // Each slash-separated component cannot begin with a dot
145
+ const components = name.split('/');
146
+ for (const comp of components) {
147
+ if (comp.startsWith('.')) {
148
+ return { valid: false, reason: `path component "${comp}" cannot start with "."` };
149
+ }
150
+ if (comp.length === 0) {
151
+ return { valid: false, reason: 'branch name cannot contain empty path components (consecutive slashes)' };
152
+ }
153
+ }
154
+ return { valid: true };
155
+ }
156
+ //# sourceMappingURL=git-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-cli.js","sourceRoot":"","sources":["../../src/git/git-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import type { GitOperationStatus } from '@agent-tower/shared';
2
+ export { GitError, BranchExistsError, BranchNotFoundError, InvalidBranchNameError, WorktreeDirtyError, MergeConflictError, BranchesDivergedError, RebaseInProgressError, } from './git-cli.js';
3
+ export interface WorktreeInfo {
4
+ /** Absolute path to the worktree directory */
5
+ path: string;
6
+ /** HEAD commit hash */
7
+ head: string;
8
+ /** Branch name (empty for detached HEAD) */
9
+ branch: string;
10
+ /** Whether this is the bare/main worktree */
11
+ bare: boolean;
12
+ }
13
+ export interface BranchStatus {
14
+ ahead: number;
15
+ behind: number;
16
+ }
17
+ export interface WorktreeStatus {
18
+ /** Number of staged + unstaged modified files */
19
+ changedFiles: number;
20
+ /** Number of untracked files */
21
+ untrackedFiles: number;
22
+ }
23
+ export interface DiffResult {
24
+ /** Full diff output */
25
+ diff: string;
26
+ /** Summary stat output */
27
+ stat: string;
28
+ }
29
+ export declare class WorktreeManager {
30
+ private repoPath;
31
+ private worktreeBaseDir;
32
+ constructor(repoPath: string);
33
+ /**
34
+ * List all worktrees with parsed metadata.
35
+ * Parses `git worktree list --porcelain` output.
36
+ */
37
+ listWorktrees(): Promise<WorktreeInfo[]>;
38
+ /**
39
+ * Get branch divergence status (ahead/behind) relative to a base branch.
40
+ */
41
+ getBranchStatus(branchName: string, baseBranch: string): Promise<BranchStatus>;
42
+ /**
43
+ * Get the working tree status of a worktree (changed + untracked file counts).
44
+ */
45
+ getWorktreeStatus(worktreePath: string): Promise<WorktreeStatus>;
46
+ /**
47
+ * Check whether a worktree has no uncommitted changes.
48
+ */
49
+ isWorktreeClean(worktreePath: string): Promise<boolean>;
50
+ /**
51
+ * Check whether a branch exists (local).
52
+ */
53
+ checkBranchExists(branchName: string): Promise<boolean>;
54
+ /**
55
+ * Create a new worktree with a new branch.
56
+ *
57
+ * - Validates branch name
58
+ * - Checks branch does not already exist
59
+ * - Creates the worktree base directory if needed
60
+ */
61
+ create(branchName: string): Promise<string>;
62
+ /**
63
+ * Remove a worktree. If the worktree does not exist, this is a no-op.
64
+ */
65
+ remove(worktreePath: string): Promise<void>;
66
+ /**
67
+ * Ensure a worktree exists for an existing branch. If the worktree directory
68
+ * is already valid, return its path. Otherwise, recreate it.
69
+ *
70
+ * Used when reactivating a MERGED workspace — the branch was preserved via
71
+ * update-ref but the worktree directory was removed.
72
+ *
73
+ * 参考: vibe-kanban crates/services/src/services/worktree_manager.rs:93-123
74
+ */
75
+ ensureWorktreeExists(branchName: string): Promise<string>;
76
+ /**
77
+ * Get the diff of a worktree branch against a base branch.
78
+ * Returns both the full diff and a stat summary.
79
+ */
80
+ getDiff(worktreePath: string, baseBranch: string): Promise<string>;
81
+ getDiff(worktreePath: string, baseBranch: string, options: {
82
+ withStat: true;
83
+ }): Promise<DiffResult>;
84
+ /**
85
+ * Squash-merge a worktree branch into the target branch.
86
+ *
87
+ * Performs the following steps:
88
+ * 1. Verify the worktree is clean
89
+ * 2. Check branch divergence — fail if base branch has advanced
90
+ * 3. Checkout target branch in the main repo
91
+ * 4. Execute `git merge --squash --no-commit <task_branch>`
92
+ * 5. Commit the squash merge
93
+ * 6. Remove the worktree and delete the task branch
94
+ */
95
+ merge(worktreePath: string, targetBranch: string, options?: {
96
+ commitMessage?: string;
97
+ }): Promise<{
98
+ sha: string;
99
+ taskBranch: string;
100
+ }>;
101
+ /**
102
+ * Prune stale worktree references.
103
+ */
104
+ prune(): Promise<void>;
105
+ /**
106
+ * Rebase the current branch in the worktree onto the latest base branch.
107
+ * Uses `git rebase --onto <baseBranch> <mergeBase> <taskBranch>`.
108
+ *
109
+ * - If a rebase is already in progress, throws RebaseInProgressError
110
+ * - On conflict, throws MergeConflictError with ConflictOp.REBASE (preserves rebase state)
111
+ * - On non-conflict failure, auto-aborts to keep repo clean
112
+ */
113
+ rebase(worktreePath: string, baseBranch: string): Promise<void>;
114
+ /**
115
+ * Get the current Git operation status of a worktree.
116
+ */
117
+ getGitOperationStatus(worktreePath: string, baseBranch: string): Promise<GitOperationStatus>;
118
+ /**
119
+ * Abort the current in-progress Git operation (rebase or merge).
120
+ * If no operation is in progress, this is a no-op.
121
+ */
122
+ abortOperation(worktreePath: string): Promise<void>;
123
+ /**
124
+ * Alias for `listWorktrees()`, returns just the paths.
125
+ * Kept for backward compatibility with existing callers.
126
+ */
127
+ list(): Promise<string[]>;
128
+ /**
129
+ * Assert that a branch exists; throw BranchNotFoundError if not.
130
+ */
131
+ private ensureBranchExists;
132
+ /**
133
+ * Parse the porcelain output of `git worktree list --porcelain`.
134
+ *
135
+ * Format:
136
+ * ```
137
+ * worktree /path/to/main
138
+ * HEAD abc123
139
+ * branch refs/heads/main
140
+ *
141
+ * worktree /path/to/wt
142
+ * HEAD def456
143
+ * branch refs/heads/feature
144
+ * ```
145
+ */
146
+ private parseWorktreeListOutput;
147
+ /**
148
+ * Get the list of conflicted files from a failed merge.
149
+ */
150
+ private getConflictedFiles;
151
+ /**
152
+ * Get the list of conflicted files in a specific worktree path.
153
+ */
154
+ private getConflictedFilesIn;
155
+ /**
156
+ * Check if a rebase is in progress in the given worktree.
157
+ * Detects by checking for rebase-merge or rebase-apply directories.
158
+ */
159
+ private isRebaseInProgress;
160
+ /**
161
+ * Check if a merge is in progress in the given worktree.
162
+ * Detects by verifying MERGE_HEAD exists.
163
+ */
164
+ private isMergeInProgress;
165
+ }
166
+ //# sourceMappingURL=worktree.manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.manager.d.ts","sourceRoot":"","sources":["../../src/git/worktree.manager.ts"],"names":[],"mappings":"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"}