@workplane/adapter-harness 0.3.1

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.
@@ -0,0 +1,25 @@
1
+ export { captureGitDiff, createTaskBranch, defaultTaskBranchName, repoPath } from '@workplane/core';
2
+ import { WorkAdapter } from '@workplane/adapter-sdk';
3
+
4
+ interface HarnessPayload {
5
+ prompt: string;
6
+ model?: string;
7
+ testCommand?: string;
8
+ branch?: string;
9
+ taskBranch?: string;
10
+ extraArgs?: string[];
11
+ interactive?: boolean;
12
+ }
13
+ interface HarnessAdapterOptions {
14
+ name: string;
15
+ kind: string;
16
+ binary: string | (() => string);
17
+ interactive?: boolean;
18
+ terminalMode?: "stdio" | "pty";
19
+ defaultArgs?: string[];
20
+ buildArgs?: (payload: HarnessPayload) => string[];
21
+ buildInteractiveArgs?: (payload: HarnessPayload) => string[];
22
+ }
23
+ declare function createHarnessAdapter(options: HarnessAdapterOptions): WorkAdapter<HarnessPayload>;
24
+
25
+ export { type HarnessAdapterOptions, type HarnessPayload, createHarnessAdapter };
package/dist/index.js ADDED
@@ -0,0 +1,69 @@
1
+ // src/index.ts
2
+ import { join } from "path";
3
+ import {
4
+ captureGitDiff,
5
+ createTaskBranch,
6
+ defaultTaskBranchName,
7
+ repoPath
8
+ } from "@workplane/core";
9
+ function resolveBinary(binary) {
10
+ return typeof binary === "function" ? binary() : binary;
11
+ }
12
+ function createHarnessAdapter(options) {
13
+ return {
14
+ name: options.name,
15
+ kind: options.kind,
16
+ interactive: options.interactive,
17
+ terminalMode: options.terminalMode,
18
+ async run(context, payload) {
19
+ const cwd = repoPath(context.workspacePath);
20
+ const branchName = payload.taskBranch ?? defaultTaskBranchName(context.runId);
21
+ await createTaskBranch(context, branchName);
22
+ const binary = resolveBinary(options.binary);
23
+ if (payload.interactive && options.buildInteractiveArgs) {
24
+ const interactiveArgs = options.buildInteractiveArgs(payload);
25
+ const execPromise = context.exec(binary, interactiveArgs, { cwd });
26
+ await new Promise((resolve) => setTimeout(resolve, 300));
27
+ context.writeStdin?.(payload.prompt + "\n");
28
+ const result2 = await execPromise;
29
+ if (result2.exitCode !== 0) {
30
+ throw new Error(`${binary} failed with exit code ${result2.exitCode}`);
31
+ }
32
+ await captureGitDiff(context, options.name);
33
+ return;
34
+ }
35
+ const extra = payload.extraArgs ?? options.defaultArgs ?? [];
36
+ const promptArgs = options.buildArgs ? options.buildArgs(payload) : [...extra, payload.prompt];
37
+ const result = await context.exec(binary, promptArgs, { cwd });
38
+ if (result.exitCode !== 0) {
39
+ throw new Error(`${binary} failed with exit code ${result.exitCode}`);
40
+ }
41
+ await captureGitDiff(context, options.name);
42
+ if (payload.testCommand) {
43
+ await context.log("system", `running test command: ${payload.testCommand}`, "run-tests");
44
+ const testResult = await context.exec("/bin/sh", ["-lc", payload.testCommand], { cwd });
45
+ const testArtifactPath = join(await context.ensureWorkspace("artifacts"), "test-output.txt");
46
+ const { writeFile } = await import("fs/promises");
47
+ await writeFile(testArtifactPath, `${testResult.stdout}
48
+ ${testResult.stderr}`, "utf8");
49
+ await context.emitArtifact({
50
+ type: "test.output",
51
+ name: "test-output.txt",
52
+ path: testArtifactPath,
53
+ metadata: { exitCode: testResult.exitCode }
54
+ });
55
+ if (testResult.exitCode !== 0) {
56
+ throw new Error(`test command failed with exit code ${testResult.exitCode}`);
57
+ }
58
+ }
59
+ }
60
+ };
61
+ }
62
+ export {
63
+ captureGitDiff,
64
+ createHarnessAdapter,
65
+ createTaskBranch,
66
+ defaultTaskBranchName,
67
+ repoPath
68
+ };
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport {\n captureGitDiff,\n createTaskBranch,\n defaultTaskBranchName,\n repoPath,\n type GitExecContext,\n} from \"@workplane/core\";\nimport type { WorkAdapter } from \"@workplane/adapter-sdk\";\n\nexport interface HarnessPayload {\n prompt: string;\n model?: string;\n testCommand?: string;\n branch?: string;\n taskBranch?: string;\n extraArgs?: string[];\n interactive?: boolean;\n}\n\nexport interface HarnessAdapterOptions {\n name: string;\n kind: string;\n binary: string | (() => string);\n interactive?: boolean;\n terminalMode?: \"stdio\" | \"pty\";\n defaultArgs?: string[];\n buildArgs?: (payload: HarnessPayload) => string[];\n buildInteractiveArgs?: (payload: HarnessPayload) => string[];\n}\n\nfunction resolveBinary(binary: string | (() => string)): string {\n return typeof binary === \"function\" ? binary() : binary;\n}\n\nexport function createHarnessAdapter(options: HarnessAdapterOptions): WorkAdapter<HarnessPayload> {\n return {\n name: options.name,\n kind: options.kind,\n interactive: options.interactive,\n terminalMode: options.terminalMode,\n async run(context, payload) {\n const cwd = repoPath(context.workspacePath);\n const branchName = payload.taskBranch ?? defaultTaskBranchName(context.runId);\n await createTaskBranch(context as GitExecContext, branchName);\n\n const binary = resolveBinary(options.binary);\n\n if (payload.interactive && options.buildInteractiveArgs) {\n const interactiveArgs = options.buildInteractiveArgs(payload);\n const execPromise = context.exec(binary, interactiveArgs, { cwd });\n await new Promise<void>((resolve) => setTimeout(resolve, 300));\n context.writeStdin?.(payload.prompt + \"\\n\");\n const result = await execPromise;\n if (result.exitCode !== 0) {\n throw new Error(`${binary} failed with exit code ${result.exitCode}`);\n }\n await captureGitDiff(context as GitExecContext, options.name);\n return;\n }\n\n const extra = payload.extraArgs ?? options.defaultArgs ?? [];\n const promptArgs = options.buildArgs ? options.buildArgs(payload) : [...extra, payload.prompt];\n const result = await context.exec(binary, promptArgs, { cwd });\n if (result.exitCode !== 0) {\n throw new Error(`${binary} failed with exit code ${result.exitCode}`);\n }\n\n await captureGitDiff(context as GitExecContext, options.name);\n\n if (payload.testCommand) {\n await context.log(\"system\", `running test command: ${payload.testCommand}`, \"run-tests\");\n const testResult = await context.exec(\"/bin/sh\", [\"-lc\", payload.testCommand], { cwd });\n const testArtifactPath = join(await context.ensureWorkspace(\"artifacts\"), \"test-output.txt\");\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(testArtifactPath, `${testResult.stdout}\\n${testResult.stderr}`, \"utf8\");\n await context.emitArtifact({\n type: \"test.output\",\n name: \"test-output.txt\",\n path: testArtifactPath,\n metadata: { exitCode: testResult.exitCode },\n });\n if (testResult.exitCode !== 0) {\n throw new Error(`test command failed with exit code ${testResult.exitCode}`);\n }\n }\n },\n };\n}\n\nexport { captureGitDiff, createTaskBranch, defaultTaskBranchName, repoPath };\n"],"mappings":";AAAA,SAAS,YAAY;AACrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAwBP,SAAS,cAAc,QAAyC;AAC9D,SAAO,OAAO,WAAW,aAAa,OAAO,IAAI;AACnD;AAEO,SAAS,qBAAqB,SAA6D;AAChG,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,IACrB,cAAc,QAAQ;AAAA,IACtB,MAAM,IAAI,SAAS,SAAS;AAC1B,YAAM,MAAM,SAAS,QAAQ,aAAa;AAC1C,YAAM,aAAa,QAAQ,cAAc,sBAAsB,QAAQ,KAAK;AAC5E,YAAM,iBAAiB,SAA2B,UAAU;AAE5D,YAAM,SAAS,cAAc,QAAQ,MAAM;AAE3C,UAAI,QAAQ,eAAe,QAAQ,sBAAsB;AACvD,cAAM,kBAAkB,QAAQ,qBAAqB,OAAO;AAC5D,cAAM,cAAc,QAAQ,KAAK,QAAQ,iBAAiB,EAAE,IAAI,CAAC;AACjE,cAAM,IAAI,QAAc,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAC7D,gBAAQ,aAAa,QAAQ,SAAS,IAAI;AAC1C,cAAMA,UAAS,MAAM;AACrB,YAAIA,QAAO,aAAa,GAAG;AACzB,gBAAM,IAAI,MAAM,GAAG,MAAM,0BAA0BA,QAAO,QAAQ,EAAE;AAAA,QACtE;AACA,cAAM,eAAe,SAA2B,QAAQ,IAAI;AAC5D;AAAA,MACF;AAEA,YAAM,QAAQ,QAAQ,aAAa,QAAQ,eAAe,CAAC;AAC3D,YAAM,aAAa,QAAQ,YAAY,QAAQ,UAAU,OAAO,IAAI,CAAC,GAAG,OAAO,QAAQ,MAAM;AAC7F,YAAM,SAAS,MAAM,QAAQ,KAAK,QAAQ,YAAY,EAAE,IAAI,CAAC;AAC7D,UAAI,OAAO,aAAa,GAAG;AACzB,cAAM,IAAI,MAAM,GAAG,MAAM,0BAA0B,OAAO,QAAQ,EAAE;AAAA,MACtE;AAEA,YAAM,eAAe,SAA2B,QAAQ,IAAI;AAE5D,UAAI,QAAQ,aAAa;AACvB,cAAM,QAAQ,IAAI,UAAU,yBAAyB,QAAQ,WAAW,IAAI,WAAW;AACvF,cAAM,aAAa,MAAM,QAAQ,KAAK,WAAW,CAAC,OAAO,QAAQ,WAAW,GAAG,EAAE,IAAI,CAAC;AACtF,cAAM,mBAAmB,KAAK,MAAM,QAAQ,gBAAgB,WAAW,GAAG,iBAAiB;AAC3F,cAAM,EAAE,UAAU,IAAI,MAAM,OAAO,aAAkB;AACrD,cAAM,UAAU,kBAAkB,GAAG,WAAW,MAAM;AAAA,EAAK,WAAW,MAAM,IAAI,MAAM;AACtF,cAAM,QAAQ,aAAa;AAAA,UACzB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,UAAU,EAAE,UAAU,WAAW,SAAS;AAAA,QAC5C,CAAC;AACD,YAAI,WAAW,aAAa,GAAG;AAC7B,gBAAM,IAAI,MAAM,sCAAsC,WAAW,QAAQ,EAAE;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":["result"]}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@workplane/adapter-harness",
3
+ "version": "0.3.1",
4
+ "private": false,
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/MindStaq/workplane.git"
10
+ },
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.js",
16
+ "types": "./dist/index.d.ts"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md"
22
+ ],
23
+ "sideEffects": false,
24
+ "publishConfig": {
25
+ "access": "public",
26
+ "registry": "https://registry.npmjs.org/"
27
+ },
28
+ "dependencies": {
29
+ "@workplane/adapter-sdk": "0.3.1",
30
+ "@workplane/core": "0.3.1"
31
+ },
32
+ "scripts": {
33
+ "build": "tsup"
34
+ }
35
+ }