agentic-engineering-harness 0.4.16
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/LICENSE +201 -0
- package/README.md +273 -0
- package/dist/agents/audit.d.ts +12 -0
- package/dist/agents/audit.js +14 -0
- package/dist/agents/audit.js.map +1 -0
- package/dist/agents/compiler.d.ts +8 -0
- package/dist/agents/compiler.js +103 -0
- package/dist/agents/compiler.js.map +1 -0
- package/dist/agents/config.d.ts +6 -0
- package/dist/agents/config.js +161 -0
- package/dist/agents/config.js.map +1 -0
- package/dist/agents/escalation.d.ts +9 -0
- package/dist/agents/escalation.js +75 -0
- package/dist/agents/escalation.js.map +1 -0
- package/dist/agents/exceptionDetection.d.ts +24 -0
- package/dist/agents/exceptionDetection.js +42 -0
- package/dist/agents/exceptionDetection.js.map +1 -0
- package/dist/agents/findings.d.ts +14 -0
- package/dist/agents/findings.js +40 -0
- package/dist/agents/findings.js.map +1 -0
- package/dist/agents/gitCheckpoint.d.ts +6 -0
- package/dist/agents/gitCheckpoint.js +61 -0
- package/dist/agents/gitCheckpoint.js.map +1 -0
- package/dist/agents/jsonc.d.ts +1 -0
- package/dist/agents/jsonc.js +42 -0
- package/dist/agents/jsonc.js.map +1 -0
- package/dist/agents/outputContracts.d.ts +161 -0
- package/dist/agents/outputContracts.js +16 -0
- package/dist/agents/outputContracts.js.map +1 -0
- package/dist/agents/parallelism.d.ts +14 -0
- package/dist/agents/parallelism.js +54 -0
- package/dist/agents/parallelism.js.map +1 -0
- package/dist/agents/permissions.d.ts +5 -0
- package/dist/agents/permissions.js +30 -0
- package/dist/agents/permissions.js.map +1 -0
- package/dist/agents/qualityConvergence.d.ts +44 -0
- package/dist/agents/qualityConvergence.js +77 -0
- package/dist/agents/qualityConvergence.js.map +1 -0
- package/dist/agents/recovery.d.ts +13 -0
- package/dist/agents/recovery.js +35 -0
- package/dist/agents/recovery.js.map +1 -0
- package/dist/agents/reviewLifecycle.d.ts +30 -0
- package/dist/agents/reviewLifecycle.js +233 -0
- package/dist/agents/reviewLifecycle.js.map +1 -0
- package/dist/agents/routing.d.ts +9 -0
- package/dist/agents/routing.js +37 -0
- package/dist/agents/routing.js.map +1 -0
- package/dist/agents/structuredOutput.d.ts +1 -0
- package/dist/agents/structuredOutput.js +54 -0
- package/dist/agents/structuredOutput.js.map +1 -0
- package/dist/agents/types.d.ts +207 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +221 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +3 -0
- package/dist/core/config.js +59 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/doctor.d.ts +8 -0
- package/dist/core/doctor.js +59 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/git.d.ts +8 -0
- package/dist/core/git.js +47 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/init.d.ts +1 -0
- package/dist/core/init.js +52 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/quick.d.ts +20 -0
- package/dist/core/quick.js +49 -0
- package/dist/core/quick.js.map +1 -0
- package/dist/core/repair.d.ts +8 -0
- package/dist/core/repair.js +7 -0
- package/dist/core/repair.js.map +1 -0
- package/dist/core/run.d.ts +38 -0
- package/dist/core/run.js +165 -0
- package/dist/core/run.js.map +1 -0
- package/dist/core/sdd.d.ts +10 -0
- package/dist/core/sdd.js +88 -0
- package/dist/core/sdd.js.map +1 -0
- package/dist/core/seal.d.ts +3 -0
- package/dist/core/seal.js +74 -0
- package/dist/core/seal.js.map +1 -0
- package/dist/core/triage.d.ts +22 -0
- package/dist/core/triage.js +38 -0
- package/dist/core/triage.js.map +1 -0
- package/dist/core/types.d.ts +354 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/verify.d.ts +6 -0
- package/dist/core/verify.js +51 -0
- package/dist/core/verify.js.map +1 -0
- package/dist/delivery/finalize.d.ts +17 -0
- package/dist/delivery/finalize.js +71 -0
- package/dist/delivery/finalize.js.map +1 -0
- package/dist/delivery/handoff.d.ts +39 -0
- package/dist/delivery/handoff.js +250 -0
- package/dist/delivery/handoff.js.map +1 -0
- package/dist/entry.d.ts +2 -0
- package/dist/entry.js +112 -0
- package/dist/entry.js.map +1 -0
- package/dist/evals/runner.d.ts +4 -0
- package/dist/evals/runner.js +112 -0
- package/dist/evals/runner.js.map +1 -0
- package/dist/evals/scoring.d.ts +3 -0
- package/dist/evals/scoring.js +41 -0
- package/dist/evals/scoring.js.map +1 -0
- package/dist/evals/types.d.ts +46 -0
- package/dist/evals/types.js +2 -0
- package/dist/evals/types.js.map +1 -0
- package/dist/issues/intake.d.ts +114 -0
- package/dist/issues/intake.js +213 -0
- package/dist/issues/intake.js.map +1 -0
- package/dist/memory/benchmark.d.ts +33 -0
- package/dist/memory/benchmark.js +69 -0
- package/dist/memory/benchmark.js.map +1 -0
- package/dist/metrics/runMetrics.d.ts +9 -0
- package/dist/metrics/runMetrics.js +34 -0
- package/dist/metrics/runMetrics.js.map +1 -0
- package/dist/metrics/usage.d.ts +3 -0
- package/dist/metrics/usage.js +53 -0
- package/dist/metrics/usage.js.map +1 -0
- package/dist/provenance/generate.d.ts +30 -0
- package/dist/provenance/generate.js +96 -0
- package/dist/provenance/generate.js.map +1 -0
- package/dist/providers/engram.d.ts +8 -0
- package/dist/providers/engram.js +14 -0
- package/dist/providers/engram.js.map +1 -0
- package/dist/providers/graphify.d.ts +9 -0
- package/dist/providers/graphify.js +28 -0
- package/dist/providers/graphify.js.map +1 -0
- package/dist/providers/paseo.d.ts +8 -0
- package/dist/providers/paseo.js +14 -0
- package/dist/providers/paseo.js.map +1 -0
- package/dist/providers/types.d.ts +41 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/telemetry/events.d.ts +2 -0
- package/dist/telemetry/events.js +29 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/otlp.d.ts +3 -0
- package/dist/telemetry/otlp.js +57 -0
- package/dist/telemetry/otlp.js.map +1 -0
- package/dist/toolchain/config.d.ts +10 -0
- package/dist/toolchain/config.js +54 -0
- package/dist/toolchain/config.js.map +1 -0
- package/dist/toolchain/doctor.d.ts +8 -0
- package/dist/toolchain/doctor.js +56 -0
- package/dist/toolchain/doctor.js.map +1 -0
- package/dist/toolchain/mise.d.ts +10 -0
- package/dist/toolchain/mise.js +61 -0
- package/dist/toolchain/mise.js.map +1 -0
- package/dist/toolchain/resolve.d.ts +8 -0
- package/dist/toolchain/resolve.js +159 -0
- package/dist/toolchain/resolve.js.map +1 -0
- package/dist/toolchain/setup.d.ts +7 -0
- package/dist/toolchain/setup.js +141 -0
- package/dist/toolchain/setup.js.map +1 -0
- package/dist/toolchain/types.d.ts +95 -0
- package/dist/toolchain/types.js +2 -0
- package/dist/toolchain/types.js.map +1 -0
- package/dist/utils/process.d.ts +15 -0
- package/dist/utils/process.js +94 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/validators/commands.d.ts +2 -0
- package/dist/validators/commands.js +28 -0
- package/dist/validators/commands.js.map +1 -0
- package/dist/validators/constraints.d.ts +6 -0
- package/dist/validators/constraints.js +30 -0
- package/dist/validators/constraints.js.map +1 -0
- package/dist/validators/diffScope.d.ts +2 -0
- package/dist/validators/diffScope.js +36 -0
- package/dist/validators/diffScope.js.map +1 -0
- package/dist/validators/evidence.d.ts +6 -0
- package/dist/validators/evidence.js +8 -0
- package/dist/validators/evidence.js.map +1 -0
- package/dist/validators/external.d.ts +3 -0
- package/dist/validators/external.js +22 -0
- package/dist/validators/external.js.map +1 -0
- package/dist/validators/gherkin.d.ts +3 -0
- package/dist/validators/gherkin.js +59 -0
- package/dist/validators/gherkin.js.map +1 -0
- package/dist/validators/graphify.d.ts +4 -0
- package/dist/validators/graphify.js +108 -0
- package/dist/validators/graphify.js.map +1 -0
- package/dist/validators/opa.d.ts +3 -0
- package/dist/validators/opa.js +43 -0
- package/dist/validators/opa.js.map +1 -0
- package/dist/validators/openapi.d.ts +25 -0
- package/dist/validators/openapi.js +98 -0
- package/dist/validators/openapi.js.map +1 -0
- package/dist/validators/registry.d.ts +2 -0
- package/dist/validators/registry.js +36 -0
- package/dist/validators/registry.js.map +1 -0
- package/dist/validators/toolCommand.d.ts +5 -0
- package/dist/validators/toolCommand.js +33 -0
- package/dist/validators/toolCommand.js.map +1 -0
- package/dist/validators/types.d.ts +13 -0
- package/dist/validators/types.js +2 -0
- package/dist/validators/types.js.map +1 -0
- package/dist/workers/agentPrompt.d.ts +3 -0
- package/dist/workers/agentPrompt.js +84 -0
- package/dist/workers/agentPrompt.js.map +1 -0
- package/dist/workers/direct.d.ts +13 -0
- package/dist/workers/direct.js +30 -0
- package/dist/workers/direct.js.map +1 -0
- package/dist/workers/factory.d.ts +4 -0
- package/dist/workers/factory.js +10 -0
- package/dist/workers/factory.js.map +1 -0
- package/dist/workers/paseo.d.ts +14 -0
- package/dist/workers/paseo.js +29 -0
- package/dist/workers/paseo.js.map +1 -0
- package/dist/workers/podman.d.ts +13 -0
- package/dist/workers/podman.js +22 -0
- package/dist/workers/podman.js.map +1 -0
- package/dist/workers/prompt.d.ts +4 -0
- package/dist/workers/prompt.js +4 -0
- package/dist/workers/prompt.js.map +1 -0
- package/dist/workers/types.d.ts +11 -0
- package/dist/workers/types.js +2 -0
- package/dist/workers/types.js.map +1 -0
- package/docs/ARCHITECTURE.md +47 -0
- package/docs/EVALS.md +28 -0
- package/docs/MEMORY.md +28 -0
- package/docs/OBSERVABILITY.md +18 -0
- package/docs/OSS_STACK.md +27 -0
- package/docs/PASEO.md +9 -0
- package/docs/PUBLISHING.md +110 -0
- package/docs/SDD.md +35 -0
- package/docs/SECURITY.md +21 -0
- package/docs/V0.2.md +42 -0
- package/docs/V0.3.md +40 -0
- package/docs/V0.4.11.md +30 -0
- package/docs/V0.4.12.md +88 -0
- package/docs/V0.4.13.md +203 -0
- package/docs/V0.4.14.md +209 -0
- package/docs/V0.4.15.md +365 -0
- package/docs/V0.4.16.md +229 -0
- package/docs/V0.4.md +28 -0
- package/docs/VALIDATION.md +23 -0
- package/package.json +18 -0
- package/policies/core/dependency-policy.rego +12 -0
- package/policies/core/schema-policy.rego +12 -0
- package/policies/core/trust-boundary.rego +17 -0
- package/presets/agents/default.jsonc +80 -0
- package/presets/docker.yaml +4 -0
- package/presets/dotnet.yaml +12 -0
- package/presets/expo.yaml +6 -0
- package/presets/generic.yaml +3 -0
- package/presets/nextjs.yaml +8 -0
- package/presets/node.yaml +6 -0
- package/presets/pnpm.yaml +6 -0
- package/presets/postgres.yaml +4 -0
- package/schemas/agent-output-planner.schema.json +1 -0
- package/schemas/agent-topology.schema.json +37 -0
- package/schemas/project.schema.json +36 -0
- package/schemas/quick-contract.schema.json +17 -0
- package/schemas/task-contract.schema.json +18 -0
- package/schemas/toolchain.schema.json +70 -0
- package/schemas/validation-report.schema.json +15 -0
- package/skills/acceptance-traceability/SKILL.md +13 -0
- package/skills/deterministic-validation/SKILL.md +15 -0
- package/skills/engineering-workflow/SKILL.md +108 -0
- package/skills/finding-dedup/SKILL.md +12 -0
- package/skills/github-delivery-lifecycle/SKILL.md +16 -0
- package/skills/implementation-worker/SKILL.md +17 -0
- package/skills/lead-engineer/SKILL.md +30 -0
- package/skills/memory-hygiene/SKILL.md +22 -0
- package/skills/prompt-drift-audit/SKILL.md +10 -0
- package/skills/recovery-classifier/SKILL.md +13 -0
- package/skills/routing-normalizer/SKILL.md +17 -0
- package/skills/sdd/SKILL.md +21 -0
- package/skills/simplify/SKILL.md +16 -0
- package/skills/verification-planning/SKILL.md +17 -0
- package/skills/worktree-lifecycle/SKILL.md +18 -0
- package/templates/AGENTS.md +37 -0
- package/templates/agents.source.jsonc +39 -0
- package/templates/otel-collector.yaml +21 -0
- package/templates/project.yaml +196 -0
- package/templates/toolchain.yaml +127 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getOriginRemote } from "../core/git.js";
|
|
4
|
+
import { loadTaskContract } from "../core/config.js";
|
|
5
|
+
import { validateQuickTaskContract } from "../core/quick.js";
|
|
6
|
+
import { validateSddChange } from "../core/sdd.js";
|
|
7
|
+
import { verifyTaskSeal } from "../core/seal.js";
|
|
8
|
+
import { runProcess } from "../utils/process.js";
|
|
9
|
+
export async function handoffTask(root, config, taskId) {
|
|
10
|
+
const contract = await loadTaskContract(root, taskId, config);
|
|
11
|
+
if (contract.mode === "quick") {
|
|
12
|
+
const validation = validateQuickTaskContract(config, contract);
|
|
13
|
+
if (!validation.ok)
|
|
14
|
+
throw new Error(`Cannot hand off ${taskId}: QuickContract validation failed: ${validation.issues.join("; ")}`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
const validation = await validateSddChange(root, taskId, config);
|
|
18
|
+
if (!validation.ok)
|
|
19
|
+
throw new Error(`Cannot hand off ${taskId}: SDD validation failed: ${[...validation.missing, ...validation.issues].join("; ")}`);
|
|
20
|
+
}
|
|
21
|
+
await assertHandoffReady(root, contract);
|
|
22
|
+
if (config.validation?.requireSeal !== false) {
|
|
23
|
+
const seal = await verifyTaskSeal(root, contract, true);
|
|
24
|
+
if (seal.status !== "PASS")
|
|
25
|
+
throw new Error(`Cannot hand off ${taskId}: ${seal.message}`);
|
|
26
|
+
}
|
|
27
|
+
const originatingBranch = contract.git?.originatingBranch ?? contract.git?.baseRef ?? config.validation?.baseRef ?? "main";
|
|
28
|
+
let record = await loadDeliveryRecord(root, config, taskId) ?? { version: 1, taskId, status: "initialized", createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), originatingBranch };
|
|
29
|
+
const github = config.delivery?.github;
|
|
30
|
+
if (github?.enabled) {
|
|
31
|
+
const token = resolveGithubToken(github.tokenEnv);
|
|
32
|
+
const repository = record.github?.repository ?? github.repository ?? await inferGithubRepository(root);
|
|
33
|
+
const apiBase = (github.apiBaseUrl ?? "https://api.github.com").replace(/\/$/, "");
|
|
34
|
+
record.github = { repository, ...(record.github ?? {}) };
|
|
35
|
+
await saveDeliveryRecord(root, config, record);
|
|
36
|
+
if (!record.github.issueNumber) {
|
|
37
|
+
const body = await renderIssueBody(root, contract, originatingBranch);
|
|
38
|
+
const assignees = [];
|
|
39
|
+
if (github.assignTokenOwner !== false)
|
|
40
|
+
assignees.push((await githubRequest(apiBase, token, "/user")).login);
|
|
41
|
+
const issue = await githubRequest(apiBase, token, `/repos/${repository}/issues`, { method: "POST", body: JSON.stringify({ title: `${contract.task.id}: ${contract.task.title}`, body, labels: github.labels ?? [], assignees }) });
|
|
42
|
+
record.github.issueNumber = issue.number;
|
|
43
|
+
record.github.issueUrl = issue.html_url;
|
|
44
|
+
record.status = "issue-created";
|
|
45
|
+
record.updatedAt = new Date().toISOString();
|
|
46
|
+
await saveDeliveryRecord(root, config, record);
|
|
47
|
+
}
|
|
48
|
+
if (!record.github.branch) {
|
|
49
|
+
const branch = renderPattern(github.branchPattern ?? "feature/gh-{issue}-{slug}", contract, record.github.issueNumber);
|
|
50
|
+
const existing = await githubRequestMaybe(apiBase, token, `/repos/${repository}/git/ref/heads/${encodeRef(branch)}`);
|
|
51
|
+
if (existing) {
|
|
52
|
+
record.github.branch = branch;
|
|
53
|
+
record.github.branchSha = existing.object.sha;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const baseRef = await githubRequest(apiBase, token, `/repos/${repository}/git/ref/heads/${encodeRef(originatingBranch)}`);
|
|
57
|
+
await githubRequest(apiBase, token, `/repos/${repository}/git/refs`, { method: "POST", body: JSON.stringify({ ref: `refs/heads/${branch}`, sha: baseRef.object.sha }) });
|
|
58
|
+
record.github.branch = branch;
|
|
59
|
+
record.github.branchSha = baseRef.object.sha;
|
|
60
|
+
}
|
|
61
|
+
record.status = "branch-created";
|
|
62
|
+
record.updatedAt = new Date().toISOString();
|
|
63
|
+
await saveDeliveryRecord(root, config, record);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const paseo = config.delivery?.paseo;
|
|
67
|
+
if (paseo?.enabled && paseo.createWorkspace !== false) {
|
|
68
|
+
if (record.paseo?.worktreePath && !(await exists(record.paseo.worktreePath)))
|
|
69
|
+
record.paseo = undefined;
|
|
70
|
+
if (!record.paseo?.workspaceId) {
|
|
71
|
+
const issue = record.github?.issueNumber;
|
|
72
|
+
const slug = renderPattern(paseo.worktreeSlugPattern ?? "gh-{issue}-{slug}", contract, issue);
|
|
73
|
+
const remoteBranch = record.github?.branch;
|
|
74
|
+
const localIssueBranch = issue ? renderPattern(github?.branchPattern ?? "feature/gh-{issue}-{slug}", contract, issue) : renderPattern("aeh-{task}-{slug}", contract, issue);
|
|
75
|
+
const workspace = remoteBranch ? await createCheckoutWorkspace(root, remoteBranch, slug, taskId) : await createBranchOffWorkspace(root, originatingBranch, localIssueBranch, slug, taskId);
|
|
76
|
+
if (!workspace.worktreePath)
|
|
77
|
+
throw new Error("Paseo workspace did not expose a worktree path; task context cannot be materialized safely.");
|
|
78
|
+
await materializeTaskContext(root, workspace.worktreePath, config, contract);
|
|
79
|
+
record.paseo = workspace;
|
|
80
|
+
record.status = "workspace-created";
|
|
81
|
+
record.updatedAt = new Date().toISOString();
|
|
82
|
+
await saveDeliveryRecord(root, config, record);
|
|
83
|
+
}
|
|
84
|
+
else if (record.paseo.worktreePath)
|
|
85
|
+
await materializeTaskContext(root, record.paseo.worktreePath, config, contract);
|
|
86
|
+
}
|
|
87
|
+
record.status = "ready";
|
|
88
|
+
record.updatedAt = new Date().toISOString();
|
|
89
|
+
await saveDeliveryRecord(root, config, record);
|
|
90
|
+
return record;
|
|
91
|
+
}
|
|
92
|
+
export async function handoffSdd(root, config, taskId) { return handoffTask(root, config, taskId); }
|
|
93
|
+
export async function seedDeliveryRecordFromIssue(root, config, contract, issue) {
|
|
94
|
+
const originatingBranch = contract.git?.originatingBranch ?? contract.git?.baseRef ?? config.validation?.baseRef ?? "main";
|
|
95
|
+
const existing = await loadDeliveryRecord(root, config, contract.task.id);
|
|
96
|
+
if (existing?.github?.issueNumber && existing.github.issueNumber !== issue.issueNumber)
|
|
97
|
+
throw new Error(`Delivery record ${contract.task.id} is already bound to GitHub issue #${existing.github.issueNumber}.`);
|
|
98
|
+
if (existing?.github?.repository && existing.github.repository !== issue.repository)
|
|
99
|
+
throw new Error(`Delivery record ${contract.task.id} is already bound to ${existing.github.repository}.`);
|
|
100
|
+
const now = new Date().toISOString();
|
|
101
|
+
const record = existing ?? { version: 1, taskId: contract.task.id, status: "initialized", createdAt: now, updatedAt: now, originatingBranch };
|
|
102
|
+
record.github = { repository: issue.repository, issueNumber: issue.issueNumber, issueUrl: issue.issueUrl, ...(record.github ?? {}) };
|
|
103
|
+
if (record.status === "initialized")
|
|
104
|
+
record.status = "issue-created";
|
|
105
|
+
record.updatedAt = now;
|
|
106
|
+
await saveDeliveryRecord(root, config, record);
|
|
107
|
+
return record;
|
|
108
|
+
}
|
|
109
|
+
export async function assertHandoffReady(root, contract) {
|
|
110
|
+
const placeholders = [];
|
|
111
|
+
for (const kind of ["proposal", "spec", "design", "tasks", "acceptance"]) {
|
|
112
|
+
const relative = contract.source?.[kind];
|
|
113
|
+
if (!relative)
|
|
114
|
+
continue;
|
|
115
|
+
const content = await fs.readFile(path.resolve(root, relative), "utf8");
|
|
116
|
+
if (/\bTODO\b|TODO observable|TODO business rule/i.test(content))
|
|
117
|
+
placeholders.push(kind);
|
|
118
|
+
}
|
|
119
|
+
for (const requirement of contract.requirements ?? [])
|
|
120
|
+
if (/\bTODO\b/i.test(requirement.description ?? ""))
|
|
121
|
+
placeholders.push(`requirement:${requirement.id}`);
|
|
122
|
+
if (placeholders.length)
|
|
123
|
+
throw new Error(`Cannot hand off ${contract.task.id}: unresolved template placeholders remain in ${[...new Set(placeholders)].join(", ")}.`);
|
|
124
|
+
}
|
|
125
|
+
export async function materializeTaskContext(controlRoot, workspaceRoot, config, contract) {
|
|
126
|
+
if (path.resolve(controlRoot) === path.resolve(workspaceRoot))
|
|
127
|
+
return;
|
|
128
|
+
const relativeFiles = [...Object.values(contract.source ?? {}).filter((value) => Boolean(value)), path.join(config.sdd?.contractsDir ?? ".harness/contracts", `${contract.task.id}.yaml`), path.join(".harness", "seals", `${contract.task.id}.json`)];
|
|
129
|
+
for (const relative of [...new Set(relativeFiles)]) {
|
|
130
|
+
if (path.isAbsolute(relative) || relative.startsWith(".."))
|
|
131
|
+
throw new Error(`Task context path must be repository-relative for worktree handoff: ${relative}`);
|
|
132
|
+
const source = path.resolve(controlRoot, relative);
|
|
133
|
+
const destination = path.resolve(workspaceRoot, relative);
|
|
134
|
+
try {
|
|
135
|
+
await fs.access(source);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
throw new Error(`Task context artifact is missing before worktree handoff: ${relative}`);
|
|
139
|
+
}
|
|
140
|
+
await fs.mkdir(path.dirname(destination), { recursive: true });
|
|
141
|
+
await fs.copyFile(source, destination);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export async function loadDeliveryRecord(root, config, taskId) {
|
|
145
|
+
for (const candidate of await deliveryControlRoots(root)) {
|
|
146
|
+
try {
|
|
147
|
+
return JSON.parse(await fs.readFile(deliveryFile(candidate, config, taskId), "utf8"));
|
|
148
|
+
}
|
|
149
|
+
catch { /* try next root */ }
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
export async function deliveryWorkspaceId(root, config, taskId) { if (config.delivery?.paseo?.enabled !== true || config.delivery.paseo.autoUseWorkspace === false)
|
|
154
|
+
return undefined; return (await loadDeliveryRecord(root, config, taskId))?.paseo?.workspaceId; }
|
|
155
|
+
export async function deliveryWorkspacePath(root, config, taskId) { if (config.delivery?.paseo?.enabled !== true || config.delivery.paseo.autoUseWorkspace === false)
|
|
156
|
+
return undefined; const value = (await loadDeliveryRecord(root, config, taskId))?.paseo?.worktreePath; return value && await exists(value) ? value : undefined; }
|
|
157
|
+
export function parseGithubRepository(remote) { const ssh = remote.match(/^[^@]+@[^:]+:([^/]+\/[^/]+?)(?:\.git)?$/); if (ssh)
|
|
158
|
+
return ssh[1]; try {
|
|
159
|
+
const url = new URL(remote);
|
|
160
|
+
const value = url.pathname.replace(/^\//, "").replace(/\.git$/, "");
|
|
161
|
+
return /^[^/]+\/[^/]+$/.test(value) ? value : undefined;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return undefined;
|
|
165
|
+
} }
|
|
166
|
+
export function renderPattern(pattern, contract, issue) { const slug = slugify(contract.task.title); return pattern.replaceAll("{issue}", issue ? String(issue) : "no-issue").replaceAll("{task}", slugify(contract.task.id)).replaceAll("{slug}", slug); }
|
|
167
|
+
export async function renderIssueBody(root, contract, originatingBranch) { const spec = contract.source?.spec ? await fs.readFile(path.resolve(root, contract.source.spec), "utf8") : ""; const acceptance = contract.source?.acceptance ? await fs.readFile(path.resolve(root, contract.source.acceptance), "utf8") : ""; const requirements = (contract.requirements ?? []).map((item) => `- ${item.id}: ${item.description ?? "see specification"}`).join("\n"); return `**Source: Agentic Engineering Harness SDD**\n\n**Task:** ${contract.task.id}\n\n## Implementation Start Rule\nImplementation is authorized from this issue-linked branch only after the validated SDD handoff completes. The local sealed TaskContract and SDD artifacts remain normative; this issue is a delivery mirror.\n\n## Originating Branch\n${originatingBranch}\n\n## Requirements\n${requirements || "See specification."}\n\n## Specification\n${spec.trim()}\n\n## Acceptance\n\`\`\`gherkin\n${acceptance.trim()}\n\`\`\`\n\n## Harness Sources\n${Object.entries(contract.source ?? {}).map(([name, value]) => `- ${name}: \`${value}\``).join("\n")}\n`; }
|
|
168
|
+
export async function inferGithubRepository(root) { const remote = await getOriginRemote(root); const repository = remote ? parseGithubRepository(remote) : undefined; if (!repository)
|
|
169
|
+
throw new Error("Cannot infer GitHub repository from origin; set delivery.github.repository as owner/repo."); return repository; }
|
|
170
|
+
export function resolveGithubTokenOptional(preferred) { for (const name of [preferred, "GH_TOKEN", "GITHUB_TOKEN", "GITHUB_PAT"].filter((value) => Boolean(value))) {
|
|
171
|
+
const token = process.env[name];
|
|
172
|
+
if (token)
|
|
173
|
+
return token;
|
|
174
|
+
} return undefined; }
|
|
175
|
+
export function resolveGithubToken(preferred) { const token = resolveGithubTokenOptional(preferred); if (token)
|
|
176
|
+
return token; throw new Error(`GitHub delivery is enabled but no token is available. Set ${preferred ?? "GH_TOKEN"} (or GITHUB_TOKEN/GITHUB_PAT).`); }
|
|
177
|
+
export async function githubRequest(base, token, endpoint, init = {}) {
|
|
178
|
+
const headers = new Headers(init.headers);
|
|
179
|
+
headers.set("Accept", "application/vnd.github+json");
|
|
180
|
+
headers.set("X-GitHub-Api-Version", "2022-11-28");
|
|
181
|
+
headers.set("Content-Type", "application/json");
|
|
182
|
+
if (token)
|
|
183
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
184
|
+
const response = await fetch(`${base}${endpoint}`, { ...init, headers });
|
|
185
|
+
const text = await response.text();
|
|
186
|
+
if (!response.ok)
|
|
187
|
+
throw new Error(`GitHub API ${init.method ?? "GET"} ${endpoint} failed (${response.status}): ${text.slice(0, 1000)}`);
|
|
188
|
+
return text ? JSON.parse(text) : undefined;
|
|
189
|
+
}
|
|
190
|
+
async function githubRequestMaybe(base, token, endpoint) { try {
|
|
191
|
+
return await githubRequest(base, token, endpoint);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
if (/failed \(404\)/.test(String(error)))
|
|
195
|
+
return undefined;
|
|
196
|
+
throw error;
|
|
197
|
+
} }
|
|
198
|
+
async function createCheckoutWorkspace(root, branch, slug, title) { const local = await runProcess(`git show-ref --verify --quiet refs/heads/${quoteRef(branch)}`, { cwd: root }); if (local.exitCode !== 0) {
|
|
199
|
+
const fetchResult = await runProcess(`git fetch origin ${quote(`refs/heads/${branch}:refs/heads/${branch}`)}`, { cwd: root, timeoutMs: 120_000 });
|
|
200
|
+
if (fetchResult.exitCode !== 0)
|
|
201
|
+
throw new Error(`Failed to fetch issue branch ${branch}: ${fetchResult.stderr || fetchResult.stdout}`);
|
|
202
|
+
} return runPaseoWorkspace(root, `--mode checkout-branch --branch ${quote(branch)}`, slug, title, branch); }
|
|
203
|
+
async function createBranchOffWorkspace(root, base, branch, slug, title) { return runPaseoWorkspace(root, `--mode branch-off --new-branch ${quote(branch)} --base ${quote(base)}`, slug, title, branch); }
|
|
204
|
+
async function runPaseoWorkspace(root, mode, slug, title, branch) {
|
|
205
|
+
const create = await runProcess(`paseo workspace create --isolation worktree --path ${quote(root)} ${mode} --worktree-slug ${quote(slug)} --title ${quote(title)} --json`, { cwd: root, timeoutMs: 180_000 });
|
|
206
|
+
if (create.exitCode !== 0)
|
|
207
|
+
throw new Error(`Paseo workspace creation failed: ${create.stderr || create.stdout}`);
|
|
208
|
+
const direct = parseWorkspace(create.stdout, branch);
|
|
209
|
+
if (direct.workspaceId && direct.worktreePath)
|
|
210
|
+
return direct;
|
|
211
|
+
const list = await runProcess("paseo workspace ls --json", { cwd: root, timeoutMs: 60_000 });
|
|
212
|
+
if (list.exitCode === 0) {
|
|
213
|
+
const found = parseWorkspace(list.stdout, branch);
|
|
214
|
+
if (found.workspaceId && found.worktreePath)
|
|
215
|
+
return found;
|
|
216
|
+
}
|
|
217
|
+
throw new Error(`Paseo created the workspace but its ID/path could not be resolved. Output: ${create.stdout}`);
|
|
218
|
+
}
|
|
219
|
+
function parseWorkspace(raw, branch) { try {
|
|
220
|
+
const value = JSON.parse(raw);
|
|
221
|
+
const candidates = flattenObjects(value);
|
|
222
|
+
const found = candidates.find((item) => [item.branch, item.branchName, item.gitBranch].some((candidate) => candidate === branch)) ?? candidates.find((item) => typeof item.id === "string" || typeof item.workspaceId === "string");
|
|
223
|
+
return found ? { workspaceId: stringValue(found.workspaceId) ?? stringValue(found.id), worktreePath: stringValue(found.worktreePath) ?? stringValue(found.path) ?? stringValue(found.root) } : {};
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return {};
|
|
227
|
+
} }
|
|
228
|
+
function flattenObjects(value) { if (Array.isArray(value))
|
|
229
|
+
return value.flatMap(flattenObjects); if (!value || typeof value !== "object")
|
|
230
|
+
return []; const record = value; return [record, ...Object.values(record).flatMap(flattenObjects)]; }
|
|
231
|
+
function stringValue(value) { return typeof value === "string" && value ? value : undefined; }
|
|
232
|
+
async function saveDeliveryRecord(root, config, record) { const file = deliveryFile(root, config, record.taskId); await fs.mkdir(path.dirname(file), { recursive: true }); await fs.writeFile(file, `${JSON.stringify(record, null, 2)}\n`); }
|
|
233
|
+
async function deliveryControlRoots(root) { const roots = [path.resolve(root)]; const common = await runProcess("git rev-parse --path-format=absolute --git-common-dir", { cwd: root, timeoutMs: 10_000 }); if (common.exitCode === 0) {
|
|
234
|
+
const gitDir = common.stdout.trim();
|
|
235
|
+
if (path.basename(gitDir) === ".git")
|
|
236
|
+
roots.push(path.dirname(gitDir));
|
|
237
|
+
} return [...new Set(roots)]; }
|
|
238
|
+
function deliveryFile(root, config, taskId) { return path.join(root, config.delivery?.stateDir ?? ".harness/delivery", `${taskId}.json`); }
|
|
239
|
+
function encodeRef(value) { return value.split("/").map(encodeURIComponent).join("/"); }
|
|
240
|
+
function slugify(value) { return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60) || "change"; }
|
|
241
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
242
|
+
function quoteRef(value) { return value.replace(/[^A-Za-z0-9._\/-]/g, ""); }
|
|
243
|
+
async function exists(file) { try {
|
|
244
|
+
await fs.access(file);
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return false;
|
|
249
|
+
} }
|
|
250
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/delivery/handoff.ts"],"names":[],"mappings":"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"}
|
package/dist/entry.d.ts
ADDED
package/dist/entry.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { initializeProject } from "./core/init.js";
|
|
5
|
+
import { loadProjectConfig } from "./core/config.js";
|
|
6
|
+
import { compileAgentTopology } from "./agents/compiler.js";
|
|
7
|
+
import { compileToolchain, setupToolchain } from "./toolchain/setup.js";
|
|
8
|
+
import { loadToolchainConfig } from "./toolchain/config.js";
|
|
9
|
+
import { resolveToolchain } from "./toolchain/resolve.js";
|
|
10
|
+
const args = process.argv.slice(2);
|
|
11
|
+
if (args.length === 1 && ["--version", "-V"].includes(args[0])) {
|
|
12
|
+
console.log("0.4.16");
|
|
13
|
+
process.exit(0);
|
|
14
|
+
}
|
|
15
|
+
if (args[0] === "setup") {
|
|
16
|
+
await runSetup(args.slice(1));
|
|
17
|
+
process.exit(process.exitCode ?? 0);
|
|
18
|
+
}
|
|
19
|
+
if (args[0] === "toolchain") {
|
|
20
|
+
await runToolchain(args.slice(1));
|
|
21
|
+
process.exit(process.exitCode ?? 0);
|
|
22
|
+
}
|
|
23
|
+
if (args[0] === "init" && args.includes("--setup")) {
|
|
24
|
+
await runInitSetup(args.slice(1));
|
|
25
|
+
process.exit(process.exitCode ?? 0);
|
|
26
|
+
}
|
|
27
|
+
await import("./cli.js");
|
|
28
|
+
async function runSetup(argv) {
|
|
29
|
+
const parsed = parse(argv);
|
|
30
|
+
const root = path.resolve(parsed.directory);
|
|
31
|
+
const config = await loadProjectConfig(root);
|
|
32
|
+
const result = await setupToolchain(root, config, { profile: parsed.value("profile"), dryRun: parsed.flag("dry-run"), updateLock: parsed.flag("update-lock"), skipProjectDependencies: parsed.flag("skip-project-deps"), preferContainers: parsed.flag("prefer-containers") });
|
|
33
|
+
console.log(`${result.dryRun ? "DRY-RUN" : "READY"} toolchain profile=${result.profile}`);
|
|
34
|
+
console.log(`miseConfig=${result.generatedConfig}`);
|
|
35
|
+
console.log(`lock=${result.lockFile}`);
|
|
36
|
+
console.log(`state=${result.stateFile}`);
|
|
37
|
+
if (result.installed.length)
|
|
38
|
+
console.log(`tools=${result.installed.join(", ")}`);
|
|
39
|
+
if (result.containers.length)
|
|
40
|
+
console.log(`containers=${result.containers.join(", ")}`);
|
|
41
|
+
if (result.projectDependencyCommands.length)
|
|
42
|
+
console.log(`projectDeps=${result.projectDependencyCommands.join(" && ")}`);
|
|
43
|
+
if (result.systemMissing.length) {
|
|
44
|
+
console.error(`missingSystem=${result.systemMissing.join(", ")}`);
|
|
45
|
+
process.exitCode = 1;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function runToolchain(argv) {
|
|
49
|
+
const sub = argv[0] ?? "show";
|
|
50
|
+
const parsed = parse(argv.slice(1));
|
|
51
|
+
const root = path.resolve(parsed.directory);
|
|
52
|
+
const config = await loadProjectConfig(root);
|
|
53
|
+
if (sub === "compile") {
|
|
54
|
+
console.log(`Compiled toolchain: ${await compileToolchain(root, config, { profile: parsed.value("profile"), updateLock: parsed.flag("update-lock") })}`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (sub === "show") {
|
|
58
|
+
const tc = await loadToolchainConfig(root, config);
|
|
59
|
+
console.log(JSON.stringify(await resolveToolchain(root, config, tc, { profile: parsed.value("profile") }), null, 2));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (sub === "setup") {
|
|
63
|
+
await runSetup(argv.slice(1));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`Unknown toolchain command '${sub}'. Use compile, show or setup.`);
|
|
67
|
+
}
|
|
68
|
+
async function runInitSetup(argv) {
|
|
69
|
+
const without = argv.filter((value) => value !== "--setup");
|
|
70
|
+
const parsed = parse(without);
|
|
71
|
+
const root = path.resolve(parsed.directory);
|
|
72
|
+
const created = await initializeProject(root);
|
|
73
|
+
const config = await loadProjectConfig(root);
|
|
74
|
+
if (config.agents) {
|
|
75
|
+
const compiled = await compileAgentTopology(root, config);
|
|
76
|
+
if (!compiled.ok)
|
|
77
|
+
throw new Error(compiled.issues.join("; "));
|
|
78
|
+
}
|
|
79
|
+
await compileToolchain(root, config);
|
|
80
|
+
const setup = await setupToolchain(root, config, { profile: parsed.value("profile"), preferContainers: parsed.flag("prefer-containers") });
|
|
81
|
+
console.log(created.length ? `Created: ${created.join(", ")}` : "Harness already initialized.");
|
|
82
|
+
console.log(`Toolchain ready: profile=${setup.profile}`);
|
|
83
|
+
}
|
|
84
|
+
function parse(argv) {
|
|
85
|
+
const valueFlags = new Set(["profile"]);
|
|
86
|
+
const booleanFlags = new Set(["dry-run", "update-lock", "skip-project-deps", "prefer-containers"]);
|
|
87
|
+
const flags = new Map();
|
|
88
|
+
const positional = [];
|
|
89
|
+
for (let i = 0; i < argv.length; i++) {
|
|
90
|
+
const value = argv[i];
|
|
91
|
+
if (!value.startsWith("--")) {
|
|
92
|
+
positional.push(value);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const name = value.slice(2);
|
|
96
|
+
if (valueFlags.has(name)) {
|
|
97
|
+
const next = argv[++i];
|
|
98
|
+
if (!next || next.startsWith("--"))
|
|
99
|
+
throw new Error(`--${name} requires a value.`);
|
|
100
|
+
flags.set(name, next);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (!booleanFlags.has(name))
|
|
104
|
+
throw new Error(`Unknown toolchain option --${name}.`);
|
|
105
|
+
flags.set(name, true);
|
|
106
|
+
}
|
|
107
|
+
if (positional.length > 1)
|
|
108
|
+
throw new Error(`Expected at most one project directory, received: ${positional.join(", ")}`);
|
|
109
|
+
const directory = positional[0] ?? ".";
|
|
110
|
+
return { directory, flag: (name) => flags.get(name) === true, value: (name) => typeof flags.get(name) === "string" ? flags.get(name) : undefined };
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HarnessProjectConfig } from "../core/types.js";
|
|
2
|
+
import type { EvalResult } from "./types.js";
|
|
3
|
+
export declare function runEvalCase(root: string, config: HarnessProjectConfig, caseId: string, variantName?: string): Promise<EvalResult>;
|
|
4
|
+
export declare function compareEvalCase(root: string, config: HarnessProjectConfig, caseId: string): Promise<EvalResult[]>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { runProcess } from "../utils/process.js";
|
|
6
|
+
import { rankEvalResults, scoreEvalResult } from "./scoring.js";
|
|
7
|
+
const variantSchema = z.object({ name: z.string().min(1), command: z.string().optional(), env: z.record(z.string(), z.string()).optional() });
|
|
8
|
+
const evalSchema = z.object({
|
|
9
|
+
version: z.literal(1),
|
|
10
|
+
id: z.string().min(1),
|
|
11
|
+
taskId: z.string().min(1),
|
|
12
|
+
baseRef: z.string().min(1),
|
|
13
|
+
fixtureDir: z.string().optional(),
|
|
14
|
+
setupCommands: z.array(z.string()).optional(),
|
|
15
|
+
runCommand: z.string().optional(),
|
|
16
|
+
variants: z.array(variantSchema).optional(),
|
|
17
|
+
expectations: z.object({
|
|
18
|
+
status: z.enum(["PASS", "FAIL"]).optional(),
|
|
19
|
+
maxRepairs: z.number().int().nonnegative().optional(),
|
|
20
|
+
maxHumanInterventions: z.number().int().nonnegative().optional(),
|
|
21
|
+
maxCostUsd: z.number().nonnegative().optional(),
|
|
22
|
+
requiredChecks: z.array(z.string()).optional()
|
|
23
|
+
}).optional(),
|
|
24
|
+
weights: z.object({ status: z.number().nonnegative().optional(), firstPass: z.number().nonnegative().optional(), repairs: z.number().nonnegative().optional(), interventions: z.number().nonnegative().optional(), efficiency: z.number().nonnegative().optional() }).optional()
|
|
25
|
+
});
|
|
26
|
+
export async function runEvalCase(root, config, caseId, variantName) {
|
|
27
|
+
const evalCase = await loadEvalCase(root, config, caseId);
|
|
28
|
+
const variant = selectVariant(evalCase, variantName);
|
|
29
|
+
const startedAt = new Date().toISOString();
|
|
30
|
+
const workspace = path.resolve(root, config.evals?.workspacesDir ?? ".harness/evals/workspaces", `${safe(caseId)}-${Date.now()}`);
|
|
31
|
+
await fs.mkdir(path.dirname(workspace), { recursive: true });
|
|
32
|
+
const add = await runProcess(`git worktree add --detach ${quote(workspace)} ${quote(evalCase.baseRef)}`, { cwd: root, timeoutMs: 120_000 });
|
|
33
|
+
if (add.exitCode !== 0)
|
|
34
|
+
throw new Error(`Unable to create eval worktree: ${add.stderr || add.stdout}`);
|
|
35
|
+
try {
|
|
36
|
+
if (evalCase.fixtureDir) {
|
|
37
|
+
const fixture = path.resolve(root, evalCase.fixtureDir);
|
|
38
|
+
await fs.cp(fixture, workspace, { recursive: true, force: true });
|
|
39
|
+
}
|
|
40
|
+
for (const setup of evalCase.setupCommands ?? []) {
|
|
41
|
+
const result = await runProcess(template(setup, evalCase, workspace), { cwd: workspace, timeoutMs: 600_000, env: variant.env });
|
|
42
|
+
if (result.exitCode !== 0)
|
|
43
|
+
throw new Error(`Eval setup failed: ${result.stderr || result.stdout}`);
|
|
44
|
+
}
|
|
45
|
+
const command = template(variant.command ?? evalCase.runCommand ?? `aeh run ${quote(evalCase.taskId)}`, evalCase, workspace);
|
|
46
|
+
const execution = await runProcess(command, { cwd: workspace, timeoutMs: 3_600_000, env: variant.env });
|
|
47
|
+
const run = await readJson(path.join(workspace, ".harness", "runs", `${evalCase.taskId}.json`));
|
|
48
|
+
const report = await readJson(path.join(workspace, ".harness", "reports", `${evalCase.taskId}.json`));
|
|
49
|
+
const status = (run?.status ?? report?.status ?? (execution.exitCode === 0 ? "PASS" : "FAIL"));
|
|
50
|
+
const base = {
|
|
51
|
+
version: 1,
|
|
52
|
+
caseId: evalCase.id,
|
|
53
|
+
variant: variant.name,
|
|
54
|
+
taskId: evalCase.taskId,
|
|
55
|
+
baseRef: evalCase.baseRef,
|
|
56
|
+
status,
|
|
57
|
+
commandExitCode: execution.exitCode,
|
|
58
|
+
metrics: run?.metrics,
|
|
59
|
+
report,
|
|
60
|
+
startedAt,
|
|
61
|
+
finishedAt: new Date().toISOString()
|
|
62
|
+
};
|
|
63
|
+
const scored = scoreEvalResult(evalCase, base);
|
|
64
|
+
const output = { ...base, ...scored };
|
|
65
|
+
const resultsDir = path.resolve(root, config.evals?.resultsDir ?? ".harness/evals/results", safe(caseId));
|
|
66
|
+
await fs.mkdir(resultsDir, { recursive: true });
|
|
67
|
+
const file = path.join(resultsDir, `${Date.now()}-${safe(variant.name)}.json`);
|
|
68
|
+
output.resultFile = path.relative(root, file).replaceAll("\\", "/");
|
|
69
|
+
await fs.writeFile(file, `${JSON.stringify(output, null, 2)}\n`);
|
|
70
|
+
return output;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await runProcess(`git worktree remove --force ${quote(workspace)}`, { cwd: root, timeoutMs: 120_000 });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function compareEvalCase(root, config, caseId) {
|
|
77
|
+
const dir = path.resolve(root, config.evals?.resultsDir ?? ".harness/evals/results", safe(caseId));
|
|
78
|
+
const files = await fs.readdir(dir).catch(() => []);
|
|
79
|
+
const results = [];
|
|
80
|
+
for (const file of files.filter((name) => name.endsWith(".json"))) {
|
|
81
|
+
const value = await readJson(path.join(dir, file));
|
|
82
|
+
if (value?.caseId === caseId)
|
|
83
|
+
results.push(value);
|
|
84
|
+
}
|
|
85
|
+
return rankEvalResults(results);
|
|
86
|
+
}
|
|
87
|
+
async function loadEvalCase(root, config, caseId) {
|
|
88
|
+
const file = path.resolve(root, config.evals?.corpusDir ?? "evals/corpus", caseId, "eval.yaml");
|
|
89
|
+
return evalSchema.parse(YAML.parse(await fs.readFile(file, "utf8")));
|
|
90
|
+
}
|
|
91
|
+
function selectVariant(evalCase, name) {
|
|
92
|
+
if (!evalCase.variants?.length)
|
|
93
|
+
return { name: name ?? "default" };
|
|
94
|
+
const selected = name ? evalCase.variants.find((variant) => variant.name === name) : evalCase.variants[0];
|
|
95
|
+
if (!selected)
|
|
96
|
+
throw new Error(`Unknown eval variant '${name}'.`);
|
|
97
|
+
return selected;
|
|
98
|
+
}
|
|
99
|
+
function template(command, evalCase, workspace) {
|
|
100
|
+
return command.replaceAll("{taskId}", evalCase.taskId).replaceAll("{workspace}", workspace);
|
|
101
|
+
}
|
|
102
|
+
async function readJson(file) {
|
|
103
|
+
try {
|
|
104
|
+
return JSON.parse(await fs.readFile(file, "utf8"));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
111
|
+
function safe(value) { return value.replace(/[^A-Za-z0-9._-]/g, "-"); }
|
|
112
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/evals/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { EvalCase, EvalResult } from "./types.js";
|
|
2
|
+
export declare function scoreEvalResult(evalCase: EvalCase, input: Omit<EvalResult, "score" | "scoreBreakdown">): Pick<EvalResult, "score" | "scoreBreakdown">;
|
|
3
|
+
export declare function rankEvalResults(results: EvalResult[]): EvalResult[];
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function scoreEvalResult(evalCase, input) {
|
|
2
|
+
const weights = {
|
|
3
|
+
status: evalCase.weights?.status ?? 60,
|
|
4
|
+
firstPass: evalCase.weights?.firstPass ?? 15,
|
|
5
|
+
repairs: evalCase.weights?.repairs ?? 10,
|
|
6
|
+
interventions: evalCase.weights?.interventions ?? 10,
|
|
7
|
+
efficiency: evalCase.weights?.efficiency ?? 5
|
|
8
|
+
};
|
|
9
|
+
const expectedStatus = evalCase.expectations?.status ?? "PASS";
|
|
10
|
+
const breakdown = {};
|
|
11
|
+
breakdown.status = input.status === expectedStatus ? weights.status : 0;
|
|
12
|
+
breakdown.firstPass = input.metrics?.firstPassSuccess ? weights.firstPass : 0;
|
|
13
|
+
const repairs = input.metrics?.repairCount ?? Number.POSITIVE_INFINITY;
|
|
14
|
+
const repairBudget = evalCase.expectations?.maxRepairs ?? 2;
|
|
15
|
+
breakdown.repairs = Number.isFinite(repairs) && repairs <= repairBudget
|
|
16
|
+
? weights.repairs * Math.max(0, 1 - repairs / (repairBudget + 1))
|
|
17
|
+
: 0;
|
|
18
|
+
const interventions = input.metrics?.humanInterventions ?? Number.POSITIVE_INFINITY;
|
|
19
|
+
const interventionBudget = evalCase.expectations?.maxHumanInterventions ?? 0;
|
|
20
|
+
breakdown.interventions = Number.isFinite(interventions) && interventions <= interventionBudget ? weights.interventions : 0;
|
|
21
|
+
const maxCost = evalCase.expectations?.maxCostUsd;
|
|
22
|
+
const cost = input.metrics?.usage.costUsd;
|
|
23
|
+
breakdown.efficiency = maxCost === undefined
|
|
24
|
+
? weights.efficiency
|
|
25
|
+
: cost !== undefined && cost <= maxCost
|
|
26
|
+
? weights.efficiency * Math.max(0, 1 - cost / Math.max(maxCost, 0.000001) * 0.5)
|
|
27
|
+
: 0;
|
|
28
|
+
if (evalCase.expectations?.requiredChecks?.length && input.report) {
|
|
29
|
+
const checks = new Map(input.report.checks.map((check) => [check.id, check.status]));
|
|
30
|
+
const missing = evalCase.expectations.requiredChecks.filter((id) => checks.get(id) !== "PASS");
|
|
31
|
+
if (missing.length)
|
|
32
|
+
breakdown.status = 0;
|
|
33
|
+
}
|
|
34
|
+
const score = round(Object.values(breakdown).reduce((sum, value) => sum + value, 0));
|
|
35
|
+
return { score, scoreBreakdown: Object.fromEntries(Object.entries(breakdown).map(([key, value]) => [key, round(value)])) };
|
|
36
|
+
}
|
|
37
|
+
export function rankEvalResults(results) {
|
|
38
|
+
return [...results].sort((a, b) => b.score - a.score || (a.metrics?.usage.costUsd ?? Infinity) - (b.metrics?.usage.costUsd ?? Infinity));
|
|
39
|
+
}
|
|
40
|
+
function round(value) { return Math.round(value * 1000) / 1000; }
|
|
41
|
+
//# sourceMappingURL=scoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/evals/scoring.ts"],"names":[],"mappings":"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"}
|