@farmslot/recipe-harness 0.1.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 (60) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +207 -0
  3. package/bin/farmslot-recipe.mjs +10 -0
  4. package/dist/adapters/core.d.ts +5 -0
  5. package/dist/adapters/core.d.ts.map +1 -0
  6. package/dist/adapters/core.js +438 -0
  7. package/dist/adapters/core.js.map +1 -0
  8. package/dist/adapters/ui.d.ts +23 -0
  9. package/dist/adapters/ui.d.ts.map +1 -0
  10. package/dist/adapters/ui.js +41 -0
  11. package/dist/adapters/ui.js.map +1 -0
  12. package/dist/cli/run-command.d.ts +3 -0
  13. package/dist/cli/run-command.d.ts.map +1 -0
  14. package/dist/cli/run-command.js +41 -0
  15. package/dist/cli/run-command.js.map +1 -0
  16. package/dist/cli/validate-command.d.ts +3 -0
  17. package/dist/cli/validate-command.d.ts.map +1 -0
  18. package/dist/cli/validate-command.js +31 -0
  19. package/dist/cli/validate-command.js.map +1 -0
  20. package/dist/cli-support.d.ts +14 -0
  21. package/dist/cli-support.d.ts.map +1 -0
  22. package/dist/cli-support.js +94 -0
  23. package/dist/cli-support.js.map +1 -0
  24. package/dist/cli.d.ts +4 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +29 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/index.d.ts +15 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +10 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/json.d.ts +9 -0
  33. package/dist/json.d.ts.map +1 -0
  34. package/dist/json.js +74 -0
  35. package/dist/json.js.map +1 -0
  36. package/dist/runner.d.ts +4 -0
  37. package/dist/runner.d.ts.map +1 -0
  38. package/dist/runner.js +1172 -0
  39. package/dist/runner.js.map +1 -0
  40. package/dist/runtime/browser-extension.d.ts +17 -0
  41. package/dist/runtime/browser-extension.d.ts.map +1 -0
  42. package/dist/runtime/browser-extension.js +42 -0
  43. package/dist/runtime/browser-extension.js.map +1 -0
  44. package/dist/runtime/cdp.d.ts +86 -0
  45. package/dist/runtime/cdp.d.ts.map +1 -0
  46. package/dist/runtime/cdp.js +512 -0
  47. package/dist/runtime/cdp.js.map +1 -0
  48. package/dist/runtime/react-native-bridge.d.ts +17 -0
  49. package/dist/runtime/react-native-bridge.d.ts.map +1 -0
  50. package/dist/runtime/react-native-bridge.js +24 -0
  51. package/dist/runtime/react-native-bridge.js.map +1 -0
  52. package/dist/types.d.ts +143 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +2 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/writers.d.ts +23 -0
  57. package/dist/writers.d.ts.map +1 -0
  58. package/dist/writers.js +72 -0
  59. package/dist/writers.js.map +1 -0
  60. package/package.json +79 -0
@@ -0,0 +1,143 @@
1
+ import type { RecipeActionManifestDocument, RecipeArtifactManifestEntry } from '@farmslot/protocol';
2
+ export type RecipeRunStatus = 'pass' | 'fail' | 'unknown';
3
+ export interface RecipeRunRequest {
4
+ recipePath?: string;
5
+ recipeDocument?: unknown;
6
+ artifactsDir: string;
7
+ projectRoot?: string;
8
+ env?: Record<string, string | undefined>;
9
+ }
10
+ export interface RecipeRunResult {
11
+ status: RecipeRunStatus;
12
+ summaryPath: string;
13
+ tracePath: string;
14
+ artifactManifestPath: string;
15
+ recipePath: string;
16
+ }
17
+ export interface RecipeRunner {
18
+ run(request: RecipeRunRequest): Promise<RecipeRunResult>;
19
+ }
20
+ export interface RecipeLogger {
21
+ info(message: string): void;
22
+ warn(message: string): void;
23
+ error(message: string): void;
24
+ }
25
+ export interface RecipeRunnerProvenance {
26
+ source: string;
27
+ git_ref: string;
28
+ name?: string;
29
+ version?: string;
30
+ }
31
+ export interface CreateRecipeRunnerOptions {
32
+ actionManifest: RecipeActionManifestDocument;
33
+ adapters: ActionAdapter[];
34
+ preconditions?: PreconditionChecker[];
35
+ logger?: RecipeLogger;
36
+ hud?: RecipeHudOptions | false;
37
+ runner?: RecipeRunnerProvenance;
38
+ }
39
+ export interface RecipeHudOptions {
40
+ enabled?: boolean;
41
+ title?: string;
42
+ display?: RecipeHudDisplayOptions;
43
+ }
44
+ export interface RecipeHudDisplayOptions {
45
+ layout?: 'bottom-bar' | 'docked-bottom' | 'card';
46
+ position?: 'bottom' | 'top' | 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
47
+ showTitle?: boolean;
48
+ /** Show node/action/proof metadata. Hidden by default because HUD copy is for humans, not trace/debug labels. */
49
+ showDebug?: boolean;
50
+ /** Show explicit composed subflow context. Hidden by default; use only when a parent/subgoal relationship helps the reviewer. */
51
+ showSubflow?: boolean;
52
+ /** Show authored detail as a second HUD line. Hidden by default because detail is trace/review metadata, not the current intent. */
53
+ showDetail?: boolean;
54
+ maxDetailLines?: number;
55
+ width?: string;
56
+ }
57
+ export interface ActionResult {
58
+ status?: RecipeRunStatus;
59
+ next?: string;
60
+ case?: string;
61
+ output?: unknown;
62
+ artifacts?: RecipeArtifactManifestEntry[];
63
+ }
64
+ export interface ActionExecutionContext {
65
+ nodeId: string;
66
+ recipe: unknown;
67
+ projectRoot: string;
68
+ artifactsDir: string;
69
+ env: Record<string, string | undefined>;
70
+ outputs: ReadonlyMap<string, unknown>;
71
+ getOutput(nodeId: string): unknown;
72
+ resolveProjectPath(relativePath: string): string;
73
+ resolveArtifactPath(relativePath: string): string;
74
+ registerArtifact(entry: RecipeArtifactManifestEntry): void;
75
+ logger: RecipeLogger;
76
+ }
77
+ export interface ActionAdapter {
78
+ action: string;
79
+ testOnly?: boolean;
80
+ execute(node: Record<string, unknown>, context: ActionExecutionContext): Promise<ActionResult>;
81
+ }
82
+ export interface RecipePreconditionGate {
83
+ id: string;
84
+ description?: string;
85
+ params?: Record<string, unknown>;
86
+ required?: boolean;
87
+ }
88
+ export interface PreconditionResult {
89
+ ok?: boolean;
90
+ output?: unknown;
91
+ failureKind?: string;
92
+ error?: string;
93
+ }
94
+ export interface PreconditionChecker {
95
+ id: string;
96
+ execute(gate: RecipePreconditionGate, context: ActionExecutionContext): Promise<PreconditionResult | boolean | undefined>;
97
+ }
98
+ export interface ArtifactWriter {
99
+ copyRecipe(recipe: unknown): Promise<string>;
100
+ register(entry: RecipeArtifactManifestEntry): void;
101
+ list(): RecipeArtifactManifestEntry[];
102
+ write(status: RecipeRunStatus, runner?: RecipeRunnerProvenance): Promise<string>;
103
+ }
104
+ export interface TraceEntry {
105
+ nodeId: string;
106
+ action: string;
107
+ phase?: string;
108
+ record?: unknown;
109
+ startedAt: string;
110
+ endedAt: string;
111
+ durationMs: number;
112
+ ok: boolean;
113
+ next?: string;
114
+ status?: RecipeRunStatus;
115
+ output?: unknown;
116
+ artifacts?: RecipeArtifactManifestEntry[];
117
+ error?: string;
118
+ }
119
+ export interface TraceWriter {
120
+ record(entry: TraceEntry): void;
121
+ list(): TraceEntry[];
122
+ write(): Promise<string>;
123
+ }
124
+ export interface SummaryDocument {
125
+ status: RecipeRunStatus;
126
+ total: number;
127
+ passed: number;
128
+ failed: number;
129
+ startedAt: string;
130
+ endedAt: string;
131
+ durationMs: number;
132
+ harness: {
133
+ name: '@farmslot/recipe-harness';
134
+ version: string;
135
+ runner_protocol_version: number;
136
+ action_registry_version: number;
137
+ };
138
+ runner?: RecipeRunnerProvenance;
139
+ }
140
+ export interface SummaryWriter {
141
+ write(summary: SummaryDocument): Promise<string>;
142
+ }
143
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { RecipeArtifactManifestEntry } from '@farmslot/protocol';
2
+ import type { ArtifactWriter, RecipeRunnerProvenance, RecipeRunStatus, SummaryDocument, SummaryWriter, TraceEntry, TraceWriter } from './types.js';
3
+ export declare class JsonArtifactWriter implements ArtifactWriter {
4
+ #private;
5
+ constructor(artifactsDir: string);
6
+ copyRecipe(recipe: unknown): Promise<string>;
7
+ register(entry: RecipeArtifactManifestEntry): void;
8
+ list(): RecipeArtifactManifestEntry[];
9
+ write(status: RecipeRunStatus, runner?: RecipeRunnerProvenance): Promise<string>;
10
+ }
11
+ export declare class JsonTraceWriter implements TraceWriter {
12
+ #private;
13
+ constructor(artifactsDir: string, runner?: RecipeRunnerProvenance);
14
+ record(entry: TraceEntry): void;
15
+ list(): TraceEntry[];
16
+ write(): Promise<string>;
17
+ }
18
+ export declare class JsonSummaryWriter implements SummaryWriter {
19
+ #private;
20
+ constructor(artifactsDir: string);
21
+ write(summary: SummaryDocument): Promise<string>;
22
+ }
23
+ //# sourceMappingURL=writers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writers.d.ts","sourceRoot":"","sources":["../src/writers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,kBAAmB,YAAW,cAAc;;gBAI3C,YAAY,EAAE,MAAM;IAI1B,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAYlD,QAAQ,CAAC,KAAK,EAAE,2BAA2B,GAAG,IAAI;IAMlD,IAAI,IAAI,2BAA2B,EAAE;IAI/B,KAAK,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;CAWvF;AAED,qBAAa,eAAgB,YAAW,WAAW;;gBAKrC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,sBAAsB;IAKjE,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAI/B,IAAI,IAAI,UAAU,EAAE;IAId,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAQ/B;AAED,qBAAa,iBAAkB,YAAW,aAAa;;gBAGzC,YAAY,EAAE,MAAM;IAI1B,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;CAKvD"}
@@ -0,0 +1,72 @@
1
+ import { mkdir } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { writeJsonFile } from './json.js';
4
+ export class JsonArtifactWriter {
5
+ #artifactsDir;
6
+ #entries = [];
7
+ constructor(artifactsDir) {
8
+ this.#artifactsDir = artifactsDir;
9
+ }
10
+ async copyRecipe(recipe) {
11
+ const recipePath = path.join(this.#artifactsDir, 'recipe.json');
12
+ await writeJsonFile(recipePath, recipe);
13
+ this.register({
14
+ path: 'recipe.json',
15
+ type: 'recipe',
16
+ label: 'Executed recipe',
17
+ category: 'system',
18
+ });
19
+ return recipePath;
20
+ }
21
+ register(entry) {
22
+ if (!this.#entries.some((existing) => existing.path === entry.path)) {
23
+ this.#entries.push(entry);
24
+ }
25
+ }
26
+ list() {
27
+ return [...this.#entries];
28
+ }
29
+ async write(status, runner) {
30
+ await mkdir(this.#artifactsDir, { recursive: true });
31
+ const manifestPath = path.join(this.#artifactsDir, 'artifact-manifest.json');
32
+ await writeJsonFile(manifestPath, {
33
+ version: 1,
34
+ runStatus: status,
35
+ ...(runner ? { provenance: { runner } } : {}),
36
+ artifacts: this.list(),
37
+ });
38
+ return manifestPath;
39
+ }
40
+ }
41
+ export class JsonTraceWriter {
42
+ #artifactsDir;
43
+ #entries = [];
44
+ #runner;
45
+ constructor(artifactsDir, runner) {
46
+ this.#artifactsDir = artifactsDir;
47
+ this.#runner = runner;
48
+ }
49
+ record(entry) {
50
+ this.#entries.push(entry);
51
+ }
52
+ list() {
53
+ return [...this.#entries];
54
+ }
55
+ async write() {
56
+ const tracePath = path.join(this.#artifactsDir, 'trace.json');
57
+ await writeJsonFile(tracePath, this.#runner ? { metadata: { runner: this.#runner }, entries: this.list() } : this.list());
58
+ return tracePath;
59
+ }
60
+ }
61
+ export class JsonSummaryWriter {
62
+ #artifactsDir;
63
+ constructor(artifactsDir) {
64
+ this.#artifactsDir = artifactsDir;
65
+ }
66
+ async write(summary) {
67
+ const summaryPath = path.join(this.#artifactsDir, 'summary.json');
68
+ await writeJsonFile(summaryPath, summary);
69
+ return summaryPath;
70
+ }
71
+ }
72
+ //# sourceMappingURL=writers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writers.js","sourceRoot":"","sources":["../src/writers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAW1C,MAAM,OAAO,kBAAkB;IACpB,aAAa,CAAS;IACtB,QAAQ,GAAkC,EAAE,CAAC;IAEtD,YAAY,YAAoB;QAC9B,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAe;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QAChE,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC;YACZ,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,iBAAiB;YACxB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,KAAkC;QACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAuB,EAAE,MAA+B;QAClE,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC;QAC7E,MAAM,aAAa,CAAC,YAAY,EAAE;YAChC,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,MAAM;YACjB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE;SACvB,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IACjB,aAAa,CAAS;IACtB,QAAQ,GAAiB,EAAE,CAAC;IAC5B,OAAO,CAAqC;IAErD,YAAY,YAAoB,EAAE,MAA+B;QAC/D,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAiB;QACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAC9D,MAAM,aAAa,CACjB,SAAS,EACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAC1F,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,iBAAiB;IACnB,aAAa,CAAS;IAE/B,YAAY,YAAoB;QAC9B,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAwB;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAClE,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,WAAW,CAAC;IACrB,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@farmslot/recipe-harness",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "farmslot-recipe": "./bin/farmslot-recipe.mjs"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "default": "./dist/index.js"
15
+ },
16
+ "./*.js": {
17
+ "types": "./dist/*.d.ts",
18
+ "import": "./dist/*.js",
19
+ "default": "./dist/*.js"
20
+ },
21
+ "./*": {
22
+ "types": "./dist/*.d.ts",
23
+ "import": "./dist/*.js",
24
+ "default": "./dist/*.js"
25
+ }
26
+ },
27
+ "scripts": {
28
+ "typecheck": "tsc --noEmit --project tsconfig.json",
29
+ "test": "tsx src/recipe-harness.test.ts",
30
+ "format": "prettier --write --ignore-path ../../.prettierignore .",
31
+ "format:check": "prettier --check --ignore-path ../../.prettierignore .",
32
+ "lint": "eslint \"src/**/*.ts\"",
33
+ "lint:fix": "eslint \"src/**/*.ts\" --fix",
34
+ "quality": "prettier --check --ignore-path ../../.prettierignore . && eslint \"src/**/*.ts\" && tsc --noEmit --project tsconfig.json && yarn build && yarn test",
35
+ "build": "yarn workspace @farmslot/protocol build && rm -rf dist && tsc --project tsconfig.build.json",
36
+ "prepack": "yarn build"
37
+ },
38
+ "dependencies": {
39
+ "@farmslot/protocol": "0.5.0",
40
+ "commander": "^12.0.0",
41
+ "ws": "^8.18.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^22.0.0",
45
+ "@types/ws": "^8.5.12",
46
+ "eslint": "^10.3.0",
47
+ "prettier": "^3.8.3",
48
+ "tsx": "^4.19.0",
49
+ "typescript": "^5.6.0"
50
+ },
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "git+https://github.com/deeeed/farmslot.git",
54
+ "directory": "packages/recipe-harness"
55
+ },
56
+ "bugs": {
57
+ "url": "https://github.com/deeeed/farmslot/issues"
58
+ },
59
+ "license": "MIT",
60
+ "homepage": "https://farmslot.io/docs/architecture/recipe-harness",
61
+ "keywords": [
62
+ "farmslot",
63
+ "recipe-harness",
64
+ "recipe-runner",
65
+ "validation",
66
+ "agentic-engineering"
67
+ ],
68
+ "files": [
69
+ "README.md",
70
+ "bin/**/*.mjs",
71
+ "dist/**/*.js",
72
+ "dist/**/*.d.ts",
73
+ "dist/**/*.d.ts.map",
74
+ "dist/**/*.js.map"
75
+ ],
76
+ "publishConfig": {
77
+ "access": "public"
78
+ }
79
+ }