@farmslot/recipe-cli 0.2.0 → 0.4.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 (119) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +13 -9
  3. package/dist/harness/adapters.d.ts +27 -0
  4. package/dist/harness/adapters.d.ts.map +1 -0
  5. package/dist/harness/adapters.js +91 -0
  6. package/dist/harness/adapters.js.map +1 -0
  7. package/dist/harness/artifact-files.d.ts +11 -0
  8. package/dist/harness/artifact-files.d.ts.map +1 -0
  9. package/dist/harness/artifact-files.js +75 -0
  10. package/dist/harness/artifact-files.js.map +1 -0
  11. package/dist/harness/checkout-lock.d.ts +13 -0
  12. package/dist/harness/checkout-lock.d.ts.map +1 -0
  13. package/dist/harness/checkout-lock.js +211 -0
  14. package/dist/harness/checkout-lock.js.map +1 -0
  15. package/dist/harness/cli-color.d.ts +25 -0
  16. package/dist/harness/cli-color.d.ts.map +1 -0
  17. package/dist/harness/cli-color.js +101 -0
  18. package/dist/harness/cli-color.js.map +1 -0
  19. package/dist/harness/command-journal.d.ts +25 -0
  20. package/dist/harness/command-journal.d.ts.map +1 -0
  21. package/dist/harness/command-journal.js +322 -0
  22. package/dist/harness/command-journal.js.map +1 -0
  23. package/dist/harness/commands/last.d.ts +3 -0
  24. package/dist/harness/commands/last.d.ts.map +1 -0
  25. package/dist/harness/commands/last.js +59 -0
  26. package/dist/harness/commands/last.js.map +1 -0
  27. package/dist/harness/commands/launch.d.ts +2 -0
  28. package/dist/harness/commands/launch.d.ts.map +1 -0
  29. package/dist/harness/commands/launch.js +105 -0
  30. package/dist/harness/commands/launch.js.map +1 -0
  31. package/dist/harness/commands/reload.d.ts +2 -0
  32. package/dist/harness/commands/reload.d.ts.map +1 -0
  33. package/dist/harness/commands/reload.js +24 -0
  34. package/dist/harness/commands/reload.js.map +1 -0
  35. package/dist/harness/commands/stop.d.ts +9 -0
  36. package/dist/harness/commands/stop.d.ts.map +1 -0
  37. package/dist/harness/commands/stop.js +60 -0
  38. package/dist/harness/commands/stop.js.map +1 -0
  39. package/dist/harness/execution-provenance.d.ts +56 -0
  40. package/dist/harness/execution-provenance.d.ts.map +1 -0
  41. package/dist/harness/execution-provenance.js +308 -0
  42. package/dist/harness/execution-provenance.js.map +1 -0
  43. package/dist/harness/heal-bounds.d.ts +15 -0
  44. package/dist/harness/heal-bounds.d.ts.map +1 -0
  45. package/dist/harness/heal-bounds.js +194 -0
  46. package/dist/harness/heal-bounds.js.map +1 -0
  47. package/dist/harness/host.d.ts +45 -0
  48. package/dist/harness/host.d.ts.map +1 -0
  49. package/dist/harness/host.js +55 -0
  50. package/dist/harness/host.js.map +1 -0
  51. package/dist/harness/index.d.ts +29 -0
  52. package/dist/harness/index.d.ts.map +1 -0
  53. package/dist/harness/index.js +32 -0
  54. package/dist/harness/index.js.map +1 -0
  55. package/dist/harness/json-stream.d.ts +19 -0
  56. package/dist/harness/json-stream.d.ts.map +1 -0
  57. package/dist/harness/json-stream.js +59 -0
  58. package/dist/harness/json-stream.js.map +1 -0
  59. package/dist/harness/leaf-invoke.d.ts +8 -0
  60. package/dist/harness/leaf-invoke.d.ts.map +1 -0
  61. package/dist/harness/leaf-invoke.js +31 -0
  62. package/dist/harness/leaf-invoke.js.map +1 -0
  63. package/dist/harness/library-provenance.d.ts +3 -0
  64. package/dist/harness/library-provenance.d.ts.map +1 -0
  65. package/dist/harness/library-provenance.js +31 -0
  66. package/dist/harness/library-provenance.js.map +1 -0
  67. package/dist/harness/live-adapter-contract.d.ts +32 -0
  68. package/dist/harness/live-adapter-contract.d.ts.map +1 -0
  69. package/dist/harness/live-adapter-contract.js +425 -0
  70. package/dist/harness/live-adapter-contract.js.map +1 -0
  71. package/dist/harness/overlay.d.ts +17 -0
  72. package/dist/harness/overlay.d.ts.map +1 -0
  73. package/dist/harness/overlay.js +415 -0
  74. package/dist/harness/overlay.js.map +1 -0
  75. package/dist/harness/parse-args.d.ts +35 -0
  76. package/dist/harness/parse-args.d.ts.map +1 -0
  77. package/dist/harness/parse-args.js +249 -0
  78. package/dist/harness/parse-args.js.map +1 -0
  79. package/dist/harness/paths.d.ts +15 -0
  80. package/dist/harness/paths.d.ts.map +1 -0
  81. package/dist/harness/paths.js +29 -0
  82. package/dist/harness/paths.js.map +1 -0
  83. package/dist/harness/recording-target.d.ts +9 -0
  84. package/dist/harness/recording-target.d.ts.map +1 -0
  85. package/dist/harness/recording-target.js +39 -0
  86. package/dist/harness/recording-target.js.map +1 -0
  87. package/dist/harness/run-diagnostics.d.ts +139 -0
  88. package/dist/harness/run-diagnostics.d.ts.map +1 -0
  89. package/dist/harness/run-diagnostics.js +458 -0
  90. package/dist/harness/run-diagnostics.js.map +1 -0
  91. package/dist/harness/run-options.d.ts +4 -0
  92. package/dist/harness/run-options.d.ts.map +1 -0
  93. package/dist/harness/run-options.js +35 -0
  94. package/dist/harness/run-options.js.map +1 -0
  95. package/dist/harness/run-recording.d.ts +43 -0
  96. package/dist/harness/run-recording.d.ts.map +1 -0
  97. package/dist/harness/run-recording.js +517 -0
  98. package/dist/harness/run-recording.js.map +1 -0
  99. package/dist/harness/run-report.d.ts +19 -0
  100. package/dist/harness/run-report.d.ts.map +1 -0
  101. package/dist/harness/run-report.js +269 -0
  102. package/dist/harness/run-report.js.map +1 -0
  103. package/dist/harness/runtime-proof.d.ts +27 -0
  104. package/dist/harness/runtime-proof.d.ts.map +1 -0
  105. package/dist/harness/runtime-proof.js +144 -0
  106. package/dist/harness/runtime-proof.js.map +1 -0
  107. package/dist/harness/shared.d.ts +43 -0
  108. package/dist/harness/shared.d.ts.map +1 -0
  109. package/dist/harness/shared.js +414 -0
  110. package/dist/harness/shared.js.map +1 -0
  111. package/dist/harness/suggest.d.ts +3 -0
  112. package/dist/harness/suggest.d.ts.map +1 -0
  113. package/dist/harness/suggest.js +37 -0
  114. package/dist/harness/suggest.js.map +1 -0
  115. package/dist/harness/trust.d.ts +38 -0
  116. package/dist/harness/trust.d.ts.map +1 -0
  117. package/dist/harness/trust.js +89 -0
  118. package/dist/harness/trust.js.map +1 -0
  119. package/package.json +11 -2
@@ -0,0 +1,415 @@
1
+ // install, verify and cleanup of the per-checkout runtime overlay. The command
2
+ // owns the grammar (adapter selection, --json, --quiet, `--` passthrough) and
3
+ // the envelope; the platform's `harness` member owns which leaf or in-process
4
+ // code runs.
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import { adapterDetectNext, detectAdapter, harnessAdapter, harnessAdapters, undetectedAdapterMessage, } from './adapters.js';
8
+ import { colorHumanMessage } from './cli-color.js';
9
+ import { harnessHost } from './host.js';
10
+ import { missingShellLeafMessage, shellLeafMissing } from './leaf-invoke.js';
11
+ import { recipeHarnessPath, recipeRuntimeDir } from './paths.js';
12
+ import { spawnScriptStreaming } from './shared.js';
13
+ const HARNESS_ACTIONS = ['install', 'verify', 'cleanup'];
14
+ function defaultUsage() {
15
+ const { name, product } = harnessHost();
16
+ const adapters = harnessAdapters().list();
17
+ return `${name} — install and validate the ${product} recipe runtime in a checkout.
18
+
19
+ Run it from inside a ${product} checkout; the platform (${adapters.join(' | ')})
20
+ is auto-detected from the repo. Pass --platform only to override.
21
+
22
+ Commands (one copy-pasteable example each):
23
+ install Install the recipe harness runtime overlay into the checkout.
24
+ ${name} install
25
+ verify Check the harness/runtime is present and healthy (no app launch).
26
+ ${name} verify
27
+ cleanup Remove the installed harness overlay and restore the checkout.
28
+ ${name} cleanup
29
+
30
+ Options:
31
+ --platform <${adapters.join('|')}> Override auto-detection (alias: --adapter).
32
+ --target <repo> Checkout to operate on (default: current dir).
33
+ --json Machine-readable summary for agents/scripts.
34
+ -- <args> Forward the rest verbatim to the underlying script.`;
35
+ }
36
+ function failureHint(surface, action) {
37
+ const restart = surface.harness.restart;
38
+ if (!restart) {
39
+ if (action === 'verify') {
40
+ return `Install the ${surface.id} harness first: ${harnessHost().name} install --platform ${surface.id}`;
41
+ }
42
+ return 'Read the error above for the specific cause, then re-run this command.';
43
+ }
44
+ return `Read the error above for the specific cause. To (re)start the runtime, run: ${restart}`;
45
+ }
46
+ function successNext(adapter, action, target) {
47
+ const { name } = harnessHost();
48
+ const base = `--adapter ${adapter} --target ${shellQuote(target)}`;
49
+ if (action === 'install')
50
+ return `${name} verify ${base}`;
51
+ if (action === 'cleanup')
52
+ return `${name} install ${base}`;
53
+ return `${name} status --target ${shellQuote(target)} --json`;
54
+ }
55
+ // has_arg: matches an exact flag or its `flag=value` form.
56
+ export function hasArg(args, needle) {
57
+ return args.some((arg) => arg === needle || arg.startsWith(`${needle}=`));
58
+ }
59
+ // arg_value: value for `flag value` or `flag=value`, else undefined.
60
+ export function argValue(args, needle) {
61
+ for (let i = 0; i < args.length; i += 1) {
62
+ if (args[i] === needle)
63
+ return args[i + 1];
64
+ if (args[i].startsWith(`${needle}=`))
65
+ return args[i].slice(needle.length + 1);
66
+ }
67
+ return undefined;
68
+ }
69
+ function shellQuote(value) {
70
+ return /^[A-Za-z0-9_./:=@+-]+$/u.test(value) ? value : `'${value.replace(/'/gu, `'\\''`)}'`;
71
+ }
72
+ function isAdapter(value) {
73
+ return value !== undefined && harnessAdapters().has(value);
74
+ }
75
+ // Split the adapter selector and --json out of the remaining argv so they are not
76
+ // forwarded to the platform's leaf (leaves reject unknown flags, and a platform
77
+ // may take --platform itself, so only the first --platform whose value is an
78
+ // adapter is consumed here and a later one is passed through). `--` forces
79
+ // everything after it to passthrough.
80
+ function parseHarnessArgs(args) {
81
+ const forward = [];
82
+ let adapter;
83
+ let json = false;
84
+ let quiet = false;
85
+ let separator = false;
86
+ for (let i = 0; i < args.length; i += 1) {
87
+ const arg = args[i];
88
+ // POSIX: everything after `--` is literal; check separator FIRST so that
89
+ // --json appearing after `--` is forwarded verbatim to the delegate.
90
+ if (separator) {
91
+ forward.push(arg);
92
+ continue;
93
+ }
94
+ if (arg === '--') {
95
+ separator = true;
96
+ continue;
97
+ }
98
+ if (arg === '--json') {
99
+ json = true;
100
+ continue;
101
+ }
102
+ if (arg === '--quiet') {
103
+ quiet = true;
104
+ continue;
105
+ }
106
+ if (arg === '--adapter' || arg === '--platform') {
107
+ const value = args[i + 1];
108
+ if (arg === '--adapter') {
109
+ adapter = value;
110
+ i += 1;
111
+ continue;
112
+ }
113
+ if (adapter === undefined && isAdapter(value)) {
114
+ adapter = value;
115
+ i += 1;
116
+ continue;
117
+ }
118
+ forward.push(arg);
119
+ continue;
120
+ }
121
+ if (arg.startsWith('--adapter=')) {
122
+ adapter = arg.slice('--adapter='.length);
123
+ continue;
124
+ }
125
+ if (arg.startsWith('--platform=')) {
126
+ const value = arg.slice('--platform='.length);
127
+ if (adapter === undefined && isAdapter(value)) {
128
+ adapter = value;
129
+ continue;
130
+ }
131
+ forward.push(arg);
132
+ continue;
133
+ }
134
+ forward.push(arg);
135
+ }
136
+ return { adapter, json, quiet, forward };
137
+ }
138
+ // Resolve the agentic-runtime.json path for a checkout: the RECIPE_RUNTIME_CONTEXT
139
+ // override wins, else the per-checkout runtime dir. Single source shared by
140
+ // platform pre-dispatch hydration and doctor's runtime-context report.
141
+ export function resolveRuntimeContextPath(target) {
142
+ return (process.env.RECIPE_RUNTIME_CONTEXT ??
143
+ path.join(target, recipeRuntimeDir(), 'agentic-runtime.json'));
144
+ }
145
+ // read_runtime_context_field: dotted lookup returning the value only when it is a
146
+ // present, non-empty scalar; undefined when the file/field is missing.
147
+ export function readRuntimeContextField(contextPath, field) {
148
+ let data;
149
+ try {
150
+ data = JSON.parse(fs.readFileSync(contextPath, 'utf8'));
151
+ }
152
+ catch {
153
+ return undefined;
154
+ }
155
+ let node = data;
156
+ for (const key of field.split('.')) {
157
+ if (node === undefined || node === null || typeof node !== 'object')
158
+ return undefined;
159
+ node = node[key];
160
+ }
161
+ if (node === undefined || node === null || node === '')
162
+ return undefined;
163
+ return String(node);
164
+ }
165
+ // runner_executable_entry / runner_file_entry: first candidate that exists (as an
166
+ // executable, or as any file) wins; otherwise the first candidate is returned so
167
+ // the exec error names it.
168
+ function resolveEntry(base, candidates, mode) {
169
+ for (const candidate of candidates) {
170
+ const full = path.resolve(base, candidate);
171
+ try {
172
+ const stat = fs.statSync(full);
173
+ if (!stat.isFile())
174
+ continue;
175
+ if (mode === 'file' || (stat.mode & 0o111) !== 0)
176
+ return full;
177
+ }
178
+ catch {
179
+ // missing candidate; try the next one
180
+ }
181
+ }
182
+ return path.resolve(base, candidates[0]);
183
+ }
184
+ // Content of an installed overlay's runner source pointer, if present. Command
185
+ // substitution in the skill stripped trailing newlines, so trim here too.
186
+ // Validates the path exists so stale stamps (e.g. from a renamed package dir)
187
+ // fall back to the host package root rather than producing ENOENT at cleanup.
188
+ function installedRunnerSource(target, adapter) {
189
+ const pointer = path.join(recipeHarnessPath(target, adapter), 'runner', '.runner-source');
190
+ if (!fs.existsSync(pointer))
191
+ return undefined;
192
+ const value = fs.readFileSync(pointer, 'utf8').trim();
193
+ if (!value || !fs.existsSync(value))
194
+ return undefined;
195
+ return value;
196
+ }
197
+ // Resolve the exact command + fixed prefix args to exec, mirroring
198
+ // recipe-harness.sh dispatch_adapter_action. forwardArgs are appended by the
199
+ // caller. install and cleanup run the platform's leaf (entry, then fallback);
200
+ // verify is whatever the platform dispatches: a leaf, a delegate, runner-owned
201
+ // code in this process, or an error to report.
202
+ function resolveHarnessDispatch(surface, action, target) {
203
+ if (action === 'verify')
204
+ return surface.harness.verify(target);
205
+ const leaf = action === 'install' ? surface.harness.install : surface.harness.cleanup;
206
+ const { packageRoot } = harnessHost();
207
+ const base = action === 'cleanup' && surface.harness.cleanup.fromInstalledRunner
208
+ ? (installedRunnerSource(target, surface.id) ?? packageRoot)
209
+ : packageRoot;
210
+ const entry = resolveEntry(base, [leaf.entry, leaf.fallback], 'file');
211
+ // Shell leaves are invoked through bash; file existence is the only requirement.
212
+ return leaf.node
213
+ ? { command: process.execPath, prefixArgs: [entry] }
214
+ : { command: entry, prefixArgs: [] };
215
+ }
216
+ export async function handleHarness(argv, commandOptions = {}) {
217
+ const printUsage = () => console.error(commandOptions.usage ?? defaultUsage());
218
+ const action = argv[0];
219
+ if (!action || action === '-h' || action === '--help') {
220
+ printUsage();
221
+ return action ? 0 : 2;
222
+ }
223
+ if (!HARNESS_ACTIONS.includes(action)) {
224
+ printUsage();
225
+ console.error(`unsupported harness subcommand: ${action}`);
226
+ return 2;
227
+ }
228
+ const harnessAction = action;
229
+ const { adapter: parsedAdapter, json, quiet, forward } = parseHarnessArgs(argv.slice(1));
230
+ const rawTarget = argValue(forward, '--target');
231
+ const target = path.resolve(rawTarget ?? process.cwd());
232
+ const adapter = parsedAdapter ?? detectAdapter(target);
233
+ // isAdapter() narrows adapter to a registered id for all code below.
234
+ if (!adapter || !isAdapter(adapter)) {
235
+ if (quiet) {
236
+ return 2;
237
+ }
238
+ else if (json) {
239
+ // parsedAdapter is string|undefined here; not yet validated as a real
240
+ // adapter, so pass undefined rather than forwarding a garbage string.
241
+ const detectError = adapter
242
+ ? {
243
+ code: 'UNSUPPORTED_PLATFORM',
244
+ message: `unsupported platform: ${adapter}`,
245
+ userAction: `pass --adapter <${harnessAdapters().list().join('|')}> to specify a supported adapter`,
246
+ }
247
+ : {
248
+ code: 'ADAPTER_DETECTION_FAILED',
249
+ message: undetectedAdapterMessage(target),
250
+ userAction: adapterDetectNext(),
251
+ };
252
+ console.log(harnessSummary(harnessAction, undefined, target, 'fail', 2, false, detectError));
253
+ }
254
+ else {
255
+ printUsage();
256
+ console.error(adapter
257
+ ? `\n✗ unsupported platform: ${adapter}`
258
+ : `\n✗ ${undetectedAdapterMessage(target)}\n Next: ${adapterDetectNext()}`);
259
+ }
260
+ return 2;
261
+ }
262
+ const autoDetected = parsedAdapter === undefined;
263
+ // Forward args carry --target so the orchestration script resolves the same
264
+ // checkout; inject the resolved path only when the caller omitted it.
265
+ let forwardArgs = hasArg(forward, '--target') ? [...forward] : ['--target', target, ...forward];
266
+ if (harnessAction === 'install' && commandOptions.install) {
267
+ const handled = commandOptions.install({ adapter, target, forward, json });
268
+ if (handled !== undefined)
269
+ return handled;
270
+ }
271
+ const surface = harnessAdapter(adapter);
272
+ if (harnessAction === 'verify' && surface.harness.verifyArgs) {
273
+ forwardArgs = surface.harness.verifyArgs(target, forwardArgs);
274
+ }
275
+ const dispatch = resolveHarnessDispatch(surface, harnessAction, target);
276
+ if ('error' in dispatch) {
277
+ if (quiet) {
278
+ return 1;
279
+ }
280
+ else if (json) {
281
+ console.log(harnessSummary(harnessAction, adapter, target, 'fail', 1, autoDetected, {
282
+ code: 'DISPATCH_UNAVAILABLE',
283
+ message: dispatch.error,
284
+ // The dispatch error embeds "Next: <hint>" — extract it so --json consumers
285
+ // get a clean programmatic escape without parsing the human message.
286
+ userAction: dispatch.error.split('\nNext: ')[1] ??
287
+ `run ${harnessHost().name} install to complete setup, then retry`,
288
+ }));
289
+ }
290
+ else {
291
+ console.error(`✗ ${harnessAction} ${adapter} failed\n ${dispatch.error.replace(/\n/gu, '\n ')}`);
292
+ }
293
+ return 1;
294
+ }
295
+ if (!json && !quiet) {
296
+ const detected = autoDetected ? ', auto-detected' : '';
297
+ console.error(colorHumanMessage(`→ ${harnessAction} (${adapter}${detected}) — target: ${target}`));
298
+ }
299
+ const start = Date.now();
300
+ if ('inProcess' in dispatch) {
301
+ const runVerify = await dispatch.inProcess();
302
+ // --json keeps stdout for the summary alone, so the in-process report goes
303
+ // to stderr exactly where a spawned leaf's stdout would have been routed.
304
+ let exitCode;
305
+ try {
306
+ exitCode = await runVerify(forwardArgs, {
307
+ out: quiet
308
+ ? () => { }
309
+ : (line) => {
310
+ (json ? process.stderr : process.stdout).write(`${line}\n`);
311
+ },
312
+ err: quiet
313
+ ? () => { }
314
+ : (line) => {
315
+ process.stderr.write(`${line}\n`);
316
+ },
317
+ });
318
+ }
319
+ catch (error) {
320
+ // A spawned leaf could only exit non-zero; in-process code can throw. The
321
+ // envelope contract (one JSON document on stdout, HARNESS_FAILED) holds
322
+ // either way, and the cause goes where the leaf's stderr went.
323
+ if (!quiet)
324
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
325
+ exitCode = 1;
326
+ }
327
+ return reportHarnessOutcome(harnessAction, surface, target, exitCode, autoDetected, json, quiet, start);
328
+ }
329
+ // Shell leaves need bash invocation; bash exits 127 (not ENOENT) for missing files.
330
+ if (shellLeafMissing(dispatch.command)) {
331
+ const message = missingShellLeafMessage(dispatch.command);
332
+ if (quiet) {
333
+ return 1;
334
+ }
335
+ else if (json) {
336
+ console.log(harnessSummary(harnessAction, adapter, target, 'fail', 1, autoDetected, {
337
+ code: 'HARNESS_SPAWN_FAILED',
338
+ message,
339
+ userAction: failureHint(surface, harnessAction),
340
+ }));
341
+ }
342
+ else {
343
+ console.error(`✗ ${message}`);
344
+ }
345
+ return 1;
346
+ }
347
+ const result = await spawnScriptStreaming(dispatch.command, [...dispatch.prefixArgs, ...forwardArgs], target, {
348
+ forward: quiet ? 'none' : json ? 'stderr' : 'original',
349
+ stdin: quiet ? 'ignore' : 'inherit',
350
+ capture: false,
351
+ });
352
+ if (result.error) {
353
+ if (quiet) {
354
+ return 1;
355
+ }
356
+ else if (json) {
357
+ console.log(harnessSummary(harnessAction, adapter, target, 'fail', 1, autoDetected, {
358
+ code: 'HARNESS_SPAWN_FAILED',
359
+ message: `${harnessAction} ${adapter} could not start: ${result.error.message}`,
360
+ userAction: failureHint(surface, harnessAction),
361
+ }));
362
+ }
363
+ else {
364
+ console.error(`✗ ${harnessAction} ${adapter} could not start: ${result.error.message}\n ${failureHint(surface, harnessAction)}`);
365
+ }
366
+ return 1;
367
+ }
368
+ return reportHarnessOutcome(harnessAction, surface, target, result.status ?? 1, autoDetected, json, quiet, start);
369
+ }
370
+ // One outcome report for both execution paths (spawned leaf and in-process
371
+ // adapter code) so their --json envelope and human lines cannot drift.
372
+ function reportHarnessOutcome(action, surface, target, exitCode, autoDetected, json, quiet, start) {
373
+ const seconds = ((Date.now() - start) / 1000).toFixed(1);
374
+ const adapter = surface.id;
375
+ if (quiet) {
376
+ return exitCode;
377
+ }
378
+ else if (json) {
379
+ console.log(harnessSummary(action, adapter, target, exitCode === 0 ? 'pass' : 'fail', exitCode, autoDetected, exitCode === 0
380
+ ? undefined
381
+ : {
382
+ code: 'HARNESS_FAILED',
383
+ message: `${action} ${adapter} failed (exit ${exitCode})`,
384
+ userAction: failureHint(surface, action),
385
+ }));
386
+ }
387
+ else if (exitCode === 0) {
388
+ console.error(colorHumanMessage(`✓ ${action} ${adapter} passed (${seconds}s)\n Next: ${successNext(adapter, action, target)}`));
389
+ }
390
+ else {
391
+ console.error(colorHumanMessage(`✗ ${action} ${adapter} failed (exit ${exitCode}, ${seconds}s)\n ${failureHint(surface, action)}`));
392
+ }
393
+ return exitCode;
394
+ }
395
+ // userAction is required whenever an error object is present so every --json
396
+ // failure carries a machine-readable escape path — parallel to the `usageOut`
397
+ // enforcement on the CLI layer. Omitting userAction is a compile-time error.
398
+ function harnessSummary(action, adapter, target, status, exitCode, autoDetected, error) {
399
+ return JSON.stringify({
400
+ schemaVersion: 1,
401
+ command: 'harness',
402
+ action,
403
+ adapter: adapter ?? null,
404
+ target,
405
+ autoDetected,
406
+ status,
407
+ exitCode,
408
+ // Error contract: every --json failure carries a stable machine code + human
409
+ // message. userAction is included when present so callers
410
+ // can surface the reachable escape without parsing the human message.
411
+ ...(status === 'fail' && error ? { error } : {}),
412
+ ...(status === 'pass' && adapter ? { next: successNext(adapter, action, target) } : {}),
413
+ });
414
+ }
415
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/harness/overlay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export type CliOptionValue = string | boolean | readonly string[];
2
+ export type CliOptions = Record<string, CliOptionValue>;
3
+ export interface ParsedArgs {
4
+ positional: string[];
5
+ options: CliOptions;
6
+ rawArgv: string[];
7
+ }
8
+ export declare class CliError extends Error {
9
+ readonly exitCode: number;
10
+ constructor(message: string, exitCode: number);
11
+ }
12
+ export declare function usageError(message: string): CliError;
13
+ export interface ParseArgsOptions {
14
+ recordIsFlag?: boolean;
15
+ }
16
+ export declare function parseArgs(argv: string[], parse?: ParseArgsOptions): ParsedArgs;
17
+ export declare function parseRecipeParamAssignments(values: readonly string[]): Record<string, unknown>;
18
+ export declare function optionString(options: CliOptions, key: string): string | undefined;
19
+ export declare function optionStrings(options: CliOptions, key: string): readonly string[] | undefined;
20
+ export declare function optionFlag(options: CliOptions, key: string): boolean;
21
+ export declare function applyRuntimeDirOption(options: CliOptions): void;
22
+ export declare function applyWatcherPortOption(options: CliOptions): void;
23
+ export declare function requiredOption(options: CliOptions, key: string, message: string): string;
24
+ export declare function adapterOption(options: CliOptions): string;
25
+ export declare function targetPath(options: CliOptions): string;
26
+ export declare function actionManifestPathOption(options: CliOptions, adapter: string): string;
27
+ export declare function parsePort(value: string | undefined, errorMessage: string): number;
28
+ export declare function resolveAdapter(options: CliOptions): {
29
+ adapter: string;
30
+ target: string;
31
+ };
32
+ export declare function shellQuote(value: string): string;
33
+ export declare function shellQuoteArg(value: string): string;
34
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
35
+ //# sourceMappingURL=parse-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../src/harness/parse-args.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAOD,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAK9C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAEpD;AAED,MAAM,WAAW,gBAAgB;IAE/B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,gBAAqB,GAAG,UAAU,CAoElF;AAqBD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2B9F;AAoBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKjF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAO7F;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAGpE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAG/D;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAMhE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIxF;AASD,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAQzD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAEtD;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAIjF;AAKD,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAcvF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}