@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,249 @@
|
|
|
1
|
+
// Shared argv/option parsing for dispatch-backed commands: positionals,
|
|
2
|
+
// camelCased options, repeatable `--library`, and the typed usage error.
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { adapterDetectNext, adapterFlags, adapterForPlatform, adapterPortEnv, assertAdapter, detectAdapter, harnessAdapter, undetectedAdapterMessage, } from './adapters.js';
|
|
5
|
+
import { EXIT } from './shared.js';
|
|
6
|
+
// Typed exit-code error: carries exitCode so both the global catch (the host bin)
|
|
7
|
+
// and the host's delegate() wrapper classify the error correctly rather than always
|
|
8
|
+
// returning 1. Usage errors (bad args / unsupported flags) carry EXIT.usage (2);
|
|
9
|
+
// validation errors carry EXIT.validation (5). Never throw a plain new Error() for
|
|
10
|
+
// user-facing bad-args cases — use usageError() so the exit code is preserved.
|
|
11
|
+
export class CliError extends Error {
|
|
12
|
+
constructor(message, exitCode) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'CliError';
|
|
15
|
+
this.exitCode = exitCode;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function usageError(message) {
|
|
19
|
+
return new CliError(message, EXIT.usage);
|
|
20
|
+
}
|
|
21
|
+
export function parseArgs(argv, parse = {}) {
|
|
22
|
+
const positional = [];
|
|
23
|
+
const options = {};
|
|
24
|
+
const booleanOptions = new Set([
|
|
25
|
+
'json',
|
|
26
|
+
'jsonStream',
|
|
27
|
+
'resetProfile',
|
|
28
|
+
'preserveProfile',
|
|
29
|
+
'record',
|
|
30
|
+
'plan',
|
|
31
|
+
'proof',
|
|
32
|
+
'list',
|
|
33
|
+
'describe',
|
|
34
|
+
'raw',
|
|
35
|
+
'matrix',
|
|
36
|
+
'categories',
|
|
37
|
+
'fix',
|
|
38
|
+
'force',
|
|
39
|
+
'expectLive',
|
|
40
|
+
'printReady',
|
|
41
|
+
'fast',
|
|
42
|
+
'allDevices',
|
|
43
|
+
'watch',
|
|
44
|
+
'help',
|
|
45
|
+
'noOpen',
|
|
46
|
+
...adapterFlags('commands'),
|
|
47
|
+
]);
|
|
48
|
+
const repeatableOptions = new Set(['library']);
|
|
49
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
50
|
+
const arg = argv[i];
|
|
51
|
+
if (!arg.startsWith('--')) {
|
|
52
|
+
positional.push(arg);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const body = arg.slice(2);
|
|
56
|
+
const equalsIndex = body.indexOf('=');
|
|
57
|
+
const rawKey = equalsIndex === -1 ? body : body.slice(0, equalsIndex);
|
|
58
|
+
const inlineValue = equalsIndex === -1 ? undefined : body.slice(equalsIndex + 1);
|
|
59
|
+
const key = normalizeOptionKey(rawKey);
|
|
60
|
+
if (key === 'recordVideo') {
|
|
61
|
+
options.recordVideo = parseRecordVideoMode(inlineValue);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (key === 'recordBaseline') {
|
|
65
|
+
options.record = true;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (key === 'record') {
|
|
69
|
+
if (parse.recordIsFlag) {
|
|
70
|
+
options.record = true;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
options.recordVideo = 'full-run';
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (booleanOptions.has(key)) {
|
|
77
|
+
options[key] = true;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (inlineValue !== undefined) {
|
|
81
|
+
assignOption(options, key, inlineValue, repeatableOptions);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (i + 1 >= argv.length)
|
|
85
|
+
throw usageError(`Missing value for ${arg}`);
|
|
86
|
+
assignOption(options, key, argv[i + 1], repeatableOptions);
|
|
87
|
+
i += 1;
|
|
88
|
+
}
|
|
89
|
+
return { positional, options, rawArgv: [...argv] };
|
|
90
|
+
}
|
|
91
|
+
function assignOption(options, key, value, repeatableOptions) {
|
|
92
|
+
if (!repeatableOptions.has(key)) {
|
|
93
|
+
options[key] = value;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const existing = options[key];
|
|
97
|
+
if (existing === undefined) {
|
|
98
|
+
options[key] = [value];
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (!Array.isArray(existing))
|
|
102
|
+
throw usageError(`--${key} has conflicting values.`);
|
|
103
|
+
options[key] = [...existing, value];
|
|
104
|
+
}
|
|
105
|
+
export function parseRecipeParamAssignments(values) {
|
|
106
|
+
const params = {};
|
|
107
|
+
for (const assignment of values) {
|
|
108
|
+
const separator = assignment.indexOf('=');
|
|
109
|
+
if (separator <= 0) {
|
|
110
|
+
throw usageError(`recipe parameter ${JSON.stringify(assignment)} must use key=value.`);
|
|
111
|
+
}
|
|
112
|
+
const key = assignment.slice(0, separator).trim();
|
|
113
|
+
if (!key)
|
|
114
|
+
throw usageError(`recipe parameter ${JSON.stringify(assignment)} has an empty key.`);
|
|
115
|
+
if (Object.hasOwn(params, key)) {
|
|
116
|
+
throw usageError(`recipe parameter ${JSON.stringify(key)} was provided more than once.`);
|
|
117
|
+
}
|
|
118
|
+
const raw = assignment.slice(separator + 1);
|
|
119
|
+
let value;
|
|
120
|
+
try {
|
|
121
|
+
value = JSON.parse(raw);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
value = raw;
|
|
125
|
+
}
|
|
126
|
+
Object.defineProperty(params, key, {
|
|
127
|
+
value,
|
|
128
|
+
enumerable: true,
|
|
129
|
+
configurable: true,
|
|
130
|
+
writable: true,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return params;
|
|
134
|
+
}
|
|
135
|
+
function parseRecordVideoMode(value) {
|
|
136
|
+
if (value === undefined || value === '' || value === 'true')
|
|
137
|
+
return 'full-run';
|
|
138
|
+
if (value === 'off' || value === 'false')
|
|
139
|
+
return false;
|
|
140
|
+
if (value === 'proof-window' || value === 'proof_window') {
|
|
141
|
+
throw usageError('--record-video=proof-window is not supported yet; use --record-video=full-run.');
|
|
142
|
+
}
|
|
143
|
+
if (value !== 'full-run') {
|
|
144
|
+
throw usageError('--record-video must be full-run or off.');
|
|
145
|
+
}
|
|
146
|
+
return 'full-run';
|
|
147
|
+
}
|
|
148
|
+
function normalizeOptionKey(key) {
|
|
149
|
+
return key.replace(/-([a-z])/gu, (_, character) => character.toUpperCase());
|
|
150
|
+
}
|
|
151
|
+
export function optionString(options, key) {
|
|
152
|
+
const value = options[key];
|
|
153
|
+
if (value === undefined)
|
|
154
|
+
return undefined;
|
|
155
|
+
if (typeof value !== 'string')
|
|
156
|
+
throw usageError(`--${key} requires a value.`);
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
export function optionStrings(options, key) {
|
|
160
|
+
const value = options[key];
|
|
161
|
+
if (value === undefined)
|
|
162
|
+
return undefined;
|
|
163
|
+
if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string')) {
|
|
164
|
+
throw usageError(`--${key} requires a value.`);
|
|
165
|
+
}
|
|
166
|
+
return value;
|
|
167
|
+
}
|
|
168
|
+
export function optionFlag(options, key) {
|
|
169
|
+
const value = options[key];
|
|
170
|
+
return value === true;
|
|
171
|
+
}
|
|
172
|
+
export function applyRuntimeDirOption(options) {
|
|
173
|
+
const runtimeDir = optionString(options, 'runtimeDir');
|
|
174
|
+
if (runtimeDir)
|
|
175
|
+
process.env.RECIPE_RUNTIME_DIR = runtimeDir;
|
|
176
|
+
}
|
|
177
|
+
export function applyWatcherPortOption(options) {
|
|
178
|
+
const watcherPort = optionString(options, 'watcherPort');
|
|
179
|
+
if (!watcherPort)
|
|
180
|
+
return;
|
|
181
|
+
process.env.WATCHER_PORT = watcherPort;
|
|
182
|
+
process.env.RECIPE_WATCHER_PORT = watcherPort;
|
|
183
|
+
for (const name of adapterPortEnv())
|
|
184
|
+
process.env[name] = watcherPort;
|
|
185
|
+
}
|
|
186
|
+
export function requiredOption(options, key, message) {
|
|
187
|
+
const value = optionString(options, key);
|
|
188
|
+
if (!value)
|
|
189
|
+
throw usageError(message);
|
|
190
|
+
return value;
|
|
191
|
+
}
|
|
192
|
+
// An unknown adapter is a usage error; an empty registry is an internal one
|
|
193
|
+
// and keeps its own error.
|
|
194
|
+
function adapterUsageError(error) {
|
|
195
|
+
if (error instanceof Error && error.message.startsWith('internal:'))
|
|
196
|
+
return error;
|
|
197
|
+
return usageError(error instanceof Error ? error.message : String(error));
|
|
198
|
+
}
|
|
199
|
+
export function adapterOption(options) {
|
|
200
|
+
const adapter = optionString(options, 'adapter');
|
|
201
|
+
try {
|
|
202
|
+
assertAdapter(adapter);
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
throw adapterUsageError(error);
|
|
206
|
+
}
|
|
207
|
+
return adapter;
|
|
208
|
+
}
|
|
209
|
+
export function targetPath(options) {
|
|
210
|
+
return path.resolve(optionString(options, 'target') ?? process.cwd());
|
|
211
|
+
}
|
|
212
|
+
export function actionManifestPathOption(options, adapter) {
|
|
213
|
+
const configured = optionString(options, 'actionManifest');
|
|
214
|
+
return configured ? path.resolve(configured) : harnessAdapter(adapter).actions.manifestPath();
|
|
215
|
+
}
|
|
216
|
+
export function parsePort(value, errorMessage) {
|
|
217
|
+
const port = Number(value);
|
|
218
|
+
if (!Number.isInteger(port) || port <= 0)
|
|
219
|
+
throw usageError(errorMessage);
|
|
220
|
+
return port;
|
|
221
|
+
}
|
|
222
|
+
// Shared adapter resolution: explicit --adapter/--platform, else auto-detect from
|
|
223
|
+
// --target/cwd (the exact detect story doctor/verify/install use). Lets `call`,
|
|
224
|
+
// `run --plan`, and `completion-candidates` work in a checkout without a flag.
|
|
225
|
+
export function resolveAdapter(options) {
|
|
226
|
+
const target = targetPath(options);
|
|
227
|
+
const explicit = optionString(options, 'adapter') ?? adapterForPlatform(optionString(options, 'platform'));
|
|
228
|
+
const adapter = explicit ?? detectAdapter(target);
|
|
229
|
+
if (!adapter) {
|
|
230
|
+
throw usageError(`${undetectedAdapterMessage(target)}\n Next: ${adapterDetectNext()}`);
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
assertAdapter(adapter);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
throw adapterUsageError(error);
|
|
237
|
+
}
|
|
238
|
+
return { adapter, target };
|
|
239
|
+
}
|
|
240
|
+
export function shellQuote(value) {
|
|
241
|
+
return `'${value.replace(/'/gu, `'\\''`)}'`;
|
|
242
|
+
}
|
|
243
|
+
export function shellQuoteArg(value) {
|
|
244
|
+
return /^[A-Za-z0-9_./:=@+-]+$/u.test(value) ? value : shellQuote(value);
|
|
245
|
+
}
|
|
246
|
+
export function isRecord(value) {
|
|
247
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=parse-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../../src/harness/parse-args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const DEFAULT_RECIPE_RUNTIME_DIR = "temp/recipe/runtime";
|
|
2
|
+
export declare const DEFAULT_RECIPE_HARNESS_ROOT = "temp/recipe/harness";
|
|
3
|
+
/** The checkout-relative runtime directory: `RECIPE_RUNTIME_DIR`, else the default. */
|
|
4
|
+
export declare function recipeRuntimeDir(): string;
|
|
5
|
+
/** The checkout-relative overlay directory: `RECIPE_HARNESS_ROOT`, else the default. */
|
|
6
|
+
export declare function recipeHarnessRoot(): string;
|
|
7
|
+
export declare function recipeRuntimePath(projectRoot: string, ...segments: string[]): string;
|
|
8
|
+
export declare function recipeHarnessPath(projectRoot: string, ...segments: string[]): string;
|
|
9
|
+
/**
|
|
10
|
+
* The host executable serving this run. The host bin exports its own resolved
|
|
11
|
+
* path as `<envPrefix>_EXECUTABLE`, so a command that re-enters the harness
|
|
12
|
+
* reaches the install a task locked onto rather than whatever PATH resolves to.
|
|
13
|
+
*/
|
|
14
|
+
export declare function harnessExecutable(): string;
|
|
15
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/harness/paths.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,0BAA0B,wBAAwB,CAAC;AAChE,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AAEjE,uFAAuF;AACvF,wBAAgB,gBAAgB,IAAI,MAAM,CAKzC;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAEpF;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAEpF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { harnessHost, hostEnvName, validateRelativeRecipePath } from './host.js';
|
|
3
|
+
// The checkout layout every host and shell leaf shares (`temp/recipe/runtime/<adapter>/`).
|
|
4
|
+
export const DEFAULT_RECIPE_RUNTIME_DIR = 'temp/recipe/runtime';
|
|
5
|
+
export const DEFAULT_RECIPE_HARNESS_ROOT = 'temp/recipe/harness';
|
|
6
|
+
/** The checkout-relative runtime directory: `RECIPE_RUNTIME_DIR`, else the default. */
|
|
7
|
+
export function recipeRuntimeDir() {
|
|
8
|
+
return validateRelativeRecipePath('RECIPE_RUNTIME_DIR', process.env.RECIPE_RUNTIME_DIR || DEFAULT_RECIPE_RUNTIME_DIR);
|
|
9
|
+
}
|
|
10
|
+
/** The checkout-relative overlay directory: `RECIPE_HARNESS_ROOT`, else the default. */
|
|
11
|
+
export function recipeHarnessRoot() {
|
|
12
|
+
return validateRelativeRecipePath('RECIPE_HARNESS_ROOT', process.env.RECIPE_HARNESS_ROOT || DEFAULT_RECIPE_HARNESS_ROOT);
|
|
13
|
+
}
|
|
14
|
+
export function recipeRuntimePath(projectRoot, ...segments) {
|
|
15
|
+
return path.join(projectRoot, recipeRuntimeDir(), ...segments);
|
|
16
|
+
}
|
|
17
|
+
export function recipeHarnessPath(projectRoot, ...segments) {
|
|
18
|
+
return path.join(projectRoot, recipeHarnessRoot(), ...segments);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The host executable serving this run. The host bin exports its own resolved
|
|
22
|
+
* path as `<envPrefix>_EXECUTABLE`, so a command that re-enters the harness
|
|
23
|
+
* reaches the install a task locked onto rather than whatever PATH resolves to.
|
|
24
|
+
*/
|
|
25
|
+
export function harnessExecutable() {
|
|
26
|
+
const host = harnessHost();
|
|
27
|
+
return path.resolve(process.env[hostEnvName('EXECUTABLE')] ?? path.join(host.packageRoot, host.bin));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/harness/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAEjF,2FAA2F;AAC3F,MAAM,CAAC,MAAM,0BAA0B,GAAG,qBAAqB,CAAC;AAChE,MAAM,CAAC,MAAM,2BAA2B,GAAG,qBAAqB,CAAC;AAEjE,uFAAuF;AACvF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,0BAA0B,CAC/B,oBAAoB,EACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,0BAA0B,CAC7D,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,iBAAiB;IAC/B,OAAO,0BAA0B,CAC/B,qBAAqB,EACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,2BAA2B,CAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,GAAG,QAAkB;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,GAAG,QAAkB;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,OAAO,IAAI,CAAC,OAAO,CACjB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAChF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RecordingTargetProvider } from '@farmslot/recipe-runner';
|
|
2
|
+
/** The runner's `--record-video` target, resolved by the adapter's `recording`. */
|
|
3
|
+
export declare function createRecordingTargetProvider(adapter: string): RecordingTargetProvider;
|
|
4
|
+
export declare function captureHelperSupportsRecordSessionSnapshots(projectRoot: string): boolean;
|
|
5
|
+
/** Whether `capture-helper version --json` lists `capability`. */
|
|
6
|
+
export declare function captureHelperSupportsCapability(projectRoot: string, capability: string): boolean;
|
|
7
|
+
/** `CAPTURE_HELPER_PATH`, else `capture-helper` on PATH. */
|
|
8
|
+
export declare function captureHelperPath(): string;
|
|
9
|
+
//# sourceMappingURL=recording-target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-target.d.ts","sourceRoot":"","sources":["../../src/harness/recording-target.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AAIjC,mFAAmF;AACnF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAStF;AAED,wBAAgB,2CAA2C,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAExF;AAED,kEAAkE;AAClE,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAYhG;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Video recording support every platform shares: the runner's recording-target
|
|
2
|
+
// provider (the platform resolves the target) and capture-helper capability checks.
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { harnessAdapter } from './adapters.js';
|
|
5
|
+
/** The runner's `--record-video` target, resolved by the adapter's `recording`. */
|
|
6
|
+
export function createRecordingTargetProvider(adapter) {
|
|
7
|
+
return {
|
|
8
|
+
async resolveRecordingTarget(context) {
|
|
9
|
+
const recording = harnessAdapter(adapter).recording;
|
|
10
|
+
if (!recording)
|
|
11
|
+
throw new Error(`--record-video is not implemented for the ${adapter} adapter.`);
|
|
12
|
+
return recording.target(context);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function captureHelperSupportsRecordSessionSnapshots(projectRoot) {
|
|
17
|
+
return captureHelperSupportsCapability(projectRoot, 'record_session_snapshot');
|
|
18
|
+
}
|
|
19
|
+
/** Whether `capture-helper version --json` lists `capability`. */
|
|
20
|
+
export function captureHelperSupportsCapability(projectRoot, capability) {
|
|
21
|
+
const result = spawnSync(captureHelperPath(), ['version', '--json'], {
|
|
22
|
+
cwd: projectRoot,
|
|
23
|
+
encoding: 'utf8',
|
|
24
|
+
});
|
|
25
|
+
if (result.status !== 0)
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
const parsed = JSON.parse(result.stdout);
|
|
29
|
+
return Array.isArray(parsed.capabilities) && parsed.capabilities.includes(capability);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** `CAPTURE_HELPER_PATH`, else `capture-helper` on PATH. */
|
|
36
|
+
export function captureHelperPath() {
|
|
37
|
+
return process.env.CAPTURE_HELPER_PATH || 'capture-helper';
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=recording-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-target.js","sourceRoot":"","sources":["../../src/harness/recording-target.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oFAAoF;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,mFAAmF;AACnF,MAAM,UAAU,6BAA6B,CAAC,OAAe;IAC3D,OAAO;QACL,KAAK,CAAC,sBAAsB,CAAC,OAA+B;YAC1D,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;YACpD,IAAI,CAAC,SAAS;gBACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,WAAW,CAAC,CAAC;YACnF,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2CAA2C,CAAC,WAAmB;IAC7E,OAAO,+BAA+B,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;AACjF,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,+BAA+B,CAAC,WAAmB,EAAE,UAAkB;IACrF,MAAM,MAAM,GAAG,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;QACnE,GAAG,EAAE,WAAW;QAChB,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAA+B,CAAC;QACvE,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,gBAAgB,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { AdapterBrowser, AdapterLogSource } from '@farmslot/adapter-sdk';
|
|
2
|
+
import type { RecipeRunResult } from '@farmslot/recipe-runner';
|
|
3
|
+
type DiagnosticLevel = 'info' | 'warning' | 'error' | 'exception';
|
|
4
|
+
/** One console log record: its first line and the continuation lines after it. */
|
|
5
|
+
export interface ConsoleRecord {
|
|
6
|
+
line: string;
|
|
7
|
+
continuation: string[];
|
|
8
|
+
}
|
|
9
|
+
/** What an allowlist entry is compared with. */
|
|
10
|
+
export interface ConsoleEventKey {
|
|
11
|
+
signature: string;
|
|
12
|
+
continuation: string;
|
|
13
|
+
first_frame: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ClassifiedConsoleRecord {
|
|
16
|
+
level: Exclude<DiagnosticLevel, 'info'>;
|
|
17
|
+
source: string;
|
|
18
|
+
message: string;
|
|
19
|
+
firstFrame: string | null;
|
|
20
|
+
key: ConsoleEventKey;
|
|
21
|
+
}
|
|
22
|
+
export interface ConsoleAllowlistMatch {
|
|
23
|
+
reason: string;
|
|
24
|
+
index: number;
|
|
25
|
+
file: string;
|
|
26
|
+
temporary?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** The least an allowlist reports: its applied entries and the problems found loading it. */
|
|
29
|
+
export interface ConsoleAllowlist {
|
|
30
|
+
entries: readonly unknown[];
|
|
31
|
+
problems: string[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* How a host reads console logs: records, which of them are findings, how a
|
|
35
|
+
* message groups, and the recipe libraries' allowlist of known noise.
|
|
36
|
+
*/
|
|
37
|
+
export interface ConsoleClassifier<TAllowlist extends ConsoleAllowlist> {
|
|
38
|
+
records(text: string): ConsoleRecord[];
|
|
39
|
+
classify(record: ConsoleRecord): ClassifiedConsoleRecord | null;
|
|
40
|
+
signature(message: string): string;
|
|
41
|
+
loadAllowlist(libraryRoots: readonly string[]): TAllowlist;
|
|
42
|
+
match(event: {
|
|
43
|
+
source: string;
|
|
44
|
+
key: ConsoleEventKey;
|
|
45
|
+
}, allowlist: TAllowlist): ConsoleAllowlistMatch | null;
|
|
46
|
+
libraryRoots(): string[];
|
|
47
|
+
}
|
|
48
|
+
export interface RunDiagnosticBaseline {
|
|
49
|
+
source: AdapterLogSource;
|
|
50
|
+
offset: number;
|
|
51
|
+
inode?: number;
|
|
52
|
+
issueBuffer?: {
|
|
53
|
+
adapter: string;
|
|
54
|
+
projectRoot: string;
|
|
55
|
+
};
|
|
56
|
+
capture?: ConsoleCaptureSpec;
|
|
57
|
+
requestLog?: {
|
|
58
|
+
adapter: string;
|
|
59
|
+
path: string;
|
|
60
|
+
offset: number;
|
|
61
|
+
inode?: number;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export interface ConsoleCaptureSpec {
|
|
65
|
+
adapter: string;
|
|
66
|
+
projectRoot: string;
|
|
67
|
+
cdpPort?: string;
|
|
68
|
+
extensionLog: string;
|
|
69
|
+
pageLog: string;
|
|
70
|
+
pidFile: string;
|
|
71
|
+
startError?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface CaptureEvidence {
|
|
74
|
+
verified: boolean;
|
|
75
|
+
detail: string;
|
|
76
|
+
}
|
|
77
|
+
export interface RunSideFinding {
|
|
78
|
+
level: DiagnosticLevel;
|
|
79
|
+
fingerprint: string;
|
|
80
|
+
count: number;
|
|
81
|
+
preview: string;
|
|
82
|
+
source?: string;
|
|
83
|
+
signature?: string;
|
|
84
|
+
firstFrame?: string | null;
|
|
85
|
+
allowlisted?: {
|
|
86
|
+
reason: string;
|
|
87
|
+
entry: number;
|
|
88
|
+
file: string;
|
|
89
|
+
temporary?: true;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export interface RunDiagnosticsDocument {
|
|
93
|
+
schemaVersion: 1;
|
|
94
|
+
scope: 'recipe-run-application';
|
|
95
|
+
status: 'clean' | 'review' | 'unavailable';
|
|
96
|
+
nonBlocking: true;
|
|
97
|
+
note: string;
|
|
98
|
+
source: {
|
|
99
|
+
label: string;
|
|
100
|
+
path: string;
|
|
101
|
+
startOffset: number;
|
|
102
|
+
endOffset: number;
|
|
103
|
+
inode?: number;
|
|
104
|
+
bytesRead: number;
|
|
105
|
+
truncated: boolean;
|
|
106
|
+
inAppBuffer: 'collected' | 'unavailable' | 'n/a';
|
|
107
|
+
rawArtifact: string;
|
|
108
|
+
redacted: true;
|
|
109
|
+
};
|
|
110
|
+
counts: {
|
|
111
|
+
total: number;
|
|
112
|
+
warning: number;
|
|
113
|
+
error: number;
|
|
114
|
+
exception: number;
|
|
115
|
+
info?: number;
|
|
116
|
+
};
|
|
117
|
+
allowlist?: {
|
|
118
|
+
entries: number;
|
|
119
|
+
applied: number;
|
|
120
|
+
problems: string[];
|
|
121
|
+
};
|
|
122
|
+
capture?: CaptureEvidence;
|
|
123
|
+
displayedFindingCount: number;
|
|
124
|
+
omittedFindingCount: number;
|
|
125
|
+
findings: RunSideFinding[];
|
|
126
|
+
}
|
|
127
|
+
export type RecipeRunEvidence = RecipeRunResult & {
|
|
128
|
+
diagnosticsPath?: string;
|
|
129
|
+
browser?: AdapterBrowser | null;
|
|
130
|
+
sideFindings?: Pick<RunDiagnosticsDocument, 'status' | 'note' | 'counts'>;
|
|
131
|
+
};
|
|
132
|
+
export declare function readRunDiagnosticsDocument(diagnosticsPath: unknown): RunDiagnosticsDocument | null;
|
|
133
|
+
export declare function formatRunDiagnosticsForHuman(diagnostics: RunDiagnosticsDocument | null, adapter: string): string[];
|
|
134
|
+
export declare function beginRunDiagnostics(adapter: string, projectRoot: string): Promise<RunDiagnosticBaseline | null>;
|
|
135
|
+
export declare function verifyConsoleCapture(capture: ConsoleCaptureSpec): Promise<CaptureEvidence>;
|
|
136
|
+
export declare function finishRunDiagnostics<TAllowlist extends ConsoleAllowlist>(baseline: RunDiagnosticBaseline | null, result: RecipeRunResult, classifier: ConsoleClassifier<TAllowlist>): Promise<RecipeRunEvidence>;
|
|
137
|
+
export declare function collectRunDiagnostics<TAllowlist extends ConsoleAllowlist>(baseline: RunDiagnosticBaseline, classifier: ConsoleClassifier<TAllowlist>, bufferedIssues?: unknown[] | null, allowlist?: TAllowlist | null, capture?: CaptureEvidence): RunDiagnosticsDocument;
|
|
138
|
+
export {};
|
|
139
|
+
//# sourceMappingURL=run-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-diagnostics.d.ts","sourceRoot":"","sources":["../../src/harness/run-diagnostics.ts"],"names":[],"mappings":"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"}
|