mcp-agent-foundry 1.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 (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +477 -0
  3. package/dist/cli/install-skills.d.ts +11 -0
  4. package/dist/cli/install-skills.d.ts.map +1 -0
  5. package/dist/cli/install-skills.js +143 -0
  6. package/dist/cli/install-skills.js.map +1 -0
  7. package/dist/cli/recovery-commands.d.ts +41 -0
  8. package/dist/cli/recovery-commands.d.ts.map +1 -0
  9. package/dist/cli/recovery-commands.js +241 -0
  10. package/dist/cli/recovery-commands.js.map +1 -0
  11. package/dist/cli/setup-wizard.d.ts +25 -0
  12. package/dist/cli/setup-wizard.d.ts.map +1 -0
  13. package/dist/cli/setup-wizard.js +1417 -0
  14. package/dist/cli/setup-wizard.js.map +1 -0
  15. package/dist/cli/test-connection.d.ts +45 -0
  16. package/dist/cli/test-connection.d.ts.map +1 -0
  17. package/dist/cli/test-connection.js +317 -0
  18. package/dist/cli/test-connection.js.map +1 -0
  19. package/dist/cli.d.ts +75 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +704 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config/defaults.d.ts +57 -0
  24. package/dist/config/defaults.d.ts.map +1 -0
  25. package/dist/config/defaults.js +99 -0
  26. package/dist/config/defaults.js.map +1 -0
  27. package/dist/config/index.d.ts +14 -0
  28. package/dist/config/index.d.ts.map +1 -0
  29. package/dist/config/index.js +22 -0
  30. package/dist/config/index.js.map +1 -0
  31. package/dist/config/manager.d.ts +184 -0
  32. package/dist/config/manager.d.ts.map +1 -0
  33. package/dist/config/manager.js +347 -0
  34. package/dist/config/manager.js.map +1 -0
  35. package/dist/config/merger.d.ts +76 -0
  36. package/dist/config/merger.d.ts.map +1 -0
  37. package/dist/config/merger.js +189 -0
  38. package/dist/config/merger.js.map +1 -0
  39. package/dist/config/schema.d.ts +20 -0
  40. package/dist/config/schema.d.ts.map +1 -0
  41. package/dist/config/schema.js +20 -0
  42. package/dist/config/schema.js.map +1 -0
  43. package/dist/config/validator.d.ts +254 -0
  44. package/dist/config/validator.d.ts.map +1 -0
  45. package/dist/config/validator.js +363 -0
  46. package/dist/config/validator.js.map +1 -0
  47. package/dist/config/worktree-defaults.d.ts +23 -0
  48. package/dist/config/worktree-defaults.d.ts.map +1 -0
  49. package/dist/config/worktree-defaults.js +78 -0
  50. package/dist/config/worktree-defaults.js.map +1 -0
  51. package/dist/index.d.ts +8 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +44 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/mcp/tools/compare-agents.d.ts +25 -0
  56. package/dist/mcp/tools/compare-agents.d.ts.map +1 -0
  57. package/dist/mcp/tools/compare-agents.js +177 -0
  58. package/dist/mcp/tools/compare-agents.js.map +1 -0
  59. package/dist/mcp/tools/critique-plan.d.ts +26 -0
  60. package/dist/mcp/tools/critique-plan.d.ts.map +1 -0
  61. package/dist/mcp/tools/critique-plan.js +162 -0
  62. package/dist/mcp/tools/critique-plan.js.map +1 -0
  63. package/dist/mcp/tools/design-feedback.d.ts +26 -0
  64. package/dist/mcp/tools/design-feedback.d.ts.map +1 -0
  65. package/dist/mcp/tools/design-feedback.js +216 -0
  66. package/dist/mcp/tools/design-feedback.js.map +1 -0
  67. package/dist/mcp/tools/index.d.ts +50 -0
  68. package/dist/mcp/tools/index.d.ts.map +1 -0
  69. package/dist/mcp/tools/index.js +191 -0
  70. package/dist/mcp/tools/index.js.map +1 -0
  71. package/dist/mcp/tools/invoke-agent.d.ts +25 -0
  72. package/dist/mcp/tools/invoke-agent.d.ts.map +1 -0
  73. package/dist/mcp/tools/invoke-agent.js +141 -0
  74. package/dist/mcp/tools/invoke-agent.js.map +1 -0
  75. package/dist/mcp/tools/review-code.d.ts +25 -0
  76. package/dist/mcp/tools/review-code.d.ts.map +1 -0
  77. package/dist/mcp/tools/review-code.js +170 -0
  78. package/dist/mcp/tools/review-code.js.map +1 -0
  79. package/dist/mcp/tools/tasks/claim-next-task.d.ts +22 -0
  80. package/dist/mcp/tools/tasks/claim-next-task.d.ts.map +1 -0
  81. package/dist/mcp/tools/tasks/claim-next-task.js +203 -0
  82. package/dist/mcp/tools/tasks/claim-next-task.js.map +1 -0
  83. package/dist/mcp/tools/tasks/create-routed-task.d.ts +17 -0
  84. package/dist/mcp/tools/tasks/create-routed-task.d.ts.map +1 -0
  85. package/dist/mcp/tools/tasks/create-routed-task.js +178 -0
  86. package/dist/mcp/tools/tasks/create-routed-task.js.map +1 -0
  87. package/dist/mcp/tools/tasks/execute-pipeline.d.ts +22 -0
  88. package/dist/mcp/tools/tasks/execute-pipeline.d.ts.map +1 -0
  89. package/dist/mcp/tools/tasks/execute-pipeline.js +401 -0
  90. package/dist/mcp/tools/tasks/execute-pipeline.js.map +1 -0
  91. package/dist/mcp/tools/tasks/execute-task.d.ts +32 -0
  92. package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -0
  93. package/dist/mcp/tools/tasks/execute-task.js +284 -0
  94. package/dist/mcp/tools/tasks/execute-task.js.map +1 -0
  95. package/dist/mcp/tools/tasks/get-pipeline-status.d.ts +26 -0
  96. package/dist/mcp/tools/tasks/get-pipeline-status.d.ts.map +1 -0
  97. package/dist/mcp/tools/tasks/get-pipeline-status.js +460 -0
  98. package/dist/mcp/tools/tasks/get-pipeline-status.js.map +1 -0
  99. package/dist/mcp/tools/tasks/index.d.ts +36 -0
  100. package/dist/mcp/tools/tasks/index.d.ts.map +1 -0
  101. package/dist/mcp/tools/tasks/index.js +66 -0
  102. package/dist/mcp/tools/tasks/index.js.map +1 -0
  103. package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts +17 -0
  104. package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts.map +1 -0
  105. package/dist/mcp/tools/worktree/cleanup-worktrees.js +147 -0
  106. package/dist/mcp/tools/worktree/cleanup-worktrees.js.map +1 -0
  107. package/dist/mcp/tools/worktree/get-worktree-status.d.ts +17 -0
  108. package/dist/mcp/tools/worktree/get-worktree-status.d.ts.map +1 -0
  109. package/dist/mcp/tools/worktree/get-worktree-status.js +123 -0
  110. package/dist/mcp/tools/worktree/get-worktree-status.js.map +1 -0
  111. package/dist/mcp/tools/worktree/index.d.ts +41 -0
  112. package/dist/mcp/tools/worktree/index.d.ts.map +1 -0
  113. package/dist/mcp/tools/worktree/index.js +69 -0
  114. package/dist/mcp/tools/worktree/index.js.map +1 -0
  115. package/dist/mcp/tools/worktree/list-worktrees.d.ts +17 -0
  116. package/dist/mcp/tools/worktree/list-worktrees.d.ts.map +1 -0
  117. package/dist/mcp/tools/worktree/list-worktrees.js +136 -0
  118. package/dist/mcp/tools/worktree/list-worktrees.js.map +1 -0
  119. package/dist/mcp/tools/worktree/resolve-conflicts.d.ts +19 -0
  120. package/dist/mcp/tools/worktree/resolve-conflicts.d.ts.map +1 -0
  121. package/dist/mcp/tools/worktree/resolve-conflicts.js +228 -0
  122. package/dist/mcp/tools/worktree/resolve-conflicts.js.map +1 -0
  123. package/dist/mcp/transport/stdio.d.ts +13 -0
  124. package/dist/mcp/transport/stdio.d.ts.map +1 -0
  125. package/dist/mcp/transport/stdio.js +15 -0
  126. package/dist/mcp/transport/stdio.js.map +1 -0
  127. package/dist/observability/logger.d.ts +137 -0
  128. package/dist/observability/logger.d.ts.map +1 -0
  129. package/dist/observability/logger.js +235 -0
  130. package/dist/observability/logger.js.map +1 -0
  131. package/dist/observability/metrics.d.ts +250 -0
  132. package/dist/observability/metrics.d.ts.map +1 -0
  133. package/dist/observability/metrics.js +364 -0
  134. package/dist/observability/metrics.js.map +1 -0
  135. package/dist/persistence/index.d.ts +9 -0
  136. package/dist/persistence/index.d.ts.map +1 -0
  137. package/dist/persistence/index.js +9 -0
  138. package/dist/persistence/index.js.map +1 -0
  139. package/dist/persistence/state-schema.d.ts +116 -0
  140. package/dist/persistence/state-schema.d.ts.map +1 -0
  141. package/dist/persistence/state-schema.js +28 -0
  142. package/dist/persistence/state-schema.js.map +1 -0
  143. package/dist/persistence/state-store.d.ts +111 -0
  144. package/dist/persistence/state-store.d.ts.map +1 -0
  145. package/dist/persistence/state-store.js +291 -0
  146. package/dist/persistence/state-store.js.map +1 -0
  147. package/dist/providers/anthropic.d.ts +164 -0
  148. package/dist/providers/anthropic.d.ts.map +1 -0
  149. package/dist/providers/anthropic.js +500 -0
  150. package/dist/providers/anthropic.js.map +1 -0
  151. package/dist/providers/base.d.ts +151 -0
  152. package/dist/providers/base.d.ts.map +1 -0
  153. package/dist/providers/base.js +227 -0
  154. package/dist/providers/base.js.map +1 -0
  155. package/dist/providers/gemini.d.ts +85 -0
  156. package/dist/providers/gemini.d.ts.map +1 -0
  157. package/dist/providers/gemini.js +414 -0
  158. package/dist/providers/gemini.js.map +1 -0
  159. package/dist/providers/kimi.d.ts +19 -0
  160. package/dist/providers/kimi.d.ts.map +1 -0
  161. package/dist/providers/kimi.js +20 -0
  162. package/dist/providers/kimi.js.map +1 -0
  163. package/dist/providers/manager.d.ts +160 -0
  164. package/dist/providers/manager.d.ts.map +1 -0
  165. package/dist/providers/manager.js +264 -0
  166. package/dist/providers/manager.js.map +1 -0
  167. package/dist/providers/ollama.d.ts +83 -0
  168. package/dist/providers/ollama.d.ts.map +1 -0
  169. package/dist/providers/ollama.js +453 -0
  170. package/dist/providers/ollama.js.map +1 -0
  171. package/dist/providers/openai.d.ts +96 -0
  172. package/dist/providers/openai.d.ts.map +1 -0
  173. package/dist/providers/openai.js +457 -0
  174. package/dist/providers/openai.js.map +1 -0
  175. package/dist/providers/zai.d.ts +19 -0
  176. package/dist/providers/zai.d.ts.map +1 -0
  177. package/dist/providers/zai.js +20 -0
  178. package/dist/providers/zai.js.map +1 -0
  179. package/dist/router/context-manager.d.ts +2 -0
  180. package/dist/router/context-manager.d.ts.map +1 -0
  181. package/dist/router/context-manager.js +3 -0
  182. package/dist/router/context-manager.js.map +1 -0
  183. package/dist/router/engine.d.ts +169 -0
  184. package/dist/router/engine.d.ts.map +1 -0
  185. package/dist/router/engine.js +435 -0
  186. package/dist/router/engine.js.map +1 -0
  187. package/dist/router/pattern-executor.d.ts +317 -0
  188. package/dist/router/pattern-executor.d.ts.map +1 -0
  189. package/dist/router/pattern-executor.js +571 -0
  190. package/dist/router/pattern-executor.js.map +1 -0
  191. package/dist/router/role-resolver.d.ts +59 -0
  192. package/dist/router/role-resolver.d.ts.map +1 -0
  193. package/dist/router/role-resolver.js +95 -0
  194. package/dist/router/role-resolver.js.map +1 -0
  195. package/dist/server.d.ts +32 -0
  196. package/dist/server.d.ts.map +1 -0
  197. package/dist/server.js +223 -0
  198. package/dist/server.js.map +1 -0
  199. package/dist/startup.d.ts +78 -0
  200. package/dist/startup.d.ts.map +1 -0
  201. package/dist/startup.js +107 -0
  202. package/dist/startup.js.map +1 -0
  203. package/dist/tasks/coordinator.d.ts +141 -0
  204. package/dist/tasks/coordinator.d.ts.map +1 -0
  205. package/dist/tasks/coordinator.js +331 -0
  206. package/dist/tasks/coordinator.js.map +1 -0
  207. package/dist/tasks/index.d.ts +13 -0
  208. package/dist/tasks/index.d.ts.map +1 -0
  209. package/dist/tasks/index.js +13 -0
  210. package/dist/tasks/index.js.map +1 -0
  211. package/dist/tasks/persistent-state-coordinator.d.ts +89 -0
  212. package/dist/tasks/persistent-state-coordinator.d.ts.map +1 -0
  213. package/dist/tasks/persistent-state-coordinator.js +371 -0
  214. package/dist/tasks/persistent-state-coordinator.js.map +1 -0
  215. package/dist/tasks/pipeline-manager.d.ts +103 -0
  216. package/dist/tasks/pipeline-manager.d.ts.map +1 -0
  217. package/dist/tasks/pipeline-manager.js +358 -0
  218. package/dist/tasks/pipeline-manager.js.map +1 -0
  219. package/dist/tasks/state-coordinator.d.ts +79 -0
  220. package/dist/tasks/state-coordinator.d.ts.map +1 -0
  221. package/dist/tasks/state-coordinator.js +200 -0
  222. package/dist/tasks/state-coordinator.js.map +1 -0
  223. package/dist/tasks/worker-mode.d.ts +65 -0
  224. package/dist/tasks/worker-mode.d.ts.map +1 -0
  225. package/dist/tasks/worker-mode.js +208 -0
  226. package/dist/tasks/worker-mode.js.map +1 -0
  227. package/dist/translation/errors.d.ts +203 -0
  228. package/dist/translation/errors.d.ts.map +1 -0
  229. package/dist/translation/errors.js +477 -0
  230. package/dist/translation/errors.js.map +1 -0
  231. package/dist/translation/index.d.ts +12 -0
  232. package/dist/translation/index.d.ts.map +1 -0
  233. package/dist/translation/index.js +32 -0
  234. package/dist/translation/index.js.map +1 -0
  235. package/dist/translation/messages.d.ts +295 -0
  236. package/dist/translation/messages.d.ts.map +1 -0
  237. package/dist/translation/messages.js +557 -0
  238. package/dist/translation/messages.js.map +1 -0
  239. package/dist/translation/streaming.d.ts +226 -0
  240. package/dist/translation/streaming.d.ts.map +1 -0
  241. package/dist/translation/streaming.js +520 -0
  242. package/dist/translation/streaming.js.map +1 -0
  243. package/dist/translation/tools.d.ts +209 -0
  244. package/dist/translation/tools.d.ts.map +1 -0
  245. package/dist/translation/tools.js +331 -0
  246. package/dist/translation/tools.js.map +1 -0
  247. package/dist/types.d.ts +747 -0
  248. package/dist/types.d.ts.map +1 -0
  249. package/dist/types.js +86 -0
  250. package/dist/types.js.map +1 -0
  251. package/dist/utils/circuit-breaker.d.ts +175 -0
  252. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  253. package/dist/utils/circuit-breaker.js +315 -0
  254. package/dist/utils/circuit-breaker.js.map +1 -0
  255. package/dist/utils/env.d.ts +2 -0
  256. package/dist/utils/env.d.ts.map +1 -0
  257. package/dist/utils/env.js +3 -0
  258. package/dist/utils/env.js.map +1 -0
  259. package/dist/utils/git.d.ts +58 -0
  260. package/dist/utils/git.d.ts.map +1 -0
  261. package/dist/utils/git.js +197 -0
  262. package/dist/utils/git.js.map +1 -0
  263. package/dist/utils/index.d.ts +9 -0
  264. package/dist/utils/index.d.ts.map +1 -0
  265. package/dist/utils/index.js +9 -0
  266. package/dist/utils/index.js.map +1 -0
  267. package/dist/utils/merge-ordering.d.ts +45 -0
  268. package/dist/utils/merge-ordering.d.ts.map +1 -0
  269. package/dist/utils/merge-ordering.js +128 -0
  270. package/dist/utils/merge-ordering.js.map +1 -0
  271. package/dist/utils/retry.d.ts +106 -0
  272. package/dist/utils/retry.d.ts.map +1 -0
  273. package/dist/utils/retry.js +188 -0
  274. package/dist/utils/retry.js.map +1 -0
  275. package/dist/worktrees/branch-manager.d.ts +55 -0
  276. package/dist/worktrees/branch-manager.d.ts.map +1 -0
  277. package/dist/worktrees/branch-manager.js +129 -0
  278. package/dist/worktrees/branch-manager.js.map +1 -0
  279. package/dist/worktrees/conflict-handler.d.ts +72 -0
  280. package/dist/worktrees/conflict-handler.d.ts.map +1 -0
  281. package/dist/worktrees/conflict-handler.js +287 -0
  282. package/dist/worktrees/conflict-handler.js.map +1 -0
  283. package/dist/worktrees/conflict-parser.d.ts +28 -0
  284. package/dist/worktrees/conflict-parser.d.ts.map +1 -0
  285. package/dist/worktrees/conflict-parser.js +140 -0
  286. package/dist/worktrees/conflict-parser.js.map +1 -0
  287. package/dist/worktrees/index.d.ts +20 -0
  288. package/dist/worktrees/index.d.ts.map +1 -0
  289. package/dist/worktrees/index.js +20 -0
  290. package/dist/worktrees/index.js.map +1 -0
  291. package/dist/worktrees/instructions.d.ts +20 -0
  292. package/dist/worktrees/instructions.d.ts.map +1 -0
  293. package/dist/worktrees/instructions.js +84 -0
  294. package/dist/worktrees/instructions.js.map +1 -0
  295. package/dist/worktrees/manager.d.ts +76 -0
  296. package/dist/worktrees/manager.d.ts.map +1 -0
  297. package/dist/worktrees/manager.js +277 -0
  298. package/dist/worktrees/manager.js.map +1 -0
  299. package/dist/worktrees/pipeline-merge-orchestrator.d.ts +55 -0
  300. package/dist/worktrees/pipeline-merge-orchestrator.d.ts.map +1 -0
  301. package/dist/worktrees/pipeline-merge-orchestrator.js +221 -0
  302. package/dist/worktrees/pipeline-merge-orchestrator.js.map +1 -0
  303. package/dist/worktrees/pool.d.ts +95 -0
  304. package/dist/worktrees/pool.d.ts.map +1 -0
  305. package/dist/worktrees/pool.js +271 -0
  306. package/dist/worktrees/pool.js.map +1 -0
  307. package/dist/worktrees/recovery.d.ts +94 -0
  308. package/dist/worktrees/recovery.d.ts.map +1 -0
  309. package/dist/worktrees/recovery.js +371 -0
  310. package/dist/worktrees/recovery.js.map +1 -0
  311. package/dist/worktrees/resource-manager.d.ts +74 -0
  312. package/dist/worktrees/resource-manager.d.ts.map +1 -0
  313. package/dist/worktrees/resource-manager.js +228 -0
  314. package/dist/worktrees/resource-manager.js.map +1 -0
  315. package/package.json +88 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Worktree Manager for Agent Foundry
3
+ *
4
+ * Manages the lifecycle of git worktrees for parallel agent execution.
5
+ */
6
+ import { BranchManager } from './branch-manager.js';
7
+ import type { Worktree, WorktreeStatus, WorktreeConfig, WorktreeInstructions, WorktreeAllocationResult } from '../types.js';
8
+ export declare class WorktreeManager {
9
+ private readonly config;
10
+ private readonly branchManager;
11
+ private readonly repoPath;
12
+ private readonly logger;
13
+ private worktrees;
14
+ constructor(repoPath: string, config: WorktreeConfig);
15
+ /**
16
+ * Initialize the worktree manager
17
+ */
18
+ initialize(): Promise<void>;
19
+ /**
20
+ * Sync in-memory state with actual git worktrees
21
+ */
22
+ syncWorktrees(): Promise<void>;
23
+ /**
24
+ * Create a new worktree for a task
25
+ */
26
+ create(taskId: string, baseBranch?: string): Promise<Worktree>;
27
+ /**
28
+ * Assign a worktree to an agent
29
+ */
30
+ assign(worktreeId: string, agentId: string): Promise<Worktree>;
31
+ /**
32
+ * Mark worktree as active (agent is using it)
33
+ */
34
+ activate(worktreeId: string): Promise<Worktree>;
35
+ /**
36
+ * Release a worktree (task completed)
37
+ */
38
+ release(worktreeId: string): Promise<Worktree>;
39
+ /**
40
+ * Remove a worktree
41
+ */
42
+ remove(worktreeId: string, deleteBranch?: boolean): Promise<void>;
43
+ /**
44
+ * Get worktree by ID
45
+ */
46
+ get(worktreeId: string): Worktree | undefined;
47
+ /**
48
+ * Get worktree by task ID
49
+ */
50
+ getByTaskId(taskId: string): Worktree | undefined;
51
+ /**
52
+ * List all worktrees
53
+ */
54
+ list(): Worktree[];
55
+ /**
56
+ * List worktrees by status
57
+ */
58
+ listByStatus(status: WorktreeStatus): Worktree[];
59
+ /**
60
+ * Generate instructions for an agent to use a worktree
61
+ */
62
+ generateInstructions(worktree: Worktree): WorktreeInstructions;
63
+ /**
64
+ * Allocate a worktree for a task (create + assign + generate instructions)
65
+ */
66
+ allocate(taskId: string, agentId: string): Promise<WorktreeAllocationResult>;
67
+ /**
68
+ * Cleanup stale worktrees
69
+ */
70
+ cleanup(): Promise<number>;
71
+ /**
72
+ * Get the branch manager for advanced operations
73
+ */
74
+ getBranchManager(): BranchManager;
75
+ }
76
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/worktrees/manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAErB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAGxB,OAAO,CAAC,SAAS,CAAoC;gBAEzC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;IAYpD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBjC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BpC;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkCpE;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkBpE;;OAEG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAarD;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAcpD;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrE;;OAEG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI7C;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAOjD;;OAEG;IACH,IAAI,IAAI,QAAQ,EAAE;IAIlB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,EAAE;IAIhD;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,oBAAoB;IAsB9D;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAuBlF;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IA4BhC;;OAEG;IACH,gBAAgB,IAAI,aAAa;CAGlC"}
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Worktree Manager for Agent Foundry
3
+ *
4
+ * Manages the lifecycle of git worktrees for parallel agent execution.
5
+ */
6
+ import { randomUUID } from 'crypto';
7
+ import * as path from 'path';
8
+ import * as fs from 'fs/promises';
9
+ import { createWorktree, removeWorktree, listWorktrees, pruneWorktrees, isGitRepository, getRepoRoot } from '../utils/git.js';
10
+ import { BranchManager } from './branch-manager.js';
11
+ import { createLogger } from '../observability/logger.js';
12
+ export class WorktreeManager {
13
+ config;
14
+ branchManager;
15
+ repoPath;
16
+ logger;
17
+ // In-memory worktree state
18
+ worktrees = new Map();
19
+ constructor(repoPath, config) {
20
+ this.repoPath = repoPath;
21
+ this.config = config;
22
+ this.logger = createLogger({ name: 'worktree-manager' });
23
+ this.branchManager = new BranchManager({
24
+ repoPath,
25
+ defaultBaseBranch: config.git.defaultBaseBranch,
26
+ branchPattern: config.git.branchPattern,
27
+ });
28
+ }
29
+ /**
30
+ * Initialize the worktree manager
31
+ */
32
+ async initialize() {
33
+ // Verify we're in a git repository
34
+ if (!(await isGitRepository(this.repoPath))) {
35
+ throw new Error(`Not a git repository: ${this.repoPath}`);
36
+ }
37
+ // Get actual repo root
38
+ const repoRoot = await getRepoRoot(this.repoPath);
39
+ // Create base directory for worktrees if it doesn't exist
40
+ const worktreeBaseDir = path.join(repoRoot, this.config.baseDir);
41
+ await fs.mkdir(worktreeBaseDir, { recursive: true });
42
+ // Sync with existing worktrees
43
+ await this.syncWorktrees();
44
+ this.logger.info('WorktreeManager initialized', {
45
+ repoPath: repoRoot,
46
+ baseDir: this.config.baseDir,
47
+ existingWorktrees: this.worktrees.size,
48
+ });
49
+ }
50
+ /**
51
+ * Sync in-memory state with actual git worktrees
52
+ */
53
+ async syncWorktrees() {
54
+ const gitWorktrees = await listWorktrees(this.repoPath);
55
+ const repoRoot = await getRepoRoot(this.repoPath);
56
+ const worktreeBaseDir = path.join(repoRoot, this.config.baseDir);
57
+ for (const gitWt of gitWorktrees) {
58
+ // Skip main worktree and worktrees outside our base directory
59
+ if (!gitWt.path.startsWith(worktreeBaseDir))
60
+ continue;
61
+ const id = path.basename(gitWt.path);
62
+ if (!this.worktrees.has(id)) {
63
+ // Discovered existing worktree - add to state
64
+ this.worktrees.set(id, {
65
+ id,
66
+ path: gitWt.path,
67
+ branch: gitWt.branch || '',
68
+ baseBranch: this.config.git.defaultBaseBranch,
69
+ status: 'stale', // Mark as stale since we don't know its state
70
+ createdAt: Date.now(),
71
+ lastActivityAt: Date.now(),
72
+ });
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * Create a new worktree for a task
78
+ */
79
+ async create(taskId, baseBranch) {
80
+ const id = `task-${taskId}-${randomUUID().slice(0, 8)}`;
81
+ const branch = this.branchManager.generateBranchName(taskId);
82
+ const base = baseBranch || this.config.git.defaultBaseBranch;
83
+ const repoRoot = await getRepoRoot(this.repoPath);
84
+ const worktreePath = path.join(repoRoot, this.config.baseDir, id);
85
+ this.logger.info('Creating worktree', { id, branch, baseBranch: base, path: worktreePath });
86
+ // Check limits
87
+ if (this.worktrees.size >= this.config.limits.maxWorktrees) {
88
+ throw new Error(`Maximum worktrees (${this.config.limits.maxWorktrees}) reached`);
89
+ }
90
+ // Create the worktree
91
+ await createWorktree(this.repoPath, worktreePath, branch, base);
92
+ const worktree = {
93
+ id,
94
+ path: worktreePath,
95
+ branch,
96
+ baseBranch: base,
97
+ status: 'available',
98
+ taskId,
99
+ createdAt: Date.now(),
100
+ lastActivityAt: Date.now(),
101
+ };
102
+ this.worktrees.set(id, worktree);
103
+ this.logger.info('Worktree created', { id, branch, path: worktreePath });
104
+ return worktree;
105
+ }
106
+ /**
107
+ * Assign a worktree to an agent
108
+ */
109
+ async assign(worktreeId, agentId) {
110
+ const worktree = this.worktrees.get(worktreeId);
111
+ if (!worktree) {
112
+ throw new Error(`Worktree not found: ${worktreeId}`);
113
+ }
114
+ if (worktree.status !== 'available') {
115
+ throw new Error(`Worktree ${worktreeId} is not available (status: ${worktree.status})`);
116
+ }
117
+ worktree.status = 'assigned';
118
+ worktree.agentId = agentId;
119
+ worktree.lastActivityAt = Date.now();
120
+ this.logger.info('Worktree assigned', { worktreeId, agentId });
121
+ return worktree;
122
+ }
123
+ /**
124
+ * Mark worktree as active (agent is using it)
125
+ */
126
+ async activate(worktreeId) {
127
+ const worktree = this.worktrees.get(worktreeId);
128
+ if (!worktree) {
129
+ throw new Error(`Worktree not found: ${worktreeId}`);
130
+ }
131
+ worktree.status = 'active';
132
+ worktree.lastActivityAt = Date.now();
133
+ this.logger.info('Worktree activated', { worktreeId });
134
+ return worktree;
135
+ }
136
+ /**
137
+ * Release a worktree (task completed)
138
+ */
139
+ async release(worktreeId) {
140
+ const worktree = this.worktrees.get(worktreeId);
141
+ if (!worktree) {
142
+ throw new Error(`Worktree not found: ${worktreeId}`);
143
+ }
144
+ worktree.status = 'completing';
145
+ worktree.agentId = undefined;
146
+ worktree.lastActivityAt = Date.now();
147
+ this.logger.info('Worktree released', { worktreeId });
148
+ return worktree;
149
+ }
150
+ /**
151
+ * Remove a worktree
152
+ */
153
+ async remove(worktreeId, deleteBranch = false) {
154
+ const worktree = this.worktrees.get(worktreeId);
155
+ if (!worktree) {
156
+ throw new Error(`Worktree not found: ${worktreeId}`);
157
+ }
158
+ this.logger.info('Removing worktree', { worktreeId, deleteBranch });
159
+ // Remove git worktree
160
+ await removeWorktree(this.repoPath, worktree.path, true);
161
+ // Optionally delete the branch
162
+ if (deleteBranch) {
163
+ await this.branchManager.deleteBranch(worktree.branch, true);
164
+ }
165
+ this.worktrees.delete(worktreeId);
166
+ this.logger.info('Worktree removed', { worktreeId });
167
+ }
168
+ /**
169
+ * Get worktree by ID
170
+ */
171
+ get(worktreeId) {
172
+ return this.worktrees.get(worktreeId);
173
+ }
174
+ /**
175
+ * Get worktree by task ID
176
+ */
177
+ getByTaskId(taskId) {
178
+ for (const wt of this.worktrees.values()) {
179
+ if (wt.taskId === taskId)
180
+ return wt;
181
+ }
182
+ return undefined;
183
+ }
184
+ /**
185
+ * List all worktrees
186
+ */
187
+ list() {
188
+ return Array.from(this.worktrees.values());
189
+ }
190
+ /**
191
+ * List worktrees by status
192
+ */
193
+ listByStatus(status) {
194
+ return this.list().filter(wt => wt.status === status);
195
+ }
196
+ /**
197
+ * Generate instructions for an agent to use a worktree
198
+ */
199
+ generateInstructions(worktree) {
200
+ return {
201
+ workingDirectory: worktree.path,
202
+ branch: worktree.branch,
203
+ baseBranch: worktree.baseBranch,
204
+ commitPrefix: `[${worktree.taskId}]`,
205
+ instructions: `
206
+ You are working in an isolated git worktree.
207
+
208
+ WORKING DIRECTORY: ${worktree.path}
209
+ BRANCH: ${worktree.branch}
210
+ BASE BRANCH: ${worktree.baseBranch}
211
+
212
+ IMPORTANT:
213
+ 1. All file operations should be relative to ${worktree.path}
214
+ 2. Commit your changes with prefix: [${worktree.taskId}]
215
+ 3. Do NOT switch branches - stay on ${worktree.branch}
216
+ 4. Do NOT merge or rebase - that will be handled after your task completes
217
+ `.trim(),
218
+ };
219
+ }
220
+ /**
221
+ * Allocate a worktree for a task (create + assign + generate instructions)
222
+ */
223
+ async allocate(taskId, agentId) {
224
+ try {
225
+ const worktree = await this.create(taskId);
226
+ await this.assign(worktree.id, agentId);
227
+ await this.activate(worktree.id);
228
+ const instructions = this.generateInstructions(worktree);
229
+ return {
230
+ success: true,
231
+ worktree,
232
+ instructions,
233
+ };
234
+ }
235
+ catch (err) {
236
+ const message = err instanceof Error ? err.message : String(err);
237
+ this.logger.error('Failed to allocate worktree', { taskId, agentId, errorMessage: message });
238
+ return {
239
+ success: false,
240
+ error: message,
241
+ };
242
+ }
243
+ }
244
+ /**
245
+ * Cleanup stale worktrees
246
+ */
247
+ async cleanup() {
248
+ const staleThreshold = Date.now() - this.config.cleanup.staleThresholdMs;
249
+ let cleaned = 0;
250
+ for (const worktree of this.worktrees.values()) {
251
+ if ((worktree.status === 'stale' || worktree.status === 'available') &&
252
+ worktree.lastActivityAt < staleThreshold) {
253
+ try {
254
+ await this.remove(worktree.id, true);
255
+ cleaned++;
256
+ }
257
+ catch (error) {
258
+ this.logger.warn('Failed to cleanup worktree', {
259
+ worktreeId: worktree.id,
260
+ error: error instanceof Error ? error.message : String(error)
261
+ });
262
+ }
263
+ }
264
+ }
265
+ // Prune git worktree references
266
+ await pruneWorktrees(this.repoPath);
267
+ this.logger.info('Cleanup completed', { cleanedCount: cleaned });
268
+ return cleaned;
269
+ }
270
+ /**
271
+ * Get the branch manager for advanced operations
272
+ */
273
+ getBranchManager() {
274
+ return this.branchManager;
275
+ }
276
+ }
277
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/worktrees/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Pipeline Merge Orchestrator
3
+ *
4
+ * Orchestrates merging of pipeline step worktrees in dependency order.
5
+ * Handles conflict detection and provides merge results.
6
+ */
7
+ import { type StepDependency } from "../utils/merge-ordering.js";
8
+ import type { StepWorktreeAllocation, PipelineMergeResult } from "../types.js";
9
+ export interface MergeConflict {
10
+ stepId: string;
11
+ branch: string;
12
+ conflictedFiles: string[];
13
+ conflictMarkers?: Array<{
14
+ file: string;
15
+ startLine: number;
16
+ endLine: number;
17
+ }>;
18
+ }
19
+ export interface StepMergeResult {
20
+ stepId: string;
21
+ branch: string;
22
+ success: boolean;
23
+ mergeCommit?: string;
24
+ conflict?: MergeConflict;
25
+ error?: string;
26
+ }
27
+ export interface MergeOrchestratorConfig {
28
+ repoPath: string;
29
+ targetBranch: string;
30
+ strategy: "sequential" | "parallel-safe";
31
+ onConflict: "halt" | "skip" | "continue";
32
+ }
33
+ export declare class PipelineMergeOrchestrator {
34
+ private readonly config;
35
+ private readonly branchManager;
36
+ private readonly logger;
37
+ constructor(config: MergeOrchestratorConfig);
38
+ /**
39
+ * Check for merge conflicts between a branch and target without actually merging.
40
+ */
41
+ checkMergeConflicts(sourceBranch: string, targetBranch: string): Promise<MergeConflict | null>;
42
+ /**
43
+ * Merge a single step's branch into target.
44
+ */
45
+ mergeStep(stepId: string, allocation: StepWorktreeAllocation): Promise<StepMergeResult>;
46
+ /**
47
+ * Merge all pipeline worktrees in dependency order.
48
+ */
49
+ mergeInDependencyOrder(pipelineId: string, stepAllocations: Map<string, StepWorktreeAllocation>, steps: StepDependency[]): Promise<PipelineMergeResult>;
50
+ /**
51
+ * Delete branches after successful merge.
52
+ */
53
+ cleanupBranches(branches: string[]): Promise<void>;
54
+ }
55
+ //# sourceMappingURL=pipeline-merge-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-merge-orchestrator.d.ts","sourceRoot":"","sources":["../../src/worktrees/pipeline-merge-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,KAAK,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,YAAY,GAAG,eAAe,CAAC;IACzC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAC1C;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAEZ,MAAM,EAAE,uBAAuB;IAU3C;;OAEG;IACG,mBAAmB,CACvB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAoChC;;OAEG;IACG,SAAS,CACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,sBAAsB,GACjC,OAAO,CAAC,eAAe,CAAC;IAwE3B;;OAEG;IACG,sBAAsB,CAC1B,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,EACpD,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,mBAAmB,CAAC;IAyF/B;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAazD"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Pipeline Merge Orchestrator
3
+ *
4
+ * Orchestrates merging of pipeline step worktrees in dependency order.
5
+ * Handles conflict detection and provides merge results.
6
+ */
7
+ import { createGit } from "../utils/git.js";
8
+ import { BranchManager } from "./branch-manager.js";
9
+ import { computeMergeOrder } from "../utils/merge-ordering.js";
10
+ import { createLogger } from "../observability/logger.js";
11
+ export class PipelineMergeOrchestrator {
12
+ config;
13
+ branchManager;
14
+ logger;
15
+ constructor(config) {
16
+ this.config = config;
17
+ this.logger = createLogger({ name: "pipeline-merge-orchestrator" });
18
+ this.branchManager = new BranchManager({
19
+ repoPath: config.repoPath,
20
+ defaultBaseBranch: config.targetBranch,
21
+ branchPattern: "task/{taskId}",
22
+ });
23
+ }
24
+ /**
25
+ * Check for merge conflicts between a branch and target without actually merging.
26
+ */
27
+ async checkMergeConflicts(sourceBranch, targetBranch) {
28
+ const git = createGit(this.config.repoPath);
29
+ try {
30
+ // Ensure we're on target branch first
31
+ await git.checkout(targetBranch);
32
+ // Try a dry-run merge
33
+ await git.raw(["merge", "--no-commit", "--no-ff", sourceBranch]);
34
+ // If we get here, no conflicts - abort the merge
35
+ await git.raw(["merge", "--abort"]);
36
+ return null;
37
+ }
38
+ catch (error) {
39
+ // Check if it's a conflict
40
+ const status = await git.status();
41
+ if (status.conflicted.length > 0) {
42
+ // Abort the merge
43
+ try {
44
+ await git.raw(["merge", "--abort"]);
45
+ }
46
+ catch {
47
+ // Already aborted or not in merge state
48
+ }
49
+ return {
50
+ stepId: "", // Will be filled by caller
51
+ branch: sourceBranch,
52
+ conflictedFiles: status.conflicted,
53
+ };
54
+ }
55
+ // Some other error
56
+ throw error;
57
+ }
58
+ }
59
+ /**
60
+ * Merge a single step's branch into target.
61
+ */
62
+ async mergeStep(stepId, allocation) {
63
+ const git = createGit(this.config.repoPath);
64
+ this.logger.info("Merging step branch", {
65
+ stepId,
66
+ branch: allocation.branch,
67
+ targetBranch: this.config.targetBranch,
68
+ });
69
+ try {
70
+ // Ensure we're on target branch
71
+ await git.checkout(this.config.targetBranch);
72
+ // Check for conflicts first
73
+ const conflict = await this.checkMergeConflicts(allocation.branch, this.config.targetBranch);
74
+ if (conflict) {
75
+ conflict.stepId = stepId;
76
+ this.logger.warn("Merge conflict detected", {
77
+ stepId,
78
+ conflictedFiles: conflict.conflictedFiles,
79
+ });
80
+ return {
81
+ stepId,
82
+ branch: allocation.branch,
83
+ success: false,
84
+ conflict,
85
+ };
86
+ }
87
+ // Perform the actual merge
88
+ await git.merge([
89
+ allocation.branch,
90
+ "-m",
91
+ `Merge step ${stepId} (${allocation.branch})`,
92
+ ]);
93
+ // Get the merge commit hash
94
+ const log = await git.log({ maxCount: 1 });
95
+ const mergeCommit = log.latest?.hash;
96
+ this.logger.info("Step merged successfully", { stepId, mergeCommit });
97
+ return {
98
+ stepId,
99
+ branch: allocation.branch,
100
+ success: true,
101
+ mergeCommit,
102
+ };
103
+ }
104
+ catch (error) {
105
+ const message = error instanceof Error ? error.message : String(error);
106
+ this.logger.error("Merge failed", { stepId, errorMessage: message });
107
+ // Try to abort any in-progress merge
108
+ try {
109
+ await git.raw(["merge", "--abort"]);
110
+ }
111
+ catch {
112
+ // Ignore
113
+ }
114
+ return {
115
+ stepId,
116
+ branch: allocation.branch,
117
+ success: false,
118
+ error: message,
119
+ };
120
+ }
121
+ }
122
+ /**
123
+ * Merge all pipeline worktrees in dependency order.
124
+ */
125
+ async mergeInDependencyOrder(pipelineId, stepAllocations, steps) {
126
+ const mergeOrder = computeMergeOrder(steps);
127
+ const mergedSteps = [];
128
+ const conflicts = [];
129
+ this.logger.info("Starting pipeline merge", {
130
+ pipelineId,
131
+ totalSteps: stepAllocations.size,
132
+ mergeBatches: mergeOrder.length,
133
+ });
134
+ for (let batchIndex = 0; batchIndex < mergeOrder.length; batchIndex++) {
135
+ const batch = mergeOrder[batchIndex];
136
+ this.logger.info("Processing merge batch", { batchIndex, steps: batch });
137
+ for (const stepId of batch) {
138
+ const allocation = stepAllocations.get(stepId);
139
+ if (!allocation) {
140
+ this.logger.warn("No worktree allocation for step", { stepId });
141
+ continue;
142
+ }
143
+ // Skip steps that didn't need worktrees (reviewers, etc.)
144
+ if (allocation.status !== "completed") {
145
+ this.logger.debug("Skipping step with status", {
146
+ stepId,
147
+ status: allocation.status,
148
+ });
149
+ continue;
150
+ }
151
+ const result = await this.mergeStep(stepId, allocation);
152
+ if (result.success) {
153
+ mergedSteps.push({
154
+ stepId: result.stepId,
155
+ branch: result.branch,
156
+ mergeCommit: result.mergeCommit,
157
+ });
158
+ }
159
+ else if (result.conflict) {
160
+ conflicts.push({
161
+ stepId: result.stepId,
162
+ branch: result.branch,
163
+ conflictedFiles: result.conflict.conflictedFiles,
164
+ error: result.error,
165
+ });
166
+ if (this.config.onConflict === "halt") {
167
+ this.logger.warn("Halting merge due to conflict", { stepId });
168
+ break;
169
+ }
170
+ }
171
+ else if (result.error) {
172
+ conflicts.push({
173
+ stepId: result.stepId,
174
+ branch: result.branch,
175
+ conflictedFiles: [],
176
+ error: result.error,
177
+ });
178
+ if (this.config.onConflict === "halt") {
179
+ break;
180
+ }
181
+ }
182
+ }
183
+ // Check if we should stop due to conflicts
184
+ if (conflicts.length > 0 && this.config.onConflict === "halt") {
185
+ break;
186
+ }
187
+ }
188
+ const success = conflicts.length === 0;
189
+ this.logger.info("Pipeline merge completed", {
190
+ pipelineId,
191
+ success,
192
+ mergedCount: mergedSteps.length,
193
+ conflictCount: conflicts.length,
194
+ });
195
+ return {
196
+ pipelineId,
197
+ success,
198
+ mergedSteps,
199
+ conflicts,
200
+ completedAt: Date.now(),
201
+ };
202
+ }
203
+ /**
204
+ * Delete branches after successful merge.
205
+ */
206
+ async cleanupBranches(branches) {
207
+ for (const branch of branches) {
208
+ try {
209
+ await this.branchManager.deleteBranch(branch, true);
210
+ this.logger.debug("Deleted branch", { branch });
211
+ }
212
+ catch (error) {
213
+ this.logger.warn("Failed to delete branch", {
214
+ branch,
215
+ error: error instanceof Error ? error.message : String(error),
216
+ });
217
+ }
218
+ }
219
+ }
220
+ }
221
+ //# sourceMappingURL=pipeline-merge-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-merge-orchestrator.js","sourceRoot":"","sources":["../../src/worktrees/pipeline-merge-orchestrator.ts"],"names":[],"mappings":"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"}