@aura3d/cli 5.0.3 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/aura.exports.json +20 -0
- package/data/root-export-dispositions.json +20 -0
- package/dist/commands/registry.d.ts +1 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +1 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/verify/index.d.ts +2 -0
- package/dist/commands/verify/index.d.ts.map +1 -0
- package/dist/commands/verify/index.js +11 -0
- package/dist/commands/verify/index.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/look-hdri-check.d.ts +7 -0
- package/dist/look-hdri-check.d.ts.map +1 -0
- package/dist/look-hdri-check.js +88 -0
- package/dist/look-hdri-check.js.map +1 -0
- package/dist/physics-backend-check.d.ts +8 -0
- package/dist/physics-backend-check.d.ts.map +1 -0
- package/dist/physics-backend-check.js +44 -0
- package/dist/physics-backend-check.js.map +1 -0
- package/dist/verify/cdp.d.ts +69 -0
- package/dist/verify/cdp.d.ts.map +1 -0
- package/dist/verify/cdp.js +223 -0
- package/dist/verify/cdp.js.map +1 -0
- package/dist/verify/codes.d.ts +17 -0
- package/dist/verify/codes.d.ts.map +1 -0
- package/dist/verify/codes.js +64 -0
- package/dist/verify/codes.js.map +1 -0
- package/dist/verify/command.d.ts +12 -0
- package/dist/verify/command.d.ts.map +1 -0
- package/dist/verify/command.js +101 -0
- package/dist/verify/command.js.map +1 -0
- package/dist/verify/frame.d.ts +46 -0
- package/dist/verify/frame.d.ts.map +1 -0
- package/dist/verify/frame.js +190 -0
- package/dist/verify/frame.js.map +1 -0
- package/dist/verify/index.d.ts +7 -0
- package/dist/verify/index.d.ts.map +1 -0
- package/dist/verify/index.js +7 -0
- package/dist/verify/index.js.map +1 -0
- package/dist/verify/lint.d.ts +43 -0
- package/dist/verify/lint.d.ts.map +1 -0
- package/dist/verify/lint.js +548 -0
- package/dist/verify/lint.js.map +1 -0
- package/dist/verify/run.d.ts +90 -0
- package/dist/verify/run.d.ts.map +1 -0
- package/dist/verify/run.js +317 -0
- package/dist/verify/run.js.map +1 -0
- package/package.json +6 -6
- package/skills/agent-docs/api-signatures.md +89 -23
- package/skills/agent-docs/recipes.md +94 -1
- package/skills/agent-docs/threejs-to-aura3d.md +7 -5
- package/skills/agent-files/AGENTS.md +1 -1
- package/skills/aura3d-materials-environments/SKILL.md +5 -5
- package/skills/aura3d-materials-environments/references/metal-glass.md +32 -0
- package/skills/aura3d-materials-environments/references/visual-helpers.md +20 -0
- package/skills/aura3d-performance/SKILL.md +5 -0
- package/skills/llms.txt +159 -30
- package/skills/manifest.json +4 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type VerifyReport } from "./run.js";
|
|
2
|
+
import type { VerifyBrowserDriver } from "./cdp.js";
|
|
3
|
+
export declare const VERIFY_USAGE: string;
|
|
4
|
+
export declare function formatReport(report: VerifyReport): string;
|
|
5
|
+
export declare function verifyCommand(argv: readonly string[], io: {
|
|
6
|
+
readonly cwd: string;
|
|
7
|
+
stdout(s: string): void;
|
|
8
|
+
stderr(s: string): void;
|
|
9
|
+
}, injected?: {
|
|
10
|
+
driver?: VerifyBrowserDriver;
|
|
11
|
+
}): Promise<number>;
|
|
12
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/verify/command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,YAAY,EAAmB,MAAM,UAAU,CAAC;AAC5F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,eAAO,MAAM,YAAY,QAGiD,CAAC;AAoB3E,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAQzD;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,QAAQ,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCzM"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// `aura3d verify [projectDir] [--json] [--out file] [--skip steps] [--only steps] [--explain CODE] [--list-codes] ...`
|
|
2
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { VERIFY_CODE_TABLE, explainCode, formatExplanation } from "./codes.js";
|
|
5
|
+
import { VERIFY_STEP_ORDER, runVerify } from "./run.js";
|
|
6
|
+
export const VERIFY_USAGE = "aura3d verify [projectDir] [--json] [--out report.json] [--skip typecheck,build,...] [--only a,b] [--route /path] [--dist dist] [--chrome <path>] [--software-gl] [--browser-lock <dir>] [--frames-dir <dir>] [--width N --height N --settle-ms N --motion-gap-ms N --timeout-ms N --ready-timeout-ms N]\n" +
|
|
7
|
+
"aura3d verify --explain <CODE> explain one finding code (cause and fix)\n" +
|
|
8
|
+
"aura3d verify --list-codes print the whole code table as JSON";
|
|
9
|
+
const valueOf = (argv, name) => {
|
|
10
|
+
const index = argv.indexOf(name);
|
|
11
|
+
const value = index >= 0 ? argv[index + 1] : undefined;
|
|
12
|
+
return value !== undefined && !value.startsWith("--") ? value : undefined;
|
|
13
|
+
};
|
|
14
|
+
const stepList = (value) => (value ?? "").split(",").map((s) => s.trim()).filter(Boolean).map((s) => {
|
|
15
|
+
if (!VERIFY_STEP_ORDER.includes(s))
|
|
16
|
+
throw new Error(`Unknown verify step "${s}". Steps: ${VERIFY_STEP_ORDER.join(", ")}.`);
|
|
17
|
+
return s;
|
|
18
|
+
});
|
|
19
|
+
const numberOf = (argv, name) => {
|
|
20
|
+
const raw = valueOf(argv, name);
|
|
21
|
+
if (raw === undefined)
|
|
22
|
+
return undefined;
|
|
23
|
+
const n = Number(raw);
|
|
24
|
+
if (!Number.isFinite(n) || n < 0)
|
|
25
|
+
throw new Error(`${name} needs a non-negative number.`);
|
|
26
|
+
return n;
|
|
27
|
+
};
|
|
28
|
+
export function formatReport(report) {
|
|
29
|
+
const lines = [`aura3d verify: ${report.ok ? "PASS" : "FAIL"} (${report.counts.error} error, ${report.counts.warning} warning) in ${(report.durationMs / 1000).toFixed(1)}s`];
|
|
30
|
+
for (const step of report.steps)
|
|
31
|
+
lines.push(` ${step.status.padEnd(7)} ${step.id}${step.detail ? ` (${step.detail})` : ""}`);
|
|
32
|
+
for (const f of report.findings) {
|
|
33
|
+
const where = f.location ? ` ${f.location.file}:${f.location.line}:${f.location.column}` : "";
|
|
34
|
+
lines.push(`${f.severity.toUpperCase().padEnd(7)} ${f.code}${where}`, ` ${f.message}`, ` fix: ${f.fix}`);
|
|
35
|
+
}
|
|
36
|
+
return lines.join("\n");
|
|
37
|
+
}
|
|
38
|
+
export async function verifyCommand(argv, io, injected) {
|
|
39
|
+
if (argv.includes("--list-codes")) {
|
|
40
|
+
io.stdout(JSON.stringify(VERIFY_CODE_TABLE, null, 2));
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
if (argv.includes("--explain")) {
|
|
44
|
+
const code = valueOf(argv, "--explain");
|
|
45
|
+
if (!code) {
|
|
46
|
+
io.stderr(`Usage: ${VERIFY_USAGE}`);
|
|
47
|
+
return 2;
|
|
48
|
+
}
|
|
49
|
+
const entry = explainCode(code);
|
|
50
|
+
if (!entry) {
|
|
51
|
+
io.stderr(`Unknown code "${code}". Run \`aura3d verify --list-codes\` for the table.`);
|
|
52
|
+
return 2;
|
|
53
|
+
}
|
|
54
|
+
io.stdout(argv.includes("--json") ? JSON.stringify(entry, null, 2) : formatExplanation(entry));
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
let skip;
|
|
58
|
+
try {
|
|
59
|
+
const only = stepList(valueOf(argv, "--only"));
|
|
60
|
+
skip = only.length ? VERIFY_STEP_ORDER.filter((s) => !only.includes(s)) : stepList(valueOf(argv, "--skip"));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
io.stderr(String(error.message));
|
|
64
|
+
return 2;
|
|
65
|
+
}
|
|
66
|
+
const valueFlags = new Set(["--out", "--skip", "--only", "--route", "--dist", "--chrome", "--browser-lock", "--frames-dir", "--width", "--height", "--settle-ms", "--motion-gap-ms", "--timeout-ms", "--ready-timeout-ms"]);
|
|
67
|
+
const positional = argv.find((arg, i) => !arg.startsWith("--") && !valueFlags.has(argv[i - 1] ?? ""));
|
|
68
|
+
let report;
|
|
69
|
+
try {
|
|
70
|
+
report = await runVerify({
|
|
71
|
+
projectDir: resolve(io.cwd, positional ?? "."),
|
|
72
|
+
skip,
|
|
73
|
+
...(valueOf(argv, "--dist") ? { distDir: valueOf(argv, "--dist") } : {}),
|
|
74
|
+
...(valueOf(argv, "--route") ? { route: valueOf(argv, "--route") } : {}),
|
|
75
|
+
...(valueOf(argv, "--chrome") ? { chromePath: valueOf(argv, "--chrome") } : {}),
|
|
76
|
+
...(valueOf(argv, "--frames-dir") ? { framesDir: resolve(io.cwd, valueOf(argv, "--frames-dir")) } : {}),
|
|
77
|
+
...(valueOf(argv, "--browser-lock") ? { browserLock: valueOf(argv, "--browser-lock") } : {}),
|
|
78
|
+
...(argv.includes("--software-gl") ? { softwareGl: true } : {}),
|
|
79
|
+
...(numberOf(argv, "--width") !== undefined ? { width: numberOf(argv, "--width") } : {}),
|
|
80
|
+
...(numberOf(argv, "--height") !== undefined ? { height: numberOf(argv, "--height") } : {}),
|
|
81
|
+
...(numberOf(argv, "--settle-ms") !== undefined ? { settleMs: numberOf(argv, "--settle-ms") } : {}),
|
|
82
|
+
...(numberOf(argv, "--motion-gap-ms") !== undefined ? { motionGapMs: numberOf(argv, "--motion-gap-ms") } : {}),
|
|
83
|
+
...(numberOf(argv, "--ready-timeout-ms") !== undefined ? { readyTimeoutMs: numberOf(argv, "--ready-timeout-ms") } : {}),
|
|
84
|
+
...(numberOf(argv, "--timeout-ms") !== undefined ? { timeoutMs: numberOf(argv, "--timeout-ms") } : {}),
|
|
85
|
+
...(injected?.driver ? { driver: injected.driver } : {})
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
io.stderr(String(error.message ?? error));
|
|
90
|
+
return 2;
|
|
91
|
+
}
|
|
92
|
+
const out = valueOf(argv, "--out");
|
|
93
|
+
if (out) {
|
|
94
|
+
const file = resolve(io.cwd, out);
|
|
95
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
96
|
+
writeFileSync(file, `${JSON.stringify(report, null, 2)}\n`);
|
|
97
|
+
}
|
|
98
|
+
io.stdout(argv.includes("--json") ? JSON.stringify(report, null, 2) : formatReport(report));
|
|
99
|
+
return report.ok ? 0 : 1;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/verify/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface RgbImage {
|
|
2
|
+
readonly width: number;
|
|
3
|
+
readonly height: number;
|
|
4
|
+
readonly rgb: Uint8Array;
|
|
5
|
+
}
|
|
6
|
+
export declare const FRAME_THRESHOLDS: Readonly<{
|
|
7
|
+
minTexturedBlockFraction: 0.1;
|
|
8
|
+
minP99Luma: 6;
|
|
9
|
+
minDistinctColors: 8;
|
|
10
|
+
blockStddev: 6;
|
|
11
|
+
maxGain: 8;
|
|
12
|
+
blockSize: 16;
|
|
13
|
+
/** Below this p99 luma (but above black) the frame counts as dim. */
|
|
14
|
+
dimP99Luma: 40;
|
|
15
|
+
}>;
|
|
16
|
+
/** Minimal PNG decoder (8-bit gray, gray+alpha, RGB, RGBA, palette; non-interlaced). Alpha is composited on black. */
|
|
17
|
+
export declare function decodePng(buf: Buffer): RgbImage;
|
|
18
|
+
export interface FrameAnalysis {
|
|
19
|
+
readonly width: number;
|
|
20
|
+
readonly height: number;
|
|
21
|
+
readonly meanLuma: number;
|
|
22
|
+
readonly lumaStddev: number;
|
|
23
|
+
readonly p1Luma: number;
|
|
24
|
+
readonly p99Luma: number;
|
|
25
|
+
readonly gain: number;
|
|
26
|
+
readonly distinctColors: number;
|
|
27
|
+
readonly texturedBlockFraction: number;
|
|
28
|
+
readonly drawn: boolean;
|
|
29
|
+
readonly reasons: readonly string[];
|
|
30
|
+
/** Machine-readable verdict flags derived from the same thresholds. */
|
|
31
|
+
readonly black: boolean;
|
|
32
|
+
readonly flat: boolean;
|
|
33
|
+
readonly empty: boolean;
|
|
34
|
+
readonly dim: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function analyzeFrame(image: RgbImage, thresholds?: typeof FRAME_THRESHOLDS): FrameAnalysis;
|
|
37
|
+
export interface MotionAnalysis {
|
|
38
|
+
/** Mean absolute per-channel difference, 0..255. */
|
|
39
|
+
readonly meanAbsDiff: number;
|
|
40
|
+
/** Share of pixels whose channels differ by more than 8. */
|
|
41
|
+
readonly changedPixelFraction: number;
|
|
42
|
+
readonly moved: boolean;
|
|
43
|
+
}
|
|
44
|
+
/** Two frames of the same size. `moved` needs at least 0.05% of pixels to change noticeably, which a static scene's encoder noise never reaches. */
|
|
45
|
+
export declare function compareFrames(a: RgbImage, b: RgbImage, minChangedFraction?: number): MotionAnalysis;
|
|
46
|
+
//# sourceMappingURL=frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/verify/frame.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CAAE;AAEvG,eAAO,MAAM,gBAAgB;;;;;;;IAO3B,qEAAqE;;EAErE,CAAC;AAKH,sHAAsH;AACtH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAqD/C;AAKD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACjI,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACxE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACjG;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAE,OAAO,gBAAmC,GAAG,aAAa,CA2CnH;AAED,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,4DAA4D;IAC5D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,oJAAoJ;AACpJ,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,kBAAkB,SAAS,GAAG,cAAc,CAWnG"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// Frame analysis for `aura3d verify`: a dependency-free PNG decoder, the black/flat/dim frame check and a two-frame motion check.
|
|
2
|
+
// The frame check is a TypeScript port of analyzeFrame in tools/release/render-gate/analysis.mjs (same thresholds, same maths); the CLI is
|
|
3
|
+
// published on its own and cannot import repo tools, so tests/unit/aura3d-cli/verify-frame.test.ts asserts the two agree on the same images.
|
|
4
|
+
import { inflateSync } from "node:zlib";
|
|
5
|
+
export const FRAME_THRESHOLDS = Object.freeze({
|
|
6
|
+
minTexturedBlockFraction: 0.1,
|
|
7
|
+
minP99Luma: 6,
|
|
8
|
+
minDistinctColors: 8,
|
|
9
|
+
blockStddev: 6,
|
|
10
|
+
maxGain: 8,
|
|
11
|
+
blockSize: 16,
|
|
12
|
+
/** Below this p99 luma (but above black) the frame counts as dim. */
|
|
13
|
+
dimP99Luma: 40
|
|
14
|
+
});
|
|
15
|
+
const SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
16
|
+
const CHANNELS = { 0: 1, 2: 3, 3: 1, 4: 2, 6: 4 };
|
|
17
|
+
/** Minimal PNG decoder (8-bit gray, gray+alpha, RGB, RGBA, palette; non-interlaced). Alpha is composited on black. */
|
|
18
|
+
export function decodePng(buf) {
|
|
19
|
+
if (buf.length < 33 || !SIGNATURE.every((b, i) => buf[i] === b))
|
|
20
|
+
throw new Error("not a PNG");
|
|
21
|
+
let pos = 8, width = 0, height = 0, depth = 0, colorType = 0, interlace = 0;
|
|
22
|
+
const idat = [];
|
|
23
|
+
let palette = null;
|
|
24
|
+
while (pos + 8 <= buf.length) {
|
|
25
|
+
const len = buf.readUInt32BE(pos);
|
|
26
|
+
const type = buf.toString("latin1", pos + 4, pos + 8);
|
|
27
|
+
const data = buf.subarray(pos + 8, pos + 8 + len);
|
|
28
|
+
if (type === "IHDR") {
|
|
29
|
+
width = data.readUInt32BE(0);
|
|
30
|
+
height = data.readUInt32BE(4);
|
|
31
|
+
depth = data[8];
|
|
32
|
+
colorType = data[9];
|
|
33
|
+
interlace = data[12];
|
|
34
|
+
}
|
|
35
|
+
else if (type === "PLTE")
|
|
36
|
+
palette = data;
|
|
37
|
+
else if (type === "IDAT")
|
|
38
|
+
idat.push(data);
|
|
39
|
+
else if (type === "IEND")
|
|
40
|
+
break;
|
|
41
|
+
pos += 12 + len;
|
|
42
|
+
}
|
|
43
|
+
if (!width || !height)
|
|
44
|
+
throw new Error("PNG without IHDR");
|
|
45
|
+
if (depth !== 8 || interlace !== 0 || !(colorType in CHANNELS))
|
|
46
|
+
throw new Error(`unsupported PNG (depth ${depth}, colour type ${colorType}, interlace ${interlace})`);
|
|
47
|
+
if (colorType === 3 && !palette)
|
|
48
|
+
throw new Error("palette PNG without PLTE");
|
|
49
|
+
const ch = CHANNELS[colorType];
|
|
50
|
+
const stride = width * ch;
|
|
51
|
+
const raw = inflateSync(Buffer.concat(idat));
|
|
52
|
+
if (raw.length < (stride + 1) * height)
|
|
53
|
+
throw new Error("truncated PNG data");
|
|
54
|
+
const out = new Uint8Array(stride * height);
|
|
55
|
+
for (let y = 0; y < height; y++) {
|
|
56
|
+
const f = raw[y * (stride + 1)];
|
|
57
|
+
const src = y * (stride + 1) + 1;
|
|
58
|
+
const dst = y * stride;
|
|
59
|
+
for (let x = 0; x < stride; x++) {
|
|
60
|
+
const a = x >= ch ? out[dst + x - ch] : 0;
|
|
61
|
+
const b = y > 0 ? out[dst - stride + x] : 0;
|
|
62
|
+
const c = x >= ch && y > 0 ? out[dst - stride + x - ch] : 0;
|
|
63
|
+
let v = raw[src + x];
|
|
64
|
+
if (f === 1)
|
|
65
|
+
v += a;
|
|
66
|
+
else if (f === 2)
|
|
67
|
+
v += b;
|
|
68
|
+
else if (f === 3)
|
|
69
|
+
v += (a + b) >> 1;
|
|
70
|
+
else if (f === 4) {
|
|
71
|
+
const p = a + b - c, pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);
|
|
72
|
+
v += pa <= pb && pa <= pc ? a : pb <= pc ? b : c;
|
|
73
|
+
}
|
|
74
|
+
else if (f !== 0)
|
|
75
|
+
throw new Error(`bad PNG filter ${f}`);
|
|
76
|
+
out[dst + x] = v & 255;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const rgb = new Uint8Array(width * height * 3);
|
|
80
|
+
for (let i = 0, n = width * height; i < n; i++) {
|
|
81
|
+
let r, g, b, al = 255;
|
|
82
|
+
if (colorType === 2) {
|
|
83
|
+
r = out[i * 3];
|
|
84
|
+
g = out[i * 3 + 1];
|
|
85
|
+
b = out[i * 3 + 2];
|
|
86
|
+
}
|
|
87
|
+
else if (colorType === 6) {
|
|
88
|
+
r = out[i * 4];
|
|
89
|
+
g = out[i * 4 + 1];
|
|
90
|
+
b = out[i * 4 + 2];
|
|
91
|
+
al = out[i * 4 + 3];
|
|
92
|
+
}
|
|
93
|
+
else if (colorType === 0) {
|
|
94
|
+
r = g = b = out[i];
|
|
95
|
+
}
|
|
96
|
+
else if (colorType === 4) {
|
|
97
|
+
r = g = b = out[i * 2];
|
|
98
|
+
al = out[i * 2 + 1];
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const p = out[i] * 3;
|
|
102
|
+
r = palette[p];
|
|
103
|
+
g = palette[p + 1];
|
|
104
|
+
b = palette[p + 2];
|
|
105
|
+
}
|
|
106
|
+
rgb[i * 3] = (r * al) / 255;
|
|
107
|
+
rgb[i * 3 + 1] = (g * al) / 255;
|
|
108
|
+
rgb[i * 3 + 2] = (b * al) / 255;
|
|
109
|
+
}
|
|
110
|
+
return { width, height, rgb };
|
|
111
|
+
}
|
|
112
|
+
const luma = (r, g, b) => 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
113
|
+
const round = (v, d = 2) => Math.round(v * 10 ** d) / 10 ** d;
|
|
114
|
+
export function analyzeFrame(image, thresholds = FRAME_THRESHOLDS) {
|
|
115
|
+
const { width, height, rgb } = image;
|
|
116
|
+
const n = width * height;
|
|
117
|
+
const hist = new Uint32Array(256);
|
|
118
|
+
const colors = new Set();
|
|
119
|
+
const lum = new Float32Array(n);
|
|
120
|
+
let sum = 0, sumSq = 0;
|
|
121
|
+
for (let i = 0; i < n; i++) {
|
|
122
|
+
const l = luma(rgb[i * 3], rgb[i * 3 + 1], rgb[i * 3 + 2]);
|
|
123
|
+
lum[i] = l;
|
|
124
|
+
sum += l;
|
|
125
|
+
sumSq += l * l;
|
|
126
|
+
hist[Math.min(255, Math.round(l))]++;
|
|
127
|
+
}
|
|
128
|
+
const pct = (p) => { let acc = 0; const target = n * p; for (let v = 0; v < 256; v++) {
|
|
129
|
+
acc += hist[v];
|
|
130
|
+
if (acc >= target)
|
|
131
|
+
return v;
|
|
132
|
+
} return 255; };
|
|
133
|
+
const mean = sum / n;
|
|
134
|
+
const stddev = Math.sqrt(Math.max(0, sumSq / n - mean * mean));
|
|
135
|
+
const p1 = pct(0.01), p99 = pct(0.99);
|
|
136
|
+
const gain = p99 >= 96 ? 1 : Math.min(thresholds.maxGain, 160 / Math.max(p99, 1));
|
|
137
|
+
for (let i = 0; i < n; i++) {
|
|
138
|
+
const r = Math.min(255, rgb[i * 3] * gain), g = Math.min(255, rgb[i * 3 + 1] * gain), b = Math.min(255, rgb[i * 3 + 2] * gain);
|
|
139
|
+
colors.add(((r >> 4) << 8) | ((g >> 4) << 4) | (b >> 4));
|
|
140
|
+
}
|
|
141
|
+
const bs = thresholds.blockSize;
|
|
142
|
+
let blocks = 0, textured = 0;
|
|
143
|
+
for (let by = 0; by + bs <= height; by += bs) {
|
|
144
|
+
for (let bx = 0; bx + bs <= width; bx += bs) {
|
|
145
|
+
let s = 0, sq = 0;
|
|
146
|
+
for (let y = by; y < by + bs; y++)
|
|
147
|
+
for (let x = bx; x < bx + bs; x++) {
|
|
148
|
+
const v = Math.min(255, lum[y * width + x] * gain);
|
|
149
|
+
s += v;
|
|
150
|
+
sq += v * v;
|
|
151
|
+
}
|
|
152
|
+
const m = s / (bs * bs), sd = Math.sqrt(Math.max(0, sq / (bs * bs) - m * m));
|
|
153
|
+
blocks++;
|
|
154
|
+
if (sd >= thresholds.blockStddev)
|
|
155
|
+
textured++;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const texturedBlockFraction = blocks ? textured / blocks : 0;
|
|
159
|
+
const reasons = [];
|
|
160
|
+
const black = p99 < thresholds.minP99Luma;
|
|
161
|
+
const flat = colors.size < thresholds.minDistinctColors;
|
|
162
|
+
const empty = texturedBlockFraction < thresholds.minTexturedBlockFraction;
|
|
163
|
+
if (black)
|
|
164
|
+
reasons.push(`black frame (p99 luma ${p99})`);
|
|
165
|
+
if (flat)
|
|
166
|
+
reasons.push(`flat frame (${colors.size} distinct colours)`);
|
|
167
|
+
if (empty)
|
|
168
|
+
reasons.push(`no scene texture (${(texturedBlockFraction * 100).toFixed(1)}% textured blocks)`);
|
|
169
|
+
return {
|
|
170
|
+
width, height, meanLuma: round(mean), lumaStddev: round(stddev), p1Luma: p1, p99Luma: p99, gain: round(gain),
|
|
171
|
+
distinctColors: colors.size, texturedBlockFraction: round(texturedBlockFraction, 4),
|
|
172
|
+
drawn: reasons.length === 0, reasons, black, flat, empty, dim: !black && p99 < thresholds.dimP99Luma
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** Two frames of the same size. `moved` needs at least 0.05% of pixels to change noticeably, which a static scene's encoder noise never reaches. */
|
|
176
|
+
export function compareFrames(a, b, minChangedFraction = 0.0005) {
|
|
177
|
+
if (a.width !== b.width || a.height !== b.height)
|
|
178
|
+
return { meanAbsDiff: 255, changedPixelFraction: 1, moved: true };
|
|
179
|
+
const n = a.width * a.height;
|
|
180
|
+
let total = 0, changed = 0;
|
|
181
|
+
for (let i = 0; i < n; i++) {
|
|
182
|
+
const d = Math.abs(a.rgb[i * 3] - b.rgb[i * 3]) + Math.abs(a.rgb[i * 3 + 1] - b.rgb[i * 3 + 1]) + Math.abs(a.rgb[i * 3 + 2] - b.rgb[i * 3 + 2]);
|
|
183
|
+
total += d / 3;
|
|
184
|
+
if (d > 24)
|
|
185
|
+
changed++;
|
|
186
|
+
}
|
|
187
|
+
const changedPixelFraction = n ? changed / n : 0;
|
|
188
|
+
return { meanAbsDiff: round(n ? total / n : 0, 3), changedPixelFraction: round(changedPixelFraction, 5), moved: changedPixelFraction >= minChangedFraction };
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/verify/frame.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./codes.js";
|
|
2
|
+
export * from "./lint.js";
|
|
3
|
+
export * from "./frame.js";
|
|
4
|
+
export * from "./run.js";
|
|
5
|
+
export { createChromeCdpDriver, findChrome, BrowserUnavailableError, type VerifyBrowserDriver, type RenderCapture, type RenderCaptureOptions } from "./cdp.js";
|
|
6
|
+
export { verifyCommand, formatReport, VERIFY_USAGE } from "./command.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verify/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,uBAAuB,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC/J,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./codes.js";
|
|
2
|
+
export * from "./lint.js";
|
|
3
|
+
export * from "./frame.js";
|
|
4
|
+
export * from "./run.js";
|
|
5
|
+
export { createChromeCdpDriver, findChrome, BrowserUnavailableError } from "./cdp.js";
|
|
6
|
+
export { verifyCommand, formatReport, VERIFY_USAGE } from "./command.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verify/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,uBAAuB,EAA2E,MAAM,UAAU,CAAC;AAC/J,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface LintSource {
|
|
2
|
+
readonly path: string;
|
|
3
|
+
readonly text: string;
|
|
4
|
+
}
|
|
5
|
+
export interface LintFinding {
|
|
6
|
+
readonly code: string;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
readonly location: {
|
|
9
|
+
readonly file: string;
|
|
10
|
+
readonly line: number;
|
|
11
|
+
readonly column: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export type LintGroup = "assets" | "scene";
|
|
15
|
+
export interface LintOptions {
|
|
16
|
+
/** Which rule group to run. Default: both. */
|
|
17
|
+
readonly group?: LintGroup;
|
|
18
|
+
/** Whether a project-relative URL (e.g. `/models/a.glb`) resolves to a file in the project. Default: never. */
|
|
19
|
+
readonly fileExists?: (url: string) => boolean;
|
|
20
|
+
}
|
|
21
|
+
/** Names the generated GLSL prelude owns. Mirrors RESERVED_UNIFORM_NAMES in packages/engine/src/agent-api/compiler/customMaterial.ts (a parity test guards drift). */
|
|
22
|
+
export declare const RESERVED_UNIFORM_NAMES: readonly string[];
|
|
23
|
+
/** Keys `effects.fog` reads. Mirrors FOG_OPTION_KEYS in packages/engine/src/agent-api/nodes/effects.ts (a parity test guards drift). Anything else is OPTION_IGNORED. */
|
|
24
|
+
export declare const FOG_VALID_OPTIONS: readonly string[];
|
|
25
|
+
/** `instances.model` options the runtime accepts and does not apply (UNAPPLIED_INSTANCED_MODEL_OPTIONS in nodes/instances.ts; emitted as OPTION_IGNORED). */
|
|
26
|
+
export declare const INSTANCES_MODEL_UNAPPLIED_OPTIONS: readonly string[];
|
|
27
|
+
/**
|
|
28
|
+
* Builder option tables for LINT_EFFECT_OPTION_IGNORED. `valid`: any other key is ignored. `ignored`: these keys are ignored.
|
|
29
|
+
* `effects.particles` has no row: every defined particle option rides to lowering, so there is no list of ignored particle options to lint against
|
|
30
|
+
* (the runtime still reports any that appear, see RUNTIME_OPTION_IGNORED).
|
|
31
|
+
*/
|
|
32
|
+
export declare const IGNORED_OPTION_RULES: readonly {
|
|
33
|
+
readonly builder: string;
|
|
34
|
+
readonly valid?: readonly string[];
|
|
35
|
+
readonly ignored?: readonly string[];
|
|
36
|
+
}[];
|
|
37
|
+
/** Source files of a project: `src/` if present, else the root (config files excluded). */
|
|
38
|
+
export declare function collectLintSources(projectDir: string): LintSource[];
|
|
39
|
+
/** Run the lint rules over in-memory sources. Pure: no file system, no engine import. */
|
|
40
|
+
export declare function lintSources(sources: readonly LintSource[], options?: LintOptions): LintFinding[];
|
|
41
|
+
/** Project-level convenience: collect sources, resolve `fileExists` against `public/` and the project root. */
|
|
42
|
+
export declare function lintProject(projectDir: string, options?: LintOptions): LintFinding[];
|
|
43
|
+
//# sourceMappingURL=lint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/verify/lint.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAC5E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9F;AACD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC3C,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,+GAA+G;IAC/G,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CAChD;AAED,sKAAsK;AACtK,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAKnD,CAAC;AAEF,yKAAyK;AACzK,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAI9C,CAAC;AAEF,6JAA6J;AAC7J,eAAO,MAAM,iCAAiC,EAAE,SAAS,MAAM,EAAmF,CAAC;AAEnJ;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAGjJ,CAAC;AAQF,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAiBnE;AAqaD,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,WAAW,EAAE,CAOpG;AAED,+GAA+G;AAC/G,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,WAAW,EAAE,CAOxF"}
|