@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,105 @@
1
+ // launch — start the app (dev server/build + surface), auto-ensure the runtime
2
+ // overlay, and heal transport within bounds. Owns the launch grammar shared by
3
+ // every platform (--heal, adapter resolution, the checkout lock) and the
4
+ // --json-stream envelope; each platform's `launch` owns the rest.
5
+ import fs from 'node:fs';
6
+ import { adapterDetectNext, adapterFlags, adapterForPlatform, harnessAdapter, isPlatformTarget, undetectedAdapterMessage, } from '../adapters.js';
7
+ import { acquireCheckoutLock } from '../checkout-lock.js';
8
+ import { parseHeal } from '../heal-bounds.js';
9
+ import { harnessHost } from '../host.js';
10
+ import { JsonStreamWriter } from '../json-stream.js';
11
+ import { checkoutBusyOut, EXIT, flag, parseFlags, resolveFlagsAdapter, str, targetOf, usageOut, } from '../shared.js';
12
+ function launchBooleans() {
13
+ return new Set(['json', 'jsonStream', ...adapterFlags('launch')]);
14
+ }
15
+ export async function handleLaunch(argv) {
16
+ const { options } = parseFlags(argv, launchBooleans());
17
+ const json = flag(options, 'json');
18
+ const stream = new JsonStreamWriter('launch', flag(options, 'jsonStream'));
19
+ const jsonOutput = json && !stream.enabled;
20
+ const restoreStdout = stream.isolateStdout();
21
+ const target = targetOf(options);
22
+ try {
23
+ let exitCode;
24
+ if (!fs.existsSync(target)) {
25
+ exitCode = await handleLaunchLocked(argv, stream);
26
+ }
27
+ else {
28
+ const lock = acquireCheckoutLock(target, 'launch');
29
+ if ('message' in lock) {
30
+ const userAction = `wait for the current owner, or inspect ${lock.path} if its process has exited`;
31
+ stream.error({ code: 'SANDBOX_BUSY', message: lock.message, userAction });
32
+ exitCode = checkoutBusyOut(jsonOutput, 'launch', lock.message, lock.path);
33
+ }
34
+ else {
35
+ try {
36
+ exitCode = await handleLaunchLocked(argv, stream);
37
+ }
38
+ finally {
39
+ lock.release();
40
+ }
41
+ }
42
+ }
43
+ stream.complete(exitCode === EXIT.ok ? 'pass' : 'fail', exitCode);
44
+ return exitCode;
45
+ }
46
+ catch (error) {
47
+ const exitCode = error !== null &&
48
+ typeof error === 'object' &&
49
+ 'exitCode' in error &&
50
+ typeof error.exitCode === 'number'
51
+ ? error.exitCode
52
+ : EXIT.runtime;
53
+ stream.error({
54
+ code: exitCode === EXIT.usage ? 'CLI_USAGE_ERROR' : 'LAUNCH_FAILED',
55
+ message: error instanceof Error ? error.message : String(error),
56
+ userAction: `${harnessHost().name} doctor --target ${quoteWord(target)} --json`,
57
+ });
58
+ stream.complete('fail', exitCode);
59
+ throw error;
60
+ }
61
+ finally {
62
+ restoreStdout();
63
+ }
64
+ }
65
+ async function handleLaunchLocked(argv, stream) {
66
+ const { positional, options } = parseFlags(argv, launchBooleans());
67
+ const json = flag(options, 'json');
68
+ const jsonOutput = json && !stream.enabled;
69
+ const machine = json || stream.enabled;
70
+ const target = targetOf(options);
71
+ const heal = parseHeal(options, 'auto');
72
+ if (typeof heal !== 'string')
73
+ return launchUsage(jsonOutput, stream, heal.error, 'use --heal off|infra-only|auto');
74
+ // A platform target (`launch ios`, or --platform ios) also selects its adapter.
75
+ const positionalTarget = isPlatformTarget(positional[0]) ? positional[0] : undefined;
76
+ const platformFlag = str(options, 'platform');
77
+ const platformTarget = positionalTarget ?? (isPlatformTarget(platformFlag) ? platformFlag : undefined);
78
+ const adapter = resolveFlagsAdapter(options, target, adapterForPlatform(platformTarget));
79
+ if (!adapter) {
80
+ return launchUsage(jsonOutput, stream, undetectedAdapterMessage(target), adapterDetectNext());
81
+ }
82
+ stream.phase('resolve', { target, adapter, platform: platformTarget ?? null });
83
+ return harnessAdapter(adapter).launch({
84
+ adapter,
85
+ target,
86
+ options,
87
+ platformTarget,
88
+ heal,
89
+ jsonOutput,
90
+ machine,
91
+ stream,
92
+ usage: (message, userAction) => launchUsage(jsonOutput, stream, message, userAction),
93
+ });
94
+ }
95
+ function launchUsage(json, stream, message, userAction) {
96
+ stream.error({ code: 'USAGE', message, userAction });
97
+ return usageOut(json, 'launch', message, userAction);
98
+ }
99
+ // Shell-quote one word for a launch `userAction`, leaving plain paths bare.
100
+ function quoteWord(value) {
101
+ if (/^[A-Za-z0-9_./:@%+=,-]+$/u.test(value))
102
+ return value;
103
+ return `'${value.replace(/'/gu, "'\"'\"'")}'`;
104
+ }
105
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/harness/commands/launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function handleReload(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=reload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload.d.ts","sourceRoot":"","sources":["../../../src/harness/commands/reload.ts"],"names":[],"mappings":"AAQA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BlE"}
@@ -0,0 +1,24 @@
1
+ // reload — reload the connected app runtime through the platform's `reload`.
2
+ import { adapterDetectNext, harnessAdapter, undetectedAdapterMessage } from '../adapters.js';
3
+ import { harnessHost } from '../host.js';
4
+ import { flag, parseFlags, resolveFlagsAdapter, targetOf, usageOut } from '../shared.js';
5
+ const RELOAD_BOOLEANS = new Set(['json']);
6
+ export async function handleReload(argv) {
7
+ const { options } = parseFlags(argv, RELOAD_BOOLEANS);
8
+ const json = flag(options, 'json');
9
+ const target = targetOf(options);
10
+ const adapter = resolveFlagsAdapter(options, target);
11
+ if (!adapter) {
12
+ return usageOut(json, 'reload', undetectedAdapterMessage(target), adapterDetectNext());
13
+ }
14
+ const surface = harnessAdapter(adapter);
15
+ if (surface.headless) {
16
+ return usageOut(json, 'reload', `${adapter} is headless; there is no app runtime to reload.`, `${harnessHost().name} run <${adapter}-recipe>`);
17
+ }
18
+ if (!surface.reload) {
19
+ return usageOut(json, 'reload', `reload does not support the ${adapter} adapter.`, surface.hints.launch);
20
+ }
21
+ surface.resolveSlotPorts(target);
22
+ return surface.reload(target, json);
23
+ }
24
+ //# sourceMappingURL=reload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload.js","sourceRoot":"","sources":["../../../src/harness/commands/reload.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEzF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,QAAQ,CACb,IAAI,EACJ,QAAQ,EACR,GAAG,OAAO,kDAAkD,EAC5D,GAAG,WAAW,EAAE,CAAC,IAAI,SAAS,OAAO,UAAU,CAChD,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,QAAQ,CACb,IAAI,EACJ,QAAQ,EACR,+BAA+B,OAAO,WAAW,EACjD,OAAO,CAAC,KAAK,CAAC,MAAM,CACrB,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface StoppedCompanion {
2
+ label: string;
3
+ pid: number;
4
+ }
5
+ export interface StopCommandOptions {
6
+ companions?(target: string): Promise<StoppedCompanion[]>;
7
+ }
8
+ export declare function handleStop(argv: string[], commandOptions?: StopCommandOptions): Promise<number>;
9
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/harness/commands/stop.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAE/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IAGjC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CAC1D;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,cAAc,GAAE,kBAAuB,GACtC,OAAO,CAAC,MAAM,CAAC,CAwDjB"}
@@ -0,0 +1,60 @@
1
+ // stop — stop the dev server this checkout owns, through the platform's
2
+ // `devServer`, plus any companion processes the host started for it.
3
+ import { adapterPortEnv, harnessAdapter } from '../adapters.js';
4
+ import { color } from '../cli-color.js';
5
+ import { harnessHost } from '../host.js';
6
+ import { optionFlag, optionString, parseArgs, resolveAdapter, shellQuote } from '../parse-args.js';
7
+ import { usageOut } from '../shared.js';
8
+ export async function handleStop(argv, commandOptions = {}) {
9
+ const { options } = parseArgs(argv);
10
+ const json = optionFlag(options, 'json');
11
+ const { adapter, target } = resolveAdapter(options);
12
+ const surface = harnessAdapter(adapter);
13
+ surface.resolveSlotPorts(target);
14
+ const explicitPort = optionString(options, 'port') ?? optionString(options, 'watcherPort');
15
+ if (explicitPort) {
16
+ process.env.WATCHER_PORT = explicitPort;
17
+ for (const name of adapterPortEnv())
18
+ process.env[name] = explicitPort;
19
+ }
20
+ const stop = surface.devServer.stop(target);
21
+ if (stop.kind === 'headless') {
22
+ return usageOut(json, 'stop', stop.message, stop.userAction);
23
+ }
24
+ const companions = (await commandOptions.companions?.(target)) ?? [];
25
+ const signalled = (stop.signalled ?? 0) + companions.length;
26
+ const summary = [
27
+ stop.summary,
28
+ ...companions.map((companion) => `stopped ${companion.label} ${companion.pid}`),
29
+ ].join('; ');
30
+ // A platform whose dev server serves several targets has no one truthful
31
+ // relaunch, so the hint is optional.
32
+ const next = surface.devServer.afterStop?.(target);
33
+ const userAction = `${harnessHost().name} status --target ${shellQuote(target)} --json`;
34
+ if (json) {
35
+ console.log(JSON.stringify({
36
+ schemaVersion: 1,
37
+ command: 'stop',
38
+ adapter,
39
+ target,
40
+ status: stop.status === 0 ? 'pass' : 'fail',
41
+ ...(stop.signalled !== undefined || companions.length > 0 ? { signalled } : {}),
42
+ exitCode: stop.status,
43
+ ...(stop.output ? { output: stop.output } : {}),
44
+ ...(stop.status === 0
45
+ ? next
46
+ ? { next }
47
+ : {}
48
+ : { error: { code: 'DEV_SERVER_STOP_FAILED', message: summary, userAction } }),
49
+ }, null, 2));
50
+ }
51
+ else {
52
+ if (stop.output)
53
+ process.stderr.write(`${stop.output}\n`);
54
+ console.error(`${color(stop.status === 0 ? 'ok' : 'err', stop.status === 0 ? '✓' : '✗')} ${summary}`);
55
+ if (stop.status !== 0 || next)
56
+ console.error(` Next: ${stop.status === 0 ? next : userAction}`);
57
+ }
58
+ return stop.status;
59
+ }
60
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/harness/commands/stop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { RecipeLibrarySource } from '@farmslot/recipe-runner';
2
+ export type ExecutionProvenancePhase = 'start' | 'pre-execute' | 'end';
3
+ export interface SourceProvenanceSnapshot {
4
+ head: string | null;
5
+ status: string;
6
+ sourceFingerprint: string;
7
+ }
8
+ export interface ExecutionProvenanceSnapshot {
9
+ phase: ExecutionProvenancePhase;
10
+ capturedAt: string;
11
+ recipeDigest: string;
12
+ product: SourceProvenanceSnapshot;
13
+ runner: SourceProvenanceSnapshot;
14
+ libraries: Array<SourceProvenanceSnapshot & {
15
+ name: string;
16
+ }>;
17
+ helpers: Array<{
18
+ path: string;
19
+ sourceFingerprint: string;
20
+ }>;
21
+ }
22
+ export interface ExecutionProvenanceDrift {
23
+ phase: Exclude<ExecutionProvenancePhase, 'start'>;
24
+ field: string;
25
+ start: string | null;
26
+ current: string | null;
27
+ }
28
+ export interface ExecutionProvenanceRecord {
29
+ schemaVersion: 1;
30
+ valid: boolean;
31
+ snapshots: ExecutionProvenanceSnapshot[];
32
+ drift: ExecutionProvenanceDrift[];
33
+ }
34
+ export interface ExecutionProvenanceInput {
35
+ adapter: string;
36
+ projectRoot: string;
37
+ recipeDocument: unknown;
38
+ recipePath?: string;
39
+ librarySources?: RecipeLibrarySource[];
40
+ excludedProductRoots?: string[];
41
+ helperPaths?: string[];
42
+ runnerRoot?: string;
43
+ runnerIncludes: readonly string[];
44
+ }
45
+ export declare class ProvenanceDriftError extends Error {
46
+ readonly code = "PROVENANCE_DRIFT";
47
+ readonly exitCode = 5;
48
+ readonly userAction: string;
49
+ readonly provenancePath: string;
50
+ readonly drift: ExecutionProvenanceDrift[];
51
+ constructor(provenancePath: string, drift: ExecutionProvenanceDrift[], cause?: unknown);
52
+ }
53
+ export declare function captureExecutionProvenance(input: ExecutionProvenanceInput, phase: ExecutionProvenancePhase): Promise<ExecutionProvenanceSnapshot>;
54
+ export declare function executionProvenanceDrift(start: ExecutionProvenanceSnapshot, current: ExecutionProvenanceSnapshot): ExecutionProvenanceDrift[];
55
+ export declare function writeExecutionProvenance(artifactsDir: string, snapshots: ExecutionProvenanceSnapshot[], drift: ExecutionProvenanceDrift[], artifactManifestPath?: string): Promise<string>;
56
+ //# sourceMappingURL=execution-provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-provenance.d.ts","sourceRoot":"","sources":["../../src/harness/execution-provenance.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAQnE,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,aAAa,GAAG,KAAK,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,wBAAwB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,EAAE,KAAK,CAAC,wBAAwB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,CAAC,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,2BAA2B,EAAE,CAAC;IACzC,KAAK,EAAE,wBAAwB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACvC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,QAAQ,KAAK;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,wBAAwB,EAAE,CAAC;gBAE/B,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO;CAWvF;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,wBAAwB,EAC/B,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,2BAA2B,CAAC,CAqBtC;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,2BAA2B,EAClC,OAAO,EAAE,2BAA2B,GACnC,wBAAwB,EAAE,CAmD5B;AAED,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,2BAA2B,EAAE,EACxC,KAAK,EAAE,wBAAwB,EAAE,EACjC,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
@@ -0,0 +1,308 @@
1
+ // What a run executed, bound at its start and compared before and after it
2
+ // runs: the recipe, the product checkout, the runner (the host package), the
3
+ // recipe libraries and any command helper scripts. Drift invalidates the run.
4
+ import { execFileSync } from 'node:child_process';
5
+ import { createHash } from 'node:crypto';
6
+ import fs, { constants as fsConstants } from 'node:fs';
7
+ import path from 'node:path';
8
+ import { digestRecipeDocument } from '@farmslot/protocol';
9
+ import { harnessAdapter } from './adapters.js';
10
+ import { indexArtifactManifest } from './artifact-files.js';
11
+ import { harnessHost } from './host.js';
12
+ const gitContexts = new Map();
13
+ export class ProvenanceDriftError extends Error {
14
+ constructor(provenancePath, drift, cause) {
15
+ const fields = [...new Set(drift.map((entry) => entry.field))].join(', ');
16
+ super(`Execution inputs changed after preparation (${fields}); evidence is invalid.`, cause === undefined ? undefined : { cause });
17
+ this.code = 'PROVENANCE_DRIFT';
18
+ this.exitCode = 5;
19
+ this.name = 'ProvenanceDriftError';
20
+ this.provenancePath = provenancePath;
21
+ this.drift = drift;
22
+ this.userAction = `restore the prepared recipe, library, and product source, then rerun; inspect ${provenancePath}`;
23
+ }
24
+ }
25
+ export async function captureExecutionProvenance(input, phase) {
26
+ const recipeDigest = input.recipePath
27
+ ? recipeFileDigest(input.recipePath)
28
+ : digestRecipeDocument(input.recipeDocument);
29
+ const libraries = (input.librarySources ?? []).map((source, index) => ({
30
+ name: source.name ?? `library-${index + 1}`,
31
+ ...sourceSnapshot(source.root),
32
+ }));
33
+ const runnerRoot = input.runnerRoot ?? harnessHost().packageRoot;
34
+ return {
35
+ phase,
36
+ capturedAt: new Date().toISOString(),
37
+ recipeDigest,
38
+ product: sourceSnapshot(input.projectRoot, input.adapter, input.excludedProductRoots),
39
+ runner: sourceSnapshot(runnerRoot, undefined, [], [...input.runnerIncludes]),
40
+ libraries,
41
+ helpers: (input.helperPaths ?? []).map((helperPath) => ({
42
+ path: displayPath(input.projectRoot, helperPath),
43
+ sourceFingerprint: fileFingerprint(helperPath),
44
+ })),
45
+ };
46
+ }
47
+ export function executionProvenanceDrift(start, current) {
48
+ const drift = [];
49
+ if (current.phase === 'start')
50
+ return drift;
51
+ const phase = current.phase;
52
+ compare(drift, phase, 'recipeDigest', start.recipeDigest, current.recipeDigest);
53
+ compareSource(drift, phase, 'product', start.product, current.product);
54
+ compareSource(drift, phase, 'runner', start.runner, current.runner);
55
+ if (start.libraries.length !== current.libraries.length) {
56
+ compare(drift, phase, 'libraries.length', String(start.libraries.length), String(current.libraries.length));
57
+ }
58
+ const count = Math.min(start.libraries.length, current.libraries.length);
59
+ for (let index = 0; index < count; index += 1) {
60
+ const expected = start.libraries[index];
61
+ const actual = current.libraries[index];
62
+ const prefix = `libraries[${index}]`;
63
+ compare(drift, phase, `${prefix}.name`, expected.name, actual.name);
64
+ compareSource(drift, phase, prefix, expected, actual);
65
+ }
66
+ if (start.helpers.length !== current.helpers.length) {
67
+ compare(drift, phase, 'helpers.length', String(start.helpers.length), String(current.helpers.length));
68
+ }
69
+ const helperCount = Math.min(start.helpers.length, current.helpers.length);
70
+ for (let index = 0; index < helperCount; index += 1) {
71
+ compare(drift, phase, `helpers[${index}].path`, start.helpers[index].path, current.helpers[index].path);
72
+ compare(drift, phase, `helpers[${index}].sourceFingerprint`, start.helpers[index].sourceFingerprint, current.helpers[index].sourceFingerprint);
73
+ }
74
+ return drift;
75
+ }
76
+ export async function writeExecutionProvenance(artifactsDir, snapshots, drift, artifactManifestPath) {
77
+ const provenancePath = path.join(path.resolve(artifactsDir), 'execution-provenance.json');
78
+ const record = {
79
+ schemaVersion: 1,
80
+ valid: drift.length === 0,
81
+ snapshots,
82
+ drift,
83
+ };
84
+ fs.mkdirSync(path.dirname(provenancePath), { recursive: true });
85
+ fs.writeFileSync(provenancePath, `${JSON.stringify(record, null, 2)}\n`);
86
+ if (artifactManifestPath) {
87
+ // The one manifest upsert the harness has; a missing or unreadable
88
+ // manifest is the caller's error, not something to skip past.
89
+ await indexArtifactManifest(artifactManifestPath, [
90
+ {
91
+ path: 'execution-provenance.json',
92
+ type: 'json',
93
+ label: 'Execution provenance',
94
+ category: 'system',
95
+ metadata: {
96
+ valid: record.valid,
97
+ errorCode: record.valid ? null : 'PROVENANCE_DRIFT',
98
+ },
99
+ },
100
+ ]);
101
+ }
102
+ return provenancePath;
103
+ }
104
+ function recipeFileDigest(recipePath) {
105
+ const source = readRegularFileNoFollow(recipePath);
106
+ try {
107
+ return digestRecipeDocument(JSON.parse(source.toString('utf8')));
108
+ }
109
+ catch {
110
+ return `invalid:sha256:${createHash('sha256').update(source).digest('hex')}`;
111
+ }
112
+ }
113
+ function sourceSnapshot(root, adapter, excludedRoots = [], includedRoots = []) {
114
+ const git = gitContext(root);
115
+ if (!git) {
116
+ return {
117
+ head: null,
118
+ status: 'not-a-git-checkout',
119
+ sourceFingerprint: directoryFingerprint(root, excludedRoots, includedRoots),
120
+ };
121
+ }
122
+ const pathspecs = sourcePathspecs(git, excludedRoots, includedRoots);
123
+ const status = gitText(git.topLevel, [
124
+ 'status',
125
+ '--porcelain=v1',
126
+ '--untracked-files=normal',
127
+ '--',
128
+ ...pathspecs,
129
+ ]);
130
+ const head = gitBuffer(git.topLevel, ['rev-parse', 'HEAD']);
131
+ const platformFingerprint = adapter ? harnessAdapter(adapter).sourceFingerprint : undefined;
132
+ return {
133
+ head: head.toString('utf8').trim() || null,
134
+ status,
135
+ sourceFingerprint: platformFingerprint && path.resolve(root) === git.topLevel
136
+ ? platformFingerprint(root)
137
+ : nestedGitSourceFingerprint(root, git, pathspecs, excludedRoots, includedRoots, head),
138
+ };
139
+ }
140
+ function nestedGitSourceFingerprint(root, git, pathspecs, excludedRoots, includedRoots, head) {
141
+ const gitFingerprint = gitSourceFingerprint(git.topLevel, pathspecs, head);
142
+ if (git.pathspec === '.' && includedRoots.length === 0)
143
+ return gitFingerprint;
144
+ return createHash('sha256')
145
+ .update(gitFingerprint)
146
+ .update('\0nested-source\0')
147
+ .update(directoryFingerprint(root, excludedRoots, includedRoots))
148
+ .digest('hex');
149
+ }
150
+ function gitContext(root) {
151
+ const cacheKey = path.resolve(root);
152
+ if (gitContexts.has(cacheKey))
153
+ return gitContexts.get(cacheKey) ?? null;
154
+ try {
155
+ const resolved = cacheKey;
156
+ const topLevel = fs.realpathSync(gitText(resolved, ['rev-parse', '--show-toplevel']).trim());
157
+ const relative = path.relative(topLevel, fs.realpathSync(resolved));
158
+ const context = relative === '..' || relative.startsWith(`..${path.sep}`)
159
+ ? null
160
+ : { topLevel, pathspec: relative || '.' };
161
+ gitContexts.set(cacheKey, context);
162
+ return context;
163
+ }
164
+ catch {
165
+ gitContexts.set(cacheKey, null);
166
+ return null;
167
+ }
168
+ }
169
+ function gitSourceFingerprint(topLevel, pathspecs, head) {
170
+ const hash = createHash('sha256');
171
+ hash.update(head);
172
+ hash.update('\0diff\0');
173
+ hash.update(gitBuffer(topLevel, [
174
+ 'diff',
175
+ '--no-ext-diff',
176
+ '--binary',
177
+ head.toString('utf8').trim(),
178
+ '--',
179
+ ...pathspecs,
180
+ ]));
181
+ const untracked = gitText(topLevel, [
182
+ 'ls-files',
183
+ '--others',
184
+ '--exclude-standard',
185
+ '-z',
186
+ '--',
187
+ ...pathspecs,
188
+ ])
189
+ .split('\0')
190
+ .filter(Boolean)
191
+ .sort();
192
+ for (const relative of untracked) {
193
+ hash.update(`\0untracked\0${relative}\0`);
194
+ const absolute = path.join(topLevel, relative);
195
+ hash.update(readPathIdentity(absolute));
196
+ }
197
+ return hash.digest('hex');
198
+ }
199
+ function sourcePathspecs(git, excludedRoots, includedRoots) {
200
+ const exclusions = excludedRoots.flatMap((root) => {
201
+ const relative = path.relative(git.topLevel, fs.existsSync(root) ? fs.realpathSync(root) : path.resolve(root));
202
+ return relative !== '..' && !relative.startsWith(`..${path.sep}`)
203
+ ? [`:(exclude)${relative}`]
204
+ : [];
205
+ });
206
+ const inclusions = includedRoots.length > 0
207
+ ? includedRoots.map((root) => path.join(git.pathspec === '.' ? '' : git.pathspec, root))
208
+ : [git.pathspec];
209
+ return [...inclusions, ...exclusions];
210
+ }
211
+ function directoryFingerprint(root, excludedRoots, includedRoots) {
212
+ const hash = createHash('sha256');
213
+ const resolvedRoot = path.resolve(root);
214
+ const roots = includedRoots.length > 0 ? includedRoots : [''];
215
+ for (const included of roots) {
216
+ hashDirectory(hash, resolvedRoot, included, new Set(excludedRoots.map((entry) => path.resolve(entry))));
217
+ }
218
+ return hash.digest('hex');
219
+ }
220
+ function hashDirectory(hash, root, relative, excludedRoots) {
221
+ const absolute = path.join(root, relative);
222
+ if ([...excludedRoots].some((excluded) => absolute === excluded || absolute.startsWith(`${excluded}${path.sep}`)))
223
+ return;
224
+ let stat;
225
+ try {
226
+ stat = fs.lstatSync(absolute);
227
+ }
228
+ catch (error) {
229
+ if (error.code === 'ENOENT') {
230
+ hash.update(`absent\0${relative}\0`);
231
+ return;
232
+ }
233
+ throw error;
234
+ }
235
+ if (stat.isDirectory()) {
236
+ hash.update(`directory\0${relative}\0`);
237
+ for (const name of fs.readdirSync(absolute).sort()) {
238
+ if (relative === '' && (name === '.git' || name === 'node_modules' || name === 'temp'))
239
+ continue;
240
+ hashDirectory(hash, root, path.join(relative, name), excludedRoots);
241
+ }
242
+ return;
243
+ }
244
+ if (stat.isSymbolicLink()) {
245
+ throw new Error(`Execution provenance source must not be a symbolic link: ${absolute}`);
246
+ }
247
+ hash.update(`file\0${relative}\0`);
248
+ hash.update(readRegularFileNoFollow(absolute));
249
+ hash.update('\0');
250
+ }
251
+ function fileFingerprint(filePath) {
252
+ return createHash('sha256').update(readRegularFileNoFollow(filePath)).digest('hex');
253
+ }
254
+ function readPathIdentity(filePath) {
255
+ const stat = fs.lstatSync(filePath);
256
+ if (stat.isSymbolicLink()) {
257
+ throw new Error(`Execution provenance source must not be a symbolic link: ${filePath}`);
258
+ }
259
+ return readRegularFileNoFollow(filePath);
260
+ }
261
+ function readRegularFileNoFollow(filePath) {
262
+ let fd;
263
+ try {
264
+ fd = fs.openSync(filePath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
265
+ }
266
+ catch (error) {
267
+ if (error.code === 'ELOOP') {
268
+ throw new Error(`Execution provenance source must not be a symbolic link: ${filePath}`);
269
+ }
270
+ throw error;
271
+ }
272
+ try {
273
+ if (!fs.fstatSync(fd).isFile()) {
274
+ throw new Error(`Execution provenance source is not a regular file: ${filePath}`);
275
+ }
276
+ return fs.readFileSync(fd);
277
+ }
278
+ finally {
279
+ fs.closeSync(fd);
280
+ }
281
+ }
282
+ function displayPath(projectRoot, filePath) {
283
+ const relative = path.relative(path.resolve(projectRoot), path.resolve(filePath));
284
+ return relative !== '..' && !relative.startsWith(`..${path.sep}`)
285
+ ? relative || '.'
286
+ : path.resolve(filePath);
287
+ }
288
+ function gitText(cwd, args) {
289
+ return gitBuffer(cwd, args).toString('utf8');
290
+ }
291
+ function gitBuffer(cwd, args) {
292
+ return execFileSync('git', args, {
293
+ cwd,
294
+ encoding: 'buffer',
295
+ maxBuffer: 128 * 1024 * 1024,
296
+ stdio: ['ignore', 'pipe', 'ignore'],
297
+ });
298
+ }
299
+ function compareSource(drift, phase, prefix, start, current) {
300
+ compare(drift, phase, `${prefix}.head`, start.head, current.head);
301
+ compare(drift, phase, `${prefix}.status`, start.status, current.status);
302
+ compare(drift, phase, `${prefix}.sourceFingerprint`, start.sourceFingerprint, current.sourceFingerprint);
303
+ }
304
+ function compare(drift, phase, field, start, current) {
305
+ if (start !== current)
306
+ drift.push({ phase, field, start, current });
307
+ }
308
+ //# sourceMappingURL=execution-provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-provenance.js","sourceRoot":"","sources":["../../src/harness/execution-provenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { HealBoundViolation, HealPolicy, HealState } from '@farmslot/adapter-sdk';
2
+ export declare function newHealState(): HealState;
3
+ export declare function conciseFailureForHuman(output: string): string;
4
+ export declare function parseHeal(options: Record<string, string | boolean>, fallback: HealPolicy): HealPolicy | {
5
+ error: string;
6
+ };
7
+ export declare function ensureOverlay(adapter: string, target: string, heal: HealPolicy, state: HealState, json: boolean): Promise<{
8
+ ok: boolean;
9
+ error?: string;
10
+ }>;
11
+ export type FailureClass = 'capture-protected' | 'wallet' | 'infra' | 'app';
12
+ export declare function classifyFailure(output: string): FailureClass;
13
+ export declare function recipeRunning(target: string): boolean;
14
+ export declare function checkHealBounds(target: string, output: string, state: HealState): HealBoundViolation | null;
15
+ //# sourceMappingURL=heal-bounds.d.ts.map