@farmslot/recipe-cli 0.8.0 → 0.10.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.
- package/CHANGELOG.md +29 -0
- package/dist/harness/adapter-plugins.d.ts +1 -0
- package/dist/harness/adapter-plugins.d.ts.map +1 -1
- package/dist/harness/adapter-plugins.js +3 -0
- package/dist/harness/adapter-plugins.js.map +1 -1
- package/dist/harness/adapters.d.ts +0 -2
- package/dist/harness/adapters.d.ts.map +1 -1
- package/dist/harness/adapters.js +0 -4
- package/dist/harness/adapters.js.map +1 -1
- package/dist/harness/catalog.d.ts.map +1 -1
- package/dist/harness/catalog.js +2 -5
- package/dist/harness/catalog.js.map +1 -1
- package/dist/harness/command-contract.d.ts +16 -1
- package/dist/harness/command-contract.d.ts.map +1 -1
- package/dist/harness/command-contract.js +8 -0
- package/dist/harness/command-contract.js.map +1 -1
- package/dist/harness/command-journal.d.ts.map +1 -1
- package/dist/harness/command-journal.js +1 -10
- package/dist/harness/command-journal.js.map +1 -1
- package/dist/harness/commands/call.d.ts +3 -3
- package/dist/harness/commands/call.d.ts.map +1 -1
- package/dist/harness/commands/call.js +49 -27
- package/dist/harness/commands/call.js.map +1 -1
- package/dist/harness/commands/checklist.d.ts +16 -0
- package/dist/harness/commands/checklist.d.ts.map +1 -0
- package/dist/harness/commands/checklist.js +171 -0
- package/dist/harness/commands/checklist.js.map +1 -0
- package/dist/harness/commands/doctor.d.ts +45 -0
- package/dist/harness/commands/doctor.d.ts.map +1 -0
- package/dist/harness/commands/doctor.js +636 -0
- package/dist/harness/commands/doctor.js.map +1 -0
- package/dist/harness/commands/execution-template.d.ts +2 -0
- package/dist/harness/commands/execution-template.d.ts.map +1 -0
- package/dist/harness/commands/execution-template.js +27 -0
- package/dist/harness/commands/execution-template.js.map +1 -0
- package/dist/harness/commands/launch.js +3 -0
- package/dist/harness/commands/launch.js.map +1 -1
- package/dist/harness/commands/prepare.d.ts +35 -0
- package/dist/harness/commands/prepare.d.ts.map +1 -0
- package/dist/harness/commands/prepare.js +608 -0
- package/dist/harness/commands/prepare.js.map +1 -0
- package/dist/harness/commands/recipe-quality.d.ts +13 -0
- package/dist/harness/commands/recipe-quality.d.ts.map +1 -0
- package/dist/harness/commands/recipe-quality.js +112 -0
- package/dist/harness/commands/recipe-quality.js.map +1 -0
- package/dist/harness/commands/run.d.ts +12 -0
- package/dist/harness/commands/run.d.ts.map +1 -1
- package/dist/harness/commands/run.js +55 -11
- package/dist/harness/commands/run.js.map +1 -1
- package/dist/harness/commands/status-watch.d.ts +20 -0
- package/dist/harness/commands/status-watch.d.ts.map +1 -0
- package/dist/harness/commands/status-watch.js +402 -0
- package/dist/harness/commands/status-watch.js.map +1 -0
- package/dist/harness/commands/status.d.ts +5 -0
- package/dist/harness/commands/status.d.ts.map +1 -0
- package/dist/harness/commands/status.js +167 -0
- package/dist/harness/commands/status.js.map +1 -0
- package/dist/harness/commands/task-init.d.ts +5 -0
- package/dist/harness/commands/task-init.d.ts.map +1 -0
- package/dist/harness/commands/task-init.js +54 -0
- package/dist/harness/commands/task-init.js.map +1 -0
- package/dist/harness/doctor-report.d.ts +58 -0
- package/dist/harness/doctor-report.d.ts.map +1 -0
- package/dist/harness/doctor-report.js +154 -0
- package/dist/harness/doctor-report.js.map +1 -0
- package/dist/harness/harness-cli.d.ts +10 -1
- package/dist/harness/harness-cli.d.ts.map +1 -1
- package/dist/harness/harness-cli.js +4 -6
- package/dist/harness/harness-cli.js.map +1 -1
- package/dist/harness/heal-bounds.d.ts.map +1 -1
- package/dist/harness/heal-bounds.js +6 -0
- package/dist/harness/heal-bounds.js.map +1 -1
- package/dist/harness/index.d.ts +17 -5
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +16 -4
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/json-stream.d.ts +9 -1
- package/dist/harness/json-stream.d.ts.map +1 -1
- package/dist/harness/json-stream.js +26 -0
- package/dist/harness/json-stream.js.map +1 -1
- package/dist/harness/paths.d.ts +2 -0
- package/dist/harness/paths.d.ts.map +1 -1
- package/dist/harness/paths.js +2 -0
- package/dist/harness/paths.js.map +1 -1
- package/dist/harness/readiness.d.ts +31 -0
- package/dist/harness/readiness.d.ts.map +1 -0
- package/dist/harness/readiness.js +12 -0
- package/dist/harness/readiness.js.map +1 -0
- package/dist/harness/recipe-validation.d.ts +0 -2
- package/dist/harness/recipe-validation.d.ts.map +1 -1
- package/dist/harness/recipe-validation.js +11 -25
- package/dist/harness/recipe-validation.js.map +1 -1
- package/dist/harness/recording-target.d.ts +11 -0
- package/dist/harness/recording-target.d.ts.map +1 -1
- package/dist/harness/recording-target.js +31 -2
- package/dist/harness/recording-target.js.map +1 -1
- package/dist/harness/run-engine.d.ts +14 -1
- package/dist/harness/run-engine.d.ts.map +1 -1
- package/dist/harness/run-engine.js +25 -4
- package/dist/harness/run-engine.js.map +1 -1
- package/dist/harness/run-options.js +2 -11
- package/dist/harness/run-options.js.map +1 -1
- package/dist/harness/stage-progress.d.ts +25 -0
- package/dist/harness/stage-progress.d.ts.map +1 -0
- package/dist/harness/stage-progress.js +170 -0
- package/dist/harness/stage-progress.js.map +1 -0
- package/dist/harness/task-view.d.ts +142 -0
- package/dist/harness/task-view.d.ts.map +1 -0
- package/dist/harness/task-view.js +451 -0
- package/dist/harness/task-view.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
// The live task view behind `status --watch`, and the one-shot `status --task`
|
|
2
|
+
// that prints the same thing once. Both read files only: no probe, no launch, no
|
|
3
|
+
// write, so watching a slot can never disturb the run it reports on.
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { isTerminalWorkerSignalStatus } from '@farmslot/protocol';
|
|
7
|
+
import { color } from '../cli-color.js';
|
|
8
|
+
import { harnessHost } from '../host.js';
|
|
9
|
+
import { EXIT } from '../shared.js';
|
|
10
|
+
import { CHECKLIST_LABEL_LIMIT, collectTaskView, findTaskDir, TASK_SILENT_AFTER_MS, } from '../task-view.js';
|
|
11
|
+
const REFRESH_MS = 2000;
|
|
12
|
+
const CLEAR_SCREEN = '\x1b[2J\x1b[H';
|
|
13
|
+
const HIDE_CURSOR = '\x1b[?25l';
|
|
14
|
+
const SHOW_CURSOR = '\x1b[?25h';
|
|
15
|
+
export async function handleStatusTaskView(options) {
|
|
16
|
+
const deps = {
|
|
17
|
+
now: () => Date.now(),
|
|
18
|
+
wait: (ms) => new Promise((resolve) => {
|
|
19
|
+
setTimeout(resolve, ms);
|
|
20
|
+
}),
|
|
21
|
+
write: (text) => process.stdout.write(text),
|
|
22
|
+
isTty: Boolean(process.stdout.isTTY),
|
|
23
|
+
};
|
|
24
|
+
if (!options.watch || !deps.isTty)
|
|
25
|
+
return runStatusWatch(options, deps);
|
|
26
|
+
// The alternate-screen redraw owns the cursor until the loop ends, including
|
|
27
|
+
// the Ctrl-C that is the normal way to leave it.
|
|
28
|
+
const restore = () => deps.write(SHOW_CURSOR);
|
|
29
|
+
const interrupt = () => {
|
|
30
|
+
restore();
|
|
31
|
+
process.exit(EXIT.ok);
|
|
32
|
+
};
|
|
33
|
+
process.on('SIGINT', interrupt);
|
|
34
|
+
deps.write(HIDE_CURSOR);
|
|
35
|
+
try {
|
|
36
|
+
return await runStatusWatch(options, deps);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
process.off('SIGINT', interrupt);
|
|
40
|
+
restore();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export async function runStatusWatch(options, deps) {
|
|
44
|
+
const title = `${harnessHost().name} status ${options.watch ? '--watch' : '--task'}`;
|
|
45
|
+
let previous;
|
|
46
|
+
// A task that was already finished when watching began is history, not the run
|
|
47
|
+
// to wait for: keep watching until a task is seen in progress and then ends.
|
|
48
|
+
let sawInProgress = false;
|
|
49
|
+
for (;;) {
|
|
50
|
+
const taskDir = options.taskDir ?? findTaskDir(options.target);
|
|
51
|
+
const view = collectTaskView(options.target, taskDir, deps.now());
|
|
52
|
+
const changes = changedLines(previous, view);
|
|
53
|
+
if (options.json && !options.watch) {
|
|
54
|
+
deps.write(`${JSON.stringify(view, null, 2)}\n`);
|
|
55
|
+
}
|
|
56
|
+
else if (options.json) {
|
|
57
|
+
if (changes.length > 0)
|
|
58
|
+
deps.write(`${JSON.stringify(view)}\n`);
|
|
59
|
+
}
|
|
60
|
+
else if (options.watch && !deps.isTty) {
|
|
61
|
+
for (const line of changes)
|
|
62
|
+
deps.write(`${line}\n`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
deps.write(`${deps.isTty && options.watch ? CLEAR_SCREEN : ''}${renderTaskView(view, title, options.taskDir !== undefined).join('\n')}\n`);
|
|
66
|
+
}
|
|
67
|
+
previous = view;
|
|
68
|
+
const terminal = isTerminalWorkerSignalStatus(view.signal?.status);
|
|
69
|
+
if (view.activity.ongoing)
|
|
70
|
+
sawInProgress = true;
|
|
71
|
+
if (!options.watch || (terminal && (sawInProgress || options.taskDir !== undefined)))
|
|
72
|
+
return EXIT.ok;
|
|
73
|
+
await deps.wait(REFRESH_MS);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// `explicitTask` is true when the caller named the task directory: its rows are
|
|
77
|
+
// shown even when it is not in progress, because that is what was asked for.
|
|
78
|
+
export function renderTaskView(view, title, explicitTask = false) {
|
|
79
|
+
const out = (style, text) => color(style, text, { stream: process.stdout });
|
|
80
|
+
// Details of a task that is not in progress are history; they would read as
|
|
81
|
+
// the current run, so they appear only for a live task or one named explicitly.
|
|
82
|
+
const showTask = view.activity.ongoing || explicitTask;
|
|
83
|
+
const lines = [
|
|
84
|
+
joinParts([
|
|
85
|
+
out('label', title),
|
|
86
|
+
out('bold', path.basename(view.checkout.target)),
|
|
87
|
+
view.checkout.branch && out('info', view.checkout.branch),
|
|
88
|
+
view.checkout.head && out('dim', `@${view.checkout.head}`),
|
|
89
|
+
showTask &&
|
|
90
|
+
view.elapsedMs !== undefined &&
|
|
91
|
+
out('dim', `${formatDuration(view.elapsedMs)} elapsed`),
|
|
92
|
+
], ' '),
|
|
93
|
+
];
|
|
94
|
+
const isolation = view.isolation;
|
|
95
|
+
const device = isolation &&
|
|
96
|
+
joinParts([isolation.platform, isolation.simulator, shortUdid(isolation.simulatorUdid)], ' ');
|
|
97
|
+
const devServer = isolation?.metroPort ?? isolation?.watcherPort ?? isolation?.devServerPort;
|
|
98
|
+
const runtimeLine = joinParts([
|
|
99
|
+
isolation?.slotId && `slot ${out('ok', isolation.slotId)}`,
|
|
100
|
+
device && out('ok', device),
|
|
101
|
+
devServer !== undefined && `metro ${out('ok', String(devServer))}`,
|
|
102
|
+
isolation?.cdpPort !== undefined && `cdp ${out('ok', String(isolation.cdpPort))}`,
|
|
103
|
+
isolation?.extensionId && `extension ${out('ok', isolation.extensionId)}`,
|
|
104
|
+
showTask &&
|
|
105
|
+
view.harness?.version &&
|
|
106
|
+
`harness ${out('info', view.harness.version)}${view.harness.sourceKind ? out('dim', ` (${view.harness.sourceKind})`) : ''}`,
|
|
107
|
+
]);
|
|
108
|
+
if (runtimeLine)
|
|
109
|
+
lines.push(runtimeLine);
|
|
110
|
+
const template = showTask ? view.template : undefined;
|
|
111
|
+
const templateLine = joinParts([
|
|
112
|
+
template?.id &&
|
|
113
|
+
`template ${out('accent', template.id)}${template.sourceId ? out('dim', ` (${template.sourceId})`) : ''}`,
|
|
114
|
+
template?.flow && `flow ${out('info', template.flow)}`,
|
|
115
|
+
template?.domain && `domain ${out('info', template.domain)}`,
|
|
116
|
+
template?.surface && `via ${out('info', template.surface)}`,
|
|
117
|
+
]);
|
|
118
|
+
if (templateLine)
|
|
119
|
+
lines.push(templateLine);
|
|
120
|
+
const taskLine = joinParts([
|
|
121
|
+
template?.ticket && out('bold', template.ticket),
|
|
122
|
+
template?.title && out('info', template.title.trim()),
|
|
123
|
+
], ' ');
|
|
124
|
+
if (taskLine)
|
|
125
|
+
lines.push(`${out('label', 'task')} ${taskLine}`);
|
|
126
|
+
const contextLine = joinParts([
|
|
127
|
+
view.libraries.length > 0 &&
|
|
128
|
+
`libraries ${out('info', view.libraries.map(libraryLabel).join(' '))}`,
|
|
129
|
+
showTask &&
|
|
130
|
+
view.fixture &&
|
|
131
|
+
`fixture ${out('info', path.basename(view.fixture.fixture ?? 'unknown'))} ${statusWord(out, view.fixture.status)}${view.fixture.walletReset ? out('warn', ' reset') : ''}`,
|
|
132
|
+
showTask &&
|
|
133
|
+
(view.prepare
|
|
134
|
+
? `sandbox ${out('info', 'preparing')}`
|
|
135
|
+
: view.sandbox?.ready !== undefined &&
|
|
136
|
+
`sandbox ${view.sandbox.ready ? out('ok', 'ready') : out('warn', 'not ready')}`),
|
|
137
|
+
]);
|
|
138
|
+
if (contextLine)
|
|
139
|
+
lines.push(contextLine);
|
|
140
|
+
if (showTask && view.acceptance?.length)
|
|
141
|
+
lines.push('', ...renderAcceptanceLines(view));
|
|
142
|
+
if (showTask && view.prepare) {
|
|
143
|
+
lines.push(`prepare ${out('info', view.prepare.step)} · ${view.prepare.completed}/${view.prepare.total} steps · ${formatDuration(view.prepare.elapsedMs)} elapsed`);
|
|
144
|
+
}
|
|
145
|
+
// A step that runs many harness commands without ticking a row is still live;
|
|
146
|
+
// the journal is the proof, so show it.
|
|
147
|
+
const last = view.lastCommand;
|
|
148
|
+
if (showTask && last) {
|
|
149
|
+
lines.push(joinParts([
|
|
150
|
+
`last command ${out('info', joinParts([last.command, last.subject], ' '))}`,
|
|
151
|
+
last.verdict && statusWord(out, last.verdict),
|
|
152
|
+
last.ageMs !== undefined && `${formatDuration(last.ageMs)} ago`,
|
|
153
|
+
]));
|
|
154
|
+
}
|
|
155
|
+
lines.push(...renderOperations(view));
|
|
156
|
+
lines.push('');
|
|
157
|
+
if (!view.activity.ongoing) {
|
|
158
|
+
lines.push(out('warn', 'no ongoing task detected'));
|
|
159
|
+
lines.push(out('dim', idleReason(view)));
|
|
160
|
+
if (!view.taskDir || !explicitTask)
|
|
161
|
+
return lines;
|
|
162
|
+
lines.push('');
|
|
163
|
+
}
|
|
164
|
+
let phase;
|
|
165
|
+
for (const row of view.checklist) {
|
|
166
|
+
if (row.phase && row.phase !== phase) {
|
|
167
|
+
const inPhase = view.checklist.filter((other) => other.phase === row.phase);
|
|
168
|
+
const done = inPhase.filter((other) => other.checked).length;
|
|
169
|
+
lines.push(out('dim', ` ${row.phase} ${done}/${inPhase.length}`));
|
|
170
|
+
}
|
|
171
|
+
phase = row.phase;
|
|
172
|
+
lines.push(renderRow(row, view.currentStep, out));
|
|
173
|
+
// A child unit's rows belong to the parent row that owns it, so they are
|
|
174
|
+
// printed under it rather than as steps of their own.
|
|
175
|
+
for (const unit of view.subtasks.filter((entry) => entry.parentStep === row.number)) {
|
|
176
|
+
lines.push(...renderSubtask(unit, out));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const signal = view.signal;
|
|
180
|
+
if (signal) {
|
|
181
|
+
const age = view.checklist.find((row) => row.runningMs !== undefined)?.runningMs;
|
|
182
|
+
lines.push('');
|
|
183
|
+
lines.push(joinParts([
|
|
184
|
+
`signal ${statusWord(out, signal.status)}`,
|
|
185
|
+
// SIGNAL.json records the last row ticked, not the row in progress.
|
|
186
|
+
signal.step && `last ticked ${out('info', stepLabel(signal.step))}`,
|
|
187
|
+
// A cancelled agent leaves status "running"; the age is the only honest hint.
|
|
188
|
+
age !== undefined &&
|
|
189
|
+
`no update for ${out(age > TASK_SILENT_AFTER_MS ? 'warn' : 'dim', formatDuration(age))}`,
|
|
190
|
+
]));
|
|
191
|
+
}
|
|
192
|
+
return lines;
|
|
193
|
+
}
|
|
194
|
+
export function renderAcceptanceLines(view) {
|
|
195
|
+
if (!view.acceptance?.length)
|
|
196
|
+
return [];
|
|
197
|
+
const out = (style, text) => color(style, text, { stream: process.stdout });
|
|
198
|
+
const proven = view.acceptance.filter((row) => row.status?.verdict === 'proven').length;
|
|
199
|
+
return [
|
|
200
|
+
`acceptance criteria ${proven}/${view.acceptance.length} proven`,
|
|
201
|
+
...view.acceptance.map((row) => {
|
|
202
|
+
const verdict = row.status?.verdict ?? 'no verdict';
|
|
203
|
+
const style = verdict === 'proven'
|
|
204
|
+
? 'ok'
|
|
205
|
+
: verdict === 'weak'
|
|
206
|
+
? 'warn'
|
|
207
|
+
: verdict === 'no verdict'
|
|
208
|
+
? 'dim'
|
|
209
|
+
: 'err';
|
|
210
|
+
return ` ${row.id} [${out(style, verdict)}] ${row.text}`;
|
|
211
|
+
}),
|
|
212
|
+
];
|
|
213
|
+
}
|
|
214
|
+
// One sentence saying why nothing is in progress, built only from allowlisted fields.
|
|
215
|
+
function idleReason(view) {
|
|
216
|
+
if (!view.taskDir)
|
|
217
|
+
return 'no task directory under temp/tasks';
|
|
218
|
+
const { reason, idleMs, branchCarriesTicket } = view.activity;
|
|
219
|
+
if (reason === 'no-task')
|
|
220
|
+
return `${path.basename(view.taskDir)} holds no task files yet`;
|
|
221
|
+
const what = reason === 'finished' ? (view.signal?.status ?? 'finished') : 'silent';
|
|
222
|
+
return joinParts([
|
|
223
|
+
`last task ${path.basename(view.taskDir)}: ${what}`,
|
|
224
|
+
idleMs !== undefined && `last update ${formatDuration(idleMs)} ago`,
|
|
225
|
+
branchCarriesTicket === false &&
|
|
226
|
+
`checkout is on ${view.checkout.branch}, which does not carry ${view.template?.ticket}`,
|
|
227
|
+
], ', ');
|
|
228
|
+
}
|
|
229
|
+
// Piped output is a log: one line per thing that actually moved, never a redraw.
|
|
230
|
+
export function changedLines(previous, next) {
|
|
231
|
+
// A different task directory is a new context, announced like the first one.
|
|
232
|
+
if (!previous || previous.taskDir !== next.taskDir) {
|
|
233
|
+
return [
|
|
234
|
+
joinParts([
|
|
235
|
+
path.basename(next.checkout.target),
|
|
236
|
+
next.taskDir ? path.basename(next.taskDir) : 'no-task-dir',
|
|
237
|
+
`status=${next.signal?.status ?? 'unknown'}`,
|
|
238
|
+
`step=${next.signal?.step ? stepLabel(next.signal.step) : 'none'}`,
|
|
239
|
+
], ' '),
|
|
240
|
+
...(next.acceptance ?? []).map((row) => `${row.id} ${row.status?.verdict ?? 'no verdict'} ${row.text}`),
|
|
241
|
+
...(next.prepare
|
|
242
|
+
? [
|
|
243
|
+
`prepare ${next.prepare.step} started (${next.prepare.completed}/${next.prepare.total} steps)`,
|
|
244
|
+
]
|
|
245
|
+
: []),
|
|
246
|
+
];
|
|
247
|
+
}
|
|
248
|
+
const lines = [];
|
|
249
|
+
for (const operation of next.operations) {
|
|
250
|
+
const before = previous.operations.find((entry) => entry.id === operation.id);
|
|
251
|
+
if (!before ||
|
|
252
|
+
before.status !== operation.status ||
|
|
253
|
+
before.stage !== operation.stage ||
|
|
254
|
+
before.ownerAlive !== operation.ownerAlive) {
|
|
255
|
+
lines.push(`operation ${operation.command} ${operation.status}${operation.stage ? ` · ${operation.stage}` : ''} · log ${operation.logPath}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
for (const step of next.prepare?.steps ?? []) {
|
|
259
|
+
if (!previous.prepare?.steps.some((prior) => prior.id === step.id && prior.status === step.status)) {
|
|
260
|
+
lines.push(`prepare ${step.id} ${step.status} (${formatDuration(step.durationMs)})`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (next.prepare &&
|
|
264
|
+
(previous.prepare?.step !== next.prepare.step ||
|
|
265
|
+
previous.prepare.startedAt !== next.prepare.startedAt)) {
|
|
266
|
+
lines.push(`prepare ${next.prepare.step} started (${next.prepare.completed}/${next.prepare.total} steps)`);
|
|
267
|
+
}
|
|
268
|
+
const before = new Map(previous.checklist.map((row) => [row.number, row.checked]));
|
|
269
|
+
const beforeAcceptance = new Map(previous.acceptance?.map((row) => [row.id, row.status?.verdict]));
|
|
270
|
+
for (const row of next.acceptance ?? []) {
|
|
271
|
+
if (beforeAcceptance.get(row.id) !== row.status?.verdict || !beforeAcceptance.has(row.id)) {
|
|
272
|
+
lines.push(`${row.id} ${row.status?.verdict ?? 'no verdict'} ${row.text}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
for (const row of next.checklist) {
|
|
276
|
+
if (!row.checked || before.get(row.number) === true)
|
|
277
|
+
continue;
|
|
278
|
+
lines.push(`checked ${row.number} ${row.label}${row.durationMs !== undefined ? ` (${formatDuration(row.durationMs)})` : ''}`);
|
|
279
|
+
}
|
|
280
|
+
const beforeUnits = new Map(previous.subtasks.map((unit) => [unit.id, unit]));
|
|
281
|
+
for (const unit of next.subtasks) {
|
|
282
|
+
const before = beforeUnits.get(unit.id);
|
|
283
|
+
if (!before) {
|
|
284
|
+
lines.push(`subtask ${unit.id} registered on step ${unit.parentStep} (${unit.rows.length} rows)`);
|
|
285
|
+
}
|
|
286
|
+
const beforeRows = new Map((before?.rows ?? []).map((row) => [row.number, row.checked]));
|
|
287
|
+
for (const row of unit.rows) {
|
|
288
|
+
if (!row.checked || beforeRows.get(row.number) === true)
|
|
289
|
+
continue;
|
|
290
|
+
lines.push(`subtask ${unit.id} checked ${row.number} ${row.label}`);
|
|
291
|
+
}
|
|
292
|
+
if (before && before.status !== unit.status) {
|
|
293
|
+
lines.push(`subtask ${unit.id} ${unit.status ?? 'unknown'}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (previous.signal?.step !== next.signal?.step && next.signal?.step) {
|
|
297
|
+
lines.push(`step ${stepLabel(next.signal.step)}`);
|
|
298
|
+
}
|
|
299
|
+
if (previous.signal?.status !== next.signal?.status) {
|
|
300
|
+
lines.push(`status ${next.signal?.status ?? 'unknown'}`);
|
|
301
|
+
}
|
|
302
|
+
// A long step shows its life through the journal, so a log watcher sees it too.
|
|
303
|
+
if (next.lastCommand && previous.lastCommand?.at !== next.lastCommand.at) {
|
|
304
|
+
lines.push(`command ${joinParts([next.lastCommand.command, next.lastCommand.subject], ' ')}${next.lastCommand.verdict ? ` ${next.lastCommand.verdict}` : ''}`);
|
|
305
|
+
}
|
|
306
|
+
return lines;
|
|
307
|
+
}
|
|
308
|
+
export function formatDuration(ms) {
|
|
309
|
+
const total = Math.max(0, Math.round(ms / 1000));
|
|
310
|
+
const seconds = String(total % 60).padStart(2, '0');
|
|
311
|
+
const minutes = Math.floor(total / 60) % 60;
|
|
312
|
+
const hours = Math.floor(total / 3600);
|
|
313
|
+
if (hours === 0)
|
|
314
|
+
return `${minutes}:${seconds}`;
|
|
315
|
+
return `${hours}:${String(minutes).padStart(2, '0')}:${seconds}`;
|
|
316
|
+
}
|
|
317
|
+
function renderRow(row, currentStep, out) {
|
|
318
|
+
const marker = row.checked
|
|
319
|
+
? out('ok', '✓')
|
|
320
|
+
: row.number === currentStep
|
|
321
|
+
? out('accent', '▶')
|
|
322
|
+
: out('dim', '·');
|
|
323
|
+
const timing = row.durationMs !== undefined
|
|
324
|
+
? formatDuration(row.durationMs)
|
|
325
|
+
: row.runningMs !== undefined
|
|
326
|
+
? `${formatDuration(row.runningMs)} …`
|
|
327
|
+
: '';
|
|
328
|
+
const number = String(row.number).padStart(2);
|
|
329
|
+
const label = timing ? row.label.padEnd(CHECKLIST_LABEL_LIMIT) : row.label;
|
|
330
|
+
const text = row.checked ? out('dim', label) : out('bold', label);
|
|
331
|
+
return ` ${marker} ${out('dim', number)} ${text}${timing ? ` ${out('dim', timing)}` : ''}`;
|
|
332
|
+
}
|
|
333
|
+
// The child header names the unit and its source, then its rows, all indented
|
|
334
|
+
// one level deeper than the parent row so the nesting is visible in a redraw.
|
|
335
|
+
function renderSubtask(unit, out) {
|
|
336
|
+
const done = unit.rows.filter((row) => row.checked).length;
|
|
337
|
+
const header = joinParts([
|
|
338
|
+
`${out('label', 'subtask')} ${out('accent', unit.id)}`,
|
|
339
|
+
statusWord(out, unit.status),
|
|
340
|
+
`${done}/${unit.rows.length}`,
|
|
341
|
+
unit.source?.ref && out('dim', unit.source.ref),
|
|
342
|
+
]);
|
|
343
|
+
const current = unit.rows.find((row) => !row.checked);
|
|
344
|
+
return [
|
|
345
|
+
` ${header}`,
|
|
346
|
+
...unit.rows.map((row) => ` ${renderRow(row, current?.number, out)}`),
|
|
347
|
+
];
|
|
348
|
+
}
|
|
349
|
+
function libraryLabel(library) {
|
|
350
|
+
const home = os.homedir();
|
|
351
|
+
const location = home && library.path.startsWith(`${home}/`)
|
|
352
|
+
? `~${library.path.slice(home.length)}`
|
|
353
|
+
: library.path;
|
|
354
|
+
return library.name ? `${library.name}=${location}` : location;
|
|
355
|
+
}
|
|
356
|
+
function statusWord(out, status) {
|
|
357
|
+
if (!status)
|
|
358
|
+
return out('dim', 'unknown');
|
|
359
|
+
const style = ['pass', 'ready', 'complete', 'no-change'].includes(status)
|
|
360
|
+
? 'ok'
|
|
361
|
+
: ['running', 'started'].includes(status)
|
|
362
|
+
? 'accent'
|
|
363
|
+
: 'err';
|
|
364
|
+
return out(style, status);
|
|
365
|
+
}
|
|
366
|
+
// SIGNAL.json records the whole checklist line as its step; the number is what
|
|
367
|
+
// a reader tracks between refreshes.
|
|
368
|
+
function stepLabel(step) {
|
|
369
|
+
return /^\s*(\d+)\./u.exec(step)?.[1] ?? step.trim();
|
|
370
|
+
}
|
|
371
|
+
function shortUdid(udid) {
|
|
372
|
+
if (!udid)
|
|
373
|
+
return undefined;
|
|
374
|
+
return `(${udid.split('-')[0]})`;
|
|
375
|
+
}
|
|
376
|
+
function joinParts(parts, separator = ' · ') {
|
|
377
|
+
return parts.filter((part) => Boolean(part)).join(separator);
|
|
378
|
+
}
|
|
379
|
+
function renderOperations(view) {
|
|
380
|
+
const active = view.operations.filter((operation) => operation.status === 'running' && operation.ownerAlive);
|
|
381
|
+
const selected = active.length ? active : view.operations.slice(-1);
|
|
382
|
+
return selected.flatMap((operation) => {
|
|
383
|
+
const elapsed = Date.parse(operation.finishedAt ?? new Date().toISOString()) -
|
|
384
|
+
Date.parse(operation.startedAt);
|
|
385
|
+
const state = operation.status === 'running'
|
|
386
|
+
? operation.ownerAlive
|
|
387
|
+
? 'owner alive'
|
|
388
|
+
: 'owner exited; outcome unknown'
|
|
389
|
+
: operation.status;
|
|
390
|
+
const age = operation.lastOutputAt
|
|
391
|
+
? formatDuration(Date.now() - Date.parse(operation.lastOutputAt)) + ' ago'
|
|
392
|
+
: 'none recorded';
|
|
393
|
+
const quoted = "'" + operation.logPath.replace(/'/g, "'\\''") + "'";
|
|
394
|
+
return [
|
|
395
|
+
`${operation.parentId ? ' ' : ''}operation ${operation.command} · ${state} · ${formatDuration(elapsed)} elapsed`,
|
|
396
|
+
...(operation.stage ? [` stage ${operation.stage}`] : []),
|
|
397
|
+
` last output ${age}`,
|
|
398
|
+
` follow: tail -n 50 -F ${quoted}`,
|
|
399
|
+
];
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=status-watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-watch.js","sourceRoot":"","sources":["../../../src/harness/commands/status-watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ParsedArgs } from '../parse-args.js';
|
|
2
|
+
import { type ReadinessViewOptions } from '../readiness.js';
|
|
3
|
+
export type StatusCommandOptions = ReadinessViewOptions;
|
|
4
|
+
export declare function handleStatus({ options }: ParsedArgs, commandOptions?: StatusCommandOptions): Promise<number>;
|
|
5
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/harness/commands/status.ts"],"names":[],"mappings":"AAkBA,OAAO,EAA4B,KAAK,UAAU,EAAc,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAIL,KAAK,oBAAoB,EAE1B,MAAM,iBAAiB,CAAC;AAMzB,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAExD,wBAAsB,YAAY,CAChC,EAAE,OAAO,EAAE,EAAE,UAAU,EACvB,cAAc,GAAE,oBAAyB,GACxC,OAAO,CAAC,MAAM,CAAC,CA4JjB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// status — the home dashboard for a checkout (its platform, the next command,
|
|
2
|
+
// connected devices with live state), and `--watch`/`--task`, the read-only
|
|
3
|
+
// view of the task the checkout is working through.
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { adapterDetectNext, assertAdapter, detectAdapter, harnessAdapter, undetectedAdapterMessage, } from '../adapters.js';
|
|
7
|
+
import { color } from '../cli-color.js';
|
|
8
|
+
import { harnessHost } from '../host.js';
|
|
9
|
+
import { optionFlag, optionString, targetPath } from '../parse-args.js';
|
|
10
|
+
import { adapterReadiness, renderFeatureFlagLine, } from '../readiness.js';
|
|
11
|
+
import { EXIT, usageOut } from '../shared.js';
|
|
12
|
+
import { collectTaskView, findTaskDir } from '../task-view.js';
|
|
13
|
+
import { handleStatusTaskView, renderAcceptanceLines } from './status-watch.js';
|
|
14
|
+
export async function handleStatus({ options }, commandOptions = {}) {
|
|
15
|
+
const target = targetPath(options);
|
|
16
|
+
const json = optionFlag(options, 'json');
|
|
17
|
+
const watch = optionFlag(options, 'watch');
|
|
18
|
+
const taskDir = optionString(options, 'task');
|
|
19
|
+
if (watch || taskDir) {
|
|
20
|
+
const resolvedTask = taskDir ? path.resolve(taskDir) : undefined;
|
|
21
|
+
// A mistyped path would otherwise render as a task that went quiet.
|
|
22
|
+
if (resolvedTask && !(fs.existsSync(resolvedTask) && fs.statSync(resolvedTask).isDirectory())) {
|
|
23
|
+
return usageOut(json, 'status', `--task is not a directory: ${resolvedTask}`, 'Pass a task directory under temp/tasks, or omit --task to follow the newest one.');
|
|
24
|
+
}
|
|
25
|
+
return handleStatusTaskView({ target, taskDir: resolvedTask, json, watch });
|
|
26
|
+
}
|
|
27
|
+
const fast = optionFlag(options, 'fast');
|
|
28
|
+
const allDevices = optionFlag(options, 'allDevices');
|
|
29
|
+
const adapter = detectAdapter(target);
|
|
30
|
+
if (!adapter) {
|
|
31
|
+
return usageOut(json, 'status', undetectedAdapterMessage(target), adapterDetectNext());
|
|
32
|
+
}
|
|
33
|
+
assertAdapter(adapter);
|
|
34
|
+
// Before resolveSlotPorts, which hydrates the env from the context file and
|
|
35
|
+
// would make every file value look like a live env override.
|
|
36
|
+
const view = commandOptions.checkoutView?.(target, adapter);
|
|
37
|
+
const surface = harnessAdapter(adapter);
|
|
38
|
+
surface.resolveSlotPorts(target);
|
|
39
|
+
const readiness = adapterReadiness(surface);
|
|
40
|
+
// Device targeting only applies where there are devices to target.
|
|
41
|
+
const deviceSource = await readiness.devices?.();
|
|
42
|
+
if (deviceSource && commandOptions.previewDevice) {
|
|
43
|
+
const preview = commandOptions.previewDevice('status', adapter, options);
|
|
44
|
+
if (!preview.ok)
|
|
45
|
+
return usageOut(json, 'status', preview.message, preview.userAction);
|
|
46
|
+
}
|
|
47
|
+
const next = surface.hints.relaunch;
|
|
48
|
+
const flags = commandOptions.featureFlags;
|
|
49
|
+
// Overrides a platform pins in a file come without a runtime. A platform that
|
|
50
|
+
// reads them from its devices gets them from the same live probe as the rest:
|
|
51
|
+
// status spawns one probe. `null` is "no runtime answered", never "no overrides".
|
|
52
|
+
const pinnedFlags = readiness.pinnedFlags?.(target) ?? null;
|
|
53
|
+
const flagReport = (overrides, detail) => flags?.report(overrides, detail);
|
|
54
|
+
const staticFeatureFlags = pinnedFlags
|
|
55
|
+
? flagReport(pinnedFlags.overrides, pinnedFlags)
|
|
56
|
+
: flagReport(null);
|
|
57
|
+
const deviceView = deviceSource ? deviceSource.view(allDevices) : null;
|
|
58
|
+
const devices = deviceView?.devices ?? [];
|
|
59
|
+
const discovery = deviceView?.deviceDiscoveryErrors.length
|
|
60
|
+
? { deviceDiscoveryErrors: deviceView.deviceDiscoveryErrors }
|
|
61
|
+
: {};
|
|
62
|
+
const discoveryNext = discovery.deviceDiscoveryErrors?.[0]?.userAction;
|
|
63
|
+
const viewField = view ? { view: view.json } : {};
|
|
64
|
+
if (json) {
|
|
65
|
+
// One envelope, after the probes (unless --fast or no devices).
|
|
66
|
+
const doProbe = !fast && deviceSource && deviceView !== null && deviceView.allConnectedDevices.length > 0;
|
|
67
|
+
if (doProbe) {
|
|
68
|
+
const liveView = await deviceSource.live(target, deviceView);
|
|
69
|
+
const liveFlags = flagReport(liveView.featureFlags);
|
|
70
|
+
console.log(JSON.stringify({
|
|
71
|
+
schemaVersion: 1,
|
|
72
|
+
command: 'status',
|
|
73
|
+
adapter,
|
|
74
|
+
target,
|
|
75
|
+
...viewField,
|
|
76
|
+
devices: liveView.devicesWithLive,
|
|
77
|
+
...(liveFlags ? { featureFlags: liveFlags } : {}),
|
|
78
|
+
...discovery,
|
|
79
|
+
...(liveView.additionalReachableDevices.length > 0
|
|
80
|
+
? { additionalReachableDevices: liveView.additionalReachableDevices }
|
|
81
|
+
: {}),
|
|
82
|
+
...(liveView.statusFields ?? {}),
|
|
83
|
+
next: discoveryNext ?? deviceSource.nextForLive(next, liveView.liveMap),
|
|
84
|
+
}, null, 2));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const runtime = !fast && readiness.statusRuntime ? await surface.runtimeStatus(target) : undefined;
|
|
88
|
+
console.log(JSON.stringify({
|
|
89
|
+
schemaVersion: 1,
|
|
90
|
+
command: 'status',
|
|
91
|
+
adapter,
|
|
92
|
+
target,
|
|
93
|
+
...viewField,
|
|
94
|
+
devices,
|
|
95
|
+
...(staticFeatureFlags ? { featureFlags: staticFeatureFlags } : {}),
|
|
96
|
+
...discovery,
|
|
97
|
+
...(runtime ? { runtime } : {}),
|
|
98
|
+
next: discoveryNext ??
|
|
99
|
+
(runtime
|
|
100
|
+
? nextForRuntime(surface.hints.launch, surface.hints.relaunch, runtime)
|
|
101
|
+
: next),
|
|
102
|
+
}, null, 2));
|
|
103
|
+
}
|
|
104
|
+
return EXIT.ok;
|
|
105
|
+
}
|
|
106
|
+
// Human output — progressive: static info prints immediately so the operator
|
|
107
|
+
// sees the device list without waiting for the probe window to close.
|
|
108
|
+
const out = (style, text) => color(style, text, { stream: process.stdout });
|
|
109
|
+
console.log(`${out('label', 'status')} ${out('bold', adapter)} ${out('dim', target)}`);
|
|
110
|
+
if (view)
|
|
111
|
+
console.log(view.text);
|
|
112
|
+
if (!fast) {
|
|
113
|
+
const taskView = collectTaskView(target, findTaskDir(target), Date.now());
|
|
114
|
+
if (taskView.activity.ongoing && taskView.acceptance?.length) {
|
|
115
|
+
console.log(renderAcceptanceLines(taskView).join('\n'));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// A device-backed override record arrives with the live probe below, so only
|
|
119
|
+
// a file-backed record can be printed this early.
|
|
120
|
+
if (!deviceSource && staticFeatureFlags)
|
|
121
|
+
renderFeatureFlagLine(staticFeatureFlags, out);
|
|
122
|
+
if (deviceSource && deviceView)
|
|
123
|
+
deviceSource.renderList(deviceView, out);
|
|
124
|
+
if (!fast && deviceSource && deviceView !== null && deviceView.allConnectedDevices.length > 0) {
|
|
125
|
+
const liveView = await deviceSource.live(target, deviceView);
|
|
126
|
+
if (liveView.additionalReachableDevices.length > 0)
|
|
127
|
+
deviceSource.renderAdditional(liveView.additionalReachableDevices, out);
|
|
128
|
+
const liveFlags = flagReport(liveView.featureFlags);
|
|
129
|
+
if (liveFlags)
|
|
130
|
+
renderFeatureFlagLine(liveFlags, out);
|
|
131
|
+
deviceSource.renderLive(devices, liveView.liveMap, out);
|
|
132
|
+
deviceSource.renderHints?.(liveView, out);
|
|
133
|
+
console.log(`${out('label', 'Next:')} ${out('cmd', discoveryNext ?? deviceSource.nextForLive(next, liveView.liveMap))}`);
|
|
134
|
+
}
|
|
135
|
+
else if (!fast && readiness.statusRuntime) {
|
|
136
|
+
const runtime = await surface.runtimeStatus(target);
|
|
137
|
+
renderRuntimeStatus(runtime, out);
|
|
138
|
+
console.log(`${out('label', 'Next:')} ${out('cmd', nextForRuntime(surface.hints.launch, surface.hints.relaunch, runtime))}`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const noRuntime = deviceSource ? flagReport(null) : undefined;
|
|
142
|
+
if (noRuntime)
|
|
143
|
+
renderFeatureFlagLine(noRuntime, out);
|
|
144
|
+
console.log(`${out('label', 'Next:')} ${out('cmd', discoveryNext ?? next)}`);
|
|
145
|
+
}
|
|
146
|
+
return EXIT.ok;
|
|
147
|
+
}
|
|
148
|
+
function renderRuntimeStatus(runtime, out) {
|
|
149
|
+
const decisionStyle = runtime.decision === 'ready' ? 'ok' : runtime.decision === 'blocked' ? 'err' : 'warn';
|
|
150
|
+
const deps = runtime.deps
|
|
151
|
+
? ` deps=${out(runtime.deps === 'current' ? 'ok' : 'warn', runtime.deps)}`
|
|
152
|
+
: '';
|
|
153
|
+
const devServer = runtime.devServer
|
|
154
|
+
? ` ${runtime.devServer.label}=${out(runtime.devServer.status === 'up' ? 'ok' : 'warn', runtime.devServer.status)}`
|
|
155
|
+
: '';
|
|
156
|
+
console.log(`${out('label', 'runtime:')} decision=${out(decisionStyle, runtime.decision)}${runtime.reasonCode ? ` ${out('dim', `(${runtime.reasonCode})`)}` : ''}${deps}${devServer}`);
|
|
157
|
+
}
|
|
158
|
+
function nextForRuntime(launchHint, relaunchHint, runtime) {
|
|
159
|
+
if (runtime.nextAction)
|
|
160
|
+
return runtime.nextAction;
|
|
161
|
+
if (runtime.decision === 'ready')
|
|
162
|
+
return `${harnessHost().name} logs`;
|
|
163
|
+
if (runtime.decision === 'relaunch')
|
|
164
|
+
return launchHint;
|
|
165
|
+
return relaunchHint;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/harness/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-init.d.ts","sourceRoot":"","sources":["../../../src/harness/commands/task-init.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,sBAAsB;IAErC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAuBD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
|