frontend-harness 0.7.8 → 0.7.10
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/CHANGELOG.md +29 -0
- package/README.md +3 -0
- package/dist/cli/index.js +26 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/runtime/clean.js +24 -3
- package/dist/runtime/clean.js.map +1 -1
- package/dist/runtime/context.js +49 -5
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/evidence.js +63 -8
- package/dist/runtime/evidence.js.map +1 -1
- package/dist/runtime/graph.js +11 -4
- package/dist/runtime/graph.js.map +1 -1
- package/dist/runtime/knowledge/constants.d.ts +9 -0
- package/dist/runtime/knowledge/constants.js +24 -0
- package/dist/runtime/knowledge/constants.js.map +1 -0
- package/dist/runtime/knowledge/core.d.ts +19 -0
- package/dist/runtime/knowledge/core.js +1264 -0
- package/dist/runtime/knowledge/core.js.map +1 -0
- package/dist/runtime/knowledge/types.d.ts +172 -0
- package/dist/runtime/knowledge/types.js +2 -0
- package/dist/runtime/knowledge/types.js.map +1 -0
- package/dist/runtime/knowledge.d.ts +2 -188
- package/dist/runtime/knowledge.js +1 -1126
- package/dist/runtime/knowledge.js.map +1 -1
- package/dist/runtime/plan/component-resolver.js +17 -6
- package/dist/runtime/plan/component-resolver.js.map +1 -1
- package/dist/runtime/plan/proposal.js +9 -0
- package/dist/runtime/plan/proposal.js.map +1 -1
- package/dist/runtime/plan.js +6 -4
- package/dist/runtime/plan.js.map +1 -1
- package/dist/runtime/policy-provenance.js +43 -5
- package/dist/runtime/policy-provenance.js.map +1 -1
- package/dist/runtime/project-discovery.js +32 -17
- package/dist/runtime/project-discovery.js.map +1 -1
- package/dist/runtime/project-paths.js +7 -1
- package/dist/runtime/project-paths.js.map +1 -1
- package/dist/runtime/protocol-init.js +105 -19
- package/dist/runtime/protocol-init.js.map +1 -1
- package/dist/runtime/repair-decision.js +76 -16
- package/dist/runtime/repair-decision.js.map +1 -1
- package/dist/runtime/repair-packet.js +55 -16
- package/dist/runtime/repair-packet.js.map +1 -1
- package/dist/runtime/scaffold/vue-template.js +1 -1
- package/dist/runtime/scaffold/vue-template.js.map +1 -1
- package/dist/runtime/scaffold.js +44 -8
- package/dist/runtime/scaffold.js.map +1 -1
- package/dist/runtime/skills.js +120 -18
- package/dist/runtime/skills.js.map +1 -1
- package/dist/runtime/state.js +49 -8
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/units.js +11 -4
- package/dist/runtime/units.js.map +1 -1
- package/dist/runtime/verification-commands.js +95 -21
- package/dist/runtime/verification-commands.js.map +1 -1
- package/dist/runtime/verify.js +64 -18
- package/dist/runtime/verify.js.map +1 -1
- package/dist/runtime/visual-compare.js +104 -12
- package/dist/runtime/visual-compare.js.map +1 -1
- package/dist/schemas/validation.js +222 -6
- package/dist/schemas/validation.js.map +1 -1
- package/dist/storage/json.d.ts +9 -1
- package/dist/storage/json.js +106 -8
- package/dist/storage/json.js.map +1 -1
- package/docs/RELEASE.md +5 -1
- package/package.json +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
1
|
import path from "node:path";
|
|
3
2
|
import { harnessPath } from "../storage/paths.js";
|
|
3
|
+
import { readJson } from "../storage/json.js";
|
|
4
4
|
import { isRecord } from "./common/parsing.js";
|
|
5
5
|
export const defaultVerificationCommandNames = ["typecheck", "test", "build"];
|
|
6
|
+
const MAX_VERIFICATION_CONFIG_BYTES = 2 * 1024 * 1024;
|
|
6
7
|
export function discoverVerificationCommands(projectRoot, overrides = {}) {
|
|
7
8
|
return inspectVerificationCommands(projectRoot, overrides).commands;
|
|
8
9
|
}
|
|
@@ -12,6 +13,9 @@ export function inspectVerificationCommands(projectRoot, overrides = {}) {
|
|
|
12
13
|
const config = harnessConfig.config;
|
|
13
14
|
const scripts = packageScripts.scripts;
|
|
14
15
|
const errors = [...harnessConfig.errors, ...packageScripts.errors];
|
|
16
|
+
errors.push(...validateDefaultConfigCommands(config));
|
|
17
|
+
const customCommands = readCustomConfigCommands(config, errors);
|
|
18
|
+
const customCommandsByName = new Map(customCommands.map((command) => [command.name, command]));
|
|
15
19
|
const commands = defaultVerificationCommandNames.map((name) => {
|
|
16
20
|
const overrideCommand = overrides[name];
|
|
17
21
|
if (overrideCommand) {
|
|
@@ -22,13 +26,17 @@ export function inspectVerificationCommands(projectRoot, overrides = {}) {
|
|
|
22
26
|
};
|
|
23
27
|
}
|
|
24
28
|
const configCommand = config.verification?.[name];
|
|
25
|
-
if (configCommand) {
|
|
29
|
+
if (typeof configCommand === "string" && configCommand.trim()) {
|
|
26
30
|
return {
|
|
27
31
|
name,
|
|
28
32
|
source: "config",
|
|
29
|
-
command: configCommand
|
|
33
|
+
command: configCommand.trim()
|
|
30
34
|
};
|
|
31
35
|
}
|
|
36
|
+
const defaultNamedCustomCommand = customCommandsByName.get(name);
|
|
37
|
+
if (defaultNamedCustomCommand) {
|
|
38
|
+
return defaultNamedCustomCommand;
|
|
39
|
+
}
|
|
32
40
|
if (scripts[name]) {
|
|
33
41
|
return {
|
|
34
42
|
name,
|
|
@@ -42,7 +50,6 @@ export function inspectVerificationCommands(projectRoot, overrides = {}) {
|
|
|
42
50
|
command: null
|
|
43
51
|
};
|
|
44
52
|
});
|
|
45
|
-
const customCommands = readCustomConfigCommands(config);
|
|
46
53
|
const defaultNames = new Set(defaultVerificationCommandNames);
|
|
47
54
|
const configuredNames = new Set(commands.map((entry) => entry.name));
|
|
48
55
|
for (const customCommand of customCommands) {
|
|
@@ -54,19 +61,54 @@ export function inspectVerificationCommands(projectRoot, overrides = {}) {
|
|
|
54
61
|
}
|
|
55
62
|
return { commands, errors };
|
|
56
63
|
}
|
|
57
|
-
function
|
|
58
|
-
if (!
|
|
64
|
+
function validateDefaultConfigCommands(config) {
|
|
65
|
+
if (config.verification !== undefined && !isJsonObject(config.verification)) {
|
|
66
|
+
return [".frontend-harness/config.json verification must be an object."];
|
|
67
|
+
}
|
|
68
|
+
if (!isJsonObject(config.verification)) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
return defaultVerificationCommandNames.flatMap((name) => {
|
|
72
|
+
if (!Object.prototype.hasOwnProperty.call(config.verification, name)) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
const command = config.verification?.[name];
|
|
76
|
+
if (typeof command !== "string" || !command.trim()) {
|
|
77
|
+
return [`.frontend-harness/config.json verification.${name} must be a non-empty string command.`];
|
|
78
|
+
}
|
|
79
|
+
return [];
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function readCustomConfigCommands(config, errors) {
|
|
83
|
+
if (config.verification !== undefined && !isJsonObject(config.verification)) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
if (config.verification?.commands === undefined) {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
if (!Array.isArray(config.verification.commands)) {
|
|
90
|
+
errors.push(".frontend-harness/config.json verification.commands must be an array.");
|
|
59
91
|
return [];
|
|
60
92
|
}
|
|
61
93
|
const commands = [];
|
|
62
94
|
const names = new Set();
|
|
63
|
-
for (const entry of config.verification.commands) {
|
|
95
|
+
for (const [index, entry] of config.verification.commands.entries()) {
|
|
64
96
|
if (!isRecord(entry)) {
|
|
97
|
+
errors.push(`.frontend-harness/config.json verification.commands[${index}] must be an object.`);
|
|
65
98
|
continue;
|
|
66
99
|
}
|
|
67
100
|
const name = typeof entry["name"] === "string" ? entry["name"].trim() : "";
|
|
68
101
|
const command = typeof entry["command"] === "string" ? entry["command"].trim() : "";
|
|
69
|
-
if (!isValidCommandName(name)
|
|
102
|
+
if (!isValidCommandName(name)) {
|
|
103
|
+
errors.push(`.frontend-harness/config.json verification.commands[${index}].name must match ${commandNamePatternDescription()}.`);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (!command) {
|
|
107
|
+
errors.push(`.frontend-harness/config.json verification.commands[${index}].command must be a non-empty string.`);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (names.has(name)) {
|
|
111
|
+
errors.push(`.frontend-harness/config.json verification.commands must not contain duplicate command name: ${name}.`);
|
|
70
112
|
continue;
|
|
71
113
|
}
|
|
72
114
|
commands.push({
|
|
@@ -80,14 +122,15 @@ function readCustomConfigCommands(config) {
|
|
|
80
122
|
}
|
|
81
123
|
function readHarnessConfig(projectRoot) {
|
|
82
124
|
const configPath = harnessPath(projectRoot, "config.json");
|
|
83
|
-
if (!fs.existsSync(configPath)) {
|
|
84
|
-
return { config: {}, errors: [] };
|
|
85
|
-
}
|
|
86
125
|
try {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
126
|
+
const config = readJson(configPath, { maxBytes: MAX_VERIFICATION_CONFIG_BYTES, label: ".frontend-harness/config.json" });
|
|
127
|
+
if (config !== null && !isJsonObject(config)) {
|
|
128
|
+
return {
|
|
129
|
+
config: {},
|
|
130
|
+
errors: [".frontend-harness/config.json root must be a JSON object."]
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return { config: config ?? {}, errors: [] };
|
|
91
134
|
}
|
|
92
135
|
catch (error) {
|
|
93
136
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -99,12 +142,38 @@ function readHarnessConfig(projectRoot) {
|
|
|
99
142
|
}
|
|
100
143
|
function readPackageScripts(projectRoot) {
|
|
101
144
|
const packageJsonPath = path.join(projectRoot, "package.json");
|
|
102
|
-
if (!fs.existsSync(packageJsonPath)) {
|
|
103
|
-
return { scripts: {}, errors: [] };
|
|
104
|
-
}
|
|
105
|
-
let packageJson;
|
|
106
145
|
try {
|
|
107
|
-
packageJson =
|
|
146
|
+
const packageJson = readJson(packageJsonPath, { maxBytes: MAX_VERIFICATION_CONFIG_BYTES, label: "package.json" });
|
|
147
|
+
if (packageJson !== null && !isJsonObject(packageJson)) {
|
|
148
|
+
return {
|
|
149
|
+
scripts: {},
|
|
150
|
+
errors: ["package.json root must be a JSON object."]
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const packageJsonScripts = packageJson?.["scripts"];
|
|
154
|
+
if (packageJsonScripts === undefined) {
|
|
155
|
+
return { scripts: {}, errors: [] };
|
|
156
|
+
}
|
|
157
|
+
if (!isJsonObject(packageJsonScripts)) {
|
|
158
|
+
return {
|
|
159
|
+
scripts: {},
|
|
160
|
+
errors: ["package.json scripts must be an object."]
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const scripts = {};
|
|
164
|
+
const errors = [];
|
|
165
|
+
for (const name of defaultVerificationCommandNames) {
|
|
166
|
+
if (!Object.prototype.hasOwnProperty.call(packageJsonScripts, name)) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const command = packageJsonScripts[name];
|
|
170
|
+
if (typeof command !== "string" || !command.trim()) {
|
|
171
|
+
errors.push(`package.json scripts.${name} must be a non-empty string command.`);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
scripts[name] = command.trim();
|
|
175
|
+
}
|
|
176
|
+
return { scripts, errors };
|
|
108
177
|
}
|
|
109
178
|
catch (error) {
|
|
110
179
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -113,9 +182,14 @@ function readPackageScripts(projectRoot) {
|
|
|
113
182
|
errors: [`package.json is not valid JSON: ${message}`]
|
|
114
183
|
};
|
|
115
184
|
}
|
|
116
|
-
return { scripts: packageJson.scripts ?? {}, errors: [] };
|
|
117
185
|
}
|
|
118
186
|
function isValidCommandName(value) {
|
|
119
187
|
return /^[a-zA-Z0-9][a-zA-Z0-9:_-]{0,79}$/.test(value);
|
|
120
188
|
}
|
|
189
|
+
function isJsonObject(value) {
|
|
190
|
+
return isRecord(value) && !Array.isArray(value);
|
|
191
|
+
}
|
|
192
|
+
function commandNamePatternDescription() {
|
|
193
|
+
return "/^[a-zA-Z0-9][a-zA-Z0-9:_-]{0,79}$/";
|
|
194
|
+
}
|
|
121
195
|
//# sourceMappingURL=verification-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-commands.js","sourceRoot":"","sources":["../../src/runtime/verification-commands.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"verification-commands.js","sourceRoot":"","sources":["../../src/runtime/verification-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/verify.js
CHANGED
|
@@ -10,7 +10,10 @@ import { checkKnowledgeCoverage } from "./knowledge.js";
|
|
|
10
10
|
import { inspectVerificationCommands } from "./verification-commands.js";
|
|
11
11
|
import { createRepairPacket } from "./repair-packet.js";
|
|
12
12
|
import { projectScriptCommand } from "./command-taxonomy.js";
|
|
13
|
+
const MAX_VERIFICATION_JSON_BYTES = 2 * 1024 * 1024;
|
|
13
14
|
const MAX_NODE_E_SCRIPT_LENGTH = 200;
|
|
15
|
+
const VERIFICATION_COMMAND_TIMEOUT_MS = 10 * 60 * 1000;
|
|
16
|
+
const VERIFICATION_COMMAND_MAX_BUFFER_BYTES = 1024 * 1024;
|
|
14
17
|
export function runVerification(projectRoot, options) {
|
|
15
18
|
const startedFromFailed = readPreviousStatus(projectRoot) === "failed";
|
|
16
19
|
const stateContract = checkStateContract(projectRoot);
|
|
@@ -63,7 +66,7 @@ export function runVerification(projectRoot, options) {
|
|
|
63
66
|
}
|
|
64
67
|
const state = loadState(projectRoot);
|
|
65
68
|
if (state.task?.inputs?.prd) {
|
|
66
|
-
const coverage = checkKnowledgeCoverage(projectRoot);
|
|
69
|
+
const coverage = checkKnowledgeCoverage(projectRoot, { requiredPrdSources: [state.task.inputs.prd] });
|
|
67
70
|
if (coverage.status !== "passed") {
|
|
68
71
|
const relativeLogPath = `.frontend-harness/logs/knowledge-coverage-${new Date().toISOString().replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z")}.log`;
|
|
69
72
|
writeText(path.join(projectRoot, relativeLogPath), [
|
|
@@ -248,7 +251,7 @@ function resolveCommands(commands) {
|
|
|
248
251
|
function runCommand(projectRoot, name, source, command) {
|
|
249
252
|
const started = Date.now();
|
|
250
253
|
const stamp = new Date().toISOString().replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z");
|
|
251
|
-
const relativeLogPath =
|
|
254
|
+
const relativeLogPath = uniqueVerificationLogPath(projectRoot, safeLogName(name), stamp);
|
|
252
255
|
const logPath = path.join(projectRoot, relativeLogPath);
|
|
253
256
|
ensureDir(path.dirname(logPath));
|
|
254
257
|
const result = spawnVerificationCommand(projectRoot, command);
|
|
@@ -263,9 +266,7 @@ function runCommand(projectRoot, name, source, command) {
|
|
|
263
266
|
result.error ? `\n## spawn error\n${result.error.message}` : ""
|
|
264
267
|
].join("\n");
|
|
265
268
|
writeText(logPath, output);
|
|
266
|
-
const commandLaunchError = result.error
|
|
267
|
-
|| (result.status !== 0
|
|
268
|
-
&& /not found|not recognized|command not found/i.test(`${result.stderr ?? ""}\n${result.stdout ?? ""}`));
|
|
269
|
+
const commandLaunchError = result.error;
|
|
269
270
|
if (commandLaunchError) {
|
|
270
271
|
return {
|
|
271
272
|
name,
|
|
@@ -287,21 +288,32 @@ function runCommand(projectRoot, name, source, command) {
|
|
|
287
288
|
logPath: relativeLogPath
|
|
288
289
|
};
|
|
289
290
|
}
|
|
291
|
+
function safeLogName(name) {
|
|
292
|
+
const normalized = name.replace(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
293
|
+
return normalized || "verification";
|
|
294
|
+
}
|
|
295
|
+
function uniqueVerificationLogPath(projectRoot, logName, stamp) {
|
|
296
|
+
for (let index = 0; index < 1000; index += 1) {
|
|
297
|
+
const suffix = index === 0 ? "" : `-${index + 1}`;
|
|
298
|
+
const relativeLogPath = `.frontend-harness/logs/${logName}-${stamp}${suffix}.log`;
|
|
299
|
+
if (!fs.existsSync(path.join(projectRoot, relativeLogPath))) {
|
|
300
|
+
return relativeLogPath;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
throw new Error(`Unable to allocate a unique verification log path for ${logName}.`);
|
|
304
|
+
}
|
|
290
305
|
function spawnVerificationCommand(projectRoot, command) {
|
|
291
306
|
const npmScript = parseNpmRunCommand(command);
|
|
292
307
|
if (npmScript) {
|
|
293
308
|
const packageScript = readPackageScript(projectRoot, npmScript);
|
|
294
309
|
const parsedPackageScript = packageScript ? parseCommand(packageScript) : null;
|
|
295
310
|
if (parsedPackageScript && path.isAbsolute(parsedPackageScript.executable)) {
|
|
296
|
-
return
|
|
297
|
-
cwd: projectRoot,
|
|
298
|
-
encoding: "utf8"
|
|
299
|
-
});
|
|
311
|
+
return spawnVerificationProcess(projectRoot, parsedPackageScript);
|
|
300
312
|
}
|
|
301
313
|
const npmCommand = resolveNpmCommand();
|
|
302
|
-
return
|
|
303
|
-
|
|
304
|
-
|
|
314
|
+
return spawnVerificationProcess(projectRoot, {
|
|
315
|
+
executable: npmCommand.executable,
|
|
316
|
+
args: [...npmCommand.args, "run", npmScript]
|
|
305
317
|
});
|
|
306
318
|
}
|
|
307
319
|
const parsedCommand = parseCommand(command);
|
|
@@ -316,13 +328,19 @@ function spawnVerificationCommand(projectRoot, command) {
|
|
|
316
328
|
error: new Error("Verification command contains unsupported shell syntax.")
|
|
317
329
|
};
|
|
318
330
|
}
|
|
319
|
-
return
|
|
331
|
+
return spawnVerificationProcess(projectRoot, parsedCommand);
|
|
332
|
+
}
|
|
333
|
+
function spawnVerificationProcess(projectRoot, command) {
|
|
334
|
+
return spawnSync(command.executable, command.args, {
|
|
320
335
|
cwd: projectRoot,
|
|
321
|
-
encoding: "utf8"
|
|
336
|
+
encoding: "utf8",
|
|
337
|
+
env: command.env ? { ...process.env, ...command.env } : process.env,
|
|
338
|
+
timeout: VERIFICATION_COMMAND_TIMEOUT_MS,
|
|
339
|
+
maxBuffer: VERIFICATION_COMMAND_MAX_BUFFER_BYTES
|
|
322
340
|
});
|
|
323
341
|
}
|
|
324
342
|
function readPackageScript(projectRoot, scriptName) {
|
|
325
|
-
const packageJson = readJson(path.join(projectRoot, "package.json"));
|
|
343
|
+
const packageJson = readJson(path.join(projectRoot, "package.json"), { maxBytes: MAX_VERIFICATION_JSON_BYTES, label: "package.json" });
|
|
326
344
|
const script = packageJson?.scripts?.[scriptName];
|
|
327
345
|
return typeof script === "string" ? script : null;
|
|
328
346
|
}
|
|
@@ -429,12 +447,40 @@ function parseShellLikeCommand(command) {
|
|
|
429
447
|
if (current) {
|
|
430
448
|
args.push(current);
|
|
431
449
|
}
|
|
450
|
+
const env = {};
|
|
451
|
+
while (args.length > 0) {
|
|
452
|
+
const assignment = parseEnvAssignment(args[0]);
|
|
453
|
+
if (!assignment) {
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
env[assignment.name] = assignment.value;
|
|
457
|
+
args.shift();
|
|
458
|
+
}
|
|
432
459
|
const executable = args.shift();
|
|
433
|
-
return executable ? { executable, args } : null;
|
|
460
|
+
return executable ? { executable, args, ...(Object.keys(env).length ? { env } : {}) } : null;
|
|
461
|
+
}
|
|
462
|
+
function parseEnvAssignment(value) {
|
|
463
|
+
if (!value) {
|
|
464
|
+
return null;
|
|
465
|
+
}
|
|
466
|
+
const equalsIndex = value.indexOf("=");
|
|
467
|
+
if (equalsIndex <= 0) {
|
|
468
|
+
return null;
|
|
469
|
+
}
|
|
470
|
+
const name = value.slice(0, equalsIndex);
|
|
471
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
|
|
472
|
+
return null;
|
|
473
|
+
}
|
|
474
|
+
return { name, value: value.slice(equalsIndex + 1) };
|
|
434
475
|
}
|
|
435
476
|
function readPreviousStatus(projectRoot) {
|
|
436
|
-
|
|
437
|
-
|
|
477
|
+
try {
|
|
478
|
+
const previous = readJson(harnessPath(projectRoot, "verification", "latest.json"), { maxBytes: MAX_VERIFICATION_JSON_BYTES, label: ".frontend-harness/verification/latest.json" });
|
|
479
|
+
return previous?.status ?? "not_run";
|
|
480
|
+
}
|
|
481
|
+
catch {
|
|
482
|
+
return "not_run";
|
|
483
|
+
}
|
|
438
484
|
}
|
|
439
485
|
function writeResult(projectRoot, result) {
|
|
440
486
|
writeJson(harnessPath(projectRoot, "verification", "latest.json"), result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/runtime/verify.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/runtime/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import fs from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
3
|
import zlib from "node:zlib";
|
|
5
|
-
import { writeJson } from "../storage/json.js";
|
|
4
|
+
import { isRegularFileWithoutSymlink, writeBuffer, writeJson } from "../storage/json.js";
|
|
6
5
|
import { resolveProjectOrHarnessRelativePath } from "./project-paths.js";
|
|
7
6
|
const PNG_SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
7
|
+
const MAX_PNG_FILE_BYTES = 32 * 1024 * 1024;
|
|
8
|
+
const MAX_PNG_DIMENSION = 8192;
|
|
9
|
+
const MAX_PNG_PIXELS = 16_000_000;
|
|
10
|
+
const VISUAL_HASH_CHUNK_BYTES = 64 * 1024;
|
|
11
|
+
const MAX_DIFF_PIXELS = 16_000_000;
|
|
8
12
|
const VISUAL_COMPARE_LIMITATIONS = [
|
|
9
13
|
"Pixel-level PNG comparison intended for deterministic harness evidence, not perceptual production visual regression.",
|
|
10
14
|
"Stabilize browser rendering, viewport, fonts, data, animation, and dynamic regions before using scores as a release signal.",
|
|
@@ -19,8 +23,8 @@ export function compareVisualArtifacts(projectRoot, input) {
|
|
|
19
23
|
if (threshold < 0 || threshold > 100 || !Number.isFinite(threshold)) {
|
|
20
24
|
throw new Error("visual compare --threshold must be a number between 0 and 100");
|
|
21
25
|
}
|
|
22
|
-
const designImage =
|
|
23
|
-
const actualImage =
|
|
26
|
+
const designImage = readPng(design.fullPath, design.relativePath);
|
|
27
|
+
const actualImage = readPng(actual.fullPath, actual.relativePath);
|
|
24
28
|
const comparedWidth = Math.min(designImage.width, actualImage.width);
|
|
25
29
|
const comparedHeight = Math.min(designImage.height, actualImage.height);
|
|
26
30
|
const diffWidth = Math.max(designImage.width, actualImage.width);
|
|
@@ -28,6 +32,7 @@ export function compareVisualArtifacts(projectRoot, input) {
|
|
|
28
32
|
if (comparedWidth <= 0 || comparedHeight <= 0) {
|
|
29
33
|
throw new Error("visual compare images must have non-empty overlapping dimensions");
|
|
30
34
|
}
|
|
35
|
+
assertImageSize(diffWidth, diffHeight, MAX_DIFF_PIXELS, "visual compare diff image");
|
|
31
36
|
const diffImage = new Uint8Array(diffWidth * diffHeight * 4);
|
|
32
37
|
let changedPixels = 0;
|
|
33
38
|
let totalDelta = 0;
|
|
@@ -52,8 +57,7 @@ export function compareVisualArtifacts(projectRoot, input) {
|
|
|
52
57
|
diffImage[diffOffset + 3] = Math.max(32, pixelDelta);
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
|
-
|
|
56
|
-
fs.writeFileSync(diff.fullPath, encodePngRgba(diffWidth, diffHeight, diffImage));
|
|
60
|
+
writeBuffer(diff.fullPath, encodePngRgba(diffWidth, diffHeight, diffImage));
|
|
57
61
|
const comparedPixels = diffWidth * diffHeight;
|
|
58
62
|
const meanAbsoluteError = totalDelta / (comparedPixels * 4);
|
|
59
63
|
const score = roundScore(Math.max(0, 100 * (1 - meanAbsoluteError / 255)));
|
|
@@ -81,7 +85,13 @@ export function compareVisualArtifacts(projectRoot, input) {
|
|
|
81
85
|
diff: sha256File(diff.fullPath)
|
|
82
86
|
},
|
|
83
87
|
comparisonTool: "frontend-harness visual compare",
|
|
84
|
-
comparisonCommand:
|
|
88
|
+
comparisonCommand: visualComparisonCommand({
|
|
89
|
+
design: design.relativePath,
|
|
90
|
+
actual: actual.relativePath,
|
|
91
|
+
diff: diff.relativePath,
|
|
92
|
+
report: report?.relativePath ?? null,
|
|
93
|
+
threshold
|
|
94
|
+
}),
|
|
85
95
|
limitations: VISUAL_COMPARE_LIMITATIONS
|
|
86
96
|
};
|
|
87
97
|
if (report) {
|
|
@@ -89,6 +99,26 @@ export function compareVisualArtifacts(projectRoot, input) {
|
|
|
89
99
|
}
|
|
90
100
|
return result;
|
|
91
101
|
}
|
|
102
|
+
function visualComparisonCommand(input) {
|
|
103
|
+
const args = [
|
|
104
|
+
"frontend-harness",
|
|
105
|
+
"visual",
|
|
106
|
+
"compare",
|
|
107
|
+
"--design",
|
|
108
|
+
input.design,
|
|
109
|
+
"--actual",
|
|
110
|
+
input.actual,
|
|
111
|
+
"--diff",
|
|
112
|
+
input.diff,
|
|
113
|
+
"--threshold",
|
|
114
|
+
String(input.threshold),
|
|
115
|
+
...(input.report ? ["--report", input.report] : [])
|
|
116
|
+
];
|
|
117
|
+
return args.map(shellQuoteArg).join(" ");
|
|
118
|
+
}
|
|
119
|
+
function shellQuoteArg(value) {
|
|
120
|
+
return /^[A-Za-z0-9_./:@%+=,-]+$/.test(value) ? value : `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
121
|
+
}
|
|
92
122
|
function channelDeltas(left, leftOffset, right, rightOffset) {
|
|
93
123
|
if (leftOffset < 0 || rightOffset < 0) {
|
|
94
124
|
return [255, 255, 255, 255];
|
|
@@ -105,7 +135,7 @@ function resolveRequiredFile(projectRoot, value, label) {
|
|
|
105
135
|
throw new Error(`${label} requires a project-relative path`);
|
|
106
136
|
}
|
|
107
137
|
const resolved = resolveProjectOrHarnessRelativePath(projectRoot, value, label);
|
|
108
|
-
if (!
|
|
138
|
+
if (!isRegularFileWithoutSymlink(resolved.fullPath)) {
|
|
109
139
|
throw new Error(`${label} does not exist: ${resolved.relativePath}`);
|
|
110
140
|
}
|
|
111
141
|
return resolved;
|
|
@@ -114,7 +144,22 @@ function resolveOutputPath(projectRoot, value, label) {
|
|
|
114
144
|
if (!value) {
|
|
115
145
|
throw new Error(`${label} requires a project-relative path`);
|
|
116
146
|
}
|
|
117
|
-
|
|
147
|
+
const resolved = resolveProjectOrHarnessRelativePath(projectRoot, value, label);
|
|
148
|
+
if (!isVisualOutputPath(resolved.relativePath)) {
|
|
149
|
+
throw new Error(`${label} must be written under .frontend-harness/visual/ or .frontend-harness/evidence/: ${resolved.relativePath}`);
|
|
150
|
+
}
|
|
151
|
+
return resolved;
|
|
152
|
+
}
|
|
153
|
+
function isVisualOutputPath(relativePath) {
|
|
154
|
+
return relativePath.startsWith(".frontend-harness/visual/")
|
|
155
|
+
|| relativePath.startsWith(".frontend-harness/evidence/");
|
|
156
|
+
}
|
|
157
|
+
function readPng(fullPath, relativePath) {
|
|
158
|
+
const stat = fs.statSync(fullPath, { throwIfNoEntry: false });
|
|
159
|
+
if (!stat || stat.size > MAX_PNG_FILE_BYTES) {
|
|
160
|
+
throw new Error(`Unsupported PNG for ${relativePath}: file exceeds ${MAX_PNG_FILE_BYTES} bytes`);
|
|
161
|
+
}
|
|
162
|
+
return decodePng(fs.readFileSync(fullPath), relativePath);
|
|
118
163
|
}
|
|
119
164
|
function decodePng(buffer, label) {
|
|
120
165
|
if (buffer.length < 8 || !buffer.subarray(0, 8).equals(PNG_SIGNATURE)) {
|
|
@@ -127,31 +172,53 @@ function decodePng(buffer, label) {
|
|
|
127
172
|
let bitDepth = -1;
|
|
128
173
|
let interlace = -1;
|
|
129
174
|
const idat = [];
|
|
175
|
+
let seenIhdr = false;
|
|
176
|
+
let seenIend = false;
|
|
130
177
|
while (offset < buffer.length) {
|
|
178
|
+
if (offset + 12 > buffer.length) {
|
|
179
|
+
throw new Error(`Unsupported PNG for ${label}: truncated PNG chunk`);
|
|
180
|
+
}
|
|
131
181
|
const length = buffer.readUInt32BE(offset);
|
|
182
|
+
const chunkEnd = offset + 12 + length;
|
|
183
|
+
if (chunkEnd > buffer.length) {
|
|
184
|
+
throw new Error(`Unsupported PNG for ${label}: PNG chunk length exceeds file size`);
|
|
185
|
+
}
|
|
132
186
|
const type = buffer.subarray(offset + 4, offset + 8).toString("ascii");
|
|
133
187
|
const data = buffer.subarray(offset + 8, offset + 8 + length);
|
|
134
|
-
offset
|
|
188
|
+
offset = chunkEnd;
|
|
135
189
|
if (type === "IHDR") {
|
|
190
|
+
if (length !== 13) {
|
|
191
|
+
throw new Error(`Unsupported PNG for ${label}: invalid IHDR length`);
|
|
192
|
+
}
|
|
136
193
|
width = data.readUInt32BE(0);
|
|
137
194
|
height = data.readUInt32BE(4);
|
|
138
195
|
bitDepth = byteAt(data, 8);
|
|
139
196
|
colorType = byteAt(data, 9);
|
|
140
197
|
interlace = byteAt(data, 12);
|
|
198
|
+
seenIhdr = true;
|
|
141
199
|
}
|
|
142
200
|
else if (type === "IDAT") {
|
|
143
201
|
idat.push(data);
|
|
144
202
|
}
|
|
145
203
|
else if (type === "IEND") {
|
|
204
|
+
seenIend = true;
|
|
146
205
|
break;
|
|
147
206
|
}
|
|
148
207
|
}
|
|
208
|
+
if (!seenIhdr || !seenIend || idat.length === 0) {
|
|
209
|
+
throw new Error(`Unsupported PNG for ${label}: missing required PNG chunks`);
|
|
210
|
+
}
|
|
149
211
|
if (bitDepth !== 8 || ![2, 6].includes(colorType) || interlace !== 0) {
|
|
150
212
|
throw new Error(`Unsupported PNG for ${label}: only 8-bit non-interlaced RGB/RGBA PNGs are supported`);
|
|
151
213
|
}
|
|
214
|
+
assertImageSize(width, height, MAX_PNG_PIXELS, label);
|
|
152
215
|
const channels = colorType === 6 ? 4 : 3;
|
|
153
|
-
const raw = zlib.inflateSync(Buffer.concat(idat));
|
|
154
216
|
const rowBytes = width * channels;
|
|
217
|
+
const expectedRawBytes = (rowBytes + 1) * height;
|
|
218
|
+
const raw = zlib.inflateSync(Buffer.concat(idat), { maxOutputLength: expectedRawBytes });
|
|
219
|
+
if (raw.length !== expectedRawBytes) {
|
|
220
|
+
throw new Error(`Unsupported PNG for ${label}: decoded data length does not match image dimensions`);
|
|
221
|
+
}
|
|
155
222
|
const rgba = new Uint8Array(width * height * 4);
|
|
156
223
|
let rawOffset = 0;
|
|
157
224
|
let previous = new Uint8Array(rowBytes);
|
|
@@ -174,6 +241,14 @@ function decodePng(buffer, label) {
|
|
|
174
241
|
}
|
|
175
242
|
return { width, height, rgba };
|
|
176
243
|
}
|
|
244
|
+
function assertImageSize(width, height, maxPixels, label) {
|
|
245
|
+
if (width <= 0 || height <= 0 || width > MAX_PNG_DIMENSION || height > MAX_PNG_DIMENSION) {
|
|
246
|
+
throw new Error(`Unsupported PNG for ${label}: image dimensions exceed supported bounds`);
|
|
247
|
+
}
|
|
248
|
+
if (width * height > maxPixels) {
|
|
249
|
+
throw new Error(`Unsupported PNG for ${label}: image has too many pixels`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
177
252
|
function unfilterRow(row, previous, bytesPerPixel, filter) {
|
|
178
253
|
for (let index = 0; index < row.length; index += 1) {
|
|
179
254
|
const current = byteAt(row, index);
|
|
@@ -263,7 +338,24 @@ function crc32(buffer) {
|
|
|
263
338
|
return (crc ^ 0xffffffff) >>> 0;
|
|
264
339
|
}
|
|
265
340
|
function sha256File(filePath) {
|
|
266
|
-
|
|
341
|
+
const hash = createHash("sha256");
|
|
342
|
+
const buffer = Buffer.alloc(VISUAL_HASH_CHUNK_BYTES);
|
|
343
|
+
const fd = fs.openSync(filePath, "r");
|
|
344
|
+
try {
|
|
345
|
+
let position = 0;
|
|
346
|
+
while (true) {
|
|
347
|
+
const bytesRead = fs.readSync(fd, buffer, 0, buffer.length, position);
|
|
348
|
+
if (bytesRead === 0) {
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
hash.update(buffer.subarray(0, bytesRead));
|
|
352
|
+
position += bytesRead;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
finally {
|
|
356
|
+
fs.closeSync(fd);
|
|
357
|
+
}
|
|
358
|
+
return hash.digest("hex");
|
|
267
359
|
}
|
|
268
360
|
function roundScore(value) {
|
|
269
361
|
return Number(value.toFixed(2));
|