pipeline-worker 0.1.26 → 0.1.28

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 (56) hide show
  1. package/README.md +6 -2
  2. package/dist/agent/claude.js +32 -1
  3. package/dist/agent/claude.js.map +1 -1
  4. package/dist/agent/types.d.ts +18 -0
  5. package/dist/cli.js +30 -4
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config/loader.js +25 -3
  8. package/dist/config/loader.js.map +1 -1
  9. package/dist/forge/github.js +7 -0
  10. package/dist/forge/github.js.map +1 -1
  11. package/dist/forge/gitlab.js +7 -0
  12. package/dist/forge/gitlab.js.map +1 -1
  13. package/dist/forge/types.d.ts +9 -0
  14. package/dist/state/runState.d.ts +10 -1
  15. package/dist/state/runState.js +20 -2
  16. package/dist/state/runState.js.map +1 -1
  17. package/dist/types.d.ts +4 -0
  18. package/dist/ui/format.d.ts +19 -0
  19. package/dist/ui/format.js +89 -0
  20. package/dist/ui/format.js.map +1 -0
  21. package/dist/ui/renderer.d.ts +41 -0
  22. package/dist/ui/renderer.js +93 -0
  23. package/dist/ui/renderer.js.map +1 -0
  24. package/dist/ui/runTree.d.ts +106 -0
  25. package/dist/ui/runTree.js +133 -0
  26. package/dist/ui/runTree.js.map +1 -0
  27. package/dist/ui/sessions.js +11 -4
  28. package/dist/ui/sessions.js.map +1 -1
  29. package/dist/ui/steps.d.ts +92 -35
  30. package/dist/ui/steps.js +177 -93
  31. package/dist/ui/steps.js.map +1 -1
  32. package/dist/ui/treeRenderer.d.ts +89 -0
  33. package/dist/ui/treeRenderer.js +271 -0
  34. package/dist/ui/treeRenderer.js.map +1 -0
  35. package/dist/ui/welcome.js +15 -9
  36. package/dist/ui/welcome.js.map +1 -1
  37. package/dist/workflow/adoptBranch.js +16 -10
  38. package/dist/workflow/adoptBranch.js.map +1 -1
  39. package/dist/workflow/captureIntent.d.ts +7 -2
  40. package/dist/workflow/captureIntent.js +1 -25
  41. package/dist/workflow/captureIntent.js.map +1 -1
  42. package/dist/workflow/openMergeRequest.d.ts +1 -1
  43. package/dist/workflow/openMergeRequest.js +8 -7
  44. package/dist/workflow/openMergeRequest.js.map +1 -1
  45. package/dist/workflow/orchestrate.d.ts +1 -1
  46. package/dist/workflow/orchestrate.js +61 -39
  47. package/dist/workflow/orchestrate.js.map +1 -1
  48. package/dist/workflow/runPlan.d.ts +18 -0
  49. package/dist/workflow/runPlan.js +53 -0
  50. package/dist/workflow/runPlan.js.map +1 -0
  51. package/dist/workflow/syncTargetBranch.d.ts +37 -0
  52. package/dist/workflow/syncTargetBranch.js +83 -0
  53. package/dist/workflow/syncTargetBranch.js.map +1 -0
  54. package/dist/workflow/watchPipeline.js +61 -23
  55. package/dist/workflow/watchPipeline.js.map +1 -1
  56. package/package.json +1 -1
@@ -0,0 +1,271 @@
1
+ /**
2
+ * The live TTY dashboard: a pinned bottom region holding the run header and
3
+ * the step tree, repainted in place, with freeform log lines (notes, agent
4
+ * output, stray console writes) scrolling into the terminal's scrollback
5
+ * ABOVE the region — the same strategy ora/listr2 use, hand-rolled to keep
6
+ * the dependency count at zero.
7
+ *
8
+ * pipeline-worker · fix-login-redirect · worktree a91f · running · 9.4k tok
9
+ * ├─ ✓ capture staged + unstaged diff 0.4s
10
+ * ├─ ● ci-watch pipeline #8123: fixing attempt 2/5 · 4.4k tok
11
+ * └─ ○ merge auto-merge + sync local main
12
+ *
13
+ * Invariants that keep the redraw exact:
14
+ * - Every painted line is pre-truncated to the terminal width, so no line
15
+ * can wrap; `renderedLines` therefore always equals the physical rows the
16
+ * region occupies, and one `ESC[{n}A CR ESC[J` erases exactly the region.
17
+ * - While attached, console.log/error are intercepted and routed through
18
+ * log(), so nothing can print into the middle of the region (CLAUDE.md's
19
+ * terminal-output discipline keeps direct process.stdout writers out of
20
+ * the rest of the codebase).
21
+ * - The cursor is hidden on attach and restored on stop AND on process exit
22
+ * (the 'exit' hook only does a sync write, which is allowed there), so a
23
+ * ctrl-C mid-frame never leaves a cursorless terminal.
24
+ */
25
+ import { styleText } from 'node:util';
26
+ import { truncateToWidth } from './steps.js';
27
+ import { formatTokens } from './format.js';
28
+ import { formatElapsed, formatAttempt } from './renderer.js';
29
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
30
+ const PAINT_INTERVAL_MS = 80;
31
+ const DEFAULT_COLUMNS = 80;
32
+ const HIDE_CURSOR = '\x1b[?25l';
33
+ const SHOW_CURSOR = '\x1b[?25h';
34
+ function isElision(row) {
35
+ return 'summary' in row;
36
+ }
37
+ function isFinished(node) {
38
+ return node.status === 'done' || node.status === 'skipped';
39
+ }
40
+ /** True when this subtree holds nothing the user still needs to see individually. */
41
+ function subtreeFinished(node) {
42
+ return isFinished(node) && node.children.every(subtreeFinished);
43
+ }
44
+ /**
45
+ * Elides rows until header + rows fit in `maxRows`, keeping what the user
46
+ * actually watches: the running/failed/pending steps. Two passes, both
47
+ * deterministic (pure function, unit-tested directly):
48
+ *
49
+ * 1. collapse each parent's leading finished children (a long fix-attempt
50
+ * history) into one `… ✓ N earlier attempts` row, keeping the last
51
+ * finished child for context;
52
+ * 2. collapse leading fully-finished top-level steps into `… ✓ N earlier
53
+ * steps`.
54
+ *
55
+ * If the tree still doesn't fit (tiny terminal), keep the tail — the newest
56
+ * rows are the live ones.
57
+ */
58
+ export function fitToHeight(rows, maxRows) {
59
+ const budget = Math.max(1, maxRows - 1); // header takes one row
60
+ if (rows.length <= budget)
61
+ return rows;
62
+ let display = [...rows];
63
+ // Walks runs of consecutive rows matching `candidate` at the same depth
64
+ // and collapses each run (if longer than 2) down to a summary line plus
65
+ // its final row, so the most recent item of a run stays visible for context.
66
+ const collapseRuns = (candidate, label) => {
67
+ const next = [];
68
+ let run = [];
69
+ const flush = () => {
70
+ if (run.length > 2) {
71
+ const collapsed = run.slice(0, -1);
72
+ next.push({ summary: label(collapsed.length, run[0].depth), depth: run[0].depth });
73
+ next.push(run[run.length - 1]);
74
+ }
75
+ else {
76
+ next.push(...run);
77
+ }
78
+ run = [];
79
+ };
80
+ for (const row of display) {
81
+ if (!isElision(row) && candidate(row) && (run.length === 0 || run[0].depth === row.depth)) {
82
+ run.push(row);
83
+ }
84
+ else {
85
+ flush();
86
+ next.push(row);
87
+ }
88
+ }
89
+ flush();
90
+ display = next;
91
+ };
92
+ collapseRuns((row) => row.depth > 0 && isFinished(row.node) && row.node.children.length === 0, (n) => `… ${n} earlier attempts`);
93
+ if (display.length <= budget)
94
+ return display;
95
+ collapseRuns((row) => row.depth === 0 && subtreeFinished(row.node), (n) => `… ${n} earlier steps`);
96
+ if (display.length <= budget)
97
+ return display;
98
+ // Last resort: keep the newest rows (the live tail).
99
+ return display.slice(display.length - budget);
100
+ }
101
+ export class TreeRenderer {
102
+ out;
103
+ tree;
104
+ renderedLines = 0;
105
+ frame = 0;
106
+ timer;
107
+ stopped = false;
108
+ originalConsole = { log: console.log, error: console.error, warn: console.warn };
109
+ onResize = () => {
110
+ // Post-reflow, the terminal may have re-wrapped the old region in ways
111
+ // cursor math can't undo reliably; abandon it (one junk block stays in
112
+ // scrollback — the deliberate trade-off) and paint fresh.
113
+ this.out.write('\n');
114
+ this.renderedLines = 0;
115
+ this.paint();
116
+ };
117
+ restoreCursorOnExit = () => {
118
+ if (!this.stopped)
119
+ this.out.write(SHOW_CURSOR);
120
+ };
121
+ constructor(out = process.stdout) {
122
+ this.out = out;
123
+ }
124
+ columns() {
125
+ return this.out.columns ?? DEFAULT_COLUMNS;
126
+ }
127
+ /**
128
+ * Repaints immediately on every tree mutation — a step finishing or a
129
+ * token count changing must show up right away, not on the next spinner
130
+ * tick. The interval timer (attach()) exists only to keep the spinner
131
+ * glyph and the running step's elapsed-time counter animating during long
132
+ * stretches with no tree events at all (a multi-minute CI poll).
133
+ */
134
+ onEvent(event, tree) {
135
+ if (this.tree === undefined)
136
+ this.attach(tree);
137
+ void event;
138
+ this.paint();
139
+ }
140
+ attach(tree) {
141
+ this.tree = tree;
142
+ this.out.write(HIDE_CURSOR);
143
+ process.once('exit', this.restoreCursorOnExit);
144
+ this.out.on?.('resize', this.onResize);
145
+ // Route anything that would print mid-region through log() instead.
146
+ console.log = (...args) => this.log(args.map(String).join(' '));
147
+ console.error = (...args) => this.log(args.map(String).join(' '));
148
+ console.warn = (...args) => this.log(args.map(String).join(' '));
149
+ // unref() so a settled run's process never lingers on the spinner timer.
150
+ this.timer = setInterval(() => this.paint(), PAINT_INTERVAL_MS);
151
+ this.timer.unref?.();
152
+ }
153
+ eraseRegion() {
154
+ if (this.renderedLines > 0) {
155
+ this.out.write(`\x1b[${this.renderedLines}A\r\x1b[J`);
156
+ this.renderedLines = 0;
157
+ }
158
+ }
159
+ /** Freeform text: erase the region, let the text enter scrollback, repaint beneath it. */
160
+ log(text) {
161
+ this.eraseRegion();
162
+ this.out.write(`${text}\n`);
163
+ if (!this.stopped)
164
+ this.paint();
165
+ }
166
+ headerLine(status) {
167
+ const tree = this.tree;
168
+ const parts = ['pipeline-worker', tree.header.title];
169
+ if (tree.header.worktreeShortId)
170
+ parts.push(`worktree ${tree.header.worktreeShortId}`);
171
+ parts.push(status);
172
+ const total = tree.totalTokens();
173
+ if (total > 0)
174
+ parts.push(formatTokens(total));
175
+ return truncateToWidth(parts.join(' · '), this.columns());
176
+ }
177
+ statusGlyph(node) {
178
+ switch (node.status) {
179
+ case 'done':
180
+ return { glyph: '✓', color: 'green' };
181
+ case 'failed':
182
+ return { glyph: '✗', color: 'red' };
183
+ case 'running':
184
+ return { glyph: SPINNER_FRAMES[this.frame % SPINNER_FRAMES.length], color: 'cyan' };
185
+ case 'skipped':
186
+ return { glyph: '–', color: 'dim' };
187
+ default:
188
+ return { glyph: '○', color: 'dim' };
189
+ }
190
+ }
191
+ /** Right-hand figures: 'attempt 2/5 · 4.4k tok · 3.2s' — whichever are known. */
192
+ figures(node) {
193
+ const parts = [];
194
+ const attempt = formatAttempt(node);
195
+ if (attempt)
196
+ parts.push(attempt);
197
+ if (node.tokens !== undefined)
198
+ parts.push(formatTokens(node.tokens));
199
+ if (node.durationMs !== undefined)
200
+ parts.push(formatElapsed(node.durationMs));
201
+ else if (node.status === 'running' && node.startedAt !== undefined)
202
+ parts.push(formatElapsed(Date.now() - node.startedAt));
203
+ return parts.join(' · ');
204
+ }
205
+ branchPrefix(row) {
206
+ let prefix = '';
207
+ for (let d = 0; d < row.depth; d++)
208
+ prefix += row.isLast[d] ? ' ' : '│ ';
209
+ prefix += row.isLast[row.depth] ? '└─ ' : '├─ ';
210
+ return prefix;
211
+ }
212
+ rowLine(row, labelWidth) {
213
+ const width = this.columns();
214
+ if (isElision(row)) {
215
+ const indent = ' '.repeat(row.depth + 1);
216
+ return styleText('dim', truncateToWidth(`${indent}${row.summary}`, width));
217
+ }
218
+ const { node } = row;
219
+ const { glyph, color } = this.statusGlyph(node);
220
+ const prefix = this.branchPrefix(row);
221
+ const figures = this.figures(node);
222
+ // Compose the visible text first and truncate it, then colorize the two
223
+ // zones (glyph, rest) — escape codes are zero-width, so wrapping math
224
+ // must run on the plain string.
225
+ const body = `${node.label.padEnd(labelWidth)} ${node.detail}`;
226
+ const room = width - prefix.length - 2; // glyph + space
227
+ const figuresPart = figures ? ` ${figures}` : '';
228
+ const bodyRoom = Math.max(0, room - figuresPart.length);
229
+ const text = `${truncateToWidth(body, bodyRoom)}${figuresPart}`;
230
+ const dimRow = node.status === 'skipped' || node.status === 'pending';
231
+ return `${prefix}${styleText(color, glyph)} ${dimRow ? styleText('dim', text) : text}`;
232
+ }
233
+ buildFrame(status) {
234
+ const tree = this.tree;
235
+ const rows = fitToHeight(tree.flatten(), this.out.rows ?? Number.POSITIVE_INFINITY);
236
+ const labelWidth = Math.max(0, ...rows.map((r) => (isElision(r) ? 0 : r.node.label.length)));
237
+ return [styleText('bold', this.headerLine(status)), ...rows.map((row) => this.rowLine(row, labelWidth))];
238
+ }
239
+ paint() {
240
+ if (!this.tree || this.stopped)
241
+ return;
242
+ this.frame += 1;
243
+ const lines = this.buildFrame(this.tree.header.status);
244
+ this.eraseRegion();
245
+ this.out.write(`${lines.join('\n')}\n`);
246
+ this.renderedLines = lines.length;
247
+ }
248
+ stop(status, detail, tree) {
249
+ if (this.tree === undefined)
250
+ this.tree = tree;
251
+ if (this.stopped)
252
+ return;
253
+ if (this.timer)
254
+ clearInterval(this.timer);
255
+ // Final frame: repaint with the terminal status so the settled tree stays
256
+ // in scrollback as the run's record, then the detail line beneath it.
257
+ const lines = this.buildFrame(status);
258
+ this.eraseRegion();
259
+ this.out.write(`${lines.join('\n')}\n`);
260
+ if (detail)
261
+ this.out.write(styleText('dim', ` ${truncateToWidth(detail, this.columns())}`) + '\n');
262
+ this.stopped = true;
263
+ this.renderedLines = 0;
264
+ this.out.write(SHOW_CURSOR);
265
+ console.log = this.originalConsole.log;
266
+ console.error = this.originalConsole.error;
267
+ console.warn = this.originalConsole.warn;
268
+ this.out.off?.('resize', this.onResize);
269
+ }
270
+ }
271
+ //# sourceMappingURL=treeRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeRenderer.js","sourceRoot":"","sources":["../../src/ui/treeRenderer.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,12 @@
1
1
  /** Prints a one-time banner summarizing this run's configuration before any workflow stage starts. */
2
+ import { readFileSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
2
5
  import { styleText } from "node:util";
3
6
  import { getGitUser } from "../git/commit.js";
4
- const RULE_WIDTH = 60;
7
+ import { boxBullet, boxBottom, boxTop } from "./format.js";
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ const pkg = JSON.parse(readFileSync(path.join(__dirname, '..', '..', 'package.json'), 'utf8'));
5
10
  export function repositoryUrl(config) {
6
11
  if (config.forge === "github") {
7
12
  return config.github.repo
@@ -26,20 +31,21 @@ export async function printWelcome(config, repoRoot) {
26
31
  ["Forge", config.forge],
27
32
  ["Repository", repositoryUrl(config)],
28
33
  [
29
- "Git user",
34
+ "Git User",
30
35
  user.name && user.email
31
36
  ? `${user.name} <${user.email}>`
32
37
  : "(not configured)",
33
38
  ],
34
39
  ];
35
- const labelWidth = Math.max(...rows.map(([label]) => label.length));
36
- const rule = styleText("cyan", "─".repeat(RULE_WIDTH));
37
- console.log(rule);
38
- console.log(styleText(["bold", "cyan"], " 🚀 pipeline-worker - By Mohan Talkad:"));
39
- console.log(rule);
40
+ console.log(boxTop());
41
+ const title = `🚀 PIPELINE WORKER v${pkg.version} • By Mohan Talkad`;
42
+ const padding = Math.max(0, 98 - title.length);
43
+ const titleLine = `│ ${styleText("bold", title)}${" ".repeat(padding)}│`;
44
+ console.log(titleLine);
45
+ console.log(boxBottom());
40
46
  for (const [label, value] of rows) {
41
- console.log(` ${styleText("cyan", label.padEnd(labelWidth))} ${value}`);
47
+ console.log(boxBullet(label, value, 2));
42
48
  }
43
- console.log(rule);
49
+ console.log("");
44
50
  }
45
51
  //# sourceMappingURL=welcome.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,UAAU,aAAa,CAAC,MAA4B;IACxD,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI;YACvB,CAAC,CAAC,sBAAsB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAC5C,CAAC,CAAC,kBAAkB,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI;QACvB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG;QAC9D,CAAC,CAAC,kBAAkB,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA4B;IAC3D,0EAA0E;IAC1E,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACvD,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,WAAW,kDAAkD,CAAC;IAClG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA4B,EAC5B,QAAgB;IAEhB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,IAAI,GAA4B;QACpC,CAAC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;QACvB,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC;YACE,UAAU;YACV,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;gBACrB,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG;gBAChC,CAAC,CAAC,kBAAkB;SACvB;KACF,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CACT,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,yCAAyC,CAAC,CACvE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"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"}
@@ -21,11 +21,11 @@ import { checkoutExistingBranch } from '../git/worktree.js';
21
21
  import { commit, hasChanges, mergeBase, stageAll } from '../git/commit.js';
22
22
  import { changedFilesSinceRef } from '../git/diff.js';
23
23
  import { detectDefaultBranch } from '../git/remote.js';
24
- import { recordEvent } from '../state/runState.js';
24
+ import { recordEvent, recordAgentTokens } from '../state/runState.js';
25
25
  import { captureIntent } from './captureIntent.js';
26
26
  import { runAndReportChecks, maybeUpdateChangelog } from './orchestrate.js';
27
27
  import { openMergeRequest, buildDescription } from './openMergeRequest.js';
28
- import { runStep, note, step } from '../ui/steps.js';
28
+ import { runStep, skipStep, note, announce } from '../ui/steps.js';
29
29
  const execFileAsync = promisify(execFile);
30
30
  async function fetchBranch(worktreePath, branch) {
31
31
  await execFileAsync('git', ['fetch', 'origin', branch], { cwd: worktreePath });
@@ -43,13 +43,18 @@ async function adoptWithExistingMr(agent, config, forge, worktreePath, state, re
43
43
  note(`--target ${targetOverride} ignored — MR/PR ${existingMr.webUrl} already targets ${existingMr.targetBranch}`);
44
44
  }
45
45
  state.targetBranch = existingMr.targetBranch;
46
- const { files, baseRef } = await runStep('A.2', '🔍', "Diffing the branch's changes", `comparing against origin/${existingMr.targetBranch}`, () => diffSinceTarget(worktreePath, existingMr.targetBranch));
47
- const intent = await runStep('5', '🧠', 'Understanding the branch\'s changes', `ask ${config.agent} to infer a summary, risk, and file-by-file breakdown`, () => captureIntent(agent, files, worktreePath, config.intentModel, baseRef));
46
+ const { files, baseRef } = await runStep('inspect', `comparing against origin/${existingMr.targetBranch}`, () => diffSinceTarget(worktreePath, existingMr.targetBranch));
47
+ // These skeleton steps only run on the no-MR-yet path (adoptWithoutMr):
48
+ // an already-open MR/PR means the branch is pushed and CI re-verifies it.
49
+ skipStep('checks', 'MR/PR already open — its CI pipeline verifies the branch');
50
+ skipStep('changelog', 'not updated when refreshing an existing MR/PR');
51
+ skipStep('push', 'branch is already pushed — that is how its MR/PR exists');
52
+ const { intent, usage } = await runStep('intent', `ask ${config.agent} to infer a summary, risk, and file-by-file breakdown`, () => captureIntent(agent, files, worktreePath, config.intentModel, baseRef));
48
53
  note(`${config.agent} says: ${intent.summary}`);
49
- await runStep('11', '📝', 'Overwriting merge request description', `MR/PR ${existingMr.webUrl}`, () => forge.updateMrDescription(existingMr.iid, buildDescription(intent, config.agent, [])));
54
+ await runStep('mr', `overwriting the description of MR/PR ${existingMr.webUrl}`, () => forge.updateMrDescription(existingMr.iid, buildDescription(intent, config.agent, [])));
50
55
  state.mrIid = existingMr.iid;
51
56
  state.phase = 'mr';
52
- recordEvent(repoRoot, state, `Overwrote description for existing MR/PR ${existingMr.webUrl}`);
57
+ recordEvent(repoRoot, state, `Overwrote description for existing MR/PR ${existingMr.webUrl}`, 'info', usage?.totalTokens);
53
58
  return state;
54
59
  }
55
60
  /** No MR/PR exists yet for this branch: run it like a fresh `pipeline-worker run` from checks onward. */
@@ -57,13 +62,14 @@ async function adoptWithoutMr(agent, config, forge, worktreePath, state, repoRoo
57
62
  const targetBranch = targetOverride ?? (await detectDefaultBranch(repoRoot));
58
63
  state.targetBranch = targetBranch;
59
64
  recordEvent(repoRoot, state, `No existing MR/PR found; targeting ${targetBranch}`);
60
- const { files, baseRef } = await runStep('A.2', '🔍', "Diffing the branch's changes", `comparing against origin/${targetBranch}`, () => diffSinceTarget(worktreePath, targetBranch));
65
+ const { files, baseRef } = await runStep('inspect', `comparing against origin/${targetBranch}`, () => diffSinceTarget(worktreePath, targetBranch));
61
66
  const checks = await runAndReportChecks(config, worktreePath, state, repoRoot);
62
67
  if (!checks) {
63
68
  throw new Error(`pipeline-worker: local checks failed for branch ${branch} — aborting before opening a merge request.`);
64
69
  }
65
- const intent = await runStep('5', '🧠', 'Understanding the branch\'s changes', `ask ${config.agent} to infer a summary, risk, and file-by-file breakdown`, () => captureIntent(agent, files, worktreePath, config.intentModel, baseRef));
70
+ const { intent, usage } = await runStep('intent', `ask ${config.agent} to infer a summary, risk, and file-by-file breakdown`, () => captureIntent(agent, files, worktreePath, config.intentModel, baseRef));
66
71
  note(`${config.agent} says: ${intent.summary}`);
72
+ recordAgentTokens(repoRoot, state, 'capture intent for adopted branch', usage);
67
73
  await maybeUpdateChangelog(config, worktreePath, intent);
68
74
  if (await hasChanges(worktreePath)) {
69
75
  await stageAll(worktreePath);
@@ -76,8 +82,8 @@ async function adoptWithoutMr(agent, config, forge, worktreePath, state, repoRoo
76
82
  return state;
77
83
  }
78
84
  export async function adoptBranch(repoRoot, config, forge, agent, branch, targetOverride) {
79
- step('🌱', 'Adopting external branch', `${branch} has no pipeline-worker run recorded for it — checking it out`);
80
- const worktreePath = await runStep('A.1', '🌳', 'Checking out branch', `fetch + checkout origin/${branch}`, () => checkoutExistingBranch(repoRoot, branch));
85
+ announce('Adopting external branch', `${branch} has no pipeline-worker run recorded for it — checking it out`);
86
+ const worktreePath = await runStep('adopt', `fetch + checkout origin/${branch}`, () => checkoutExistingBranch(repoRoot, branch));
81
87
  const state = { branch, targetBranch: '', worktreePath, ciFixAttempt: 0, conflictAttempt: 0, phase: 'intent' };
82
88
  recordEvent(repoRoot, state, `Adopted external branch ${branch} into worktree ${worktreePath}`);
83
89
  const existingMr = await forge.findExistingMr(branch);
@@ -1 +1 @@
1
- {"version":3,"file":"adoptBranch.js","sourceRoot":"","sources":["../../src/workflow/adoptBranch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adoptBranch.js","sourceRoot":"","sources":["../../src/workflow/adoptBranch.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /** Step 3: ask the configured agent what a diff is *for*, in a structured, reusable shape. */
2
- import type { AgentAdapter } from '../agent/types.js';
2
+ import type { AgentAdapter, AgentUsage } from '../agent/types.js';
3
3
  import type { CapturedIntent } from '../types.js';
4
4
  /**
5
5
  * Rather than embedding the (potentially huge — generated lockfiles, binary
@@ -25,4 +25,9 @@ import type { CapturedIntent } from '../types.js';
25
25
  * is already committed on the branch — `git diff HEAD` there would show
26
26
  * nothing.
27
27
  */
28
- export declare function captureIntent(agent: AgentAdapter, files: string[], worktreePath: string, model: string, baseRef?: string): Promise<CapturedIntent>;
28
+ /** captureIntent's return: the validated intent plus the turn's best-effort token usage, so the caller can record the spend against its run state. */
29
+ export interface IntentCapture {
30
+ intent: CapturedIntent;
31
+ usage?: AgentUsage;
32
+ }
33
+ export declare function captureIntent(agent: AgentAdapter, files: string[], worktreePath: string, model: string, baseRef?: string): Promise<IntentCapture>;
@@ -88,30 +88,6 @@ const IntentShape = z.object({
88
88
  riskReason: singleLine('riskReason'),
89
89
  testScenarios: z.array(singleLine('testScenarios[]')).min(1),
90
90
  });
91
- /**
92
- * Rather than embedding the (potentially huge — generated lockfiles, binary
93
- * assets, etc.) diff text in the prompt, this only lists which files
94
- * changed and lets the agent read each one's diff itself with its own
95
- * tools, scoped to `worktreePath` (the isolated worktree the change was
96
- * already applied into by orchestrate.ts's "Applying your changes" step).
97
- * That keeps the prompt itself small and constant-size regardless of how
98
- * large any individual file's diff is, and lets the agent skip files it
99
- * judges irrelevant to intent (lockfiles, generated assets) instead of
100
- * paying to read them.
101
- *
102
- * `model` (config's `intentModel`, default "haiku" — see config/loader.ts)
103
- * lets a lighter model handle this step to keep its token cost down, since
104
- * naming a branch/commit/summary from a diff needs no deep reasoning.
105
- * Adapters with no per-invocation model selection (e.g. copilot) ignore it.
106
- * The CI-fix path (watchPipeline.ts) deliberately never sets a model override
107
- * — fixing a real failing build needs the stronger default model.
108
- *
109
- * `baseRef` defaults to `HEAD`, matching a normal run's uncommitted diff. The
110
- * `resume` branch-adoption path (adoptBranch.ts) passes a fixed merge-base
111
- * commit instead (see git/commit.ts's mergeBase), since there the change set
112
- * is already committed on the branch — `git diff HEAD` there would show
113
- * nothing.
114
- */
115
91
  export async function captureIntent(agent, files, worktreePath, model, baseRef = 'HEAD') {
116
92
  const prompt = 'The following files changed in this git worktree (which is your current working directory):\n' +
117
93
  files.map((file) => `- ${file}`).join('\n') +
@@ -134,7 +110,7 @@ export async function captureIntent(agent, files, worktreePath, model, baseRef =
134
110
  });
135
111
  noteSession(result, worktreePath);
136
112
  try {
137
- return IntentShape.parse(JSON.parse(result.text));
113
+ return { intent: IntentShape.parse(JSON.parse(result.text)), usage: result.usage };
138
114
  }
139
115
  catch (error) {
140
116
  const message = error instanceof Error ? error.message : String(error);
@@ -1 +1 @@
1
- {"version":3,"file":"captureIntent.js","sourceRoot":"","sources":["../../src/workflow/captureIntent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"captureIntent.js","sourceRoot":"","sources":["../../src/workflow/captureIntent.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** Stages 10-11: push the branch and open (or reuse) an MR/PR describing the workflow that produced it. */
1
+ /** Steps 'push' and 'mr': push the branch and open (or reuse) an MR/PR describing the workflow that produced it. */
2
2
  import type { ForgeClient } from '../forge/types.js';
3
3
  import type { CapturedIntent, CheckResult, MergeMethod, MergeRequest } from '../types.js';
4
4
  /** Renders the MR/PR description as: Intent, Summary, per-file changes, Risk, Checks, Test Scenarios. */
@@ -1,6 +1,6 @@
1
- /** Stages 10-11: push the branch and open (or reuse) an MR/PR describing the workflow that produced it. */
1
+ /** Steps 'push' and 'mr': push the branch and open (or reuse) an MR/PR describing the workflow that produced it. */
2
2
  import { push } from '../git/commit.js';
3
- import { runStep, skipStep, note, noteRisk } from '../ui/steps.js';
3
+ import { runStep, skipStep, addDynamicStep, note, noteRisk } from '../ui/steps.js';
4
4
  /**
5
5
  * ✅/❌ per check, mirroring the pass/fail glyphs cli.ts prints for the same
6
6
  * stage (see ui/steps.ts). An empty list means the `resume` branch-adoption
@@ -36,12 +36,13 @@ export function buildDescription(intent, agentName, checks) {
36
36
  * developer merges manually once CI is green.
37
37
  */
38
38
  async function maybeEnableAutoMerge(forge, mr, autoMergeOnGreen, mergeMethod) {
39
+ addDynamicStep('mr', 'mr/auto-merge', 'auto-merge');
39
40
  if (!autoMergeOnGreen) {
40
- skipStep('11.1', '🔀', 'Enabling auto-merge on green', 'config.autoMergeOnGreen is disabled');
41
+ skipStep('mr/auto-merge', 'config.autoMergeOnGreen is disabled');
41
42
  return;
42
43
  }
43
44
  try {
44
- await runStep('11.1', '🔀', 'Enabling auto-merge on green', `merge method: ${mergeMethod}`, () => forge.enableAutoMerge(mr.iid, mergeMethod));
45
+ await runStep('mr/auto-merge', `merge method: ${mergeMethod}`, () => forge.enableAutoMerge(mr.iid, mergeMethod));
45
46
  }
46
47
  catch (error) {
47
48
  const message = error instanceof Error ? error.message : String(error);
@@ -49,17 +50,17 @@ async function maybeEnableAutoMerge(forge, mr, autoMergeOnGreen, mergeMethod) {
49
50
  }
50
51
  }
51
52
  export async function openMergeRequest(forge, worktreePath, branch, targetBranch, intent, agentName, checks, autoMergeOnGreen = false, mergeMethod = 'squash') {
52
- await runStep(10, '', 'Pushing your branch', `push ${branch} to origin`, () => push(worktreePath, 'origin', branch));
53
+ await runStep('push', `push ${branch} to origin`, () => push(worktreePath, 'origin', branch));
53
54
  const existing = await forge.findExistingMr(branch);
54
55
  if (existing) {
55
- skipStep(11, '🔀', 'Opening merge request', `an MR/PR already exists for this branch — reusing ${existing.webUrl} instead of opening a new one`);
56
+ skipStep('mr', `an MR/PR already exists for this branch — reusing ${existing.webUrl} instead of opening a new one`);
56
57
  // Deliberately does not (re-)enable auto-merge here: a resumed run reusing
57
58
  // an existing MR/PR must not silently turn on something a human may have
58
59
  // turned off since it was opened.
59
60
  return existing;
60
61
  }
61
62
  const description = buildDescription(intent, agentName, checks);
62
- const mr = await runStep(11, '🔀', 'Opening merge request', `target branch: ${targetBranch}`, () => forge.createMergeRequest({ sourceBranch: branch, targetBranch, title: intent.commitMessage, description }));
63
+ const mr = await runStep('mr', `target branch: ${targetBranch}`, () => forge.createMergeRequest({ sourceBranch: branch, targetBranch, title: intent.commitMessage, description }));
63
64
  note(mr.webUrl);
64
65
  await maybeEnableAutoMerge(forge, mr, autoMergeOnGreen, mergeMethod);
65
66
  return mr;
@@ -1 +1 @@
1
- {"version":3,"file":"openMergeRequest.js","sourceRoot":"","sources":["../../src/workflow/openMergeRequest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openMergeRequest.js","sourceRoot":"","sources":["../../src/workflow/openMergeRequest.ts"],"names":[],"mappings":"AAAA,oHAAoH;AAEpH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAInF;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,MAAqB;IACzC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,gEAAgE,CAAC;IACjG,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChH,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,gBAAgB,CAAC,MAAsB,EAAE,SAAiB,EAAE,MAAqB;IAC/F,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9F,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAExE,OAAO,CACL,eAAe,MAAM,CAAC,MAAM,MAAM;QAClC,gBAAgB,MAAM,CAAC,OAAO,MAAM;QACpC,sBAAsB,WAAW,MAAM;QACvC,aAAa,IAAI,MAAM,MAAM,CAAC,UAAU,MAAM;QAC9C,gBAAgB,YAAY,CAAC,MAAM,CAAC,MAAM;QAC1C,wBAAwB,aAAa,MAAM;QAC3C,OAAO;QACP,2DAA2D,SAAS,MAAM;QAC1E,8HAA8H,CAC/H,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,oBAAoB,CAAC,KAAkB,EAAE,EAAgB,EAAE,gBAAyB,EAAE,WAAwB;IAC3H,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,QAAQ,CAAC,eAAe,EAAE,qCAAqC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,eAAe,EAAE,iBAAiB,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IACnH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,OAAO,qCAAqC,CAAC,CAAC;IACnG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAkB,EAClB,YAAoB,EACpB,MAAc,EACd,YAAoB,EACpB,MAAsB,EACtB,SAAiB,EACjB,MAAqB,EACrB,gBAAgB,GAAG,KAAK,EACxB,cAA2B,QAAQ;IAEnC,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,EAAE,qDAAqD,QAAQ,CAAC,MAAM,+BAA+B,CAAC,CAAC;QACpH,2EAA2E;QAC3E,yEAAyE;QACzE,kCAAkC;QAClC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAEhE,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,EACJ,kBAAkB,YAAY,EAAE,EAChC,GAAG,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC,CACjH,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,oBAAoB,CAAC,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAErE,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -1,4 +1,4 @@
1
- /** Top-level control flow wiring the user's workflow stages together — see ui/steps.ts's TOTAL_STAGES for the full numbered sequence. */
1
+ /** Top-level control flow wiring the user's workflow steps together — see workflow/runPlan.ts for the full step skeleton. */
2
2
  import type { CapturedIntent, CheckResult, PipelineWorkerConfig, RunPhase, RunState } from '../types.js';
3
3
  /**
4
4
  * True once the run has an open MR/PR — from that point, `pipeline-worker