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.
- package/README.md +6 -2
- package/dist/agent/claude.js +32 -1
- package/dist/agent/claude.js.map +1 -1
- package/dist/agent/types.d.ts +18 -0
- package/dist/cli.js +30 -4
- package/dist/cli.js.map +1 -1
- package/dist/config/loader.js +25 -3
- package/dist/config/loader.js.map +1 -1
- package/dist/forge/github.js +7 -0
- package/dist/forge/github.js.map +1 -1
- package/dist/forge/gitlab.js +7 -0
- package/dist/forge/gitlab.js.map +1 -1
- package/dist/forge/types.d.ts +9 -0
- package/dist/state/runState.d.ts +10 -1
- package/dist/state/runState.js +20 -2
- package/dist/state/runState.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/ui/format.d.ts +19 -0
- package/dist/ui/format.js +89 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/renderer.d.ts +41 -0
- package/dist/ui/renderer.js +93 -0
- package/dist/ui/renderer.js.map +1 -0
- package/dist/ui/runTree.d.ts +106 -0
- package/dist/ui/runTree.js +133 -0
- package/dist/ui/runTree.js.map +1 -0
- package/dist/ui/sessions.js +11 -4
- package/dist/ui/sessions.js.map +1 -1
- package/dist/ui/steps.d.ts +92 -35
- package/dist/ui/steps.js +177 -93
- package/dist/ui/steps.js.map +1 -1
- package/dist/ui/treeRenderer.d.ts +89 -0
- package/dist/ui/treeRenderer.js +271 -0
- package/dist/ui/treeRenderer.js.map +1 -0
- package/dist/ui/welcome.js +15 -9
- package/dist/ui/welcome.js.map +1 -1
- package/dist/workflow/adoptBranch.js +16 -10
- package/dist/workflow/adoptBranch.js.map +1 -1
- package/dist/workflow/captureIntent.d.ts +7 -2
- package/dist/workflow/captureIntent.js +1 -25
- package/dist/workflow/captureIntent.js.map +1 -1
- package/dist/workflow/openMergeRequest.d.ts +1 -1
- package/dist/workflow/openMergeRequest.js +8 -7
- package/dist/workflow/openMergeRequest.js.map +1 -1
- package/dist/workflow/orchestrate.d.ts +1 -1
- package/dist/workflow/orchestrate.js +61 -39
- package/dist/workflow/orchestrate.js.map +1 -1
- package/dist/workflow/runPlan.d.ts +18 -0
- package/dist/workflow/runPlan.js +53 -0
- package/dist/workflow/runPlan.js.map +1 -0
- package/dist/workflow/syncTargetBranch.d.ts +37 -0
- package/dist/workflow/syncTargetBranch.js +83 -0
- package/dist/workflow/syncTargetBranch.js.map +1 -0
- package/dist/workflow/watchPipeline.js +61 -23
- package/dist/workflow/watchPipeline.js.map +1 -1
- 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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"}
|
package/dist/ui/welcome.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
34
|
+
"Git User",
|
|
30
35
|
user.name && user.email
|
|
31
36
|
? `${user.name} <${user.email}>`
|
|
32
37
|
: "(not configured)",
|
|
33
38
|
],
|
|
34
39
|
];
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
console.log(
|
|
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(
|
|
47
|
+
console.log(boxBullet(label, value, 2));
|
|
42
48
|
}
|
|
43
|
-
console.log(
|
|
49
|
+
console.log("");
|
|
44
50
|
}
|
|
45
51
|
//# sourceMappingURL=welcome.js.map
|
package/dist/ui/welcome.js.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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('
|
|
47
|
-
|
|
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('
|
|
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('
|
|
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('
|
|
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
|
-
|
|
80
|
-
const worktreePath = await runStep('
|
|
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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
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
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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('
|
|
41
|
+
skipStep('mr/auto-merge', 'config.autoMergeOnGreen is disabled');
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
43
44
|
try {
|
|
44
|
-
await runStep('
|
|
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(
|
|
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(
|
|
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(
|
|
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":"AAAA,
|
|
1
|
+
{"version":3,"file":"openMergeRequest.js","sourceRoot":"","sources":["../../src/workflow/openMergeRequest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Top-level control flow wiring the user's workflow
|
|
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
|