agent-pipeline 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/CLAUDE.md +2 -3
  2. package/README.md +110 -55
  3. package/dist/cli/commands/agent/info.js +1 -1
  4. package/dist/cli/commands/agent/info.js.map +1 -1
  5. package/dist/cli/commands/agent/list.js +1 -1
  6. package/dist/cli/commands/agent/list.js.map +1 -1
  7. package/dist/cli/commands/agent/pull.d.ts +1 -0
  8. package/dist/cli/commands/agent/pull.d.ts.map +1 -1
  9. package/dist/cli/commands/agent/pull.js +67 -44
  10. package/dist/cli/commands/agent/pull.js.map +1 -1
  11. package/dist/cli/commands/cleanup.d.ts +4 -0
  12. package/dist/cli/commands/cleanup.d.ts.map +1 -1
  13. package/dist/cli/commands/cleanup.js +197 -37
  14. package/dist/cli/commands/cleanup.js.map +1 -1
  15. package/dist/cli/commands/history.d.ts.map +1 -1
  16. package/dist/cli/commands/history.js +3 -22
  17. package/dist/cli/commands/history.js.map +1 -1
  18. package/dist/cli/commands/hooks.d.ts +10 -0
  19. package/dist/cli/commands/hooks.d.ts.map +1 -0
  20. package/dist/cli/commands/hooks.js +88 -0
  21. package/dist/cli/commands/hooks.js.map +1 -0
  22. package/dist/cli/commands/init.d.ts +1 -6
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/init.js +173 -58
  25. package/dist/cli/commands/init.js.map +1 -1
  26. package/dist/cli/commands/loop-context.d.ts +2 -0
  27. package/dist/cli/commands/loop-context.d.ts.map +1 -0
  28. package/dist/cli/commands/loop-context.js +88 -0
  29. package/dist/cli/commands/loop-context.js.map +1 -0
  30. package/dist/cli/commands/pipeline/create.d.ts.map +1 -1
  31. package/dist/cli/commands/pipeline/create.js +156 -68
  32. package/dist/cli/commands/pipeline/create.js.map +1 -1
  33. package/dist/cli/commands/run.d.ts +1 -1
  34. package/dist/cli/commands/run.d.ts.map +1 -1
  35. package/dist/cli/commands/run.js +29 -5
  36. package/dist/cli/commands/run.js.map +1 -1
  37. package/dist/cli/commands/schema.d.ts +9 -0
  38. package/dist/cli/commands/schema.d.ts.map +1 -0
  39. package/dist/cli/commands/schema.js +541 -0
  40. package/dist/cli/commands/schema.js.map +1 -0
  41. package/dist/cli/commands/status.d.ts.map +1 -1
  42. package/dist/cli/commands/status.js +0 -6
  43. package/dist/cli/commands/status.js.map +1 -1
  44. package/dist/cli/help/index.d.ts +6 -0
  45. package/dist/cli/help/index.d.ts.map +1 -0
  46. package/dist/cli/help/index.js +538 -0
  47. package/dist/cli/help/index.js.map +1 -0
  48. package/dist/cli/help/types.d.ts +22 -0
  49. package/dist/cli/help/types.d.ts.map +1 -0
  50. package/dist/cli/help/types.js +2 -0
  51. package/dist/cli/help/types.js.map +1 -0
  52. package/dist/cli/hooks.d.ts +5 -1
  53. package/dist/cli/hooks.d.ts.map +1 -1
  54. package/dist/cli/hooks.js +106 -12
  55. package/dist/cli/hooks.js.map +1 -1
  56. package/dist/cli/templates/agents/code-review-agents/code-reviewer.md +46 -0
  57. package/dist/cli/templates/agents/code-review-agents/memory-doc-updater.md +189 -0
  58. package/dist/cli/templates/agents/code-review-agents/quality-checker.md +52 -0
  59. package/dist/cli/templates/agents/frontend-agents/brutalist_purist.md +563 -0
  60. package/dist/cli/templates/agents/frontend-agents/cyberpunk_hacker.md +824 -0
  61. package/dist/cli/templates/agents/frontend-agents/frontend-pipeline-ref.md +32 -0
  62. package/dist/cli/templates/agents/frontend-agents/indie_game_dev.md +715 -0
  63. package/dist/cli/templates/agents/frontend-agents/luxury_editorial.md +628 -0
  64. package/dist/cli/templates/agents/frontend-agents/product_owner.md +159 -0
  65. package/dist/cli/templates/agents/frontend-agents/retro_90s_webmaster.md +385 -0
  66. package/dist/cli/templates/agents/frontend-agents/showcase.md +362 -0
  67. package/dist/cli/templates/agents/frontend-agents/swiss_modernist.md +716 -0
  68. package/dist/cli/templates/agents/loop-agents/socratic-explorer.md +91 -0
  69. package/dist/cli/templates/instructions/handover.md +40 -0
  70. package/dist/cli/templates/instructions/loop.md +35 -0
  71. package/dist/cli/templates/pipelines/front-end-parallel-example.yml +81 -0
  72. package/dist/cli/templates/pipelines/loop-example.yml +25 -0
  73. package/dist/cli/templates/pipelines/post-commit-example.yml +49 -58
  74. package/dist/cli/templates/schema/pipeline-config.schema.json +400 -0
  75. package/dist/cli/templates/schema/pipeline-config.schema.yaml +301 -0
  76. package/dist/cli/utils/agent-importer.d.ts +1 -0
  77. package/dist/cli/utils/agent-importer.d.ts.map +1 -1
  78. package/dist/cli/utils/agent-importer.js +67 -0
  79. package/dist/cli/utils/agent-importer.js.map +1 -1
  80. package/dist/cli/utils/interactive-prompts.d.ts +4 -0
  81. package/dist/cli/utils/interactive-prompts.d.ts.map +1 -1
  82. package/dist/cli/utils/interactive-prompts.js +59 -13
  83. package/dist/cli/utils/interactive-prompts.js.map +1 -1
  84. package/dist/config/pipeline-loader.d.ts +4 -1
  85. package/dist/config/pipeline-loader.d.ts.map +1 -1
  86. package/dist/config/pipeline-loader.js +58 -0
  87. package/dist/config/pipeline-loader.js.map +1 -1
  88. package/dist/config/schema.d.ts +65 -35
  89. package/dist/config/schema.d.ts.map +1 -1
  90. package/dist/core/abort-controller.d.ts +16 -0
  91. package/dist/core/abort-controller.d.ts.map +1 -0
  92. package/dist/core/abort-controller.js +52 -0
  93. package/dist/core/abort-controller.js.map +1 -0
  94. package/dist/core/agent-query-runner.d.ts +0 -1
  95. package/dist/core/agent-query-runner.d.ts.map +1 -1
  96. package/dist/core/agent-query-runner.js +0 -22
  97. package/dist/core/agent-query-runner.js.map +1 -1
  98. package/dist/core/agent-runtimes/claude-code-headless-runtime.d.ts +5 -1
  99. package/dist/core/agent-runtimes/claude-code-headless-runtime.d.ts.map +1 -1
  100. package/dist/core/agent-runtimes/claude-code-headless-runtime.js +127 -12
  101. package/dist/core/agent-runtimes/claude-code-headless-runtime.js.map +1 -1
  102. package/dist/core/agent-runtimes/claude-sdk-runtime.d.ts +0 -2
  103. package/dist/core/agent-runtimes/claude-sdk-runtime.d.ts.map +1 -1
  104. package/dist/core/agent-runtimes/claude-sdk-runtime.js +1 -22
  105. package/dist/core/agent-runtimes/claude-sdk-runtime.js.map +1 -1
  106. package/dist/core/branch-manager.d.ts +3 -1
  107. package/dist/core/branch-manager.d.ts.map +1 -1
  108. package/dist/core/branch-manager.js +11 -1
  109. package/dist/core/branch-manager.js.map +1 -1
  110. package/dist/core/git-manager.d.ts +17 -1
  111. package/dist/core/git-manager.d.ts.map +1 -1
  112. package/dist/core/git-manager.js +147 -3
  113. package/dist/core/git-manager.js.map +1 -1
  114. package/dist/core/group-execution-orchestrator.d.ts +7 -13
  115. package/dist/core/group-execution-orchestrator.d.ts.map +1 -1
  116. package/dist/core/group-execution-orchestrator.js +53 -142
  117. package/dist/core/group-execution-orchestrator.js.map +1 -1
  118. package/dist/core/handover-manager.d.ts +24 -0
  119. package/dist/core/handover-manager.d.ts.map +1 -0
  120. package/dist/core/handover-manager.js +214 -0
  121. package/dist/core/handover-manager.js.map +1 -0
  122. package/dist/core/instruction-loader.d.ts +23 -0
  123. package/dist/core/instruction-loader.d.ts.map +1 -0
  124. package/dist/core/instruction-loader.js +112 -0
  125. package/dist/core/instruction-loader.js.map +1 -0
  126. package/dist/core/loop-state-manager.d.ts +12 -7
  127. package/dist/core/loop-state-manager.d.ts.map +1 -1
  128. package/dist/core/loop-state-manager.js +49 -3
  129. package/dist/core/loop-state-manager.js.map +1 -1
  130. package/dist/core/parallel-executor.d.ts +12 -3
  131. package/dist/core/parallel-executor.d.ts.map +1 -1
  132. package/dist/core/parallel-executor.js +92 -14
  133. package/dist/core/parallel-executor.js.map +1 -1
  134. package/dist/core/pipeline-finalizer.d.ts +12 -4
  135. package/dist/core/pipeline-finalizer.d.ts.map +1 -1
  136. package/dist/core/pipeline-finalizer.js +244 -33
  137. package/dist/core/pipeline-finalizer.js.map +1 -1
  138. package/dist/core/pipeline-initializer.d.ts +13 -5
  139. package/dist/core/pipeline-initializer.d.ts.map +1 -1
  140. package/dist/core/pipeline-initializer.js +53 -25
  141. package/dist/core/pipeline-initializer.js.map +1 -1
  142. package/dist/core/pipeline-runner.d.ts +13 -1
  143. package/dist/core/pipeline-runner.d.ts.map +1 -1
  144. package/dist/core/pipeline-runner.js +352 -60
  145. package/dist/core/pipeline-runner.js.map +1 -1
  146. package/dist/core/pr-creator.d.ts +0 -1
  147. package/dist/core/pr-creator.d.ts.map +1 -1
  148. package/dist/core/pr-creator.js +12 -4
  149. package/dist/core/pr-creator.js.map +1 -1
  150. package/dist/core/stage-executor.d.ts +17 -9
  151. package/dist/core/stage-executor.d.ts.map +1 -1
  152. package/dist/core/stage-executor.js +152 -166
  153. package/dist/core/stage-executor.js.map +1 -1
  154. package/dist/core/types/agent-runtime.d.ts +3 -2
  155. package/dist/core/types/agent-runtime.d.ts.map +1 -1
  156. package/dist/core/worktree-manager.d.ts +21 -0
  157. package/dist/core/worktree-manager.d.ts.map +1 -0
  158. package/dist/core/worktree-manager.js +133 -0
  159. package/dist/core/worktree-manager.js.map +1 -0
  160. package/dist/index.js +118 -112
  161. package/dist/index.js.map +1 -1
  162. package/dist/notifications/notification-manager.d.ts +1 -0
  163. package/dist/notifications/notification-manager.d.ts.map +1 -1
  164. package/dist/notifications/notification-manager.js +17 -3
  165. package/dist/notifications/notification-manager.js.map +1 -1
  166. package/dist/notifications/notifiers/local-notifier.d.ts.map +1 -1
  167. package/dist/notifications/notifiers/local-notifier.js +5 -2
  168. package/dist/notifications/notifiers/local-notifier.js.map +1 -1
  169. package/dist/notifications/notifiers/slack-notifier.d.ts.map +1 -1
  170. package/dist/notifications/notifiers/slack-notifier.js +39 -8
  171. package/dist/notifications/notifiers/slack-notifier.js.map +1 -1
  172. package/dist/notifications/types.d.ts +1 -1
  173. package/dist/notifications/types.d.ts.map +1 -1
  174. package/dist/ui/components/execution-group.d.ts.map +1 -1
  175. package/dist/ui/components/execution-group.js +1 -1
  176. package/dist/ui/components/execution-group.js.map +1 -1
  177. package/dist/ui/components/interactive-summary.d.ts +9 -0
  178. package/dist/ui/components/interactive-summary.d.ts.map +1 -0
  179. package/dist/ui/components/interactive-summary.js +166 -0
  180. package/dist/ui/components/interactive-summary.js.map +1 -0
  181. package/dist/ui/components/keyboard-hints.d.ts +12 -0
  182. package/dist/ui/components/keyboard-hints.d.ts.map +1 -0
  183. package/dist/ui/components/keyboard-hints.js +13 -0
  184. package/dist/ui/components/keyboard-hints.js.map +1 -0
  185. package/dist/ui/components/live-timer.d.ts +9 -0
  186. package/dist/ui/components/live-timer.d.ts.map +1 -0
  187. package/dist/ui/components/live-timer.js +25 -0
  188. package/dist/ui/components/live-timer.js.map +1 -0
  189. package/dist/ui/components/loop-iteration-history.d.ts +8 -0
  190. package/dist/ui/components/loop-iteration-history.d.ts.map +1 -0
  191. package/dist/ui/components/loop-iteration-history.js +106 -0
  192. package/dist/ui/components/loop-iteration-history.js.map +1 -0
  193. package/dist/ui/components/loop-session-summary.d.ts +9 -0
  194. package/dist/ui/components/loop-session-summary.d.ts.map +1 -0
  195. package/dist/ui/components/loop-session-summary.js +39 -0
  196. package/dist/ui/components/loop-session-summary.js.map +1 -0
  197. package/dist/ui/components/stage-row.d.ts +0 -1
  198. package/dist/ui/components/stage-row.d.ts.map +1 -1
  199. package/dist/ui/components/stage-row.js +5 -15
  200. package/dist/ui/components/stage-row.js.map +1 -1
  201. package/dist/ui/components/status-badge.d.ts.map +1 -1
  202. package/dist/ui/components/status-badge.js +1 -0
  203. package/dist/ui/components/status-badge.js.map +1 -1
  204. package/dist/ui/pipeline-ui.d.ts +1 -0
  205. package/dist/ui/pipeline-ui.d.ts.map +1 -1
  206. package/dist/ui/pipeline-ui.js +22 -18
  207. package/dist/ui/pipeline-ui.js.map +1 -1
  208. package/dist/utils/error-factory.d.ts.map +1 -1
  209. package/dist/utils/error-factory.js +10 -2
  210. package/dist/utils/error-factory.js.map +1 -1
  211. package/dist/utils/pipeline-formatter.d.ts +8 -2
  212. package/dist/utils/pipeline-formatter.d.ts.map +1 -1
  213. package/dist/utils/pipeline-formatter.js +30 -26
  214. package/dist/utils/pipeline-formatter.js.map +1 -1
  215. package/dist/utils/pipeline-logger.d.ts +19 -0
  216. package/dist/utils/pipeline-logger.d.ts.map +1 -0
  217. package/dist/utils/pipeline-logger.js +80 -0
  218. package/dist/utils/pipeline-logger.js.map +1 -0
  219. package/dist/utils/platform-opener.d.ts +4 -0
  220. package/dist/utils/platform-opener.d.ts.map +1 -0
  221. package/dist/utils/platform-opener.js +52 -0
  222. package/dist/utils/platform-opener.js.map +1 -0
  223. package/dist/validators/agent-validator.d.ts +10 -0
  224. package/dist/validators/agent-validator.d.ts.map +1 -0
  225. package/dist/validators/agent-validator.js +87 -0
  226. package/dist/validators/agent-validator.js.map +1 -0
  227. package/dist/validators/dag-validator.d.ts +9 -0
  228. package/dist/validators/dag-validator.d.ts.map +1 -0
  229. package/dist/validators/dag-validator.js +51 -0
  230. package/dist/validators/dag-validator.js.map +1 -0
  231. package/dist/validators/environment-validator.d.ts +9 -0
  232. package/dist/validators/environment-validator.d.ts.map +1 -0
  233. package/dist/validators/environment-validator.js +35 -0
  234. package/dist/validators/environment-validator.js.map +1 -0
  235. package/dist/validators/execution-validator.d.ts +8 -0
  236. package/dist/validators/execution-validator.d.ts.map +1 -0
  237. package/dist/validators/execution-validator.js +51 -0
  238. package/dist/validators/execution-validator.js.map +1 -0
  239. package/dist/validators/git-validator.d.ts +13 -0
  240. package/dist/validators/git-validator.d.ts.map +1 -0
  241. package/dist/validators/git-validator.js +135 -0
  242. package/dist/validators/git-validator.js.map +1 -0
  243. package/dist/validators/notification-validator.d.ts +8 -0
  244. package/dist/validators/notification-validator.d.ts.map +1 -0
  245. package/dist/validators/notification-validator.js +27 -0
  246. package/dist/validators/notification-validator.js.map +1 -0
  247. package/dist/validators/pipeline-validator.d.ts +3 -26
  248. package/dist/validators/pipeline-validator.d.ts.map +1 -1
  249. package/dist/validators/pipeline-validator.js +5 -515
  250. package/dist/validators/pipeline-validator.js.map +1 -1
  251. package/dist/validators/retry-validator.d.ts +9 -0
  252. package/dist/validators/retry-validator.d.ts.map +1 -0
  253. package/dist/validators/retry-validator.js +34 -0
  254. package/dist/validators/retry-validator.js.map +1 -0
  255. package/dist/validators/runtime-validator.d.ts +9 -0
  256. package/dist/validators/runtime-validator.d.ts.map +1 -0
  257. package/dist/validators/runtime-validator.js +82 -0
  258. package/dist/validators/runtime-validator.js.map +1 -0
  259. package/dist/validators/structure-validator.d.ts +8 -0
  260. package/dist/validators/structure-validator.d.ts.map +1 -0
  261. package/dist/validators/structure-validator.js +39 -0
  262. package/dist/validators/structure-validator.js.map +1 -0
  263. package/dist/validators/types.d.ts +19 -0
  264. package/dist/validators/types.d.ts.map +1 -0
  265. package/dist/validators/types.js +2 -0
  266. package/dist/validators/types.js.map +1 -0
  267. package/dist/validators/validation-orchestrator.d.ts +9 -0
  268. package/dist/validators/validation-orchestrator.d.ts.map +1 -0
  269. package/dist/validators/validation-orchestrator.js +43 -0
  270. package/dist/validators/validation-orchestrator.js.map +1 -0
  271. package/package.json +17 -11
  272. package/dist/cli/commands/install.d.ts +0 -2
  273. package/dist/cli/commands/install.d.ts.map +0 -1
  274. package/dist/cli/commands/install.js +0 -15
  275. package/dist/cli/commands/install.js.map +0 -1
  276. package/dist/cli/commands/uninstall.d.ts +0 -2
  277. package/dist/cli/commands/uninstall.d.ts.map +0 -1
  278. package/dist/cli/commands/uninstall.js +0 -6
  279. package/dist/cli/commands/uninstall.js.map +0 -1
  280. package/dist/cli/templates/agents/cleanup-reporter.md +0 -107
  281. package/dist/cli/templates/agents/code-reducer.md +0 -51
  282. package/dist/cli/templates/agents/code-reviewer.md +0 -34
  283. package/dist/cli/templates/agents/context-reducer.md +0 -94
  284. package/dist/cli/templates/agents/dependency-auditor.md +0 -127
  285. package/dist/cli/templates/agents/detective-empath.md +0 -26
  286. package/dist/cli/templates/agents/detective-linguist.md +0 -26
  287. package/dist/cli/templates/agents/detective-logician.md +0 -26
  288. package/dist/cli/templates/agents/detective-skeptic.md +0 -26
  289. package/dist/cli/templates/agents/detective-statistician.md +0 -26
  290. package/dist/cli/templates/agents/doc-updater.md +0 -30
  291. package/dist/cli/templates/agents/judge.md +0 -27
  292. package/dist/cli/templates/agents/memory-updater.md +0 -72
  293. package/dist/cli/templates/agents/quality-checker.md +0 -32
  294. package/dist/cli/templates/agents/security-auditor.md +0 -32
  295. package/dist/cli/templates/agents/storyteller.md +0 -26
  296. package/dist/cli/templates/agents/summary.md +0 -32
  297. package/dist/cli/templates/agents/synthesizer.md +0 -26
  298. package/dist/cli/templates/pipelines/large-pipeline-example.yml +0 -178
  299. package/dist/cli/templates/pipelines/post-merge-example.yml +0 -78
  300. package/dist/cli/templates/pipelines/pre-commit-example.yml +0 -41
  301. package/dist/cli/templates/pipelines/pre-push-example.yml +0 -51
  302. package/dist/cli/templates/pipelines/test-pipeline.yml +0 -90
  303. package/dist/config/project-config-loader.d.ts +0 -11
  304. package/dist/config/project-config-loader.d.ts.map +0 -1
  305. package/dist/config/project-config-loader.js +0 -100
  306. package/dist/config/project-config-loader.js.map +0 -1
  307. package/dist/core/condition-evaluator.d.ts +0 -16
  308. package/dist/core/condition-evaluator.d.ts.map +0 -1
  309. package/dist/core/condition-evaluator.js +0 -121
  310. package/dist/core/condition-evaluator.js.map +0 -1
  311. package/dist/core/context-reducer.d.ts +0 -15
  312. package/dist/core/context-reducer.d.ts.map +0 -1
  313. package/dist/core/context-reducer.js +0 -224
  314. package/dist/core/context-reducer.js.map +0 -1
  315. package/dist/core/output-storage-manager.d.ts +0 -14
  316. package/dist/core/output-storage-manager.d.ts.map +0 -1
  317. package/dist/core/output-storage-manager.js +0 -68
  318. package/dist/core/output-storage-manager.js.map +0 -1
  319. package/dist/core/output-tool-builder.d.ts +0 -6
  320. package/dist/core/output-tool-builder.d.ts.map +0 -1
  321. package/dist/core/output-tool-builder.js +0 -50
  322. package/dist/core/output-tool-builder.js.map +0 -1
  323. /package/{license → LICENSE} +0 -0
@@ -1,16 +1,22 @@
1
1
  import { ErrorFactory } from '../utils/error-factory.js';
2
+ import { PipelineAbortError } from './abort-controller.js';
2
3
  export class ParallelExecutor {
3
4
  stageExecutor;
4
5
  onStateChange;
5
- constructor(stageExecutor, onStateChange) {
6
+ abortController;
7
+ constructor(stageExecutor, onStateChange, abortController) {
6
8
  this.stageExecutor = stageExecutor;
7
9
  this.onStateChange = onStateChange;
10
+ this.abortController = abortController;
8
11
  }
9
12
  emitStateChange(state) {
10
13
  if (this.onStateChange) {
11
14
  this.onStateChange(state);
12
15
  }
13
16
  }
17
+ isAborted() {
18
+ return this.abortController?.aborted ?? false;
19
+ }
14
20
  createFailedExecution(stageConfig, reason) {
15
21
  const timestamp = new Date().toISOString();
16
22
  return {
@@ -39,45 +45,117 @@ export class ParallelExecutor {
39
45
  duration
40
46
  };
41
47
  }
42
- async executeParallelGroup(stages, pipelineState, onOutputUpdate) {
48
+ addRunningStage(stageConfig, pipelineState) {
49
+ pipelineState.stages.push({
50
+ stageName: stageConfig.name,
51
+ status: 'running',
52
+ startTime: new Date().toISOString(),
53
+ retryAttempt: 0,
54
+ maxRetries: stageConfig.retry?.maxAttempts || 0
55
+ });
56
+ }
57
+ updateStageInState(execution, pipelineState) {
58
+ const index = pipelineState.stages.findIndex(s => s.stageName === execution.stageName);
59
+ if (index >= 0) {
60
+ pipelineState.stages[index] = execution;
61
+ }
62
+ }
63
+ async executeParallelGroup(stages, pipelineState, onOutputUpdate, groupContext) {
43
64
  const startTime = Date.now();
65
+ if (this.isAborted()) {
66
+ const skipTimestamp = new Date().toISOString();
67
+ const skippedExecutions = stages.map(stage => ({
68
+ stageName: stage.name,
69
+ status: 'skipped',
70
+ startTime: skipTimestamp,
71
+ endTime: skipTimestamp,
72
+ duration: 0
73
+ }));
74
+ for (const execution of skippedExecutions) {
75
+ pipelineState.stages.push(execution);
76
+ }
77
+ this.emitStateChange(pipelineState);
78
+ return this.buildExecutionResult(skippedExecutions, startTime);
79
+ }
80
+ if (groupContext?.isFinalGroup !== undefined) {
81
+ this.stageExecutor.updateLoopContext({ isFinalGroup: groupContext.isFinalGroup });
82
+ }
83
+ for (const stageConfig of stages) {
84
+ this.addRunningStage(stageConfig, pipelineState);
85
+ }
86
+ this.emitStateChange(pipelineState);
44
87
  const promises = stages.map(async (stageConfig) => {
45
88
  const stageOutputCallback = this.createStageCallback(stageConfig.name, onOutputUpdate);
46
89
  try {
47
90
  const execution = await this.stageExecutor.executeStage(stageConfig, pipelineState, stageOutputCallback);
91
+ this.updateStageInState(execution, pipelineState);
48
92
  this.emitStateChange(pipelineState);
49
93
  return execution;
50
94
  }
51
95
  catch (error) {
96
+ if (error instanceof PipelineAbortError) {
97
+ const abortedExecution = this.createFailedExecution(stageConfig, error);
98
+ this.updateStageInState(abortedExecution, pipelineState);
99
+ this.emitStateChange(pipelineState);
100
+ throw error;
101
+ }
102
+ const failedExecution = this.createFailedExecution(stageConfig, error);
103
+ this.updateStageInState(failedExecution, pipelineState);
52
104
  this.emitStateChange(pipelineState);
53
- throw error;
54
- }
55
- });
56
- const results = await Promise.allSettled(promises);
57
- const executions = results.map((result, index) => {
58
- if (result.status === 'fulfilled') {
59
- return result.value;
60
- }
61
- else {
62
- const stageConfig = stages[index];
63
- return this.createFailedExecution(stageConfig, result.reason);
105
+ return failedExecution;
64
106
  }
65
107
  });
108
+ const executions = await Promise.all(promises);
66
109
  return this.buildExecutionResult(executions, startTime);
67
110
  }
68
- async executeSequentialGroup(stages, pipelineState, onOutputUpdate) {
111
+ async executeSequentialGroup(stages, pipelineState, onOutputUpdate, groupContext) {
69
112
  const startTime = Date.now();
70
113
  const executions = [];
114
+ if (groupContext?.isFinalGroup !== undefined) {
115
+ this.stageExecutor.updateLoopContext({ isFinalGroup: groupContext.isFinalGroup });
116
+ }
71
117
  for (const stageConfig of stages) {
118
+ if (this.isAborted()) {
119
+ const skipTimestamp = new Date().toISOString();
120
+ const skippedExecution = {
121
+ stageName: stageConfig.name,
122
+ status: 'skipped',
123
+ startTime: skipTimestamp,
124
+ endTime: skipTimestamp,
125
+ duration: 0
126
+ };
127
+ executions.push(skippedExecution);
128
+ pipelineState.stages.push(skippedExecution);
129
+ this.emitStateChange(pipelineState);
130
+ continue;
131
+ }
132
+ this.addRunningStage(stageConfig, pipelineState);
133
+ this.emitStateChange(pipelineState);
72
134
  const stageOutputCallback = this.createStageCallback(stageConfig.name, onOutputUpdate);
73
135
  try {
74
136
  const execution = await this.stageExecutor.executeStage(stageConfig, pipelineState, stageOutputCallback);
75
137
  executions.push(execution);
138
+ this.updateStageInState(execution, pipelineState);
76
139
  this.emitStateChange(pipelineState);
77
140
  }
78
141
  catch (error) {
142
+ if (error instanceof PipelineAbortError) {
143
+ const abortedExecution = {
144
+ stageName: stageConfig.name,
145
+ status: 'failed',
146
+ startTime: new Date().toISOString(),
147
+ endTime: new Date().toISOString(),
148
+ duration: 0,
149
+ error: { message: 'Stage aborted', timestamp: new Date().toISOString() }
150
+ };
151
+ executions.push(abortedExecution);
152
+ this.updateStageInState(abortedExecution, pipelineState);
153
+ this.emitStateChange(pipelineState);
154
+ throw error;
155
+ }
79
156
  const failedExecution = this.createFailedExecution(stageConfig, error);
80
157
  executions.push(failedExecution);
158
+ this.updateStageInState(failedExecution, pipelineState);
81
159
  this.emitStateChange(pipelineState);
82
160
  }
83
161
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parallel-executor.js","sourceRoot":"","sources":["../../src/core/parallel-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parallel-executor.js","sourceRoot":"","sources":["../../src/core/parallel-executor.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { PRCreator } from './pr-creator.js';
4
4
  import { StateManager } from './state-manager.js';
5
5
  import { PipelineConfig, PipelineState } from '../config/schema.js';
6
6
  import { NotificationContext } from '../notifications/types.js';
7
+ import { PipelineLogger } from '../utils/pipeline-logger.js';
7
8
  export declare class PipelineFinalizer {
8
9
  private gitManager;
9
10
  private branchManager;
@@ -12,13 +13,20 @@ export declare class PipelineFinalizer {
12
13
  private repoPath;
13
14
  private dryRun;
14
15
  private shouldLog;
16
+ private worktreeManager;
15
17
  constructor(gitManager: GitManager, branchManager: BranchManager, prCreator: PRCreator, stateManager: StateManager, repoPath: string, dryRun: boolean, shouldLog: (interactive: boolean) => boolean);
16
- finalize(state: PipelineState, config: PipelineConfig, pipelineBranch: string | undefined, originalBranch: string, startTime: number, interactive: boolean, notifyCallback: (context: NotificationContext) => Promise<void>, stateChangeCallback: (state: PipelineState) => void): Promise<PipelineState>;
18
+ finalize(state: PipelineState, config: PipelineConfig, pipelineBranch: string | undefined, worktreePath: string | undefined, executionRepoPath: string, startTime: number, interactive: boolean, verbose: boolean, notifyCallback: (context: NotificationContext) => Promise<void>, stateChangeCallback: (state: PipelineState) => void, options?: {
19
+ suppressCompletionNotification?: boolean;
20
+ pipelineLogger?: PipelineLogger;
21
+ }): Promise<PipelineState>;
17
22
  private calculateMetrics;
18
- private saveOutputs;
19
- private handlePRCreation;
23
+ private handleMergeStrategy;
24
+ private handlePullRequest;
25
+ private handleLocalMerge;
20
26
  private notifyCompletion;
21
27
  private printSummary;
22
- private cleanup;
28
+ private calculateTotalTokens;
29
+ private copyHandoverToMainRepo;
30
+ private handleWorktreeCleanup;
23
31
  }
24
32
  //# sourceMappingURL=pipeline-finalizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-finalizer.d.ts","sourceRoot":"","sources":["../../src/core/pipeline-finalizer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;gBANT,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO;IAMhD,QAAQ,CACZ,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EACtB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,EACpB,cAAc,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,EAC/D,mBAAmB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAClD,OAAO,CAAC,aAAa,CAAC;YAiCX,gBAAgB;YAShB,WAAW;YAWX,gBAAgB;YA+DhB,gBAAgB;IAe9B,OAAO,CAAC,YAAY;YAON,OAAO;CAYtB"}
1
+ {"version":3,"file":"pipeline-finalizer.d.ts","sourceRoot":"","sources":["../../src/core/pipeline-finalizer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAiB,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAc7D,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,eAAe,CAAkB;gBAG/B,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO;IAQhD,QAAQ,CACZ,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EACtB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,EAC/D,mBAAmB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EACnD,OAAO,CAAC,EAAE;QAAE,8BAA8B,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,cAAc,CAAA;KAAE,GACtF,OAAO,CAAC,aAAa,CAAC;YA2FX,gBAAgB;YAkBhB,mBAAmB;YAqCnB,iBAAiB;YAwEjB,gBAAgB;YA8FhB,gBAAgB;IAe9B,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,oBAAoB;YAmCd,sBAAsB;YAiCtB,qBAAqB;CAgDpC"}
@@ -1,5 +1,20 @@
1
- import { OutputStorageManager } from './output-storage-manager.js';
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import chalk from 'chalk';
4
+ import { GitManager } from './git-manager.js';
5
+ import { BranchManager } from './branch-manager.js';
6
+ import { WorktreeManager } from './worktree-manager.js';
2
7
  import { PipelineFormatter } from '../utils/pipeline-formatter.js';
8
+ const c = {
9
+ success: chalk.green,
10
+ warn: chalk.yellow,
11
+ error: chalk.red,
12
+ dim: chalk.dim,
13
+ cmd: chalk.cyan,
14
+ branch: chalk.magenta,
15
+ path: chalk.yellow,
16
+ header: chalk.bold.white,
17
+ };
3
18
  export class PipelineFinalizer {
4
19
  gitManager;
5
20
  branchManager;
@@ -8,6 +23,7 @@ export class PipelineFinalizer {
8
23
  repoPath;
9
24
  dryRun;
10
25
  shouldLog;
26
+ worktreeManager;
11
27
  constructor(gitManager, branchManager, prCreator, stateManager, repoPath, dryRun, shouldLog) {
12
28
  this.gitManager = gitManager;
13
29
  this.branchManager = branchManager;
@@ -16,49 +32,103 @@ export class PipelineFinalizer {
16
32
  this.repoPath = repoPath;
17
33
  this.dryRun = dryRun;
18
34
  this.shouldLog = shouldLog;
35
+ this.worktreeManager = new WorktreeManager(repoPath);
19
36
  }
20
- async finalize(state, config, pipelineBranch, originalBranch, startTime, interactive, notifyCallback, stateChangeCallback) {
21
- await this.calculateMetrics(state, startTime);
22
- await this.saveOutputs(state, config);
23
- if (pipelineBranch && config.git?.pullRequest?.autoCreate) {
24
- await this.handlePRCreation(config, pipelineBranch, state, interactive, notifyCallback);
37
+ async finalize(state, config, pipelineBranch, worktreePath, executionRepoPath, startTime, interactive, verbose, notifyCallback, stateChangeCallback, options) {
38
+ const { pipelineLogger } = options || {};
39
+ await this.calculateMetrics(state, startTime, executionRepoPath);
40
+ if (state.status === 'aborted') {
41
+ if (this.shouldLog(interactive)) {
42
+ console.log(`\n${c.warn('⚠')} ${c.warn('Pipeline aborted.')} Work preserved on branch: ${c.branch(pipelineBranch || '(current)')}`);
43
+ if (worktreePath) {
44
+ console.log(` ${c.dim('Worktree preserved for recovery:')} ${c.path(worktreePath)}`);
45
+ }
46
+ }
47
+ if (worktreePath && state.artifacts.mainRepoHandoverDir) {
48
+ await this.copyHandoverToMainRepo(state.artifacts.handoverDir, state.artifacts.mainRepoHandoverDir, interactive);
49
+ state.artifacts.handoverDir = state.artifacts.mainRepoHandoverDir;
50
+ }
51
+ await this.stateManager.saveState(state);
52
+ stateChangeCallback(state);
53
+ await notifyCallback({
54
+ event: 'pipeline.aborted',
55
+ pipelineState: state
56
+ });
57
+ return state;
58
+ }
59
+ if (pipelineBranch && config.git) {
60
+ const mergeStrategy = config.git.mergeStrategy || 'none';
61
+ await this.handleMergeStrategy(mergeStrategy, config, pipelineBranch, state, executionRepoPath, interactive, notifyCallback);
62
+ }
63
+ if (worktreePath && state.artifacts.mainRepoHandoverDir) {
64
+ await this.copyHandoverToMainRepo(state.artifacts.handoverDir, state.artifacts.mainRepoHandoverDir, interactive);
65
+ state.artifacts.handoverDir = state.artifacts.mainRepoHandoverDir;
25
66
  }
26
67
  await this.stateManager.saveState(state);
27
68
  stateChangeCallback(state);
28
- await this.notifyCompletion(state, notifyCallback);
69
+ if (!options?.suppressCompletionNotification) {
70
+ await this.notifyCompletion(state, notifyCallback);
71
+ }
29
72
  if (this.shouldLog(interactive)) {
30
- this.printSummary(state);
73
+ this.printSummary(state, worktreePath, verbose);
74
+ }
75
+ const prCreatedSuccessfully = !!state.artifacts.pullRequest?.url;
76
+ await this.handleWorktreeCleanup(worktreePath, config, state.status, interactive, prCreatedSuccessfully);
77
+ if (pipelineLogger) {
78
+ pipelineLogger.pipelineComplete(state.status, state.artifacts.totalDuration, state.stages.length);
79
+ pipelineLogger.close();
31
80
  }
32
- await this.cleanup(pipelineBranch, originalBranch, interactive);
33
81
  return state;
34
82
  }
35
- async calculateMetrics(state, startTime) {
83
+ async calculateMetrics(state, startTime, executionRepoPath) {
36
84
  const endTime = Date.now();
37
85
  state.artifacts.totalDuration = (endTime - startTime) / 1000;
38
- state.artifacts.finalCommit = await this.gitManager.getCurrentCommit();
86
+ const execGitManager = executionRepoPath !== this.repoPath
87
+ ? new GitManager(executionRepoPath)
88
+ : this.gitManager;
89
+ state.artifacts.finalCommit = await execGitManager.getCurrentCommit();
39
90
  }
40
- async saveOutputs(state, config) {
41
- if (config.settings?.contextReduction?.saveVerboseOutputs !== false) {
42
- const outputStorageManager = new OutputStorageManager(this.repoPath, state.runId);
43
- await outputStorageManager.savePipelineSummary(state.stages);
44
- await outputStorageManager.saveChangedFiles(state.artifacts.changedFiles);
91
+ async handleMergeStrategy(strategy, config, branchName, state, executionRepoPath, interactive, notifyCallback) {
92
+ const hasCommits = state.stages.some(s => s.commitSha);
93
+ if (!hasCommits && (strategy === 'pull-request' || strategy === 'local-merge')) {
94
+ if (this.shouldLog(interactive)) {
95
+ console.log(`\n${c.dim('📍 No commits to merge.')} Work preserved on branch: ${c.branch(branchName)}`);
96
+ }
97
+ return;
98
+ }
99
+ switch (strategy) {
100
+ case 'pull-request':
101
+ await this.handlePullRequest(config, branchName, state, executionRepoPath, interactive, notifyCallback);
102
+ break;
103
+ case 'local-merge':
104
+ await this.handleLocalMerge(config, branchName, interactive);
105
+ break;
106
+ case 'none':
107
+ if (this.shouldLog(interactive)) {
108
+ console.log(`\n${c.dim('📍 Work preserved on branch:')} ${c.branch(branchName)}`);
109
+ }
110
+ break;
45
111
  }
46
112
  }
47
- async handlePRCreation(config, branchName, state, interactive, notifyCallback) {
113
+ async handlePullRequest(config, branchName, state, executionRepoPath, interactive, notifyCallback) {
48
114
  try {
49
- await this.branchManager.pushBranch(branchName);
115
+ const pushBranchManager = executionRepoPath !== this.repoPath
116
+ ? new BranchManager(executionRepoPath)
117
+ : this.branchManager;
118
+ await pushBranchManager.pushBranch(branchName);
50
119
  const exists = await this.prCreator.prExists(branchName);
51
120
  if (exists) {
52
- if (this.shouldLog(interactive)) {
53
- console.log(`\n✅ Pull request already exists for ${branchName}`);
54
- console.log(` View it with: gh pr view ${branchName}`);
55
- }
121
+ console.log(`\n${c.success('✓')} Pull request already exists for ${c.branch(branchName)}`);
122
+ console.log(` ${c.dim('View it with:')} ${c.cmd(`gh pr view ${branchName}`)}`);
56
123
  return;
57
124
  }
58
- const prConfig = config.git.pullRequest;
125
+ const prConfig = config.git?.pullRequest || {};
59
126
  const result = await this.prCreator.createPR(branchName, config.git?.baseBranch || 'main', prConfig, state);
60
127
  if (this.shouldLog(interactive)) {
61
- console.log(`\n✅ Pull Request created: ${result.url}`);
128
+ const isComplete = state.status === 'completed';
129
+ const statusIcon = isComplete ? c.success('✓') : c.warn('⚠');
130
+ const statusSuffix = state.status === 'partial' ? c.dim(' (partial success)') : '';
131
+ console.log(`\n${statusIcon} Pull Request created${statusSuffix}: ${c.cmd(result.url)}`);
62
132
  }
63
133
  state.artifacts.pullRequest = {
64
134
  url: result.url,
@@ -73,11 +143,81 @@ export class PipelineFinalizer {
73
143
  });
74
144
  }
75
145
  catch (error) {
146
+ const errorMessage = error instanceof Error ? error.message : String(error);
147
+ state.artifacts.prError = errorMessage;
148
+ await this.stateManager.saveState(state);
149
+ console.log(`\n${c.error('✗')} ${c.error('Failed to create PR:')} ${c.dim(errorMessage)}`);
150
+ console.log(` ${c.dim('Branch')} ${c.branch(branchName)} ${c.dim('has been pushed to remote.')}`);
151
+ console.log(` ${c.dim('You can create the PR manually with:')} ${c.cmd('gh pr create')}`);
152
+ }
153
+ }
154
+ async handleLocalMerge(config, branchName, interactive) {
155
+ const baseBranch = config.git?.baseBranch || 'main';
156
+ const baseCheckedOutPath = await this.gitManager.isBranchCheckedOut(baseBranch);
157
+ let mergeWorktreePath = null;
158
+ let mergeAttemptedOnCheckedOutPath = false;
159
+ try {
160
+ if (baseCheckedOutPath) {
161
+ const checkedOutGitManager = new GitManager(baseCheckedOutPath);
162
+ const hasChanges = await checkedOutGitManager.hasUncommittedChanges();
163
+ if (hasChanges) {
164
+ if (this.shouldLog(interactive)) {
165
+ console.log(`\n${c.warn('⚠')} Cannot auto-merge: ${c.branch(baseBranch)} has uncommitted changes.`);
166
+ console.log(` ${c.dim('Pipeline completed successfully. Changes on branch:')} ${c.branch(branchName)}`);
167
+ console.log(`\n ${c.dim('Commit or stash your work, then run:')} ${c.cmd(`git merge ${branchName}`)}`);
168
+ }
169
+ return;
170
+ }
171
+ if (this.shouldLog(interactive)) {
172
+ console.log(`\n${c.dim('🔀 Merging')} ${c.branch(branchName)} ${c.dim('into')} ${c.branch(baseBranch)}${c.dim('...')}`);
173
+ }
174
+ try {
175
+ mergeAttemptedOnCheckedOutPath = true;
176
+ await checkedOutGitManager.merge(branchName);
177
+ console.log(`${c.success('✓')} Merged ${c.branch(branchName)} into ${c.branch(baseBranch)}`);
178
+ return;
179
+ }
180
+ catch (mergeError) {
181
+ if (this.shouldLog(interactive)) {
182
+ console.log(`\n${c.error('✗')} Failed to merge: ${mergeError instanceof Error ? mergeError.message : String(mergeError)}`);
183
+ console.log(` ${c.dim('To resolve:')} ${c.cmd('git status')} then fix conflicts and ${c.cmd('git commit')}`);
184
+ console.log(` ${c.dim('Or abort:')} ${c.cmd('git merge --abort')}`);
185
+ }
186
+ throw mergeError;
187
+ }
188
+ }
189
+ const worktreeBaseDir = this.worktreeManager.getWorktreeBaseDir();
190
+ await fs.mkdir(worktreeBaseDir, { recursive: true });
191
+ const safeBranchName = branchName.replace(/[\\/]/g, '-');
192
+ mergeWorktreePath = path.join(worktreeBaseDir, `merge-${safeBranchName}-${Date.now()}`);
193
+ await this.worktreeManager.createWorktree(mergeWorktreePath, baseBranch, baseBranch);
194
+ const mergeGitManager = new GitManager(mergeWorktreePath);
76
195
  if (this.shouldLog(interactive)) {
77
- console.error(`\n❌ Failed to create PR: ${error instanceof Error ? error.message : String(error)}`);
78
- console.log(` Branch ${branchName} has been pushed to remote.`);
79
- console.log(` You can create the PR manually with: gh pr create`);
196
+ console.log(`\n${c.dim('🔀 Merging')} ${c.branch(branchName)} ${c.dim('into')} ${c.branch(baseBranch)}${c.dim('...')}`);
80
197
  }
198
+ await mergeGitManager.merge(branchName);
199
+ await this.worktreeManager.removeWorktree(mergeWorktreePath, true);
200
+ await this.worktreeManager.pruneWorktrees();
201
+ mergeWorktreePath = null;
202
+ console.log(`${c.success('✓')} Merged ${c.branch(branchName)} into ${c.branch(baseBranch)}`);
203
+ }
204
+ catch (error) {
205
+ if (mergeAttemptedOnCheckedOutPath) {
206
+ throw error;
207
+ }
208
+ if (this.shouldLog(interactive)) {
209
+ console.log(`\n${c.error('✗')} ${c.error('Failed to merge:')} ${c.dim(error instanceof Error ? error.message : String(error))}`);
210
+ console.log(` ${c.dim('Branch')} ${c.branch(branchName)} ${c.dim('still exists with your changes.')}`);
211
+ console.log('');
212
+ console.log(` ${c.dim('You can merge manually with:')}`);
213
+ console.log(` ${c.cmd(`git checkout ${baseBranch} && git merge ${branchName}`)}`);
214
+ if (mergeWorktreePath) {
215
+ console.log('');
216
+ console.log(` ${c.dim('Merge worktree preserved at:')} ${c.path(mergeWorktreePath)}`);
217
+ }
218
+ console.log('');
219
+ }
220
+ throw error;
81
221
  }
82
222
  }
83
223
  async notifyCompletion(state, notifyCallback) {
@@ -88,15 +228,86 @@ export class PipelineFinalizer {
88
228
  prUrl: state.artifacts.pullRequest?.url
89
229
  });
90
230
  }
91
- printSummary(state) {
92
- console.log(PipelineFormatter.formatSummary(state));
231
+ printSummary(state, worktreePath, verbose = false) {
232
+ const totals = this.calculateTotalTokens(state);
233
+ console.log(PipelineFormatter.formatSummary(state, verbose, totals));
234
+ if (worktreePath && verbose) {
235
+ console.log(`\n${c.dim('đŸŒŗ Worktree location:')} ${c.path(worktreePath)}`);
236
+ }
237
+ }
238
+ calculateTotalTokens(state) {
239
+ let totalProcessed = 0;
240
+ let totalOutput = 0;
241
+ let totalTurns = 0;
242
+ let totalCacheRead = 0;
243
+ for (const stage of state.stages) {
244
+ if (stage.tokenUsage) {
245
+ const cacheRead = stage.tokenUsage.cache_read || 0;
246
+ const cacheCreation = stage.tokenUsage.cache_creation || 0;
247
+ const actualInput = stage.tokenUsage.actual_input || 0;
248
+ const cacheCreationIncluded = cacheCreation > 0 && actualInput >= cacheCreation;
249
+ const stageProcessed = actualInput + cacheRead + (cacheCreationIncluded ? 0 : cacheCreation);
250
+ totalProcessed += stageProcessed;
251
+ totalOutput += stage.tokenUsage.output || 0;
252
+ totalTurns += stage.tokenUsage.num_turns || 0;
253
+ totalCacheRead += cacheRead;
254
+ }
255
+ }
256
+ return { totalProcessed, totalOutput, totalTurns, totalCacheRead };
257
+ }
258
+ async copyHandoverToMainRepo(sourcePath, destPath, interactive) {
259
+ try {
260
+ await fs.mkdir(path.dirname(destPath), { recursive: true });
261
+ await fs.cp(sourcePath, destPath, { recursive: true });
262
+ if (this.shouldLog(interactive)) {
263
+ console.log(`\n${c.dim('📋 Copied handover files to:')} ${c.path(destPath)}`);
264
+ }
265
+ }
266
+ catch (error) {
267
+ if (this.shouldLog(interactive)) {
268
+ console.log(`\n${c.warn('⚠')} ${c.dim('Could not copy handover directory:')} ${c.dim(error instanceof Error ? error.message : String(error))}`);
269
+ console.log(` ${c.dim('Source:')} ${c.path(sourcePath)}`);
270
+ console.log(` ${c.dim('Destination:')} ${c.path(destPath)}`);
271
+ }
272
+ }
93
273
  }
94
- async cleanup(pipelineBranch, originalBranch, interactive) {
95
- if (pipelineBranch && originalBranch && !this.dryRun) {
274
+ async handleWorktreeCleanup(worktreePath, config, status, interactive, prCreatedSuccessfully = false) {
275
+ if (!worktreePath || this.dryRun) {
276
+ return;
277
+ }
278
+ const strategy = config.git?.branchStrategy || 'reusable';
279
+ const success = status === 'completed';
280
+ if (strategy === 'reusable') {
281
+ if (this.shouldLog(interactive)) {
282
+ console.log(`\n${c.dim('đŸŒŗ Worktree preserved at:')} ${c.path(worktreePath)}`);
283
+ console.log(` ${c.dim('Use')} ${c.cmd('agent-pipeline cleanup --worktrees')} ${c.dim('to remove.')}`);
284
+ }
285
+ return;
286
+ }
287
+ if (strategy === 'unique-and-delete' && success) {
288
+ try {
289
+ await this.worktreeManager.cleanupWorktree(worktreePath, true, prCreatedSuccessfully);
290
+ if (this.shouldLog(interactive)) {
291
+ console.log(`\n${c.dim('đŸ—‘ī¸ Cleaned up worktree:')} ${c.path(worktreePath)}`);
292
+ }
293
+ }
294
+ catch (error) {
295
+ if (this.shouldLog(interactive)) {
296
+ console.log(`\n${c.warn('⚠')} ${c.dim('Could not cleanup worktree:')} ${c.dim(error instanceof Error ? error.message : String(error))}`);
297
+ console.log(` ${c.dim('Worktree remains at:')} ${c.path(worktreePath)}`);
298
+ }
299
+ }
300
+ }
301
+ else if (strategy === 'unique-per-run' && success) {
302
+ if (this.shouldLog(interactive)) {
303
+ console.log(`\n${c.dim('đŸŒŗ Worktree preserved at:')} ${c.path(worktreePath)}`);
304
+ console.log(` ${c.dim('Use')} ${c.cmd('agent-pipeline cleanup --worktrees')} ${c.dim('to remove.')}`);
305
+ }
306
+ }
307
+ else if (!success) {
96
308
  if (this.shouldLog(interactive)) {
97
- console.log(`\nâ†Šī¸ Returning to branch: ${originalBranch}`);
309
+ console.log(`\n${c.dim('đŸŒŗ Worktree preserved for debugging:')} ${c.path(worktreePath)}`);
98
310
  }
99
- await this.branchManager.checkoutBranch(originalBranch);
100
311
  }
101
312
  }
102
313
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-finalizer.js","sourceRoot":"","sources":["../../src/core/pipeline-finalizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline-finalizer.js","sourceRoot":"","sources":["../../src/core/pipeline-finalizer.ts"],"names":[],"mappings":"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"}