@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.
- package/CHANGELOG.md +20 -0
- package/README.md +13 -9
- package/dist/harness/adapters.d.ts +27 -0
- package/dist/harness/adapters.d.ts.map +1 -0
- package/dist/harness/adapters.js +91 -0
- package/dist/harness/adapters.js.map +1 -0
- package/dist/harness/artifact-files.d.ts +11 -0
- package/dist/harness/artifact-files.d.ts.map +1 -0
- package/dist/harness/artifact-files.js +75 -0
- package/dist/harness/artifact-files.js.map +1 -0
- package/dist/harness/checkout-lock.d.ts +13 -0
- package/dist/harness/checkout-lock.d.ts.map +1 -0
- package/dist/harness/checkout-lock.js +211 -0
- package/dist/harness/checkout-lock.js.map +1 -0
- package/dist/harness/cli-color.d.ts +25 -0
- package/dist/harness/cli-color.d.ts.map +1 -0
- package/dist/harness/cli-color.js +101 -0
- package/dist/harness/cli-color.js.map +1 -0
- package/dist/harness/command-journal.d.ts +25 -0
- package/dist/harness/command-journal.d.ts.map +1 -0
- package/dist/harness/command-journal.js +322 -0
- package/dist/harness/command-journal.js.map +1 -0
- package/dist/harness/commands/last.d.ts +3 -0
- package/dist/harness/commands/last.d.ts.map +1 -0
- package/dist/harness/commands/last.js +59 -0
- package/dist/harness/commands/last.js.map +1 -0
- package/dist/harness/commands/launch.d.ts +2 -0
- package/dist/harness/commands/launch.d.ts.map +1 -0
- package/dist/harness/commands/launch.js +105 -0
- package/dist/harness/commands/launch.js.map +1 -0
- package/dist/harness/commands/reload.d.ts +2 -0
- package/dist/harness/commands/reload.d.ts.map +1 -0
- package/dist/harness/commands/reload.js +24 -0
- package/dist/harness/commands/reload.js.map +1 -0
- package/dist/harness/commands/stop.d.ts +9 -0
- package/dist/harness/commands/stop.d.ts.map +1 -0
- package/dist/harness/commands/stop.js +60 -0
- package/dist/harness/commands/stop.js.map +1 -0
- package/dist/harness/execution-provenance.d.ts +56 -0
- package/dist/harness/execution-provenance.d.ts.map +1 -0
- package/dist/harness/execution-provenance.js +308 -0
- package/dist/harness/execution-provenance.js.map +1 -0
- package/dist/harness/heal-bounds.d.ts +15 -0
- package/dist/harness/heal-bounds.d.ts.map +1 -0
- package/dist/harness/heal-bounds.js +194 -0
- package/dist/harness/heal-bounds.js.map +1 -0
- package/dist/harness/host.d.ts +45 -0
- package/dist/harness/host.d.ts.map +1 -0
- package/dist/harness/host.js +55 -0
- package/dist/harness/host.js.map +1 -0
- package/dist/harness/index.d.ts +29 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +32 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/json-stream.d.ts +19 -0
- package/dist/harness/json-stream.d.ts.map +1 -0
- package/dist/harness/json-stream.js +59 -0
- package/dist/harness/json-stream.js.map +1 -0
- package/dist/harness/leaf-invoke.d.ts +8 -0
- package/dist/harness/leaf-invoke.d.ts.map +1 -0
- package/dist/harness/leaf-invoke.js +31 -0
- package/dist/harness/leaf-invoke.js.map +1 -0
- package/dist/harness/library-provenance.d.ts +3 -0
- package/dist/harness/library-provenance.d.ts.map +1 -0
- package/dist/harness/library-provenance.js +31 -0
- package/dist/harness/library-provenance.js.map +1 -0
- package/dist/harness/live-adapter-contract.d.ts +32 -0
- package/dist/harness/live-adapter-contract.d.ts.map +1 -0
- package/dist/harness/live-adapter-contract.js +425 -0
- package/dist/harness/live-adapter-contract.js.map +1 -0
- package/dist/harness/overlay.d.ts +17 -0
- package/dist/harness/overlay.d.ts.map +1 -0
- package/dist/harness/overlay.js +415 -0
- package/dist/harness/overlay.js.map +1 -0
- package/dist/harness/parse-args.d.ts +35 -0
- package/dist/harness/parse-args.d.ts.map +1 -0
- package/dist/harness/parse-args.js +249 -0
- package/dist/harness/parse-args.js.map +1 -0
- package/dist/harness/paths.d.ts +15 -0
- package/dist/harness/paths.d.ts.map +1 -0
- package/dist/harness/paths.js +29 -0
- package/dist/harness/paths.js.map +1 -0
- package/dist/harness/recording-target.d.ts +9 -0
- package/dist/harness/recording-target.d.ts.map +1 -0
- package/dist/harness/recording-target.js +39 -0
- package/dist/harness/recording-target.js.map +1 -0
- package/dist/harness/run-diagnostics.d.ts +139 -0
- package/dist/harness/run-diagnostics.d.ts.map +1 -0
- package/dist/harness/run-diagnostics.js +458 -0
- package/dist/harness/run-diagnostics.js.map +1 -0
- package/dist/harness/run-options.d.ts +4 -0
- package/dist/harness/run-options.d.ts.map +1 -0
- package/dist/harness/run-options.js +35 -0
- package/dist/harness/run-options.js.map +1 -0
- package/dist/harness/run-recording.d.ts +43 -0
- package/dist/harness/run-recording.d.ts.map +1 -0
- package/dist/harness/run-recording.js +517 -0
- package/dist/harness/run-recording.js.map +1 -0
- package/dist/harness/run-report.d.ts +19 -0
- package/dist/harness/run-report.d.ts.map +1 -0
- package/dist/harness/run-report.js +269 -0
- package/dist/harness/run-report.js.map +1 -0
- package/dist/harness/runtime-proof.d.ts +27 -0
- package/dist/harness/runtime-proof.d.ts.map +1 -0
- package/dist/harness/runtime-proof.js +144 -0
- package/dist/harness/runtime-proof.js.map +1 -0
- package/dist/harness/shared.d.ts +43 -0
- package/dist/harness/shared.d.ts.map +1 -0
- package/dist/harness/shared.js +414 -0
- package/dist/harness/shared.js.map +1 -0
- package/dist/harness/suggest.d.ts +3 -0
- package/dist/harness/suggest.d.ts.map +1 -0
- package/dist/harness/suggest.js +37 -0
- package/dist/harness/suggest.js.map +1 -0
- package/dist/harness/trust.d.ts +38 -0
- package/dist/harness/trust.d.ts.map +1 -0
- package/dist/harness/trust.js +89 -0
- package/dist/harness/trust.js.map +1 -0
- 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":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,8EAA8E;AAC9E,aAAa;AAEb,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,eAAe,EACf,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAoBnD,MAAM,eAAe,GAA6B,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEnF,SAAS,YAAY;IACnB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,GAAG,IAAI,+BAA+B,OAAO;;uBAE/B,OAAO,4BAA4B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;;;;gBAK9D,IAAI;;gBAEJ,IAAI;;gBAEJ,IAAI;;;gBAGJ,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;;;2FAGyD,CAAC;AAC5F,CAAC;AAED,SAAS,WAAW,CAAC,OAAwB,EAAE,MAAqB;IAClE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO,eAAe,OAAO,CAAC,EAAE,mBAAmB,WAAW,EAAE,CAAC,IAAI,uBAAuB,OAAO,CAAC,EAAE,EAAE,CAAC;QAC3G,CAAC;QACD,OAAO,wEAAwE,CAAC;IAClF,CAAC;IACD,OAAO,+EAA+E,OAAO,EAAE,CAAC;AAClG,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,MAAqB,EAAE,MAAc;IACzE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,aAAa,OAAO,aAAa,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IACnE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,IAAI,WAAW,IAAI,EAAE,CAAC;IAC1D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,IAAI,YAAY,IAAI,EAAE,CAAC;IAC3D,OAAO,GAAG,IAAI,oBAAoB,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC;AAChE,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,MAAc;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,QAAQ,CAAC,IAAc,EAAE,MAAc;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC;AAC9F,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB;IAC1C,OAAO,KAAK,KAAK,SAAS,IAAI,eAAe,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAWD,kFAAkF;AAClF,gFAAgF;AAChF,6EAA6E;AAC7E,2EAA2E;AAC3E,sCAAsC;AACtC,SAAS,gBAAgB,CAAC,IAAc;IACtC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAA2B,CAAC;IAChC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,yEAAyE;QACzE,qEAAqE;QACrE,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,IAAI,GAAG,IAAI,CAAC;YACZ,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,IAAI,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;gBACxB,OAAO,GAAG,KAAK,CAAC;gBAChB,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,OAAO,GAAG,KAAK,CAAC;gBAChB,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACzC,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,OAAO,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,OAAO,GAAG,KAAK,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC;AAED,mFAAmF;AACnF,4EAA4E;AAC5E,uEAAuE;AACvE,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,sBAAsB,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CAAC,WAAmB,EAAE,KAAa;IACxE,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,GAAY,IAAI,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACtF,IAAI,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACzE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,kFAAkF;AAClF,iFAAiF;AACjF,2BAA2B;AAC3B,SAAS,YAAY,CAAC,IAAY,EAAE,UAAoB,EAAE,IAAqB;IAC7E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC7B,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,+EAA+E;AAC/E,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,SAAS,qBAAqB,CAAC,MAAc,EAAE,OAAe;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC1F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mEAAmE;AACnE,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,+CAA+C;AAC/C,SAAS,sBAAsB,CAC7B,OAAwB,EACxB,MAAqB,EACrB,MAAc;IAEd,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;IACtF,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC;IACtC,MAAM,IAAI,GACR,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB;QACjE,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC;QAC5D,CAAC,CAAC,WAAW,CAAC;IAClB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IACtE,iFAAiF;IACjF,OAAO,IAAI,CAAC,IAAI;QACd,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE;QACpD,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAc,EACd,iBAAwC,EAAE;IAE1C,MAAM,UAAU,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,IAAI,YAAY,EAAE,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtD,UAAU,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAuB,CAAC,EAAE,CAAC;QACvD,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,aAAa,GAAG,MAAuB,CAAC;IAE9C,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IACvD,qEAAqE;IACrE,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,sEAAsE;YACtE,sEAAsE;YACtE,MAAM,WAAW,GAAG,OAAO;gBACzB,CAAC,CAAC;oBACE,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,yBAAyB,OAAO,EAAE;oBAC3C,UAAU,EAAE,mBAAmB,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,kCAAkC;iBACpG;gBACH,CAAC,CAAC;oBACE,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC;oBACzC,UAAU,EAAE,iBAAiB,EAAE;iBAChC,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,OAAO;gBACL,CAAC,CAAC,6BAA6B,OAAO,EAAE;gBACxC,CAAC,CAAC,OAAO,wBAAwB,CAAC,MAAM,CAAC,aAAa,iBAAiB,EAAE,EAAE,CAC9E,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,YAAY,GAAG,aAAa,KAAK,SAAS,CAAC;IAEjD,4EAA4E;IAC5E,sEAAsE;IACtE,IAAI,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;IAEhG,IAAI,aAAa,KAAK,SAAS,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;QAC1D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC;IAC5C,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,aAAa,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7D,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QACxB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE;gBACtE,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,QAAQ,CAAC,KAAK;gBACvB,4EAA4E;gBAC5E,qEAAqE;gBACrE,UAAU,EACR,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBACnC,OAAO,WAAW,EAAE,CAAC,IAAI,wCAAwC;aACpE,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CACX,KAAK,aAAa,IAAI,OAAO,cAAc,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CACpF,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,KAAK,CACX,iBAAiB,CAAC,KAAK,aAAa,KAAK,OAAO,GAAG,QAAQ,eAAe,MAAM,EAAE,CAAC,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,IAAI,WAAW,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC7C,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE;gBACtC,GAAG,EAAE,KAAK;oBACR,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC;oBACV,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;wBACP,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;oBAC9D,CAAC;gBACL,GAAG,EAAE,KAAK;oBACR,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC;oBACV,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;wBACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;oBACpC,CAAC;aACN,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,wEAAwE;YACxE,+DAA+D;YAC/D,IAAI,CAAC,KAAK;gBACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtF,QAAQ,GAAG,CAAC,CAAC;QACf,CAAC;QACD,OAAO,oBAAoB,CACzB,aAAa,EACb,OAAO,EACP,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,KAAK,CACN,CAAC;IACJ,CAAC;IAED,oFAAoF;IACpF,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE;gBACtE,IAAI,EAAE,sBAAsB;gBAC5B,OAAO;gBACP,UAAU,EAAE,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC;aAChD,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,QAAQ,CAAC,OAAO,EAChB,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,WAAW,CAAC,EACxC,MAAM,EACN;QACE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;QACtD,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACnC,OAAO,EAAE,KAAK;KACf,CACF,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE;gBACtE,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,GAAG,aAAa,IAAI,OAAO,qBAAqB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC/E,UAAU,EAAE,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC;aAChD,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CACX,KAAK,aAAa,IAAI,OAAO,qBAAqB,MAAM,CAAC,KAAK,CAAC,OAAO,OAAO,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CACnH,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,oBAAoB,CACzB,aAAa,EACb,OAAO,EACP,MAAM,EACN,MAAM,CAAC,MAAM,IAAI,CAAC,EAClB,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,KAAK,CACN,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,uEAAuE;AACvE,SAAS,oBAAoB,CAC3B,MAAqB,EACrB,OAAwB,EACxB,MAAc,EACd,QAAgB,EAChB,YAAqB,EACrB,IAAa,EACb,KAAc,EACd,KAAa;IAEb,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;IAC3B,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,QAAQ,CAAC;IAClB,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,cAAc,CACZ,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAChC,QAAQ,EACR,YAAY,EACZ,QAAQ,KAAK,CAAC;YACZ,CAAC,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,GAAG,MAAM,IAAI,OAAO,iBAAiB,QAAQ,GAAG;gBACzD,UAAU,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;aACzC,CACN,CACF,CAAC;IACJ,CAAC;SAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CACX,iBAAiB,CACf,KAAK,MAAM,IAAI,OAAO,YAAY,OAAO,eAAe,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAC/F,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CACX,iBAAiB,CACf,KAAK,MAAM,IAAI,OAAO,iBAAiB,QAAQ,KAAK,OAAO,SAAS,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CACnG,CACF,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,SAAS,cAAc,CACrB,MAAqB,EACrB,OAA2B,EAC3B,MAAc,EACd,MAAuB,EACvB,QAAgB,EAChB,YAAqB,EACrB,KAA6D;IAE7D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,SAAS;QAClB,MAAM;QACN,OAAO,EAAE,OAAO,IAAI,IAAI;QACxB,MAAM;QACN,YAAY;QACZ,MAAM;QACN,QAAQ;QACR,6EAA6E;QAC7E,0DAA0D;QAC1D,sEAAsE;QACtE,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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"}
|