agent-pipeline 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 (312) hide show
  1. package/CLAUDE.md +134 -0
  2. package/README.md +209 -0
  3. package/dist/analytics/pipeline-analytics.d.ts +19 -0
  4. package/dist/analytics/pipeline-analytics.d.ts.map +1 -0
  5. package/dist/analytics/pipeline-analytics.js +155 -0
  6. package/dist/analytics/pipeline-analytics.js.map +1 -0
  7. package/dist/analytics/types.d.ts +31 -0
  8. package/dist/analytics/types.d.ts.map +1 -0
  9. package/dist/analytics/types.js +2 -0
  10. package/dist/analytics/types.js.map +1 -0
  11. package/dist/cli/commands/agent/info.d.ts +2 -0
  12. package/dist/cli/commands/agent/info.d.ts.map +1 -0
  13. package/dist/cli/commands/agent/info.js +62 -0
  14. package/dist/cli/commands/agent/info.js.map +1 -0
  15. package/dist/cli/commands/agent/list.d.ts +2 -0
  16. package/dist/cli/commands/agent/list.d.ts.map +1 -0
  17. package/dist/cli/commands/agent/list.js +57 -0
  18. package/dist/cli/commands/agent/list.js.map +1 -0
  19. package/dist/cli/commands/agent/pull.d.ts +5 -0
  20. package/dist/cli/commands/agent/pull.d.ts.map +1 -0
  21. package/dist/cli/commands/agent/pull.js +71 -0
  22. package/dist/cli/commands/agent/pull.js.map +1 -0
  23. package/dist/cli/commands/analytics.d.ts +6 -0
  24. package/dist/cli/commands/analytics.d.ts.map +1 -0
  25. package/dist/cli/commands/analytics.js +101 -0
  26. package/dist/cli/commands/analytics.js.map +1 -0
  27. package/dist/cli/commands/cleanup.d.ts +7 -0
  28. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  29. package/dist/cli/commands/cleanup.js +76 -0
  30. package/dist/cli/commands/cleanup.js.map +1 -0
  31. package/dist/cli/commands/history.d.ts +7 -0
  32. package/dist/cli/commands/history.d.ts.map +1 -0
  33. package/dist/cli/commands/history.js +173 -0
  34. package/dist/cli/commands/history.js.map +1 -0
  35. package/dist/cli/commands/init.d.ts +7 -0
  36. package/dist/cli/commands/init.d.ts.map +1 -0
  37. package/dist/cli/commands/init.js +158 -0
  38. package/dist/cli/commands/init.js.map +1 -0
  39. package/dist/cli/commands/install.d.ts +2 -0
  40. package/dist/cli/commands/install.d.ts.map +1 -0
  41. package/dist/cli/commands/install.js +15 -0
  42. package/dist/cli/commands/install.js.map +1 -0
  43. package/dist/cli/commands/list.d.ts +2 -0
  44. package/dist/cli/commands/list.d.ts.map +1 -0
  45. package/dist/cli/commands/list.js +13 -0
  46. package/dist/cli/commands/list.js.map +1 -0
  47. package/dist/cli/commands/pipeline/clone.d.ts +2 -0
  48. package/dist/cli/commands/pipeline/clone.d.ts.map +1 -0
  49. package/dist/cli/commands/pipeline/clone.js +42 -0
  50. package/dist/cli/commands/pipeline/clone.js.map +1 -0
  51. package/dist/cli/commands/pipeline/config.d.ts +2 -0
  52. package/dist/cli/commands/pipeline/config.d.ts.map +1 -0
  53. package/dist/cli/commands/pipeline/config.js +23 -0
  54. package/dist/cli/commands/pipeline/config.js.map +1 -0
  55. package/dist/cli/commands/pipeline/create.d.ts +2 -0
  56. package/dist/cli/commands/pipeline/create.d.ts.map +1 -0
  57. package/dist/cli/commands/pipeline/create.js +86 -0
  58. package/dist/cli/commands/pipeline/create.js.map +1 -0
  59. package/dist/cli/commands/pipeline/delete.d.ts +6 -0
  60. package/dist/cli/commands/pipeline/delete.d.ts.map +1 -0
  61. package/dist/cli/commands/pipeline/delete.js +60 -0
  62. package/dist/cli/commands/pipeline/delete.js.map +1 -0
  63. package/dist/cli/commands/pipeline/edit.d.ts +2 -0
  64. package/dist/cli/commands/pipeline/edit.d.ts.map +1 -0
  65. package/dist/cli/commands/pipeline/edit.js +50 -0
  66. package/dist/cli/commands/pipeline/edit.js.map +1 -0
  67. package/dist/cli/commands/pipeline/export.d.ts +6 -0
  68. package/dist/cli/commands/pipeline/export.d.ts.map +1 -0
  69. package/dist/cli/commands/pipeline/export.js +48 -0
  70. package/dist/cli/commands/pipeline/export.js.map +1 -0
  71. package/dist/cli/commands/pipeline/import.d.ts +2 -0
  72. package/dist/cli/commands/pipeline/import.d.ts.map +1 -0
  73. package/dist/cli/commands/pipeline/import.js +59 -0
  74. package/dist/cli/commands/pipeline/import.js.map +1 -0
  75. package/dist/cli/commands/pipeline/validate.d.ts +2 -0
  76. package/dist/cli/commands/pipeline/validate.d.ts.map +1 -0
  77. package/dist/cli/commands/pipeline/validate.js +28 -0
  78. package/dist/cli/commands/pipeline/validate.js.map +1 -0
  79. package/dist/cli/commands/rollback.d.ts +6 -0
  80. package/dist/cli/commands/rollback.d.ts.map +1 -0
  81. package/dist/cli/commands/rollback.js +49 -0
  82. package/dist/cli/commands/rollback.js.map +1 -0
  83. package/dist/cli/commands/run.d.ts +15 -0
  84. package/dist/cli/commands/run.d.ts.map +1 -0
  85. package/dist/cli/commands/run.js +61 -0
  86. package/dist/cli/commands/run.js.map +1 -0
  87. package/dist/cli/commands/status.d.ts +2 -0
  88. package/dist/cli/commands/status.d.ts.map +1 -0
  89. package/dist/cli/commands/status.js +52 -0
  90. package/dist/cli/commands/status.js.map +1 -0
  91. package/dist/cli/commands/test.d.ts +5 -0
  92. package/dist/cli/commands/test.d.ts.map +1 -0
  93. package/dist/cli/commands/test.js +18 -0
  94. package/dist/cli/commands/test.js.map +1 -0
  95. package/dist/cli/commands/uninstall.d.ts +2 -0
  96. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  97. package/dist/cli/commands/uninstall.js +6 -0
  98. package/dist/cli/commands/uninstall.js.map +1 -0
  99. package/dist/cli/hooks.d.ts +8 -0
  100. package/dist/cli/hooks.d.ts.map +1 -0
  101. package/dist/cli/hooks.js +98 -0
  102. package/dist/cli/hooks.js.map +1 -0
  103. package/dist/cli/templates/agents/cleanup-reporter.md +107 -0
  104. package/dist/cli/templates/agents/code-reducer.md +51 -0
  105. package/dist/cli/templates/agents/code-reviewer.md +34 -0
  106. package/dist/cli/templates/agents/context-reducer.md +94 -0
  107. package/dist/cli/templates/agents/dependency-auditor.md +127 -0
  108. package/dist/cli/templates/agents/detective-empath.md +26 -0
  109. package/dist/cli/templates/agents/detective-linguist.md +26 -0
  110. package/dist/cli/templates/agents/detective-logician.md +26 -0
  111. package/dist/cli/templates/agents/detective-skeptic.md +26 -0
  112. package/dist/cli/templates/agents/detective-statistician.md +26 -0
  113. package/dist/cli/templates/agents/doc-updater.md +30 -0
  114. package/dist/cli/templates/agents/judge.md +27 -0
  115. package/dist/cli/templates/agents/memory-updater.md +72 -0
  116. package/dist/cli/templates/agents/quality-checker.md +32 -0
  117. package/dist/cli/templates/agents/security-auditor.md +32 -0
  118. package/dist/cli/templates/agents/storyteller.md +26 -0
  119. package/dist/cli/templates/agents/summary.md +32 -0
  120. package/dist/cli/templates/agents/synthesizer.md +26 -0
  121. package/dist/cli/templates/pipelines/large-pipeline-example.yml +178 -0
  122. package/dist/cli/templates/pipelines/post-commit-example.yml +67 -0
  123. package/dist/cli/templates/pipelines/post-merge-example.yml +78 -0
  124. package/dist/cli/templates/pipelines/pre-commit-example.yml +41 -0
  125. package/dist/cli/templates/pipelines/pre-push-example.yml +51 -0
  126. package/dist/cli/templates/pipelines/test-pipeline.yml +90 -0
  127. package/dist/cli/utils/agent-importer.d.ts +21 -0
  128. package/dist/cli/utils/agent-importer.d.ts.map +1 -0
  129. package/dist/cli/utils/agent-importer.js +150 -0
  130. package/dist/cli/utils/agent-importer.js.map +1 -0
  131. package/dist/cli/utils/interactive-prompts.d.ts +10 -0
  132. package/dist/cli/utils/interactive-prompts.d.ts.map +1 -0
  133. package/dist/cli/utils/interactive-prompts.js +75 -0
  134. package/dist/cli/utils/interactive-prompts.js.map +1 -0
  135. package/dist/config/pipeline-loader.d.ts +14 -0
  136. package/dist/config/pipeline-loader.d.ts.map +1 -0
  137. package/dist/config/pipeline-loader.js +71 -0
  138. package/dist/config/pipeline-loader.js.map +1 -0
  139. package/dist/config/project-config-loader.d.ts +11 -0
  140. package/dist/config/project-config-loader.d.ts.map +1 -0
  141. package/dist/config/project-config-loader.js +100 -0
  142. package/dist/config/project-config-loader.js.map +1 -0
  143. package/dist/config/schema.d.ts +165 -0
  144. package/dist/config/schema.d.ts.map +1 -0
  145. package/dist/config/schema.js +2 -0
  146. package/dist/config/schema.js.map +1 -0
  147. package/dist/core/agent-query-runner.d.ts +25 -0
  148. package/dist/core/agent-query-runner.d.ts.map +1 -0
  149. package/dist/core/agent-query-runner.js +76 -0
  150. package/dist/core/agent-query-runner.js.map +1 -0
  151. package/dist/core/agent-runtime-registry.d.ts +11 -0
  152. package/dist/core/agent-runtime-registry.d.ts.map +1 -0
  153. package/dist/core/agent-runtime-registry.js +32 -0
  154. package/dist/core/agent-runtime-registry.js.map +1 -0
  155. package/dist/core/agent-runtimes/claude-code-headless-runtime.d.ts +16 -0
  156. package/dist/core/agent-runtimes/claude-code-headless-runtime.d.ts.map +1 -0
  157. package/dist/core/agent-runtimes/claude-code-headless-runtime.js +301 -0
  158. package/dist/core/agent-runtimes/claude-code-headless-runtime.js.map +1 -0
  159. package/dist/core/agent-runtimes/claude-sdk-runtime.d.ts +15 -0
  160. package/dist/core/agent-runtimes/claude-sdk-runtime.d.ts.map +1 -0
  161. package/dist/core/agent-runtimes/claude-sdk-runtime.js +92 -0
  162. package/dist/core/agent-runtimes/claude-sdk-runtime.js.map +1 -0
  163. package/dist/core/branch-manager.d.ts +15 -0
  164. package/dist/core/branch-manager.d.ts.map +1 -0
  165. package/dist/core/branch-manager.js +90 -0
  166. package/dist/core/branch-manager.js.map +1 -0
  167. package/dist/core/condition-evaluator.d.ts +16 -0
  168. package/dist/core/condition-evaluator.d.ts.map +1 -0
  169. package/dist/core/condition-evaluator.js +121 -0
  170. package/dist/core/condition-evaluator.js.map +1 -0
  171. package/dist/core/context-reducer.d.ts +15 -0
  172. package/dist/core/context-reducer.d.ts.map +1 -0
  173. package/dist/core/context-reducer.js +224 -0
  174. package/dist/core/context-reducer.js.map +1 -0
  175. package/dist/core/dag-planner.d.ts +13 -0
  176. package/dist/core/dag-planner.d.ts.map +1 -0
  177. package/dist/core/dag-planner.js +233 -0
  178. package/dist/core/dag-planner.js.map +1 -0
  179. package/dist/core/git-manager.d.ts +14 -0
  180. package/dist/core/git-manager.d.ts.map +1 -0
  181. package/dist/core/git-manager.js +70 -0
  182. package/dist/core/git-manager.js.map +1 -0
  183. package/dist/core/group-execution-orchestrator.d.ts +34 -0
  184. package/dist/core/group-execution-orchestrator.d.ts.map +1 -0
  185. package/dist/core/group-execution-orchestrator.js +238 -0
  186. package/dist/core/group-execution-orchestrator.js.map +1 -0
  187. package/dist/core/loop-state-manager.d.ts +29 -0
  188. package/dist/core/loop-state-manager.d.ts.map +1 -0
  189. package/dist/core/loop-state-manager.js +78 -0
  190. package/dist/core/loop-state-manager.js.map +1 -0
  191. package/dist/core/output-storage-manager.d.ts +14 -0
  192. package/dist/core/output-storage-manager.d.ts.map +1 -0
  193. package/dist/core/output-storage-manager.js +68 -0
  194. package/dist/core/output-storage-manager.js.map +1 -0
  195. package/dist/core/output-tool-builder.d.ts +6 -0
  196. package/dist/core/output-tool-builder.d.ts.map +1 -0
  197. package/dist/core/output-tool-builder.js +50 -0
  198. package/dist/core/output-tool-builder.js.map +1 -0
  199. package/dist/core/parallel-executor.d.ts +21 -0
  200. package/dist/core/parallel-executor.d.ts.map +1 -0
  201. package/dist/core/parallel-executor.js +93 -0
  202. package/dist/core/parallel-executor.js.map +1 -0
  203. package/dist/core/pipeline-finalizer.d.ts +24 -0
  204. package/dist/core/pipeline-finalizer.d.ts.map +1 -0
  205. package/dist/core/pipeline-finalizer.js +103 -0
  206. package/dist/core/pipeline-finalizer.js.map +1 -0
  207. package/dist/core/pipeline-initializer.d.ts +36 -0
  208. package/dist/core/pipeline-initializer.d.ts.map +1 -0
  209. package/dist/core/pipeline-initializer.js +105 -0
  210. package/dist/core/pipeline-initializer.js.map +1 -0
  211. package/dist/core/pipeline-runner.d.ts +36 -0
  212. package/dist/core/pipeline-runner.d.ts.map +1 -0
  213. package/dist/core/pipeline-runner.js +326 -0
  214. package/dist/core/pipeline-runner.js.map +1 -0
  215. package/dist/core/pr-creator.d.ts +23 -0
  216. package/dist/core/pr-creator.d.ts.map +1 -0
  217. package/dist/core/pr-creator.js +138 -0
  218. package/dist/core/pr-creator.js.map +1 -0
  219. package/dist/core/retry-handler.d.ts +15 -0
  220. package/dist/core/retry-handler.d.ts.map +1 -0
  221. package/dist/core/retry-handler.js +95 -0
  222. package/dist/core/retry-handler.js.map +1 -0
  223. package/dist/core/stage-executor.d.ts +27 -0
  224. package/dist/core/stage-executor.d.ts.map +1 -0
  225. package/dist/core/stage-executor.js +365 -0
  226. package/dist/core/stage-executor.js.map +1 -0
  227. package/dist/core/state-manager.d.ts +10 -0
  228. package/dist/core/state-manager.d.ts.map +1 -0
  229. package/dist/core/state-manager.js +61 -0
  230. package/dist/core/state-manager.js.map +1 -0
  231. package/dist/core/types/agent-runtime.d.ts +51 -0
  232. package/dist/core/types/agent-runtime.d.ts.map +1 -0
  233. package/dist/core/types/agent-runtime.js +2 -0
  234. package/dist/core/types/agent-runtime.js.map +1 -0
  235. package/dist/core/types/execution-graph.d.ts +29 -0
  236. package/dist/core/types/execution-graph.d.ts.map +1 -0
  237. package/dist/core/types/execution-graph.js +2 -0
  238. package/dist/core/types/execution-graph.js.map +1 -0
  239. package/dist/index.d.ts +3 -0
  240. package/dist/index.d.ts.map +1 -0
  241. package/dist/index.js +400 -0
  242. package/dist/index.js.map +1 -0
  243. package/dist/notifications/notification-manager.d.ts +12 -0
  244. package/dist/notifications/notification-manager.d.ts.map +1 -0
  245. package/dist/notifications/notification-manager.js +74 -0
  246. package/dist/notifications/notification-manager.js.map +1 -0
  247. package/dist/notifications/notifiers/base-notifier.d.ts +9 -0
  248. package/dist/notifications/notifiers/base-notifier.d.ts.map +1 -0
  249. package/dist/notifications/notifiers/base-notifier.js +27 -0
  250. package/dist/notifications/notifiers/base-notifier.js.map +1 -0
  251. package/dist/notifications/notifiers/local-notifier.d.ts +11 -0
  252. package/dist/notifications/notifiers/local-notifier.d.ts.map +1 -0
  253. package/dist/notifications/notifiers/local-notifier.js +91 -0
  254. package/dist/notifications/notifiers/local-notifier.js.map +1 -0
  255. package/dist/notifications/notifiers/slack-notifier.d.ts +13 -0
  256. package/dist/notifications/notifiers/slack-notifier.d.ts.map +1 -0
  257. package/dist/notifications/notifiers/slack-notifier.js +209 -0
  258. package/dist/notifications/notifiers/slack-notifier.js.map +1 -0
  259. package/dist/notifications/types.d.ts +34 -0
  260. package/dist/notifications/types.d.ts.map +1 -0
  261. package/dist/notifications/types.js +2 -0
  262. package/dist/notifications/types.js.map +1 -0
  263. package/dist/ui/components/execution-group.d.ts +10 -0
  264. package/dist/ui/components/execution-group.d.ts.map +1 -0
  265. package/dist/ui/components/execution-group.js +19 -0
  266. package/dist/ui/components/execution-group.js.map +1 -0
  267. package/dist/ui/components/stage-row.d.ts +10 -0
  268. package/dist/ui/components/stage-row.d.ts.map +1 -0
  269. package/dist/ui/components/stage-row.js +69 -0
  270. package/dist/ui/components/stage-row.js.map +1 -0
  271. package/dist/ui/components/status-badge.d.ts +7 -0
  272. package/dist/ui/components/status-badge.d.ts.map +1 -0
  273. package/dist/ui/components/status-badge.js +18 -0
  274. package/dist/ui/components/status-badge.js.map +1 -0
  275. package/dist/ui/components/summary-line.d.ts +9 -0
  276. package/dist/ui/components/summary-line.d.ts.map +1 -0
  277. package/dist/ui/components/summary-line.js +13 -0
  278. package/dist/ui/components/summary-line.js.map +1 -0
  279. package/dist/ui/pipeline-ui.d.ts +8 -0
  280. package/dist/ui/pipeline-ui.d.ts.map +1 -0
  281. package/dist/ui/pipeline-ui.js +82 -0
  282. package/dist/ui/pipeline-ui.js.map +1 -0
  283. package/dist/utils/error-factory.d.ts +21 -0
  284. package/dist/utils/error-factory.d.ts.map +1 -0
  285. package/dist/utils/error-factory.js +74 -0
  286. package/dist/utils/error-factory.js.map +1 -0
  287. package/dist/utils/errors.d.ts +11 -0
  288. package/dist/utils/errors.d.ts.map +1 -0
  289. package/dist/utils/errors.js +21 -0
  290. package/dist/utils/errors.js.map +1 -0
  291. package/dist/utils/gh-cli-checker.d.ts +6 -0
  292. package/dist/utils/gh-cli-checker.d.ts.map +1 -0
  293. package/dist/utils/gh-cli-checker.js +42 -0
  294. package/dist/utils/gh-cli-checker.js.map +1 -0
  295. package/dist/utils/logger.d.ts +16 -0
  296. package/dist/utils/logger.d.ts.map +1 -0
  297. package/dist/utils/logger.js +39 -0
  298. package/dist/utils/logger.js.map +1 -0
  299. package/dist/utils/pipeline-formatter.d.ts +10 -0
  300. package/dist/utils/pipeline-formatter.d.ts.map +1 -0
  301. package/dist/utils/pipeline-formatter.js +92 -0
  302. package/dist/utils/pipeline-formatter.js.map +1 -0
  303. package/dist/utils/token-estimator.d.ts +15 -0
  304. package/dist/utils/token-estimator.d.ts.map +1 -0
  305. package/dist/utils/token-estimator.js +46 -0
  306. package/dist/utils/token-estimator.js.map +1 -0
  307. package/dist/validators/pipeline-validator.d.ts +31 -0
  308. package/dist/validators/pipeline-validator.d.ts.map +1 -0
  309. package/dist/validators/pipeline-validator.js +540 -0
  310. package/dist/validators/pipeline-validator.js.map +1 -0
  311. package/license +21 -0
  312. package/package.json +90 -0
@@ -0,0 +1,233 @@
1
+ export class DAGPlanner {
2
+ buildExecutionPlan(config) {
3
+ const validation = this.validateDAG(config);
4
+ if (!validation.valid) {
5
+ throw new Error(`Invalid pipeline DAG:\n${validation.errors.join('\n')}`);
6
+ }
7
+ const nodes = this.buildNodes(config);
8
+ const adjacencyList = this.buildAdjacencyList(nodes);
9
+ const sortedStages = this.topologicalSort(nodes);
10
+ const groups = this.groupByLevel(sortedStages, nodes);
11
+ const plan = {
12
+ groups,
13
+ totalStages: config.agents.length,
14
+ maxParallelism: Math.max(...groups.map(g => g.stages.length)),
15
+ isSequential: groups.every(g => g.stages.length === 1)
16
+ };
17
+ return {
18
+ nodes,
19
+ adjacencyList,
20
+ plan,
21
+ validation
22
+ };
23
+ }
24
+ validateDAG(config) {
25
+ const errors = [];
26
+ const warnings = [];
27
+ const stageNames = new Set(config.agents.map(a => a.name));
28
+ const seen = new Set();
29
+ const duplicates = new Set();
30
+ for (const agent of config.agents) {
31
+ if (seen.has(agent.name)) {
32
+ duplicates.add(agent.name);
33
+ }
34
+ seen.add(agent.name);
35
+ }
36
+ if (duplicates.size > 0) {
37
+ errors.push(`Duplicate stage names: ${Array.from(duplicates).join(', ')}`);
38
+ }
39
+ for (const agent of config.agents) {
40
+ if (agent.dependsOn) {
41
+ for (const dependency of agent.dependsOn) {
42
+ if (!stageNames.has(dependency)) {
43
+ errors.push(`Stage "${agent.name}" depends on unknown stage "${dependency}"`);
44
+ }
45
+ }
46
+ }
47
+ }
48
+ const visited = new Set();
49
+ const recursionStack = new Set();
50
+ const cycleReported = new Set();
51
+ const hasCycle = (stageName) => {
52
+ visited.add(stageName);
53
+ recursionStack.add(stageName);
54
+ const stage = config.agents.find(a => a.name === stageName);
55
+ if (stage?.dependsOn) {
56
+ for (const dependency of stage.dependsOn) {
57
+ if (!visited.has(dependency)) {
58
+ if (hasCycle(dependency))
59
+ return true;
60
+ }
61
+ else if (recursionStack.has(dependency)) {
62
+ const cycleKey = `${stageName}->${dependency}`;
63
+ if (!cycleReported.has(cycleKey)) {
64
+ errors.push(`Circular dependency detected involving "${stageName}" -> "${dependency}"`);
65
+ cycleReported.add(cycleKey);
66
+ }
67
+ return true;
68
+ }
69
+ }
70
+ }
71
+ recursionStack.delete(stageName);
72
+ return false;
73
+ };
74
+ for (const agent of config.agents) {
75
+ if (!visited.has(agent.name)) {
76
+ hasCycle(agent.name);
77
+ }
78
+ }
79
+ for (const agent of config.agents) {
80
+ if (agent.dependsOn?.includes(agent.name)) {
81
+ errors.push(`Stage "${agent.name}" cannot depend on itself`);
82
+ }
83
+ }
84
+ if (errors.length === 0) {
85
+ const maxDepth = this.calculateMaxDepth(config);
86
+ if (maxDepth > 5) {
87
+ warnings.push(`Deep dependency chain detected (${maxDepth} levels). Consider optimizing.`);
88
+ }
89
+ }
90
+ return {
91
+ valid: errors.length === 0,
92
+ errors,
93
+ warnings
94
+ };
95
+ }
96
+ buildNodes(config) {
97
+ const nodes = new Map();
98
+ for (const stage of config.agents) {
99
+ nodes.set(stage.name, {
100
+ stage,
101
+ dependencies: stage.dependsOn || [],
102
+ dependents: [],
103
+ level: 0
104
+ });
105
+ }
106
+ for (const [name, node] of nodes) {
107
+ for (const dependency of node.dependencies) {
108
+ const dependencyNode = nodes.get(dependency);
109
+ if (dependencyNode) {
110
+ dependencyNode.dependents.push(name);
111
+ }
112
+ }
113
+ }
114
+ this.calculateLevels(nodes);
115
+ return nodes;
116
+ }
117
+ calculateLevels(nodes) {
118
+ const visited = new Set();
119
+ const calculateLevel = (name) => {
120
+ const existingNode = nodes.get(name);
121
+ if (!existingNode) {
122
+ return 0;
123
+ }
124
+ if (visited.has(name)) {
125
+ return existingNode.level;
126
+ }
127
+ visited.add(name);
128
+ if (existingNode.dependencies.length === 0) {
129
+ existingNode.level = 0;
130
+ return 0;
131
+ }
132
+ const dependencyLevels = existingNode.dependencies.map(dependency => calculateLevel(dependency));
133
+ existingNode.level = Math.max(...dependencyLevels) + 1;
134
+ return existingNode.level;
135
+ };
136
+ for (const name of nodes.keys()) {
137
+ calculateLevel(name);
138
+ }
139
+ }
140
+ buildAdjacencyList(nodes) {
141
+ const adjacencyList = new Map();
142
+ for (const [name, node] of nodes) {
143
+ adjacencyList.set(name, node.dependencies);
144
+ }
145
+ return adjacencyList;
146
+ }
147
+ topologicalSort(nodes) {
148
+ const inDegree = new Map();
149
+ const sorted = [];
150
+ for (const [name, node] of nodes) {
151
+ inDegree.set(name, node.dependencies.length);
152
+ }
153
+ const nodesWithNoDependencies = [];
154
+ for (const [name, degree] of inDegree) {
155
+ if (degree === 0) {
156
+ nodesWithNoDependencies.push(name);
157
+ }
158
+ }
159
+ const queue = nodesWithNoDependencies;
160
+ while (queue.length > 0) {
161
+ const current = queue.shift();
162
+ if (!current)
163
+ continue;
164
+ sorted.push(current);
165
+ const node = nodes.get(current);
166
+ if (!node)
167
+ continue;
168
+ for (const dependent of node.dependents) {
169
+ const newDegree = (inDegree.get(dependent) || 0) - 1;
170
+ inDegree.set(dependent, newDegree);
171
+ if (newDegree === 0) {
172
+ queue.push(dependent);
173
+ }
174
+ }
175
+ }
176
+ if (sorted.length !== nodes.size) {
177
+ throw new Error('Invalid pipeline DAG: Cycle detected or incomplete DAG');
178
+ }
179
+ return sorted;
180
+ }
181
+ groupByLevel(sortedStages, nodes) {
182
+ const levelMap = new Map();
183
+ for (const stageName of sortedStages) {
184
+ const node = nodes.get(stageName);
185
+ if (!node)
186
+ continue;
187
+ const level = node.level;
188
+ if (!levelMap.has(level)) {
189
+ levelMap.set(level, []);
190
+ }
191
+ const levelStages = levelMap.get(level);
192
+ if (levelStages) {
193
+ levelStages.push(node.stage);
194
+ }
195
+ }
196
+ const groups = [];
197
+ const sortedLevels = Array.from(levelMap.keys()).sort((a, b) => a - b);
198
+ for (const level of sortedLevels) {
199
+ const stages = levelMap.get(level);
200
+ if (stages && stages.length > 0) {
201
+ groups.push({
202
+ level,
203
+ stages
204
+ });
205
+ }
206
+ }
207
+ return groups;
208
+ }
209
+ calculateMaxDepth(config) {
210
+ const depthMap = new Map();
211
+ const getDepth = (stageName) => {
212
+ const cachedDepth = depthMap.get(stageName);
213
+ if (cachedDepth !== undefined) {
214
+ return cachedDepth;
215
+ }
216
+ const stage = config.agents.find(a => a.name === stageName);
217
+ if (!stage || !stage.dependsOn || stage.dependsOn.length === 0) {
218
+ depthMap.set(stageName, 0);
219
+ return 0;
220
+ }
221
+ const dependencyDepths = stage.dependsOn.map(dependency => getDepth(dependency));
222
+ const depth = Math.max(...dependencyDepths) + 1;
223
+ depthMap.set(stageName, depth);
224
+ return depth;
225
+ };
226
+ let maxDepth = 0;
227
+ for (const agent of config.agents) {
228
+ maxDepth = Math.max(maxDepth, getDepth(agent.name));
229
+ }
230
+ return maxDepth;
231
+ }
232
+ }
233
+ //# sourceMappingURL=dag-planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-planner.js","sourceRoot":"","sources":["../../src/core/dag-planner.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,UAAU;IAIrB,kBAAkB,CAAC,MAAsB;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAEtD,MAAM,IAAI,GAAkB;YAC1B,MAAM;YACN,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YACjC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7D,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;SACvD,CAAC;QAEF,OAAO;YACL,KAAK;YACL,aAAa;YACb,IAAI;YACJ,UAAU;SACX,CAAC;IACJ,CAAC;IAKD,WAAW,CAAC,MAAsB;QAChC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAG3D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QAGD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBAChC,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,+BAA+B,UAAU,GAAG,CAAC,CAAC;oBAChF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAGD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAExC,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAW,EAAE;YAC9C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAC5D,IAAI,KAAK,EAAE,SAAS,EAAE,CAAC;gBACrB,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC7B,IAAI,QAAQ,CAAC,UAAU,CAAC;4BAAE,OAAO,IAAI,CAAC;oBACxC,CAAC;yBAAM,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC1C,MAAM,QAAQ,GAAG,GAAG,SAAS,KAAK,UAAU,EAAE,CAAC;wBAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACjC,MAAM,CAAC,IAAI,CAAC,2CAA2C,SAAS,SAAS,UAAU,GAAG,CAAC,CAAC;4BACxF,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBAC9B,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YAED,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAGD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,2BAA2B,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAID,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,mCAAmC,QAAQ,gCAAgC,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAKO,UAAU,CAAC,MAAsB;QACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;QAG/C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;gBACpB,KAAK;gBACL,YAAY,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;gBACnC,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;QACL,CAAC;QAGD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACjC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3C,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC7C,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAGD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAE5B,OAAO,KAAK,CAAC;IACf,CAAC;IAKO,eAAe,CAAC,KAAiC;QACvD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;YAC9C,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,CAAC;YACX,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,YAAY,CAAC,KAAK,CAAC;YAC5B,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAElB,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3C,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC;gBACvB,OAAO,CAAC,CAAC;YACX,CAAC;YAED,MAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;YACjG,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvD,OAAO,YAAY,CAAC,KAAK,CAAC;QAC5B,CAAC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAChC,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAKO,kBAAkB,CAAC,KAAiC;QAC1D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;QAElD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACjC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAKO,eAAe,CACrB,KAAiC;QAEjC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;QAG5B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACjC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QAGD,MAAM,uBAAuB,GAAa,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACtC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjB,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAGD,MAAM,KAAK,GAAG,uBAAuB,CAAC;QACtC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACrD,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAEnC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;oBACpB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAKO,YAAY,CAClB,YAAsB,EACtB,KAAiC;QAEjC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;QAEvD,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAEzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1B,CAAC;YAED,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAGD,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK;oBACL,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAKO,iBAAiB,CAAC,MAAsB;QAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE3C,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAU,EAAE;YAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/D,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC3B,OAAO,CAAC,CAAC;YACX,CAAC;YAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YACjF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAChD,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { SimpleGit } from 'simple-git';
2
+ export declare class GitManager {
3
+ protected git: SimpleGit;
4
+ constructor(repoPath: string);
5
+ getCurrentCommit(): Promise<string>;
6
+ getChangedFiles(commitSha: string): Promise<string[]>;
7
+ hasUncommittedChanges(): Promise<boolean>;
8
+ stageAllChanges(): Promise<void>;
9
+ commitWithMetadata(message: string, metadata: Record<string, string>): Promise<string>;
10
+ createPipelineCommit(stageName: string, runId: string, customMessage?: string): Promise<string>;
11
+ revertToCommit(commitSha: string): Promise<void>;
12
+ getCommitMessage(commitSha: string): Promise<string>;
13
+ }
14
+ //# sourceMappingURL=git-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-manager.d.ts","sourceRoot":"","sources":["../../src/core/git-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,SAAS,EAAE,MAAM,YAAY,CAAC;AAOlD,qBAAa,UAAU;IACrB,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC;gBAEb,QAAQ,EAAE,MAAM;IAItB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBrD,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IAKzC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,kBAAkB,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC;IAoBZ,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC;IAgBZ,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAI3D"}
@@ -0,0 +1,70 @@
1
+ import { simpleGit } from 'simple-git';
2
+ import { ErrorFactory } from '../utils/error-factory.js';
3
+ export class GitManager {
4
+ git;
5
+ constructor(repoPath) {
6
+ this.git = simpleGit(repoPath);
7
+ }
8
+ async getCurrentCommit() {
9
+ const log = await this.git.log(['-1']);
10
+ return log.latest?.hash || '';
11
+ }
12
+ async getChangedFiles(commitSha) {
13
+ try {
14
+ const diff = await this.git.diff([
15
+ '--name-only',
16
+ `${commitSha}^`,
17
+ commitSha
18
+ ]);
19
+ return diff.split('\n').filter(Boolean);
20
+ }
21
+ catch (error) {
22
+ const gitError = ErrorFactory.createGitError(error, 'diff');
23
+ if (gitError.message.includes('ambiguous argument') ||
24
+ gitError.message.includes('unknown revision')) {
25
+ const allFiles = await this.git.raw(['ls-tree', '--name-only', '-r', commitSha]);
26
+ return allFiles.split('\n').filter(Boolean);
27
+ }
28
+ throw new Error(gitError.suggestion || gitError.message);
29
+ }
30
+ }
31
+ async hasUncommittedChanges() {
32
+ const status = await this.git.status();
33
+ return !status.isClean();
34
+ }
35
+ async stageAllChanges() {
36
+ await this.git.add('.');
37
+ }
38
+ async commitWithMetadata(message, metadata) {
39
+ const status = await this.git.status();
40
+ if (status.staged.length === 0) {
41
+ throw new Error('No staged changes to commit. Stage changes with git.add() first.');
42
+ }
43
+ const trailers = Object.entries(metadata)
44
+ .map(([key, value]) => `${key}: ${value}`)
45
+ .join('\n');
46
+ const fullMessage = `${message}\n\n${trailers}`;
47
+ await this.git.commit(fullMessage);
48
+ return this.getCurrentCommit();
49
+ }
50
+ async createPipelineCommit(stageName, runId, customMessage) {
51
+ if (!(await this.hasUncommittedChanges())) {
52
+ return '';
53
+ }
54
+ await this.stageAllChanges();
55
+ const message = customMessage || `Apply ${stageName} changes`;
56
+ const commitMessage = `[pipeline:${stageName}] ${message}`;
57
+ return this.commitWithMetadata(commitMessage, {
58
+ 'Pipeline-Run-ID': runId,
59
+ 'Pipeline-Stage': stageName
60
+ });
61
+ }
62
+ async revertToCommit(commitSha) {
63
+ await this.git.reset(['--hard', commitSha]);
64
+ }
65
+ async getCommitMessage(commitSha) {
66
+ const log = await this.git.log(['-1', commitSha]);
67
+ return log.latest?.message || '';
68
+ }
69
+ }
70
+ //# sourceMappingURL=git-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-manager.js","sourceRoot":"","sources":["../../src/core/git-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { GitManager } from './git-manager.js';
2
+ import { ParallelExecutor } from './parallel-executor.js';
3
+ import { StateManager } from './state-manager.js';
4
+ import { AgentRuntime } from './types/agent-runtime.js';
5
+ import { PipelineConfig, PipelineState, StageExecution } from '../config/schema.js';
6
+ import { ExecutionGraph, ExecutionGroup } from './types/execution-graph.js';
7
+ export interface GroupProcessingResult {
8
+ state: PipelineState;
9
+ shouldStopPipeline: boolean;
10
+ }
11
+ export declare class GroupExecutionOrchestrator {
12
+ private gitManager;
13
+ private stateManager;
14
+ private repoPath;
15
+ private dryRun;
16
+ private runtime;
17
+ private shouldLog;
18
+ private stateChangeCallback;
19
+ private notifyStageResultsCallback;
20
+ private conditionEvaluator;
21
+ constructor(gitManager: GitManager, stateManager: StateManager, repoPath: string, dryRun: boolean, runtime: AgentRuntime, shouldLog: (interactive: boolean) => boolean, stateChangeCallback: (state: PipelineState) => void, notifyStageResultsCallback: (executions: StageExecution[], state: PipelineState) => Promise<void>);
22
+ processGroup(group: ExecutionGroup, state: PipelineState, config: PipelineConfig, executionGraph: ExecutionGraph, parallelExecutor: ParallelExecutor, interactive: boolean): Promise<GroupProcessingResult>;
23
+ private filterDisabledStages;
24
+ private evaluateConditions;
25
+ private executeGroup;
26
+ private handleContextReduction;
27
+ private handleGroupFailures;
28
+ private getNextStageToExecute;
29
+ private estimateNextContext;
30
+ private logSkippedStage;
31
+ private logGroupStart;
32
+ private logGroupResult;
33
+ }
34
+ //# sourceMappingURL=group-execution-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-execution-orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/group-execution-orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,EACL,cAAc,EACd,aAAa,EAEb,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5E,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,aAAa,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,qBAAa,0BAA0B;IAInC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,0BAA0B;IAVpC,OAAO,CAAC,kBAAkB,CAAqB;gBAGrC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,EAC5C,mBAAmB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EACnD,0BAA0B,EAAE,CAClC,UAAU,EAAE,cAAc,EAAE,EAC5B,KAAK,EAAE,aAAa,KACjB,OAAO,CAAC,IAAI,CAAC;IAQd,YAAY,CAChB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EACtB,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,qBAAqB,CAAC;IAsEjC,OAAO,CAAC,oBAAoB;YA2Bd,kBAAkB;YA4ClB,YAAY;YA4CZ,sBAAsB;IA8FpC,OAAO,CAAC,mBAAmB;IAsE3B,OAAO,CAAC,qBAAqB;YAiBf,mBAAmB;IA6BjC,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,cAAc;CAcvB"}
@@ -0,0 +1,238 @@
1
+ import { StageExecutor } from './stage-executor.js';
2
+ import { ConditionEvaluator } from './condition-evaluator.js';
3
+ import { ContextReducer } from './context-reducer.js';
4
+ import { TokenEstimator } from '../utils/token-estimator.js';
5
+ import { PipelineFormatter } from '../utils/pipeline-formatter.js';
6
+ export class GroupExecutionOrchestrator {
7
+ gitManager;
8
+ stateManager;
9
+ repoPath;
10
+ dryRun;
11
+ runtime;
12
+ shouldLog;
13
+ stateChangeCallback;
14
+ notifyStageResultsCallback;
15
+ conditionEvaluator;
16
+ constructor(gitManager, stateManager, repoPath, dryRun, runtime, shouldLog, stateChangeCallback, notifyStageResultsCallback) {
17
+ this.gitManager = gitManager;
18
+ this.stateManager = stateManager;
19
+ this.repoPath = repoPath;
20
+ this.dryRun = dryRun;
21
+ this.runtime = runtime;
22
+ this.shouldLog = shouldLog;
23
+ this.stateChangeCallback = stateChangeCallback;
24
+ this.notifyStageResultsCallback = notifyStageResultsCallback;
25
+ this.conditionEvaluator = new ConditionEvaluator();
26
+ }
27
+ async processGroup(group, state, config, executionGraph, parallelExecutor, interactive) {
28
+ const { enabledStages } = this.filterDisabledStages(group, state, interactive);
29
+ const stagesToRun = await this.evaluateConditions(enabledStages, state, interactive);
30
+ if (stagesToRun.length === 0) {
31
+ return { state, shouldStopPipeline: false };
32
+ }
33
+ this.logGroupStart(stagesToRun, group, interactive);
34
+ const executionMode = config.settings?.executionMode || 'parallel';
35
+ const groupResult = await this.executeGroup(stagesToRun, state, executionMode, parallelExecutor, interactive);
36
+ state.stages.push(...groupResult.executions);
37
+ await this.notifyStageResultsCallback(groupResult.executions, state);
38
+ await this.stateManager.saveState(state);
39
+ this.stateChangeCallback(state);
40
+ await this.handleContextReduction(state, config, executionGraph, executionGraph.plan.groups.indexOf(group), interactive);
41
+ this.logGroupResult(groupResult, executionMode, stagesToRun, parallelExecutor, interactive);
42
+ const shouldStopPipeline = this.handleGroupFailures(groupResult, stagesToRun, state, config, interactive);
43
+ return { state, shouldStopPipeline };
44
+ }
45
+ filterDisabledStages(group, state, interactive) {
46
+ const enabledStages = group.stages.filter((s) => s.enabled !== false);
47
+ const disabledStages = group.stages.filter((s) => s.enabled === false);
48
+ for (const disabledStage of disabledStages) {
49
+ if (this.shouldLog(interactive)) {
50
+ this.logSkippedStage(disabledStage.name, 'disabled');
51
+ }
52
+ state.stages.push({
53
+ stageName: disabledStage.name,
54
+ status: 'skipped',
55
+ startTime: new Date().toISOString()
56
+ });
57
+ this.stateChangeCallback(state);
58
+ }
59
+ return { enabledStages, disabledStages };
60
+ }
61
+ async evaluateConditions(enabledStages, state, interactive) {
62
+ const stagesToRun = [];
63
+ for (const stage of enabledStages) {
64
+ if (stage.condition) {
65
+ const conditionMet = this.conditionEvaluator.evaluate(stage.condition, state);
66
+ if (!conditionMet) {
67
+ if (this.shouldLog(interactive)) {
68
+ this.logSkippedStage(stage.name, 'condition', stage.condition);
69
+ }
70
+ state.stages.push({
71
+ stageName: stage.name,
72
+ status: 'skipped',
73
+ startTime: new Date().toISOString(),
74
+ conditionEvaluated: true,
75
+ conditionResult: false
76
+ });
77
+ this.stateChangeCallback(state);
78
+ continue;
79
+ }
80
+ else {
81
+ if (this.shouldLog(interactive)) {
82
+ console.log(`✅ Condition met for stage "${stage.name}": ${stage.condition}`);
83
+ }
84
+ }
85
+ }
86
+ stagesToRun.push(stage);
87
+ }
88
+ return stagesToRun;
89
+ }
90
+ async executeGroup(stagesToRun, state, executionMode, parallelExecutor, _interactive) {
91
+ const shouldRunParallel = executionMode === 'parallel' && stagesToRun.length > 1;
92
+ if (shouldRunParallel) {
93
+ return await parallelExecutor.executeParallelGroup(stagesToRun, state, (stageName, output) => {
94
+ const stageIndex = state.stages.findIndex((s) => s.stageName === stageName);
95
+ if (stageIndex >= 0) {
96
+ state.stages[stageIndex].agentOutput = output;
97
+ this.stateChangeCallback(state);
98
+ }
99
+ });
100
+ }
101
+ else {
102
+ return await parallelExecutor.executeSequentialGroup(stagesToRun, state, (stageName, output) => {
103
+ const currentStage = state.stages[state.stages.length - 1];
104
+ if (currentStage && currentStage.stageName === stageName) {
105
+ currentStage.agentOutput = output;
106
+ this.stateChangeCallback(state);
107
+ }
108
+ });
109
+ }
110
+ }
111
+ async handleContextReduction(state, config, executionGraph, currentGroupIndex, interactive) {
112
+ const contextReductionConfig = config.settings?.contextReduction;
113
+ if (!contextReductionConfig?.enabled ||
114
+ contextReductionConfig.strategy !== 'agent-based' ||
115
+ !contextReductionConfig.agentPath) {
116
+ return;
117
+ }
118
+ const nextStage = this.getNextStageToExecute(executionGraph, currentGroupIndex);
119
+ if (!nextStage) {
120
+ return;
121
+ }
122
+ const contextEstimate = await this.estimateNextContext(state, nextStage);
123
+ const contextReducer = new ContextReducer(this.gitManager, this.repoPath, state.runId, this.runtime);
124
+ if (contextReducer.shouldReduce(contextEstimate, contextReductionConfig)) {
125
+ if (this.shouldLog(interactive)) {
126
+ console.log(`⚠️ Context approaching limit (${PipelineFormatter.formatTokenCount(contextEstimate)} tokens). ` +
127
+ `Running context reducer...\n`);
128
+ }
129
+ try {
130
+ const reducerOutput = await contextReducer.runReduction(state, nextStage, contextReductionConfig.agentPath);
131
+ if (reducerOutput.status === 'success') {
132
+ const reducedState = contextReducer.applyReduction(state, reducerOutput);
133
+ state.stages = reducedState.stages;
134
+ await this.stateManager.saveState(state);
135
+ this.stateChangeCallback(state);
136
+ if (this.shouldLog(interactive)) {
137
+ console.log(`✅ Context reduced successfully\n`);
138
+ }
139
+ }
140
+ else {
141
+ if (this.shouldLog(interactive)) {
142
+ console.log(`⚠️ Context reduction failed. Continuing with full context.\n`);
143
+ }
144
+ }
145
+ }
146
+ catch (error) {
147
+ if (this.shouldLog(interactive)) {
148
+ console.warn(`⚠️ Context reduction error: ${error}. Continuing with full context.\n`);
149
+ }
150
+ }
151
+ }
152
+ }
153
+ handleGroupFailures(groupResult, stagesToRun, state, config, interactive) {
154
+ if (!groupResult.anyFailed) {
155
+ return false;
156
+ }
157
+ const failedStages = groupResult.executions.filter((e) => e.status === 'failed');
158
+ for (const failedStage of failedStages) {
159
+ const stageConfig = stagesToRun.find((s) => s.name === failedStage.stageName);
160
+ const failureStrategy = stageConfig?.onFail || config.settings?.failureStrategy || 'stop';
161
+ switch (failureStrategy) {
162
+ case 'stop': {
163
+ if (this.shouldLog(interactive)) {
164
+ console.log(`🛑 Pipeline stopped due to stage failure: ${failedStage.stageName}\n`);
165
+ }
166
+ return true;
167
+ }
168
+ case 'continue': {
169
+ if (this.shouldLog(interactive)) {
170
+ console.log(`⚠️ Stage ${failedStage.stageName} failed but continuing (continue mode)\n`);
171
+ }
172
+ if (state.status === 'running') {
173
+ state.status = 'partial';
174
+ }
175
+ break;
176
+ }
177
+ case 'warn': {
178
+ if (this.shouldLog(interactive)) {
179
+ console.log(`⚠️ Stage ${failedStage.stageName} failed (warn mode) - continuing pipeline\n`);
180
+ }
181
+ if (state.status === 'running') {
182
+ state.status = 'partial';
183
+ }
184
+ break;
185
+ }
186
+ default: {
187
+ if (this.shouldLog(interactive)) {
188
+ console.log(`🛑 Pipeline stopped due to stage failure: ${failedStage.stageName} (unrecognized failure strategy "${failureStrategy}")\n`);
189
+ }
190
+ return true;
191
+ }
192
+ }
193
+ }
194
+ return false;
195
+ }
196
+ getNextStageToExecute(executionGraph, currentGroupIndex) {
197
+ const nextGroupIndex = currentGroupIndex + 1;
198
+ if (nextGroupIndex >= executionGraph.plan.groups.length) {
199
+ return null;
200
+ }
201
+ const nextGroup = executionGraph.plan.groups[nextGroupIndex];
202
+ const enabledStage = nextGroup.stages.find((s) => s.enabled !== false);
203
+ return enabledStage || null;
204
+ }
205
+ async estimateNextContext(state, nextStage) {
206
+ const stageExecutor = new StageExecutor(this.gitManager, this.dryRun, state.runId, this.repoPath, this.runtime);
207
+ try {
208
+ const context = await stageExecutor.buildAgentContext(nextStage, state);
209
+ const tokenEstimator = new TokenEstimator();
210
+ const estimate = tokenEstimator.estimateTokens(context);
211
+ tokenEstimator.dispose();
212
+ return estimate;
213
+ }
214
+ catch (error) {
215
+ return 0;
216
+ }
217
+ }
218
+ logSkippedStage(stageName, reason, conditionText) {
219
+ if (reason === 'disabled') {
220
+ console.log(`⏭️ Skipping disabled stage: ${stageName}\n`);
221
+ }
222
+ else {
223
+ console.log(`⏭️ Skipping stage "${stageName}" (condition not met): ${conditionText}\n`);
224
+ }
225
+ }
226
+ logGroupStart(stagesToRun, group, interactive) {
227
+ if (this.shouldLog(interactive) && stagesToRun.length > 1) {
228
+ console.log(`🔀 Running ${stagesToRun.length} stages in parallel (group ${group.level})...`);
229
+ }
230
+ }
231
+ logGroupResult(groupResult, executionMode, stagesToRun, parallelExecutor, interactive) {
232
+ const shouldRunParallel = executionMode === 'parallel' && stagesToRun.length > 1;
233
+ if (this.shouldLog(interactive) && shouldRunParallel) {
234
+ console.log(`📊 ${parallelExecutor.aggregateResults(groupResult)}\n`);
235
+ }
236
+ }
237
+ }
238
+ //# sourceMappingURL=group-execution-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-execution-orchestrator.js","sourceRoot":"","sources":["../../src/core/group-execution-orchestrator.ts"],"names":[],"mappings":"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"}