@farmslot/recipe-cli 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/harness/adapter-plugins.d.ts +1 -0
  3. package/dist/harness/adapter-plugins.d.ts.map +1 -1
  4. package/dist/harness/adapter-plugins.js +26 -13
  5. package/dist/harness/adapter-plugins.js.map +1 -1
  6. package/dist/harness/adapters.d.ts +0 -2
  7. package/dist/harness/adapters.d.ts.map +1 -1
  8. package/dist/harness/adapters.js +0 -4
  9. package/dist/harness/adapters.js.map +1 -1
  10. package/dist/harness/command-contract.d.ts +16 -1
  11. package/dist/harness/command-contract.d.ts.map +1 -1
  12. package/dist/harness/command-contract.js +8 -0
  13. package/dist/harness/command-contract.js.map +1 -1
  14. package/dist/harness/commands/call.d.ts.map +1 -1
  15. package/dist/harness/commands/call.js +30 -9
  16. package/dist/harness/commands/call.js.map +1 -1
  17. package/dist/harness/commands/checklist.d.ts +16 -0
  18. package/dist/harness/commands/checklist.d.ts.map +1 -0
  19. package/dist/harness/commands/checklist.js +171 -0
  20. package/dist/harness/commands/checklist.js.map +1 -0
  21. package/dist/harness/commands/doctor.d.ts +45 -0
  22. package/dist/harness/commands/doctor.d.ts.map +1 -0
  23. package/dist/harness/commands/doctor.js +591 -0
  24. package/dist/harness/commands/doctor.js.map +1 -0
  25. package/dist/harness/commands/execution-template.d.ts +2 -0
  26. package/dist/harness/commands/execution-template.d.ts.map +1 -0
  27. package/dist/harness/commands/execution-template.js +27 -0
  28. package/dist/harness/commands/execution-template.js.map +1 -0
  29. package/dist/harness/commands/launch.js +3 -0
  30. package/dist/harness/commands/launch.js.map +1 -1
  31. package/dist/harness/commands/prepare.d.ts +35 -0
  32. package/dist/harness/commands/prepare.d.ts.map +1 -0
  33. package/dist/harness/commands/prepare.js +570 -0
  34. package/dist/harness/commands/prepare.js.map +1 -0
  35. package/dist/harness/commands/recipe-quality.d.ts +13 -0
  36. package/dist/harness/commands/recipe-quality.d.ts.map +1 -0
  37. package/dist/harness/commands/recipe-quality.js +112 -0
  38. package/dist/harness/commands/recipe-quality.js.map +1 -0
  39. package/dist/harness/commands/run.d.ts.map +1 -1
  40. package/dist/harness/commands/run.js +13 -1
  41. package/dist/harness/commands/run.js.map +1 -1
  42. package/dist/harness/commands/status-watch.d.ts +20 -0
  43. package/dist/harness/commands/status-watch.d.ts.map +1 -0
  44. package/dist/harness/commands/status-watch.js +402 -0
  45. package/dist/harness/commands/status-watch.js.map +1 -0
  46. package/dist/harness/commands/status.d.ts +5 -0
  47. package/dist/harness/commands/status.d.ts.map +1 -0
  48. package/dist/harness/commands/status.js +167 -0
  49. package/dist/harness/commands/status.js.map +1 -0
  50. package/dist/harness/commands/task-init.d.ts +5 -0
  51. package/dist/harness/commands/task-init.d.ts.map +1 -0
  52. package/dist/harness/commands/task-init.js +54 -0
  53. package/dist/harness/commands/task-init.js.map +1 -0
  54. package/dist/harness/doctor-report.d.ts +58 -0
  55. package/dist/harness/doctor-report.d.ts.map +1 -0
  56. package/dist/harness/doctor-report.js +154 -0
  57. package/dist/harness/doctor-report.js.map +1 -0
  58. package/dist/harness/harness-cli.d.ts +10 -1
  59. package/dist/harness/harness-cli.d.ts.map +1 -1
  60. package/dist/harness/harness-cli.js +9 -9
  61. package/dist/harness/harness-cli.js.map +1 -1
  62. package/dist/harness/heal-bounds.d.ts +1 -1
  63. package/dist/harness/heal-bounds.d.ts.map +1 -1
  64. package/dist/harness/heal-bounds.js +33 -2
  65. package/dist/harness/heal-bounds.js.map +1 -1
  66. package/dist/harness/index.d.ts +15 -3
  67. package/dist/harness/index.d.ts.map +1 -1
  68. package/dist/harness/index.js +14 -2
  69. package/dist/harness/index.js.map +1 -1
  70. package/dist/harness/json-stream.d.ts +7 -1
  71. package/dist/harness/json-stream.d.ts.map +1 -1
  72. package/dist/harness/json-stream.js +12 -0
  73. package/dist/harness/json-stream.js.map +1 -1
  74. package/dist/harness/paths.d.ts +2 -0
  75. package/dist/harness/paths.d.ts.map +1 -1
  76. package/dist/harness/paths.js +2 -0
  77. package/dist/harness/paths.js.map +1 -1
  78. package/dist/harness/readiness.d.ts +31 -0
  79. package/dist/harness/readiness.d.ts.map +1 -0
  80. package/dist/harness/readiness.js +12 -0
  81. package/dist/harness/readiness.js.map +1 -0
  82. package/dist/harness/recording-target.d.ts +11 -0
  83. package/dist/harness/recording-target.d.ts.map +1 -1
  84. package/dist/harness/recording-target.js +31 -2
  85. package/dist/harness/recording-target.js.map +1 -1
  86. package/dist/harness/run-engine.d.ts.map +1 -1
  87. package/dist/harness/run-engine.js.map +1 -1
  88. package/dist/harness/run-options.js +2 -11
  89. package/dist/harness/run-options.js.map +1 -1
  90. package/dist/harness/shared.d.ts.map +1 -1
  91. package/dist/harness/shared.js +60 -44
  92. package/dist/harness/shared.js.map +1 -1
  93. package/dist/harness/stage-progress.d.ts +25 -0
  94. package/dist/harness/stage-progress.d.ts.map +1 -0
  95. package/dist/harness/stage-progress.js +162 -0
  96. package/dist/harness/stage-progress.js.map +1 -0
  97. package/dist/harness/task-view.d.ts +142 -0
  98. package/dist/harness/task-view.d.ts.map +1 -0
  99. package/dist/harness/task-view.js +451 -0
  100. package/dist/harness/task-view.js.map +1 -0
  101. package/package.json +2 -2
@@ -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,5 @@
1
+ export interface TaskInitCommandOptions {
2
+ surface?: string;
3
+ }
4
+ export declare function handleTaskInit(argv: string[], options?: TaskInitCommandOptions): Promise<number>;
5
+ //# sourceMappingURL=task-init.d.ts.map
@@ -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"}