@farmslot/recipe-cli 0.8.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 (97) hide show
  1. package/CHANGELOG.md +19 -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 +3 -0
  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 +4 -6
  61. package/dist/harness/harness-cli.js.map +1 -1
  62. package/dist/harness/heal-bounds.d.ts.map +1 -1
  63. package/dist/harness/heal-bounds.js +6 -0
  64. package/dist/harness/heal-bounds.js.map +1 -1
  65. package/dist/harness/index.d.ts +15 -3
  66. package/dist/harness/index.d.ts.map +1 -1
  67. package/dist/harness/index.js +14 -2
  68. package/dist/harness/index.js.map +1 -1
  69. package/dist/harness/json-stream.d.ts +7 -1
  70. package/dist/harness/json-stream.d.ts.map +1 -1
  71. package/dist/harness/json-stream.js +12 -0
  72. package/dist/harness/json-stream.js.map +1 -1
  73. package/dist/harness/paths.d.ts +2 -0
  74. package/dist/harness/paths.d.ts.map +1 -1
  75. package/dist/harness/paths.js +2 -0
  76. package/dist/harness/paths.js.map +1 -1
  77. package/dist/harness/readiness.d.ts +31 -0
  78. package/dist/harness/readiness.d.ts.map +1 -0
  79. package/dist/harness/readiness.js +12 -0
  80. package/dist/harness/readiness.js.map +1 -0
  81. package/dist/harness/recording-target.d.ts +11 -0
  82. package/dist/harness/recording-target.d.ts.map +1 -1
  83. package/dist/harness/recording-target.js +31 -2
  84. package/dist/harness/recording-target.js.map +1 -1
  85. package/dist/harness/run-engine.d.ts.map +1 -1
  86. package/dist/harness/run-engine.js.map +1 -1
  87. package/dist/harness/run-options.js +2 -11
  88. package/dist/harness/run-options.js.map +1 -1
  89. package/dist/harness/stage-progress.d.ts +25 -0
  90. package/dist/harness/stage-progress.d.ts.map +1 -0
  91. package/dist/harness/stage-progress.js +162 -0
  92. package/dist/harness/stage-progress.js.map +1 -0
  93. package/dist/harness/task-view.d.ts +142 -0
  94. package/dist/harness/task-view.d.ts.map +1 -0
  95. package/dist/harness/task-view.js +451 -0
  96. package/dist/harness/task-view.js.map +1 -0
  97. package/package.json +2 -2
@@ -0,0 +1,162 @@
1
+ // stage-progress — the one renderer for setup stages (launch, prepare, doctor
2
+ // --fix). Each stage is a line on stderr, `[2/5] metro: bundling 61% (4,210/6,900
3
+ // modules), 1m42s`, repeated at least every 15 s while it runs, so a slow start
4
+ // and a hang read differently. A payload that stops changing gets a plain "no
5
+ // progress for 1m00s" line; it never fails the command. Stdout and every --json
6
+ // document stay as they were; --json-stream gets a `stage` event per line.
7
+ const HEARTBEAT_MS = 15_000;
8
+ const STALL_NOTICE_MS = 60_000;
9
+ /** A line from a child harness command that is itself a stage line. */
10
+ export const STAGE_LINE = /^\[\d+\/\d+\] /u;
11
+ /** `20s`, `1m42s`, `1h03m`. */
12
+ export function formatElapsed(ms) {
13
+ const seconds = Math.max(0, Math.floor(ms / 1000));
14
+ if (seconds < 60)
15
+ return `${seconds}s`;
16
+ const minutes = Math.floor(seconds / 60);
17
+ if (minutes < 60)
18
+ return `${minutes}m${String(seconds % 60).padStart(2, '0')}s`;
19
+ return `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, '0')}m`;
20
+ }
21
+ // The payload as the event carries it; also what "changed" compares, so a
22
+ // percent moving within one whole number is not progress the line could show.
23
+ function progressFields(progress) {
24
+ const fields = {
25
+ waitingFor: progress.waitingFor,
26
+ message: progress.message,
27
+ percent: progress.percent === undefined ? undefined : Math.floor(progress.percent),
28
+ current: progress.current,
29
+ totalCount: progress.total,
30
+ unit: progress.unit,
31
+ screen: progress.screen,
32
+ };
33
+ return Object.fromEntries(Object.entries(fields).filter((entry) => entry[1] !== undefined));
34
+ }
35
+ const count = (value) => value.toLocaleString('en-US');
36
+ /** `bundling 61% (4,210/6,900 modules)`, `waiting for unlock, page is #onboarding/welcome`. */
37
+ export function stageProgressText(progress) {
38
+ const { message, waitingFor, percent, current, total, unit, screen } = progress;
39
+ const counts = current === undefined
40
+ ? undefined
41
+ : `(${count(current)}${total === undefined ? '' : `/${count(total)}`}${unit ? ` ${unit}` : ''})`;
42
+ const head = [message, waitingFor && `waiting for ${waitingFor}`].filter(Boolean).join(', ');
43
+ const measured = [head, percent === undefined ? undefined : `${Math.floor(percent)}%`, counts]
44
+ .filter(Boolean)
45
+ .join(' ');
46
+ return [measured, screen && `page is ${screen}`].filter(Boolean).join(', ');
47
+ }
48
+ function stallNoticeMs() {
49
+ const value = Number(process.env.RECIPE_STAGE_STALL_NOTICE_MS);
50
+ return Number.isFinite(value) && value > 0 ? value : STALL_NOTICE_MS;
51
+ }
52
+ export function createStageReporter(options = {}) {
53
+ const write = options.write ?? ((line) => process.stderr.write(`${line}\n`));
54
+ const heartbeatMs = options.heartbeatMs ?? HEARTBEAT_MS;
55
+ const stallMs = options.stallMs ?? stallNoticeMs();
56
+ const open = new Set();
57
+ // A plain heartbeat is owed when the command has been quiet, not each stage:
58
+ // a stage that speaks for the whole command keeps another one quiet. A stall
59
+ // notice is always said.
60
+ let lastLineAt = 0;
61
+ // When any stage last moved: an outer stage with no progress of its own
62
+ // (`launch` around an adapter's stages) moves when the command does.
63
+ let lastChangeAt = 0;
64
+ return {
65
+ stage(name, { index, total }) {
66
+ const prefix = `[${index}/${total}] ${name}`;
67
+ const startedAt = Date.now();
68
+ lastChangeAt = startedAt;
69
+ let latest = {};
70
+ let latestKey = '{}';
71
+ let changedAt = startedAt;
72
+ let timer;
73
+ let ended = false;
74
+ const line = (text, status, fields = {}) => {
75
+ const elapsedMs = Date.now() - startedAt;
76
+ lastLineAt = Date.now();
77
+ write(`${prefix}: ${text}, ${formatElapsed(elapsedMs)}`);
78
+ options.event?.({ stage: name, index, total, status, elapsedMs, ...fields });
79
+ };
80
+ const heartbeat = () => {
81
+ const now = Date.now();
82
+ const movedAt = latestKey === '{}' ? Math.max(changedAt, lastChangeAt) : changedAt;
83
+ const stalledMs = now - movedAt;
84
+ const quietMs = now - lastLineAt;
85
+ if (stalledMs < stallMs && quietMs < heartbeatMs) {
86
+ schedule(heartbeatMs - quietMs);
87
+ return;
88
+ }
89
+ const text = stageProgressText(latest);
90
+ if (stalledMs >= stallMs) {
91
+ const still = latest.screen ? `still on ${latest.screen}` : text && `still ${text}`;
92
+ const notice = [`no progress for ${formatElapsed(stalledMs)}`, still].filter(Boolean);
93
+ line(notice.join(', '), 'progress', { ...progressFields(latest), stalledMs });
94
+ }
95
+ else {
96
+ line(text || 'running', 'progress', progressFields(latest));
97
+ }
98
+ schedule(heartbeatMs);
99
+ };
100
+ // Unref'd: feedback must never be what keeps the process alive.
101
+ const schedule = (delayMs) => {
102
+ clearTimeout(timer);
103
+ timer = setTimeout(heartbeat, delayMs);
104
+ timer.unref();
105
+ };
106
+ const end = (status, detail) => {
107
+ if (ended)
108
+ return;
109
+ ended = true;
110
+ clearTimeout(timer);
111
+ open.delete(handle);
112
+ line(detail ? `${status}, ${detail}` : status, status, detail ? { message: detail } : {});
113
+ };
114
+ const handle = {
115
+ progress(progress) {
116
+ if (ended)
117
+ return;
118
+ const fields = progressFields(progress);
119
+ const key = JSON.stringify(fields);
120
+ // The same payload again is not progress; the heartbeat repeats it.
121
+ if (key === latestKey)
122
+ return;
123
+ latest = { ...progress };
124
+ latestKey = key;
125
+ changedAt = Date.now();
126
+ lastChangeAt = changedAt;
127
+ line(stageProgressText(latest) || 'running', 'progress', fields);
128
+ schedule(heartbeatMs);
129
+ },
130
+ done: (detail) => end('done', detail),
131
+ failed: (detail) => end('failed', detail),
132
+ forward(childLine) {
133
+ if (ended)
134
+ return;
135
+ lastLineAt = Date.now();
136
+ write(`${prefix} › ${childLine}`);
137
+ if (!childLine.includes('no progress for')) {
138
+ changedAt = Date.now();
139
+ lastChangeAt = changedAt;
140
+ }
141
+ // A child line counts as this stage's line: the parent speaks only
142
+ // when the child has been quiet for a heartbeat.
143
+ schedule(heartbeatMs);
144
+ },
145
+ };
146
+ open.add(handle);
147
+ line('started', 'start');
148
+ schedule(heartbeatMs);
149
+ return handle;
150
+ },
151
+ close(status, detail) {
152
+ // Innermost first: a stage opened inside another ends before it.
153
+ for (const stage of [...open].reverse()) {
154
+ if (status === 'done')
155
+ stage.done(detail);
156
+ else
157
+ stage.failed(detail);
158
+ }
159
+ },
160
+ };
161
+ }
162
+ //# sourceMappingURL=stage-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-progress.js","sourceRoot":"","sources":["../../src/harness/stage-progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import { type TaskOperation } from '@farmslot/protocol';
2
+ import { type AcceptanceCriterionView } from '@farmslot/protocol/contracts/acceptance';
3
+ export declare const CHECKLIST_LABEL_LIMIT = 70;
4
+ export interface TaskViewCheckout {
5
+ target: string;
6
+ branch?: string;
7
+ head?: string;
8
+ }
9
+ export interface TaskViewIsolation {
10
+ slotId?: string;
11
+ platform?: string;
12
+ metroPort?: number;
13
+ watcherPort?: number;
14
+ devServerPort?: number;
15
+ simulator?: string;
16
+ simulatorUdid?: string;
17
+ cdpPort?: number;
18
+ extensionId?: string;
19
+ }
20
+ export interface TaskViewHarness {
21
+ version?: string;
22
+ sourceKind?: string;
23
+ }
24
+ export interface TaskViewTemplate {
25
+ id?: string;
26
+ sourceId?: string;
27
+ flow?: string;
28
+ domain?: string;
29
+ surface?: string;
30
+ title?: string;
31
+ ticket?: string;
32
+ }
33
+ export interface TaskViewLibrary {
34
+ name?: string;
35
+ path: string;
36
+ }
37
+ export interface TaskViewFixture {
38
+ fixture?: string;
39
+ canonicalFixture?: string;
40
+ status?: string;
41
+ walletReset?: boolean;
42
+ }
43
+ export interface TaskViewSandbox {
44
+ ready?: boolean;
45
+ }
46
+ export interface TaskViewRow {
47
+ /** The second-level heading this row sits under in CHECKLIST.md, when there is one. */
48
+ phase?: string;
49
+ number: number;
50
+ label: string;
51
+ checked: boolean;
52
+ /** Time from the previous marked row (or the handoff start) to this mark. */
53
+ durationMs?: number;
54
+ /** Time since the last mark, on the row the agent is working now. */
55
+ runningMs?: number;
56
+ }
57
+ /** Where a child unit's markdown came from, as `mark` recorded it. */
58
+ export interface TaskViewSubtaskSource {
59
+ kind?: string;
60
+ ref?: string;
61
+ }
62
+ /**
63
+ * A child checklist unit registered on one parent row (ADR-060). Its rows are
64
+ * enumerated by the same protocol parser as the parent checklist, so a row here
65
+ * is the box `mark sub <id> <n>` ticks.
66
+ */
67
+ export interface TaskViewSubtask {
68
+ id: string;
69
+ /** 1-based parent row this unit owns. */
70
+ parentStep: number;
71
+ status?: string;
72
+ /** False while the unit still owns its parent row (`running` or `blocked`). */
73
+ settled: boolean;
74
+ rows: TaskViewRow[];
75
+ source?: TaskViewSubtaskSource;
76
+ }
77
+ export interface TaskViewSignal {
78
+ status?: string;
79
+ step?: string;
80
+ timestamp?: string;
81
+ attemptId?: string;
82
+ }
83
+ export interface TaskView {
84
+ operations: Array<TaskOperation & {
85
+ ownerAlive: boolean;
86
+ }>;
87
+ checkout: TaskViewCheckout;
88
+ taskDir?: string;
89
+ isolation?: TaskViewIsolation;
90
+ harness?: TaskViewHarness;
91
+ template?: TaskViewTemplate;
92
+ acceptance?: AcceptanceCriterionView[];
93
+ libraries: TaskViewLibrary[];
94
+ fixture?: TaskViewFixture;
95
+ sandbox?: TaskViewSandbox;
96
+ prepare?: TaskViewPrepare;
97
+ checklist: TaskViewRow[];
98
+ /** Child units registered on this task's rows, in registration order. */
99
+ subtasks: TaskViewSubtask[];
100
+ signal?: TaskViewSignal;
101
+ /** The last journaled harness command run in this checkout (call, run, launch, …). */
102
+ lastCommand?: TaskViewCommand;
103
+ currentStep?: number;
104
+ elapsedMs?: number;
105
+ activity: TaskViewActivity;
106
+ }
107
+ export interface TaskViewPrepare {
108
+ step: string;
109
+ elapsedMs: number;
110
+ completed: number;
111
+ total: number;
112
+ steps: Array<{
113
+ id: string;
114
+ status: string;
115
+ durationMs: number;
116
+ }>;
117
+ startedAt: string;
118
+ updatedAt: string;
119
+ }
120
+ export interface TaskViewCommand {
121
+ command: string;
122
+ /** The first positional argument, e.g. the action of `call` or the recipe of `run`. */
123
+ subject?: string;
124
+ verdict?: string;
125
+ /** When the command finished, or started when it is still running. */
126
+ at?: string;
127
+ /** Time since `at`. */
128
+ ageMs?: number;
129
+ }
130
+ /** Whether a task is in progress in this checkout, and why not when it is not. */
131
+ export interface TaskViewActivity {
132
+ ongoing: boolean;
133
+ reason?: 'no-task' | 'finished' | 'silent';
134
+ /** Time since the task last wrote its signal, ticked a row, or ran a harness command. */
135
+ idleMs?: number;
136
+ /** False when the task names a ticket and the checked-out branch does not carry it. */
137
+ branchCarriesTicket?: boolean;
138
+ }
139
+ export declare const TASK_SILENT_AFTER_MS: number;
140
+ export declare function findTaskDir(target: string): string | undefined;
141
+ export declare function collectTaskView(target: string, taskDir: string | undefined, now: number): TaskView;
142
+ //# sourceMappingURL=task-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-view.d.ts","sourceRoot":"","sources":["../../src/harness/task-view.ts"],"names":[],"mappings":"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"}