human-to-code 0.0.1 → 0.1.2
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/Readme.md +368 -38
- package/SECURITY.md +175 -11
- package/dist/adapters/general.d.ts +30 -0
- package/dist/adapters/general.d.ts.map +1 -0
- package/dist/adapters/general.js +77 -0
- package/dist/adapters/general.js.map +1 -0
- package/dist/adapters/node.d.ts +8 -0
- package/dist/adapters/node.d.ts.map +1 -0
- package/dist/adapters/node.js +1071 -0
- package/dist/adapters/node.js.map +1 -0
- package/dist/adapters/python.d.ts +7 -0
- package/dist/adapters/python.d.ts.map +1 -0
- package/dist/adapters/python.js +540 -0
- package/dist/adapters/python.js.map +1 -0
- package/dist/adapters/rust.d.ts +7 -0
- package/dist/adapters/rust.d.ts.map +1 -0
- package/dist/adapters/rust.js +517 -0
- package/dist/adapters/rust.js.map +1 -0
- package/dist/analyzer-types.d.ts +161 -0
- package/dist/analyzer-types.d.ts.map +1 -0
- package/dist/analyzer-types.js +8 -0
- package/dist/analyzer-types.js.map +1 -0
- package/dist/analyzer-utils.d.ts +40 -0
- package/dist/analyzer-utils.d.ts.map +1 -0
- package/dist/analyzer-utils.js +591 -0
- package/dist/analyzer-utils.js.map +1 -0
- package/dist/analyzer.d.ts +21 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +111 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/certification.d.ts +102 -0
- package/dist/certification.d.ts.map +1 -0
- package/dist/certification.js +193 -0
- package/dist/certification.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +566 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler-skills.d.ts +25 -0
- package/dist/compiler-skills.d.ts.map +1 -0
- package/dist/compiler-skills.js +158 -0
- package/dist/compiler-skills.js.map +1 -0
- package/dist/compiler-tools.d.ts +29 -0
- package/dist/compiler-tools.d.ts.map +1 -0
- package/dist/compiler-tools.js +337 -0
- package/dist/compiler-tools.js.map +1 -0
- package/dist/config.d.ts +122 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +704 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +153 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +772 -0
- package/dist/context.js.map +1 -0
- package/dist/contracts.d.ts +196 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +721 -0
- package/dist/contracts.js.map +1 -0
- package/dist/discovery.d.ts +34 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +312 -0
- package/dist/discovery.js.map +1 -0
- package/dist/documentation.d.ts +44 -0
- package/dist/documentation.d.ts.map +1 -0
- package/dist/documentation.js +418 -0
- package/dist/documentation.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/patch.d.ts +71 -0
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js +394 -0
- package/dist/patch.js.map +1 -0
- package/dist/pinned-http.d.ts +15 -0
- package/dist/pinned-http.d.ts.map +1 -0
- package/dist/pinned-http.js +170 -0
- package/dist/pinned-http.js.map +1 -0
- package/dist/planner.d.ts +30 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +228 -0
- package/dist/planner.js.map +1 -0
- package/dist/provider.d.ts +168 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +512 -0
- package/dist/provider.js.map +1 -0
- package/dist/providers.d.ts +41 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +954 -0
- package/dist/providers.js.map +1 -0
- package/dist/run-store.d.ts +24 -0
- package/dist/run-store.d.ts.map +1 -0
- package/dist/run-store.js +285 -0
- package/dist/run-store.js.map +1 -0
- package/dist/schemas.d.ts +18 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +228 -0
- package/dist/schemas.js.map +1 -0
- package/dist/secret-scan.d.ts +30 -0
- package/dist/secret-scan.d.ts.map +1 -0
- package/dist/secret-scan.js +122 -0
- package/dist/secret-scan.js.map +1 -0
- package/dist/snapshot.d.ts +33 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +136 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/support-matrix.d.ts +23 -0
- package/dist/support-matrix.d.ts.map +1 -0
- package/dist/support-matrix.js +199 -0
- package/dist/support-matrix.js.map +1 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +25 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +388 -0
- package/dist/validation.js.map +1 -0
- package/dist/workflow.d.ts +65 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +1636 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +36 -9
- package/.claude/settings.local.json +0 -12
- package/.github/workflows/ci.yml +0 -18
- package/CONTRIBUTING.md +0 -40
- package/src/cli.ts +0 -218
- package/src/config.ts +0 -186
- package/src/discovery.ts +0 -186
- package/src/index.ts +0 -22
- package/src/types.ts +0 -74
- package/test/config.test.ts +0 -97
- package/test/discovery.test.ts +0 -91
- package/tsconfig.json +0 -17
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/** Strong, container-only validation with baseline comparison. */
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { lstat, stat } from "node:fs/promises";
|
|
4
|
+
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { scanSecrets } from "./context.js";
|
|
7
|
+
const MAX_CAPTURE_BYTES = 1024 * 1024;
|
|
8
|
+
const MIN_TIMEOUT_MS = 1_000;
|
|
9
|
+
const MAX_TIMEOUT_MS = 30 * 60_000;
|
|
10
|
+
const IMAGE_ID = /^(?:sha256:)?[a-f0-9]{64}$/u;
|
|
11
|
+
const SHELL_EXECUTABLES = new Set([
|
|
12
|
+
"sh",
|
|
13
|
+
"bash",
|
|
14
|
+
"zsh",
|
|
15
|
+
"fish",
|
|
16
|
+
"cmd",
|
|
17
|
+
"cmd.exe",
|
|
18
|
+
"powershell",
|
|
19
|
+
"powershell.exe",
|
|
20
|
+
"pwsh",
|
|
21
|
+
"npx",
|
|
22
|
+
]);
|
|
23
|
+
export class ValidationError extends Error {
|
|
24
|
+
code;
|
|
25
|
+
constructor(code, message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = "ValidationError";
|
|
28
|
+
this.code = code;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function now() {
|
|
32
|
+
return new Date().toISOString();
|
|
33
|
+
}
|
|
34
|
+
function executableName(value) {
|
|
35
|
+
return value.replaceAll("\\", "/").split("/").at(-1)?.toLowerCase() ?? "";
|
|
36
|
+
}
|
|
37
|
+
function validateCommand(command) {
|
|
38
|
+
if (!command.id || !Array.isArray(command.argv) || command.argv.length === 0) {
|
|
39
|
+
throw new ValidationError("INVALID_COMMAND", "Validation commands require an id and argv.");
|
|
40
|
+
}
|
|
41
|
+
if (command.argv.some((part) => typeof part !== "string" || part.length === 0 || part.includes("\0"))) {
|
|
42
|
+
throw new ValidationError("INVALID_COMMAND", `Validation command ${command.id} has invalid argv.`);
|
|
43
|
+
}
|
|
44
|
+
if (SHELL_EXECUTABLES.has(executableName(command.argv[0]))) {
|
|
45
|
+
throw new ValidationError("SHELL_COMMAND_BLOCKED", `Validation command ${command.id} invokes a shell or implicit downloader.`);
|
|
46
|
+
}
|
|
47
|
+
if (!Number.isInteger(command.timeoutMs) ||
|
|
48
|
+
command.timeoutMs < MIN_TIMEOUT_MS ||
|
|
49
|
+
command.timeoutMs > MAX_TIMEOUT_MS) {
|
|
50
|
+
throw new ValidationError("INVALID_TIMEOUT", `Validation command ${command.id} timeout must be between ${MIN_TIMEOUT_MS} and ${MAX_TIMEOUT_MS} ms.`);
|
|
51
|
+
}
|
|
52
|
+
if (isAbsolute(command.cwd) || command.cwd.includes("\0")) {
|
|
53
|
+
throw new ValidationError("INVALID_CWD", `Validation command ${command.id} cwd must be relative.`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function assertDirectory(path, label) {
|
|
57
|
+
return lstat(path).then((info) => {
|
|
58
|
+
if (!info.isDirectory() || info.isSymbolicLink()) {
|
|
59
|
+
throw new ValidationError("INVALID_ROOT", `${label} must be a real directory.`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function assertCwd(root, cwd) {
|
|
64
|
+
const abs = resolve(root, cwd || ".");
|
|
65
|
+
const rel = relative(root, abs);
|
|
66
|
+
if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
67
|
+
throw new ValidationError("INVALID_CWD", `Validation cwd escapes the snapshot: ${cwd}.`);
|
|
68
|
+
}
|
|
69
|
+
return rel === "" ? "." : rel.split(sep).join("/");
|
|
70
|
+
}
|
|
71
|
+
async function runProcess(executable, args, timeoutMs, maxOutputBytes) {
|
|
72
|
+
const started = Date.now();
|
|
73
|
+
return new Promise((resolveResult, reject) => {
|
|
74
|
+
const child = spawn(executable, args, {
|
|
75
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
76
|
+
env: { PATH: process.env.PATH ?? "" },
|
|
77
|
+
windowsHide: true,
|
|
78
|
+
});
|
|
79
|
+
let stdout = Buffer.alloc(0);
|
|
80
|
+
let stderr = Buffer.alloc(0);
|
|
81
|
+
let truncated = false;
|
|
82
|
+
let timedOut = false;
|
|
83
|
+
const append = (current, chunk) => {
|
|
84
|
+
if (current.length >= maxOutputBytes) {
|
|
85
|
+
truncated = true;
|
|
86
|
+
return current;
|
|
87
|
+
}
|
|
88
|
+
const remaining = maxOutputBytes - current.length;
|
|
89
|
+
if (chunk.length > remaining)
|
|
90
|
+
truncated = true;
|
|
91
|
+
return Buffer.concat([current, chunk.subarray(0, remaining)]);
|
|
92
|
+
};
|
|
93
|
+
child.stdout?.on("data", (chunk) => {
|
|
94
|
+
stdout = append(stdout, chunk);
|
|
95
|
+
});
|
|
96
|
+
child.stderr?.on("data", (chunk) => {
|
|
97
|
+
stderr = append(stderr, chunk);
|
|
98
|
+
});
|
|
99
|
+
child.once("error", reject);
|
|
100
|
+
const timer = setTimeout(() => {
|
|
101
|
+
timedOut = true;
|
|
102
|
+
child.kill("SIGKILL");
|
|
103
|
+
}, timeoutMs);
|
|
104
|
+
timer.unref();
|
|
105
|
+
child.once("close", (code, signal) => {
|
|
106
|
+
clearTimeout(timer);
|
|
107
|
+
resolveResult({
|
|
108
|
+
code,
|
|
109
|
+
signal,
|
|
110
|
+
stdout: stdout.toString("utf8"),
|
|
111
|
+
stderr: stderr.toString("utf8"),
|
|
112
|
+
timedOut,
|
|
113
|
+
outputTruncated: truncated,
|
|
114
|
+
durationMs: Date.now() - started,
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
export async function strongSandboxAvailable(dockerBinary = "docker") {
|
|
120
|
+
try {
|
|
121
|
+
const result = await runProcess(dockerBinary, ["version", "--format", "{{.Server.Version}}"], 5_000, 16_384);
|
|
122
|
+
return result.code === 0 && result.stdout.trim().length > 0;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function validateImageReference(image) {
|
|
129
|
+
if (typeof image !== "string" ||
|
|
130
|
+
image.length === 0 ||
|
|
131
|
+
image.length > 512 ||
|
|
132
|
+
image.startsWith("-") ||
|
|
133
|
+
/[\0\r\n\t ]/u.test(image)) {
|
|
134
|
+
throw new ValidationError("INVALID_IMAGE", "Sandbox image must be a bounded container image reference without whitespace or option prefixes.");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolve a trusted image reference to an already-installed immutable id.
|
|
139
|
+
* Validation never lets Docker/Podman pull an image as a side effect.
|
|
140
|
+
*/
|
|
141
|
+
async function localSandboxRuntime(dockerBinary, image) {
|
|
142
|
+
validateImageReference(image);
|
|
143
|
+
let versionResult;
|
|
144
|
+
let imageResult;
|
|
145
|
+
try {
|
|
146
|
+
[versionResult, imageResult] = await Promise.all([
|
|
147
|
+
runProcess(dockerBinary, ["version", "--format", "{{.Server.Version}}"], 5_000, 16_384),
|
|
148
|
+
runProcess(dockerBinary, ["image", "inspect", "--format", "{{.Id}}", image], 10_000, 16_384),
|
|
149
|
+
]);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
const version = versionResult.stdout.trim();
|
|
155
|
+
const rawId = imageResult.stdout.trim().toLowerCase();
|
|
156
|
+
if (versionResult.code !== 0 ||
|
|
157
|
+
version.length === 0 ||
|
|
158
|
+
imageResult.code !== 0 ||
|
|
159
|
+
!IMAGE_ID.test(rawId)) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
const imageId = rawId.startsWith("sha256:") ? rawId : `sha256:${rawId}`;
|
|
163
|
+
return { binary: dockerBinary, version, imageId };
|
|
164
|
+
}
|
|
165
|
+
function safeEnvironment(environment) {
|
|
166
|
+
const args = ["-e", "HOME=/tmp/human-to-code-home", "-e", "CI=1"];
|
|
167
|
+
for (const [key, value] of Object.entries(environment ?? {}).sort(([a], [b]) => a.localeCompare(b))) {
|
|
168
|
+
if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) {
|
|
169
|
+
throw new ValidationError("INVALID_ENV", `Invalid sandbox environment name: ${key}.`);
|
|
170
|
+
}
|
|
171
|
+
if (/TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|PRIVATE_KEY|CREDENTIAL/i.test(key)) {
|
|
172
|
+
throw new ValidationError("SECRET_ENV", `Credential-like environment variable is blocked: ${key}.`);
|
|
173
|
+
}
|
|
174
|
+
if (value.includes("\0") || value.length > 16_384) {
|
|
175
|
+
throw new ValidationError("INVALID_ENV", `Invalid sandbox environment value for ${key}.`);
|
|
176
|
+
}
|
|
177
|
+
args.push("-e", `${key}=${value}`);
|
|
178
|
+
}
|
|
179
|
+
return args;
|
|
180
|
+
}
|
|
181
|
+
async function runInStrongSandbox(rootInput, command, options) {
|
|
182
|
+
validateCommand(command);
|
|
183
|
+
const root = resolve(rootInput);
|
|
184
|
+
await assertDirectory(root, "Validation snapshot");
|
|
185
|
+
const cwd = assertCwd(root, command.cwd);
|
|
186
|
+
const cwdInfo = await stat(resolve(root, cwd)).catch(() => undefined);
|
|
187
|
+
if (!cwdInfo?.isDirectory()) {
|
|
188
|
+
throw new ValidationError("INVALID_CWD", `Validation cwd does not exist: ${command.cwd}.`);
|
|
189
|
+
}
|
|
190
|
+
const name = `human-to-code-${randomUUID()}`;
|
|
191
|
+
const docker = options.dockerBinary ?? "docker";
|
|
192
|
+
const args = [
|
|
193
|
+
"run",
|
|
194
|
+
"--rm",
|
|
195
|
+
"--pull",
|
|
196
|
+
"never",
|
|
197
|
+
"--name",
|
|
198
|
+
name,
|
|
199
|
+
"--network",
|
|
200
|
+
"none",
|
|
201
|
+
"--read-only",
|
|
202
|
+
"--cap-drop",
|
|
203
|
+
"ALL",
|
|
204
|
+
"--security-opt",
|
|
205
|
+
"no-new-privileges",
|
|
206
|
+
"--pids-limit",
|
|
207
|
+
String(options.pidsLimit ?? 256),
|
|
208
|
+
"--memory",
|
|
209
|
+
options.memory ?? "2g",
|
|
210
|
+
"--cpus",
|
|
211
|
+
String(options.cpus ?? 2),
|
|
212
|
+
"--tmpfs",
|
|
213
|
+
"/tmp:rw,nosuid,nodev,noexec,size=536870912",
|
|
214
|
+
"--mount",
|
|
215
|
+
`type=bind,src=${root},dst=/workspace,rw`,
|
|
216
|
+
"--workdir",
|
|
217
|
+
cwd === "." ? "/workspace" : `/workspace/${cwd}`,
|
|
218
|
+
...safeEnvironment(options.environment),
|
|
219
|
+
options.image,
|
|
220
|
+
...command.argv,
|
|
221
|
+
];
|
|
222
|
+
const startedAt = now();
|
|
223
|
+
let result;
|
|
224
|
+
try {
|
|
225
|
+
result = await runProcess(docker, args, command.timeoutMs, options.maxOutputBytes ?? MAX_CAPTURE_BYTES);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
return {
|
|
229
|
+
id: command.id,
|
|
230
|
+
status: "error",
|
|
231
|
+
exitCode: null,
|
|
232
|
+
signal: null,
|
|
233
|
+
durationMs: 0,
|
|
234
|
+
stdout: "",
|
|
235
|
+
stderr: String(error),
|
|
236
|
+
timedOut: false,
|
|
237
|
+
flaky: false,
|
|
238
|
+
outputTruncated: false,
|
|
239
|
+
startedAt,
|
|
240
|
+
finishedAt: now(),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
if (result.timedOut) {
|
|
244
|
+
await runProcess(docker, ["rm", "-f", name], 10_000, 32_768).catch(() => undefined);
|
|
245
|
+
}
|
|
246
|
+
const secretOutput = scanSecrets(result.stdout).length > 0 || scanSecrets(result.stderr).length > 0;
|
|
247
|
+
return {
|
|
248
|
+
id: command.id,
|
|
249
|
+
status: secretOutput ? "error" : result.code === 0 && !result.timedOut ? "passed" : "failed",
|
|
250
|
+
exitCode: result.code,
|
|
251
|
+
signal: result.signal,
|
|
252
|
+
durationMs: result.durationMs,
|
|
253
|
+
stdout: secretOutput ? "" : result.stdout,
|
|
254
|
+
stderr: secretOutput ? "SECURITY_BLOCKED: credential-like validation output was discarded before report persistence." : result.stderr,
|
|
255
|
+
timedOut: result.timedOut,
|
|
256
|
+
flaky: false,
|
|
257
|
+
outputTruncated: result.outputTruncated,
|
|
258
|
+
startedAt,
|
|
259
|
+
finishedAt: now(),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
async function runPlan(root, plan, options, retryFailedOnce) {
|
|
263
|
+
const results = [];
|
|
264
|
+
for (const command of plan.commands) {
|
|
265
|
+
let result = await runInStrongSandbox(root, command, options);
|
|
266
|
+
if (retryFailedOnce && result.status === "failed") {
|
|
267
|
+
const retry = await runInStrongSandbox(root, command, options);
|
|
268
|
+
if (retry.status === "passed")
|
|
269
|
+
result = { ...retry, flaky: true };
|
|
270
|
+
}
|
|
271
|
+
results.push(result);
|
|
272
|
+
}
|
|
273
|
+
return results;
|
|
274
|
+
}
|
|
275
|
+
function resultFailed(result) {
|
|
276
|
+
return result.status !== "passed" || result.flaky || result.outputTruncated;
|
|
277
|
+
}
|
|
278
|
+
export async function validateBaselineAndCandidate(plan, options) {
|
|
279
|
+
const startedAt = now();
|
|
280
|
+
if (plan.schemaVersion !== 1 || !Array.isArray(plan.commands) || plan.commands.length === 0) {
|
|
281
|
+
throw new ValidationError("INVALID_PLAN", "ValidationPlanV1 must contain at least one command.");
|
|
282
|
+
}
|
|
283
|
+
for (const command of plan.commands)
|
|
284
|
+
validateCommand(command);
|
|
285
|
+
await Promise.all([
|
|
286
|
+
assertDirectory(resolve(options.baselineRoot), "Baseline snapshot"),
|
|
287
|
+
assertDirectory(resolve(options.candidateRoot), "Candidate snapshot"),
|
|
288
|
+
]);
|
|
289
|
+
const available = await strongSandboxAvailable(options.dockerBinary);
|
|
290
|
+
if (!available) {
|
|
291
|
+
return {
|
|
292
|
+
schemaVersion: 1,
|
|
293
|
+
status: "unvalidated",
|
|
294
|
+
sandbox: "none",
|
|
295
|
+
baseline: [],
|
|
296
|
+
candidate: [],
|
|
297
|
+
repairs: [],
|
|
298
|
+
manualChecks: plan.manualChecks.map((description) => ({
|
|
299
|
+
description,
|
|
300
|
+
status: "pending",
|
|
301
|
+
})),
|
|
302
|
+
diagnostics: ["A strong Docker sandbox is unavailable; no project command was executed."],
|
|
303
|
+
startedAt,
|
|
304
|
+
finishedAt: now(),
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const dockerBinary = options.dockerBinary ?? "docker";
|
|
308
|
+
const runtime = await localSandboxRuntime(dockerBinary, options.image);
|
|
309
|
+
if (!runtime) {
|
|
310
|
+
return {
|
|
311
|
+
schemaVersion: 1,
|
|
312
|
+
status: "unvalidated",
|
|
313
|
+
sandbox: "none",
|
|
314
|
+
baseline: [],
|
|
315
|
+
candidate: [],
|
|
316
|
+
repairs: [],
|
|
317
|
+
manualChecks: plan.manualChecks.map((description) => ({
|
|
318
|
+
description,
|
|
319
|
+
status: "pending",
|
|
320
|
+
})),
|
|
321
|
+
diagnostics: [
|
|
322
|
+
"The configured validation image is not already installed as a locally inspectable immutable image; no image was pulled and no project command was executed.",
|
|
323
|
+
],
|
|
324
|
+
startedAt,
|
|
325
|
+
finishedAt: now(),
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
const sandboxOptions = {
|
|
329
|
+
image: runtime.imageId,
|
|
330
|
+
dockerBinary: runtime.binary,
|
|
331
|
+
cpus: options.cpus,
|
|
332
|
+
memory: options.memory,
|
|
333
|
+
pidsLimit: options.pidsLimit,
|
|
334
|
+
maxOutputBytes: options.maxOutputBytes,
|
|
335
|
+
environment: options.environment,
|
|
336
|
+
};
|
|
337
|
+
const retry = options.retryFailedOnce ?? true;
|
|
338
|
+
const baseline = await runPlan(options.baselineRoot, plan, sandboxOptions, retry);
|
|
339
|
+
const candidate = await runPlan(options.candidateRoot, plan, sandboxOptions, retry);
|
|
340
|
+
const requiredIds = new Set(plan.commands.filter((command) => command.required).map((command) => command.id));
|
|
341
|
+
const requiredCandidate = candidate.filter((result) => requiredIds.has(result.id));
|
|
342
|
+
const baselineFailures = baseline.filter((result) => requiredIds.has(result.id) && resultFailed(result));
|
|
343
|
+
const candidateFailures = requiredCandidate.filter(resultFailed);
|
|
344
|
+
const diagnostics = [];
|
|
345
|
+
diagnostics.push(`Sandbox runtime ${runtime.version}; locally installed image ${runtime.imageId}; image pulling disabled.`);
|
|
346
|
+
let status;
|
|
347
|
+
if (candidateFailures.length === 0 && baselineFailures.length === 0) {
|
|
348
|
+
status = plan.manualChecks.length === 0 ? "validated" : "unvalidated";
|
|
349
|
+
if (plan.manualChecks.length > 0)
|
|
350
|
+
diagnostics.push("Manual acceptance checks remain incomplete.");
|
|
351
|
+
}
|
|
352
|
+
else if (candidateFailures.length === 0 && baselineFailures.length > 0) {
|
|
353
|
+
status = "non_regression_only";
|
|
354
|
+
diagnostics.push("The baseline was unhealthy; candidate checks passed but cannot be certified automatically.");
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
const baselineIds = new Set(baselineFailures.map((result) => result.id));
|
|
358
|
+
const onlyExisting = candidateFailures.every((result) => baselineIds.has(result.id));
|
|
359
|
+
status = onlyExisting ? "non_regression_only" : "failed";
|
|
360
|
+
diagnostics.push(onlyExisting
|
|
361
|
+
? "Required failures existed in the baseline and remain; the result is not verified."
|
|
362
|
+
: "The candidate introduced or retained required validation failures.");
|
|
363
|
+
}
|
|
364
|
+
if ([...baseline, ...candidate].some((result) => result.flaky)) {
|
|
365
|
+
status = "unvalidated";
|
|
366
|
+
diagnostics.push("At least one validation command was flaky (failed and then passed).");
|
|
367
|
+
}
|
|
368
|
+
if ([...baseline, ...candidate].some((result) => result.stderr.startsWith("SECURITY_BLOCKED:"))) {
|
|
369
|
+
status = "failed";
|
|
370
|
+
diagnostics.push("SECURITY_BLOCKED: validation emitted credential-like content; captured output was discarded.");
|
|
371
|
+
}
|
|
372
|
+
return {
|
|
373
|
+
schemaVersion: 1,
|
|
374
|
+
status,
|
|
375
|
+
sandbox: "strong",
|
|
376
|
+
baseline,
|
|
377
|
+
candidate,
|
|
378
|
+
repairs: [],
|
|
379
|
+
manualChecks: plan.manualChecks.map((description) => ({
|
|
380
|
+
description,
|
|
381
|
+
status: "pending",
|
|
382
|
+
})),
|
|
383
|
+
diagnostics,
|
|
384
|
+
startedAt,
|
|
385
|
+
finishedAt: now(),
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Auditable generation, isolated validation, and explicit application workflow. */
|
|
2
|
+
import { type ProjectProfileV1 } from "./analyzer.ts";
|
|
3
|
+
import { type ConfigV1 } from "./config.ts";
|
|
4
|
+
import { type ChangeContractV1, type PatchSetV1, type RunStatus, type ValidationPlanV1, type ValidationReportV1 } from "./contracts.ts";
|
|
5
|
+
import { type ContextManifestV1 } from "./context.ts";
|
|
6
|
+
import { type ProviderAdapter } from "./provider.ts";
|
|
7
|
+
import { RunStore } from "./run-store.ts";
|
|
8
|
+
import { validateBaselineAndCandidate } from "./validation.ts";
|
|
9
|
+
export interface ProviderCertificationV1 {
|
|
10
|
+
matrixKey: string;
|
|
11
|
+
certified: boolean;
|
|
12
|
+
reason: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RunCertificationV1 {
|
|
15
|
+
schemaVersion: 1;
|
|
16
|
+
supportMatrixVersion: string;
|
|
17
|
+
provider: ProviderCertificationV1;
|
|
18
|
+
profileCertified: boolean;
|
|
19
|
+
certified: boolean;
|
|
20
|
+
reasons: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface GenerateRunOptions {
|
|
23
|
+
root: string;
|
|
24
|
+
profile: ProjectProfileV1;
|
|
25
|
+
contract: ChangeContractV1;
|
|
26
|
+
config: ConfigV1;
|
|
27
|
+
provider: ProviderAdapter;
|
|
28
|
+
store?: RunStore;
|
|
29
|
+
offline?: boolean;
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
}
|
|
32
|
+
export interface WorkflowOutcome {
|
|
33
|
+
runId: string;
|
|
34
|
+
status: RunStatus;
|
|
35
|
+
diagnostics: string[];
|
|
36
|
+
diff?: string;
|
|
37
|
+
report?: ValidationReportV1;
|
|
38
|
+
/** Fixed CLI exit code when the status alone cannot distinguish dependency/partial failures. */
|
|
39
|
+
exitCode?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ValidateStoredRunOptions {
|
|
42
|
+
runId: string;
|
|
43
|
+
store?: RunStore;
|
|
44
|
+
sandboxImage?: string;
|
|
45
|
+
dockerBinary?: string;
|
|
46
|
+
manualChecksPassed?: boolean;
|
|
47
|
+
/** Present only for guided validation; standalone validate never guesses credentials. */
|
|
48
|
+
provider?: ProviderAdapter;
|
|
49
|
+
/** Must exactly match the configuration persisted during generation. */
|
|
50
|
+
config?: ConfigV1;
|
|
51
|
+
signal?: AbortSignal;
|
|
52
|
+
/** Deterministic test seam; production always uses the strong-sandbox runner. */
|
|
53
|
+
validationRunner?: typeof validateBaselineAndCandidate;
|
|
54
|
+
}
|
|
55
|
+
/** Resolve per-workspace policy conservatively for one atomic contract. */
|
|
56
|
+
export declare function resolveWorkspaceConfig(config: ConfigV1, profile: ProjectProfileV1, contract: ChangeContractV1): ConfigV1;
|
|
57
|
+
export declare function createValidationPlan(profile: ProjectProfileV1, contract: ChangeContractV1): ValidationPlanV1;
|
|
58
|
+
export declare function buildContextPreview(rootInput: string, profile: ProjectProfileV1, contract: ChangeContractV1, config: ConfigV1, offline?: boolean): Promise<ContextManifestV1>;
|
|
59
|
+
export declare function renderPatchDiff(patch: PatchSetV1): string;
|
|
60
|
+
export declare function generateRun(input: GenerateRunOptions): Promise<WorkflowOutcome>;
|
|
61
|
+
export declare function validateStoredRun(options: ValidateStoredRunOptions): Promise<WorkflowOutcome>;
|
|
62
|
+
export declare function applyVerifiedRun(runId: string, store?: RunStore): Promise<WorkflowOutcome>;
|
|
63
|
+
export declare function rollbackAppliedRun(runId: string, store?: RunStore): Promise<WorkflowOutcome>;
|
|
64
|
+
export declare function rootRelative(root: string, path: string): string;
|
|
65
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
|